Spring Boot ELK-Stack ve Kafka İle Log Management

Furkan Özmen
Tapu.com Bakış Açısı
4 min readMar 27, 2022

--

Herkese selam, bu yazımızda Elk stack ve kafka iklisini kullanarak loglarımızı nasıl yönetip izleyeceğimizi simüle edip koda dökeceğiz. Kodlamaya girişmeden önce ELK stack dediğimiz üçlünün ne olduğunu , burada nasıl konumlandıracağımızı ve kafkanın buradaki işlevinin ne olduğu hakkında biraz bilgi verelim.

Eğer microservisler ile çalışıyorsanız loglamanın ne denli hayati öneme sahip olduğunun farkındasınızdır. Servisler büyüdükçe gelen logları takip etmek, aksiyon almak ve hareket geçmek inanılmaz derecede zorlaşabiliyor. Düşünsenize bir kullanıcı sistemde ödeme yaparken bir şeyler oluyor ve ödeme gerçekleşmiyor. Buradaki sorunu tespit etmenin ilk akla gelen çözümü akan loglara bakmak oluyor . Bu akan logları mükemmel bir grafik arayüzünden takip ediyor olsaydık nasıl olurdu ?

İşte burada ELK stack devreye giriyor. ElasticSearch’ün bir ürünü olan bu stack Elasticsearch , Logstash ve Kibanadan oluşuyor.

ELK STACK NASIL ÇALIŞIYOR ?

Burada ilk önce logstash’den bahsetmek gerekir. Logstash birden fazla kaynaktan veri alıp, bu veriyi transform edip elasticsearch’ün anlayacağı bir biçimde elasticsearch’e gönderir. Biz buradaki kaynak kısmını filebeat ile dolduracağız. Filebeat docker loglarını input olarak verip, her değişiklik geldiğinde datayı logstashe forward eder.

Elasticsearch ise logstash’den aldığı verileri aranabilir, analiz edilebilir hale getirerek verilerimizi tutar. Burada dikkat etmek gereken nokta şudur. Biz DB olarak elasticsearch’ü burada kullanmadık. Çünkü günün sonunda eğer benim relational ilişkilere sahip bir datam varsa burada elastic benim işimi görmeyecektir. relational DB üzerinden gelen verileri senkron şekilde okuyup analiz etmek mantıklı karar olacaktır. Ama elasticsearch’ün de NoSQL bir db olarak kullanılabildiğini unutmayalım.

Burada günün sonunda verilerimizi elasticsearch üzerinde tutmuş olduk. Peki bu verileri kim görselleştirecek ?

Kibana bu soruna çözüm olarak doğdu. Elasticsearch’e yazılan verileri okuyarak dataları gelişmiş filtrelemelere sokup , akan logları kolaylıkla takip edip bu loglardan sonuçlar çıkarabilirsiniz. Fakat şunu da söyleyelim ki burada elasticsearch gidip kibanaya veri yazmaz. Bu bilinen bir yanlıştır. Kibana elasticsearch üzerinden veri okur.

Peki son olarak Kafka’yı neden kullanacağımızı anlatıp ELK stack’i docker üzerinde çalıştırabilir bir hale getirip örnek bir api yazalım.

Burada kafka’yı kullanmamın sebebi aslında projeyi zenginleştirmek ve yeni teknolojiler deneyimlemek oldu. Burada Kafka’nın teknik detaylarına değinmeyeceğim. Günün sonunda Kafka’ya tapucom e-commerce api ‘sinin ürün özelliklerini gönderip , o topici dinleyen bir consumer üzerinden loglarımı uygulamaya basacağım. Hadi o halde bir spring boot uygulaması oluşturup filebeat docker image’ini oluşturmaya başlayalım.

Build dosyamıza bu bağımlılıkları ekleyelim.

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>

Filebeat için image oluşturalım.

Son olarak filebeat.yml oluşturup ilgili konfigürasyonu yapalım. Buranın özelleşmesi tamamen geliştiriciye bağlı.

Şimdi ise docker build -t filebeat . komutu ile image oluşturmayı tamamlayalım. Sırada logstash image’i oluşturmak var. Bunu için de iki adımımız olacak.

  1. DockerFile dosyası
  2. Config dosyası

burada önemli olan elastic hostunu doğru verebilmek. Biraz canım yanmıştı hostları farklı kaydettiğim için. Config dosyasını hazırlayalım ..

Burada input ve output değerleri karşımıza çıkıyor. input’da nereden veri okuyacağı output da ise veriyi nereye yönlendireceğini söylüyoruz. Burada config dosyasında transform ve filtreleme işlemleri yapabiliriz. Örnek conf. dosyası.

Burada da son olarak docker build -t logstash . komutu ile image oluşturma işlemini tamamlayalım. Sonrasında ise Kafka kullanan spring uygulamasını dockerize edip compose dosyamızı oluşturmaya başlayalım.

Spring Boot Uygulamasını Dockerize Etmek

docker build -t ecommerce . diyerek son image’i oluşturup docker-compose dosyasını oluşturalım.

Genel olarak bu compose dosyasında neler olduğundan bahsedelim. İlk önce kafkanın çalışması için zookeper’i ekledik ve kafka konfigürasyonu yaptık. Burada kafka’yı broker ile adlandırdım. Daha sonra Kafka üzerindeki producer-consumer’ları ve giden mesajları grafiksel bir arayüzde görmek istediğim için Kafka-ui kullandım. Geri kalanlar spring uygulamamın ayağa kalkması için gereken teknolojiler. Şimdi bir endpoint oluşturup buraya bir log yazalım.

Burada sendKafka methodunda product topiğine eklenen ürünün tüm bilgilerini gönderdik.

Şimdi son olarak “product” topiğini dinleyen methodu görelim .

Burada gelen Json’u “,” ile ayırıp logların alt alta gelmesini istedim. Artık her ürün ekleme endpointine istek attığımda bu method tetiklenecek ve kibanaya loglar akmaya başlayacak.

/add-product apisine bir json isteği atalım.

İstek attığım anda veriler kafka topiğine yazıldı. Görsel üzerinden görelim bu datayı.

Verilerimin topiğe yazıldığını garantiledikten sonra asıl amacımız olan kibanaya yazıldığını da görmemiz gerek. http://localhost:5601/ adresine giderek create index diyelim ve gelen seçeneklerden dockerlogs olanı oluşturalım.

veriler sağlıklı bir şekilde geliyor. Artık elinizde tüm uygulamadan gelen loglar bulunuyor. Bunları yönetmek , izlemek ve filtrelemek sizin hayal gücünüze bağlı.

Bir sonraki yazımda ise Kubernetes cluster’larına kurulan ve open source bir service mesh ürünü olan Istio üzerinde ELK stack kurulumu ve log yönetimi başlıklarına giriş yapacağız.

Okuduğunuz için teşekkürler .

--

--