Ana içeriğe atla

ELK Stack ile Microservice Mimarisinde Loglama (Elasticsearch + Logstash + Kibana + Spring Boot)

ELK Stack Nedir?







ELK Stack basit olarak Elasticsearch + Logstash ve Kibana araçlarının baş harfleri alınarak ortaya çıkarılmış bir isimdir.
Genel olarak herkes Kibana'yı bir loglama aracı olarak görsede Elastic tarafında işler tamamıyla farklıdır. Bu üç tool bir birbirine bağımlıdır ve serverlarınızda üçü de koşmalıdır.




elasticsearch-xelcode

Elasticsearch, inputları ve logları saklamamızda bize yardımcı olacak, Lucene arama motorunu temel alan bir NoSQL veritabanıdır.


logstash-xelcode

Logstash, gelen input ve logları kabul edip, çeşitli kaynaklara dağıtan bir işlem hattı aracıdır. Loglarımızı uygulamamızdan alıp uygun formata çevirdikten sonra elasticsearch tarafına aktarımından sorumlu olacak.

kibana-xelcode

Kibana ise kullanıcı tarafına en yakın yerde durup,  log verilerini elasticsearch'ten alıp görselleştirmekten sorumlu olacak. Aynı zamanda KQL denilen bir arama yapısı ile loglarımıza hızlıca erişmemizi sağlayacak.


Çalışma mimarisini bir görselle kolayca anlayabiliriz:

Spring Boot ve ELK Stack Mimarisi




Mimarimiz görseldeki gibi olacaktır. 
  1. Spring Boot frameworkünde kodladığımız microservicelerimiz .log dosyaları üretecekler.
  2. Bu .log dosyalarını logstash üzerine alıp elasticsearch'e aktaracak.
  3. Elasticsearch aldığı inputları kaydettikten sonra Kibana'ya gönderecek.
  4. Kibana elastichsearch üzerinden okuduğu datalar için bize görsel bir arayüz sunacak.

Öncelikle ben demoyu Windows için anlatıyor olacağım.  ELASTICSEARCH - LOGSTASH ve KIBANA isimlerinin üzerine tıklayıp .zip dosyalarını indirelim. 




İndirdikten sonra hepsini .zipten çıkarıp tek klasörde toplamakta fayda var. Şimdi yukarıdaki resimde gördüğümüz mimariyi yavaş yavaş oluşturalım. 

Öncelikle mimarimizin sağ tarafını yani Elasticsearch ile Kibana arasındaki bağlantıyı kuralım. Elasticsearch'ün bütün yapının merkezinde yer aldığını belirtmiştik. İlk önce Elasticsearch'ü ayağa kaldıralım. Terminal ekranı açıp \elasticsearch\bin konumuna ilerleyip elasticsearch.bat dosyasını çalıştıralım.



Ayağa kalktığında :9200 portunda ayağa kalktığına dair bir bildirimi terminal ekranından okuyabilirsiniz.



Teyit etmek için https://localhost:9200 adresine ilerlediğimizde JSON formatlı bir output görüyor olmamız gerekli.



Elastiksearch ayağa kalktığına göre şimdi sıra Kibana'da. Kibana'nın ayağa kalkması ve Elasticsearch ile konuşması için küçük bir konfigürasyon gerekli.  
Kibana klasörünün içinde /config/kibana.yml dosyasını bir tane text editör ile açalım. 28. satırdaki elasticsearch.hosts açıklama satırının başındaki # işaretini silerek aktif ediyoruz. Böylelikle Kibana hostu 9200 portu üzerinden dinleyecek. 



Şimdi Kibana'yı da ayağa kaldırmak için terminali /kinaba/bin adresine yönlendirip kibana.bat dosyasını aynı elasticsearch'te olduğu gibi çalıştırıyoruz. Kibana ayağa kalktığında da localhost:5601 portundan ayağa kalktığına dair bilgiyi terminal ekranından okuyabiliyor olmamız gerekli.



localhost:5601 adresine ilerlediğimizde bizleri Kibana'nın arayüzü karşılayacak.




Mimarimizde sağ tarafın inşasını bitirdiğimize göre sol tarafa yönelebiliriz. Şimdilik Kibana ve elasticsearch'ü kendi hâlinde bırakacağız. 
Elimizde kalan işlere bakacak olursak;
  • Microservisimizin bir .log dosyası üretmesi gerekli.
  • Bu .log dosyasını logstash içeri alıp işlemeli.
  • İşlenen bu loglar elasticsearch'e kaydedilmeli
İlk işimiz olan bir microservis mimarisinde bir uygulama yazalım. Microservice denildiği zaman akıllara bir çok servisçik geliyor olsa da ben işleri özetlemesi bakımından küçük bir servis yazdım. 
Servis kısaca bir kullanıcının id ve ismini geriye yönen, kişiyi id ile aradığımızda varsa bulunan kişiyi geriye dönen ve bir info logu yazan, yok ise null dönüp bir error logu yazan bir servis olacak. Servisi GitHub repository'mde paylaştım. Dileyenler için link vereceğim. Projemizin bir log oluşturması için application.properties dosyasının uzantısını application.yml olarak değiştirmemiz gerekli.



Sadece logging: file: name: alanını doldurmak yeterli olacaktır. Daha sonra LOGGER ile oluşturduğumuz loglar name: alanında belirttiğimiz .log dosyasına loglanacaklar. Benim örneğimde solvia.log dosyası oluşacak ve logları orada görebileceğim.



Uygulamama /getUser/id üzerinde bir çağrıda bulunduğumda geriye bir User dönecek. 


User'ı bulursa user'i geriye dönüp aynı zamanda bir log düşecek, aynı şekilde bulamadığında da null dönüp bir log düşecek. Haydi bir kaç test yapıp uygulamanın .log üretip üretmediğine bakalım. 

Öncelikle uygulamayı indirmek veya localinize klonlamak için aşağıdaki Github simgesine tıklayabilirisiniz. 



Uygulamam application.yml dosyasında da belirttiğim üzere 9898 portu üzerinden tetiklenecektir. Çok uzatmamak adına uygulamayı ayağa kaldırdıktan sonra bir var olan bir de olmayan bir User'a çağrı yapacağım, var olan User:



Var olmayan User:




Bir hata fırlattığını görebiliriz. Şimdi application.yml içinde belirttiğimiz adrese gidip dosyanın oluşup oluşmadığını ve içerisinin dolup dolmadığını kontrol edelim. 






Dosyanın belirttiğimiz yolda oluştuğunu ve içerisinin de başarıyla dolduğunu teyit ettikten sonra geriye kalan iki şey dosyayı Logstash'in içeriye alıp işlemesini sağlamak ve bu işlenen dosyanın elasticsearch'ten Kibana arayüzüne akmasını sağlamak. Bunu yapmadan önce şimdilik .log dosyamızın içerisini boşaltabiliriz. Haydi hep birlikte mimarimizin kalan tarafını tamamlamaya. 

Eğer logstash'i indirdiğimiz sayfaya bakarsak alt taraflarda bir yükleme talimatı göreceğiz. Bu talimatta da belirttiği üzere bir .conf uzantılı konfigürasyon dosyası oluşturmamız gerekli. 


Bu konfigürasyon dosyasında özetle: 
Logstash .log dosyasını nereden okuyacak (path - adres bilgisi) ve elasticsearch şu anda nerede koşuyor? (URL)

Belli bir formatı olan logstash.conf dosyasını ben aşağıdaki gibi oluşturdum ve bu dosyayı Logstash'in olduğu dizin de /bin klasörüne yapıştırdım.

input {
    file {
        path => "C:/ELK-Stack/logging/solvia.log"
        start_position => "beginning"
    }
}

output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        hosts => ["localhost:9200"]
    }
}


Dosyamızı kaydedip /bin yoluna yapıştırdıktan sonra bin klasörünün olduğu yolu kopyalayıp bilgisayarımızdaki Ortam Değişkenleri'nden PATH içine yapıştırmamız gerekli. Bunun için Bu Bilgisayara sağ tıklayıp Özellikler -> Gelişmis Sistem Ayarları -> Ortam Değişkenleri yoluna ilerleyelim. Altta sistem değişkenleri kısmında Path'e iki kez tıklayıp kopyaladığımız logstash'in yolunu yapıştıralım. 





Yapıştıktan sonra artık Logstash'i belirttiğimiz konfigürasyonlarla ayağa kaldırabiliriz. Terminal konumunu /logstash/bin konumuna getirdikten sonra terminale logstash -f logstash.conf yazarak ayağa kalkmasını bekliyoruz. 




Logstash'de ayağa kalktığına göre şimdi tekrardan servisimize dönüp yukarıda anlatıldığı gibi requestlerler gönderip loglar oluşturalım. Bu logların Logstash terminalinde de oluşup oluşmadığını kontrol edelim aynı zamanda. 





Logların Logstash ekranına başarıyla aktığını da teyit ettikten sonra son adımımız olan Kibana ayarlarını yapalım. 

Kibana'ya localhost:5601 adresinden erişebildiğimizi söylemiştik. Şimdi oraya tekrardan uğruyoruz ve sol üst köşedeki üç çizgiden hamburger menüyü açıyoruz. En alttaki Management sekmesinden Stack Management seçeneğine tıklıyoruz.



Açılan pencerenin alt kısmında Kibana sekmesinden Index Pattern seçeneğine tıklayalım. Ardından çıkan pencerede Create'e tıklıyoruz.

Daha sonra açılan pencerede alt kısımda logstash ile başlayan bir dosya ismi göreceksiniz arama kısmına sadece log yazıp Next seçeneğine tıklayınız.



Sonraki pencerede açılan timefilter seçeneğini şimdilik dont want diye onaylayabilirsiniz. Ayarları doğru bir hiyerarşi ile yaptıysanız çıktının şu şekilde olması gerekli:






Şimdi loglarımızı okuma sırası. Yine Kibana açılır penceresinden Discover'a ilerleyelim. Tebrikler loglarınızı başarıyla görüp yöneteceğiniz arayüz karşınızda.



Şu an itibariyle benim kayıtlarımda 48 log girdisi var. Yukarıdaki arama satırına Error veya info veya loglar içerisinde bulmayı umduğunuz herhangi bir şeyi yazarak, aramak istediğiniz şeye kolayca erişebilirsiniz.

Bu süreçte bir hata ile karşılaşırsanız şayet lütfen yorum atıp, paylaşmaktan çekinmeyiniz. Seve seve yardımcı olacağımdan hiç şüpheniz olmasın. 

Yorumlar

Bu blogdaki popüler yayınlar

Arduino Buzzer için Örnek Müzik Kodları

Bugün ki yazımda programlaması tamamıyla bana ait olan bazı buzzer kodlarını yazımın devamında paylaşıyor olacağım. Öncelikle bağlantı şemasıyla başlayalım; Malzemeler: Arduino (Uno, Nano, Mega) 100 Ohm Direnç Breadboard Bağlama Tarifi: Buzzer'da iki bacak bulunur. Buzzer'ın üstüne baktığınızda bacaklardan birisinin hizasında (+) yazar. Bu bacağı 8 No.lu pine bağlayabilirsiniz. veya istediğiniz herhangi başka bir digital bacak da olabilir. Kodunuzu da ona göre düzenlemeniz gerekir. İkinci bacağı da direnç üzerinden GND (-) Toprak hattına bağlamak gerekir. Bağlantı Şeması: Yukarıdaki şemada siyah (-), kırmızı (+) ucu temsil etmektedir. Ben kodlara ilgili notaların frekanslarını ekledim. Örnek olarak da 2 adet müziği buraya ekleyeceğim. sizler diğer müziklerin notalarını öğrendikten sonra duraksamaları deneme yanılma yoluyla bulabilirsiniz. Takıldığınız yerde aşağıya yorum bırakırsanız seve seve yardımcı da olabilirim. Notalar: 1 2 3 4 5 6 7

16x2 LCD I2C (i2c) Hataları ve Çözümler

Merhaba arkadaşlar arduino I2C modülü kullanımında oluşan bazı hatalardan bahsetmek istiyorum. Öncelikle bu modülle görüntü alamıyorsanız arkasındaki potansiyometreyi sağa ve sola çevirerek uygun konstrata getirin bu sebeple yazılar görünmüyor olabilir. Bağladığınızda arduino kapanıyorsa kısa devre vardır lehim aralıklarını kontrol edin temas olabiliyor. Eğer tek karakter ekranda çıkıyor diğer karakterler çıkmıyorsa aşağıda verdiğim kütüpaneyi yükleyin sorununuz çözülecektir. Eğer buna rağmen görüntü alamıyorsanız LCD panel adresiniz farklı olabilir  LiquidCrystal_I2C lcd(0x27, 16, 2);  kod satırındaki " 27 " yi " 3f " yapın. Yani şöyle olmalı  LiquidCrystal_I2C lcd(0x3f, 16, 2);  Bu şekilde büyük olasılıkla görüntü alamama sorununuz çözülecektir. I2C Port bağlantıları şöyle olmalıdır: gnd-gnd vcc - 5 v sda- A4 scl-A5 pinine bağlanmalıdır. Örnek Kod: #include <Wire.h> #include <LiquidCrystal_I2C.h> // LCD adres 0x3f 16 kara

PID Algoritmalı Çizgi İzleyen Robot (PID Line Follower)

PID var olan bir problemin çözümünde  Oranı, integrali ve Türevi toplayarak bir hata oranı çıkarır ve bunu minimuma indirgemek için bir yol geliştirilir. Daha sonra PID'nin detaylı açıklamasını yaparım. Bu yazıdaki amacım hani hep gördüğünüz virajları çok hızlı dönen çizgi izleyenlerin nasıl yapıldıklarını nacizane göstermek. Malzemeler: Arduino Nano veya UNO Pololu QTR 8RC Kızıl ötesi sensör dizisi Pololu TB6612FNG Motor Sürücü 2 Adet Redüktörlü 6V DC Motor 9V Tercihen Duracell Pil (Arduino beslemesi için)  11.1V bir Li-Po pil (Motor sürücü için) Bağlantı Şeması: Kaynak Kodu: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 #include <QTRSensors.h> #define Kp 0 // Kendi deneyimlerinizle bulmanız gerekli küçük bir değer ile başlayıp, büyütebilirsiniz en kararlı Kp değerini bulana kadar.. #