Python ile Elasticsearch ve Kibana ML Kullanımı

Uygulama Yönetimi Ekibi
6 min readAug 22, 2022

Selamlar, bu haftaki yazımızda Elastichsearch yardımıyla, Python kullanarak Kibana alternatifi görselleştirme yapacağız. Önceki ELK konulu yazımızda Ubuntu 20.04 OS’e sahip makinede ELK uygulamalarının nasıl kurulacağını anlatmıştık. Bu kurulum sayesinde, Logstash kullanarak SQL Server’daki sorgu aracılığıyla oradaki verileri Database Converter kullanarak Elasticsearch’ün anlayabileceği forma getirmiştik. Elasticsearch’te bulunan data klasöründe saklanan verilerin de Kibana aracılığıyla görselleştirilmesi sağlanmıştı. Kibana bize sadece görselleştirme sağlamaz, aynı zamanda 9200 portunu, yani Elasticsearch’ü, da yönetir. Bu arayüzde indislerin silinmesini, kullanıcı oluşturulmasını ve diğer güvenlik işlemlerinin gerçekleştirilmesini sağlarız.

Bugün ise bu sunucuda yapılan işlemleri Python’da bazı kütüphaneleri kullanarak gerçekleştireceğiz.

İlk adım olarak Elasticsearch’e login olabilmek için gerekli kütüphaneyi kurmakla başlıyoruz. Bunun aşağıdaki ilgili komutu çalıştırıyoruz:

pip install elasticsearch

Elasticsearch’ten gelecek olan verileri anlamlı formata gelmesini sağlayacak olan Pandas’a da burada büyük sorumluluk düşüyor:

pip install pandas

Python kodunu hazırlarken göreceğiz ki, kullanacağımız query formatı Kibana’da Dev Tools kısmında yazdığımız tarza benzer bir şekilde olacak. Kibana’da GET, POST kullanılarak yapılan işlemleri burada da gerçekleştirebilmiş olacağız.

Daha önceki yazımızda, kurulum sırasında eklenmeyen ancak burada güvenlik önlemleri sebebiyle Kibana’ya erişmek veya log atamaları işlemlerini gerçekleştirebileceğimiz bir kullanıcıya ihtiyacımız olacaktır. Bu kullanıcıyı oluşturmak için öncelikle Elasticsearch’ün kurulu olduğu sunucuda /etc/elasticsearch/elasticsearch.yml dosyasını düzenlemek için açıyoruz ve aşağıdaki iki parametreyi aktifleştiriyoruz.

xpack.security.enabled: truexpack.security.transport.ssl.enabled: true

Aksi takdirde şifre oluştururken bu parametrelerin açılmasını gerektiren error logları ile karşılaşacaktık. Bu işlem sonrası Elasticsearch restart edilir ve sıradaki komut girilir;

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

Burada ELK uygulamalarının default kullanıcıları için şifreler oluşturduktan sonra Python ile işleme devam ediyoruz.

Daha sonra oluşturduğumuz kullanıcı adı, şifre ve elasticsearch sunucusunun IP adresi ile Port’unun belirtildiği .env dosyasını oluşturuyoruz.

ELASTIC_URL = ‘http://Sunucu_adi:9200' 

ELASTIC_USER = ‘elastic’
ELASTIC_PASSWORD = ‘olusturulan_sifre’

Ardından dotenv kütüphanesi ile bu dosyadaki kullanıcı, şifre ve port bilgilerini main Python kodumuzda belirtiyoruz.

load_dotenv() 

elastic_url = os.getenv(“ELASTIC_URL”)
elastic_user = os.getenv(“ELASTIC_USER”)
elastic_pass = os.getenv(“ELASTIC_PASSWORD”)
es = Elasticsearch([elastic_url], basic_auth=(elastic_user, elastic_pass))

Burada “es” olarak yazılan kısım Elasticsearch kütüphanesinin birincil komutu olup, 9200 portuna başarılı bir şekilde erişmemizi sağlayacak olan işlemdir.

Şimdiki amacımız KPI metrikleri içerisinde belirli bir sunucu için ortalama response süresi ve başarılı response süresinin belirtildiği bir plot ortaya çıkarmaktır. Python’da çizdireceğimiz grafik ile Kibana’daki oluşturulan grafiği kıyaslayarak hangisinin daha işlevsel olduğunu belirleyebileceğiz. Python’da çizim işlemlerimizi gerçekleştirmek için ise matplotlib kütüphanesini kurmamız gerekmektedir:

pip install matplotlib

Bu işlemi gerçekleştirdikten sonra önce Elasticsearch’ün anlayacağı queryi yazmamız gerekmektedir. Bu işlemi get_elasticsearchdata adlı bir fonksiyonda gerçekleştiriyoruz:

def get_elasticsearchdata(): 
#elasticsearch query
query = {
“query”: {
“wildcard”: {
“(Filtrelenecek Sunucu Sütunu)”: “*(Buraya sunucu adı için anahtar kelime girilir)*”
} } }

Yazılan query belirtilen sunucu veya sunucular için anahtar kelimeleri filtrelenmesini sağlar. Bu SQL query’sini yazarken kullanılan LIKE komutunun Kibana Dev Tools’taki versiyonudur ve filtrelemek için uygun bir araçtır.

Sırada query’nin yazıldığı fonksiyonun Elasticsearch.Helpers.actions.scan tarafına yollanması bulunuyor. Bu kısmı ise True ve False ayarları ile birlikte kendi indisimize göre uyarlıyoruz. Bizimkisi için örnek index pattern’imiz kpi_metrics_logs_2022.08.20 olacak. Burada tarih yerine (*) koyarak da bu isimdeki Logstash’ten günlük gelen tüm metriklerin çekilmesini sağlıyoruz.

part_of_index = scan(client=es, 
query=query,
index=’kpi_metrics_logs_2022.08.20',
raise_on_error=True,
preserve_order=False,
clear_scroll=True
)

Ardından burada oluşturulan sonucu listeliyoruz ve sonrasında boş bir array oluşturuyoruz.

result = list(part_of_index) 

temp = []

Burada oluşturulan boş temp array’ine ise her bir veriyi basıyoruz. Tüm alanları “_source” etiketiyle bastırmamız gereklidir. Ardından pandas yardımıyla bu arrayi dataframe haline getiriyoruz ve veri anlamlı değer kazanmış oluyor.

for hit in result: 
temp.append(hit[‘_source’])

df = pd.DataFrame(temp)

Matplotlib yardımıyla oluşan verilerimizin Field Name farklılıklarına göre istediğimiz şekilde grafiklerinin yazdırılmasını sağlıyoruz. Burada Line Chart yaparak veriyi görselleştireceğiz.

plt.plot(df[‘successaverageresponsetime’], 
df[‘averageresponsetime’],
‘r-’, label=’Success Average Response Time according to Average Response Time’,
linewidth=2,
markersize=5,
marker=’o’,
markerfacecolor=’blue’,
markeredgecolor=’red’,
markeredgewidth=2,
alpha=0.5)
plt.show()

Plot’umuzu daha iyi anlaşılması için customize ettikten sonra kodumuzu run edebiliriz ve response timeların toplamının grafiğe dökülmüş halini görebiliriz.

Matplotlib ile Oluşan Line Chart
Kibana Dashboard’unda Hazırlanan Line Chart

Görüldüğü üzere iki aynı amaca yönelik grafik de farklı platformlarda oluşturulmuştur. Python’da oluşturulan grafikte detay görüntülemek zorlasa da Kibana dashboard’unda oluşturulan grafik detay görüntülemeye farklı timestmapler için olanak sağlar. Ama burada asıl gösterilmek istenilen de verileri doğru bir şekilde çekilip çekilemediğiydi. Bunu da böylece gerçekleştirebilmiş olduk.

Bu verileri pandas yardımıyla bir tabloya dönüştürebiliriz. Verilerin dağınık görünmemesi için aşağıdaki ayarlamaları kodumuzda gerçekleştirmeliyiz.

df = get_elasticsearchdata() 
pd.set_option(‘display.max_rows’, None)
pd.set_option(‘display.max_columns’, None)
pd.set_option(‘display.width’, None)
pd.set_option(‘display.max_colwidth’, None)
df.columns.values.tolist()

Böylece sütunları anlamlı bir şekilde görüntüleyebilmiş olduk. Bu bilgiler Elasticsearch’ten direkt kendi IDE’mize aktarıldı.

resp = es.info() 
elastic_homepage = pd.DataFrame(resp)

Burada gerçekleştirilen kodlar yardımıyla 9200 portuna browserdan gittiğimizde gördüğümüz ekranın sütunlarını görmüş olacağız.

Elasticsearch data klasöründe kayıtlı indislerimizden birisini silmek için ise aşağıdaki komut satırını yazmak yeterli olacaktır. Bu kısmı bir cronjob gibi kullanarak komut schedule edilebilir ve böylece diskte şişme engellenebilir. Python’ı burada elasticsearch-curator’a bir alternatif olarak kullanmış oluruz.

es.indices.delete(index=’hedefteki_indis’, ignore=[400, 404])

Bu komut sayesinde hedefteki index’i silmiş oluyoruz.

Python’da Regression Modelleri ile Kendi Kibana ML Tahminimizin Oluşturulması

Elasticsearch, Kibana arayüzünde Analytics kısmında Machine Learning kısmına yer verir. Bu hizmeti lisanslı olarak sağlar.

Biz de kodumuzun bu kısmında bir sunucuda bulunan bir site’nin login ekranının totaldeki request sayısına göre ne kadar başarılı olduğunu matplotlib kütüphanesi yardımıyla çizdiriyoruz. Bu çizilmiş olan grafiğe de Polynominal Regression modelimizi numpy yardımıyla uyguluyoruz. Verilen grafik için Linear Regression modeli de uygulanabilirdi ama kimi siteların belirli saat aralıklarında farklı request sayılarıyla karşı karşıya kaldığını düşünerek bu kısımda genel olarak Polynominal Regression modelinin uygulanabileceğini belirtebiliriz.

Öncelikle hedefteki verilerimizi boş arraylerimizin içine yazdırıyoruz.

successcount_array = df[‘successrequestcount’] 
totalcount_array = df[‘totalrequestcount’]

Numpy kütüphanemizi hali hazırda import etmiştik. Şimdi de numpy içinde bulunan polyfit’i çağırıyoruz.

polymodel = np.poly1d(np.polyfit(totalcount_array, 
successcount_array,
3)
)

polyline = np.linspace(0, 30, 100)

plt.scatter(totalcount_array,
successcount_array)
plt.plot(polyline, polymodel(polyline),
‘r-’,
label=’Total Request Count with Poly Regression Model’
)
plt.show()

Grafiğimizi bastırınca 0 ve 30 arasında bu şekilde sonuçlar elde ediyoruz.

Polynominal Regression modelinin asıl katkısını ise site çok fazla request aldığında gözlemleyebiliriz. Örneğin endpointimizi 30 yerine 1200 yaptığımızı varsayarsak bize ilerleyen zamanlarda bu sunucuda aynı performansı gösteren bir site’ın bu url için nasıl performans gösterebileceğini aşağı yukarı belli eder.

Doğrumuzun maksimum performansı göstermesi için linear olması gerekmektedir. Bu da şunu gösterir, Site üzerinde yapılan iyileştirmeler sonucunda ortaya çıkan daha iyi performans, bu eğrinin optimal olmasını sağlar. Kibana’nın Machine Learning kısmı da kullanıcıya veya şirketlere bu tarz geliştirmelerin yapılması konusunda fikir sağlamasına olanak verir.

Bu yazımızda Python ile daha önceden kurduğumuz Elasticsearch’ün yönetimine ve indislerin görüntülenmesinin üzerinden geçmiş olduk. Grafiğe dökme konusunda ise Kibana’nın, Python kütüphanelerine göre ne kadar başarılı olduğunu görmüş olduk. Aynı zamanda verileri Python’da barındırdığımız için de Machine Learning metodlarını kullanarak lisans yükseltmeden, Kibana’nın avantajlarından Python ile yararlanabileceğimizi de bir regression modeliyle de olsa deneyimledik.

Okuduğunuz için teşekkürler, yeni yazılarda görüşmek üzere.

Emekleri için İsmail Tarık ÖZLÜK’e teşekkür ederiz…

https://www.linkedin.com/in/tar%C4%B1k-%C3%B6zl%C3%BCk-08a9261b9/

--

--