Open Source Olarak Kullanılan ELK Yapısında Dashboard Raporları Nasıl Gönderilir?

Birol EMEKLİ
Devops Türkiye☁️ 🐧 🐳 ☸️
3 min readDec 17, 2019

--

Merhabalar,

Bir önceki yazımda ELK yapısına open source olarak Search Guard ile login sayfası nasıl implement edilir bunun üzerinde durmuştum. Bu yazımda ise kibana üzerindeki dashboardların günlük olarak bana iletilmesini istiyorum, fakat open source ELK yapısında bu özellik malesef yok. Ama eğer lisansınız varsa zaten bu imkanı size sağlıyorlar.

Bende yine open source olarak bu isteğimin nasıl gerçekleştirebileceğimi düşünürken daha önce de kullanmış olduğum selenium ile bunu yapabileceğim sonucuda vardır. Python ve selenium kullanarak bu dashboardların günlük olarak nasıl iletilebileceğine şimdi beraber bakalım.

from selenium import webdriver
from time import sleep
import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
import smtplib
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--window-size=1420,1080')
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
driver=webdriver.Chrome('/usr/local/bin/chromedriver',chrome_options=chrome_options)driver.get("http://kibanaip:5601")

İlk olarak selenium ve python kurulumunu yapıyoruz. Daha sonra chromedriver indiriyoruz. Yukarıdaki gibi chrome driver ayarlarını yapabiliriz. Burada driver.get ile kibana url adresimizi giriyoruz. Tarayıcı gidip bu adresi açıyor. Burada dikkat edilmesi gereken driver kapanmadığı sürece proses olarak hayatına devam etmesidir. :) Yukarıda driver kapatılmadığı için proses hala devam etmektedir. Ben geliştirmeleri linux ortamında gerçekleştiriyorum.

Bir önceki yazımda search guard kurulumu yapmıştım. Burada driver login sayfasına erişmiş olacak. Burada username ve password alanlarının id bilgileri ile bularak istediğim kullanıcı bilgilerini girmesini sağlıyorum.

_username=driver.find_element_by_id('sg.username')
_username.clear()
_username.send_keys("kibanauser")
sleep(0.5)_password=driver.find_element_by_id('sg.password')
_password.clear()
_password.send_keys("kibanapassword")
sleep(0.5)button=driver.find_element_by_id('sg.login')
button.click()

Yukarki kod çalıştığında login sayfasında bulunan textlerin id ile bulunarak send_keys ile istediğim bilgileri girmesini sağlıyorum. Daha sonra login buttonu id ile bulup click özelliği ile tıklatıyorum ve login oluyoruz. Kibana ana sayfasına düşmüş oluyoruz. Bu aşamadan sonra ben direk dashboard üzerinden share seçeneğinden aldığım linkler ile ilerleyeceğim. İsterseniz dashboard alanına tıklatıp, oradan istediğiniz dashboard ismini bulup girerek de yapabilirsiniz. Fakat ben mail olarak iletmek istediğim dashboardlar belli olduğu için bu şekilde bir yöntem seçtim.

driver.get("http://kibana:5601/goto/7d5b4170f3c051251936354ee3d4f743790")

Login olduktan sonra tabi driver hala kapatmadıysak ya da kapanmadıysa dashboard üzerinden aldığımız linke direk gidebiliriz.

name=driver.find_element_by_xpath('//*[@id="kibana-body"]/div/div[2]/div[1]/nav/span').textsleep(1)full=driver.find_element_by_xpath('//*[@id="kibana-body"]/div/div[3]/div/div[2]/dashboard-app/kbn-top-nav/kbn-top-nav-helper/span/div[1]/div[1]/button/span/span')full.click()sleep(15)
el = driver.find_element_by_tag_name('body')
total_height = el.size["height"]+1000
driver.set_window_size(1920, total_height)

Daha sonra girmiş olduğum dashboard üzerinden dashboard başlığını(name) alıyorum, bu alanı mail gönderirken ve screenshot kaydederken kullanacağım. Daha sonra tam ekran yapmak için tam ekran buttonunu buldurup(full) tıklatıyorum ve ekranı daha geniş kaydedebilmek için driver size ile değişiklikler yapıyorum. Buradaki sleepler ekranın istenilen bilgiler ile dolması için bekletiliyor. Burada selenium ile çalışırken her farklı işlemde ms bile olsa bekletmek gerekiyor. Çünkü web sayfası açılışı yavaş olduğu için selenium burada istenilen alanı bulamıyor ve hata verebiliyor.

date=datetime.datetime.now()
date=date.date()
driver.save_screenshot('/mail/{0}-1}.png'.format(str(date),name))
sleep(1)
image_name=(str(date)+"-"+name+".png")
driver.quit()

Daha sonra ekran screenshot almaya geldik. Şimdi burada düzenli bir şekilde saklamak için tarih ve yukarıdaki bir bölümde dashboard alanının başlık kısmını almıştık. Onunla birleştirerek kayıt edecek şekilde işlemi gerçekleştiriyoruz. Driver ile işimiz bittiği için kapatabiliriz. Unutmayalım yoksa prosesler şişer :)

Bu aşamalardan sonra artık selenium ve python ile kibana arayüzüne giriş yapmış, istenilen dashboard ekranı üzerindeki başlığını alıp, tam ekran yapıp belirtli bir süre ekrandaki verilerin dolmasını bekledikten sonra, ekran screenshot alarak tarih ve dashboard başlığı ile kaydettik. Şimdi geldi bu raporu kullanıcılara mail atmaya.

msg = MIMEMultipart()
password = “mailpassword”
msg[‘From’] =”mailadress”
msg[‘To’] = “gonderilecekmailadresi”
msg[‘Subject’] = “Rapor”
msg.attach(MIMEImage(file(“/mail/” + image_name).read()))
server = smtplib.SMTP(“1.1.1.1”,”25")
server.starttls()
server.login(msg[‘From’], password)
server.sendmail(msg[‘From’], msg[“To”].split(“,”), msg.as_string())

Daha sonra yukarıki gibi bir mail modulu yazıyoruz. Burada kaydettiğimiz ekran görüntüsü raporunu göndereceğiz. İlgili yerleri doldurduktan sonra, screenshot kaydettiğimiz yerden image_name ile resmi okutarak alıyoruz ve ilgili kullanıcılara gönderiyoruz.

Bu aşamadan sonra isterseniz crontab ile günlük olarak bu raporlarınızı belirli bir saatte kendinize iletebilirsiniz. Bu sayede open source çözümlerle kibana arayüzünden istediğimiz verileri almış olduk. Benden bu kadar :)

Kodu githuba atacağım. Buradan inceleyerek daha iyi anlaşılacağını düşünüyorum.

Kodları githuba yükledim. Burdan bakabilirsiniz.

--

--