Yazı hakkında bir yorum bırakmak için tıklayın.
Bu yazıya sizde katkıda bulunabilirsiniz.
Elasticsearch 5.0 sürümü ile birlikte yeni gelen yeni bir özelliği nasıl kullanacağımıza kısaca bir göz atalım. “Ingest Node”.
“Ingest Node” genel veri dönüştürmeleri ve zenginleştirmeleri için kullanabileceğiniz yeni bir Elasticsearch node türüdür.
Her bir görev bir processor
olarak temsil edilir. Her bir processor
bir pipeline
lar
dizisinden ile oluşur. (Buradaki terimlerin çevirilerini yapmadım ancak processor
‘ü
veri işleyen bir yapı, pipeline
‘ı ise veri işleme hattı olarak düşünebilirsiniz.)
Şu anda hali hazırda Elasticsearch içerisinde 20 tane processor
bulunmaktadır.
Örneğin: grok, date, gsub, lowercase/uppercase, remove ve rename. Tam listeye
şu adresten(adres içeriği ingilizcedir) ulaşabilirsiniz.
Bunun yanında ingest
özelliği için ayrıca 3 tane eklenti daha bulunmaktadır:
_ingest
arayüzü ile kolayca yeni bir “ingest pipeline” oluşturabilirsiniz.
PUT _ingest/pipeline/rename_hostname
{
"processors": [
{
"rename": {
"field": "hostname",
"target_field": "host",
"ignore_missing": true
}
}
]
}
Bu örnekte rename_hostname
adında bir “pipeline” oluşturduk ve bu sadece
hostname
alanını alıp adını değiştirip host
olarak geri yazıyor. Eğer hostname
yok ise processor
işlemine hata vermeden devam ediyor.
“Pipeline”ı kullanmak için çeşitli yollar mevcut.
Direk Elasticsearch API üzeriden kullanırken, pipeline
parametresini url parametresi
olarak göndermeniz yeterlidir. Örneğin :
POST server/values/?pipeline=rename_hostname
{
"hostname": "myserver"
}
Logstash ile kullanırken çıktı ayarlamaları arasına pipeline
parametresini eklemelisiniz:
output {
elasticsearch {
hosts => "192.168.100.39"
index => "server"
pipeline => "rename_hostname"
}
}
Benzer şekilde Beat uygulamasını kullanırken yine çıktı ayarları arasına pipeline
parametresini eklemeniz gerekir:
output.elasticsearch:
hosts: ["192.168.100.39:9200"]
index: "server"
pipeline: "convert_value"
Note: Alpha 5.0 sürümünde, Beat ayarlarında
parameters.pipeline
şeklinde kullanmalısınız
Yeni bir pipeline oluşturduğunuzda, gerçek veri üzerinde kullanmadan önce test edebilmek ve bir hata fırlatıp fırlatmayacağını araştırmak gerçekten çok önemlidir.
Bunun için bir Simulate API mevcuttur:
POST _ingest/pipeline/rename_hostname/_simulate
{
"docs": [
{
"_source": {
"hostname": "myserver"
}
}
]
}
Sonuçlar bize alanın başarılı bir şekilde değiştiğini gösterecektir:
[...]
"_source": {
"host": "myserver"
},
[...]
Gerçek dünyadan bir örnek ile devam edelim: Web Günlükleri.
Bu “Combined Log Format” içerisinde Apache httpd ve nginx tarafından desteklenen girdi günlüğünün bir örneği:
212.87.37.154 - - [12/Sep/2016:16:21:15 +0000] "GET /favicon.ico HTTP/1.1" 200 3638 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"
Gördüğünüz gibi birkaç parça bilgiden oluşan bir metin: IP adres, zaman damgası, kullanıcı aracısı(user agent) ve daha fazlası. Hızlı bir arama ve görselleştirme sunmak için verimizi parçalara ayırıp Elasticsearch’de kendi alanları içerisine koyacağız. İsteğin nereden geldiğini bilmemiz de gerçekten çok yararlı olurdu. Bunları hepsini aşağıdaki pipeline ile yapabiliriz.
PUT _ingest/pipeline/access_log
{
"description" : "Ingest pipeline for Combined Log Format",
"processors" : [
{
"grok": {
"field": "message",
"patterns": ["%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \\[%{HTTPDATE:timestamp}\\] \"%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} (?:-|%{NUMBER:bytes:int}) %{QS:referrer} %{QS:agent}"]
}
},
{
"date": {
"field": "timestamp",
"formats": [ "dd/MMM/YYYY:HH:mm:ss Z" ]
}
},
{
"geoip": {
"field": "clientip"
}
},
{
"user_agent": {
"field": "agent"
}
}
]
}
Bu örnek 4 processor
içermektedir:
grok
regular expression ile metin halindeki günlük verisini işleyip kendi alanları olan yapısal bir hale getirmektedir.date
dökümanın zaman dangası bilgisini tanımlamaktadır.geoip
istekte bulunanın IP adresini alıp iç bir veritabanına sorarak coğrafi konumunu belirlemektedir.user-agent
kullanıcı aracı bilgisini metin olarak alıp yapısal bir hale getirmektedir.Son iki processor
Elasticsearch’e eklenti olarak gelmektedir. Bu yüzden onları
öncelikli olarak kurmalıyız:
bin/elasticsearch-plugin install ingest-geoip
bin/elasticsearch-plugin install ingest-user-agent
Pipeline’ı test etmek için Simutale API’ı kullanabiliriz :
POST _ingest/pipeline/httpd_weblogs/_simulate
{
"docs": [
{
"_source": {
"message": "212.87.37.154 - - [12/Sep/2016:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\""
}
}
]
}
Sonuç bize çalıştığını göstercektir:
{
"docs": [
{
"doc": {
"_index": "_index",
"_type": "_type",
"_id": "_id",
"_source": {
"request": "/favicon.ico",
"agent": "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"",
"geoip": {
"continent_name": "Europe",
"city_name": null,
"country_iso_code": "DE",
"region_name": null,
"location": {
"lon": 9,
"lat": 51
}
},
"auth": "-",
"ident": "-",
"verb": "GET",
"message": "212.87.37.154 - - [12/Sep/2016:16:21:15 +0000] \"GET /favicon.ico HTTP/1.1\" 200 3638 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36\"",
"referrer": "\"-\"",
"@timestamp": "2016-09-12T16:21:15.000Z",
"response": 200,
"bytes": 3638,
"clientip": "212.87.37.154",
"httpversion": "1.1",
"user_agent": {
"patch": "2743",
"major": "52",
"minor": "0",
"os": "Mac OS X 10.11.6",
"os_minor": "11",
"os_major": "10",
"name": "Chrome",
"os_name": "Mac OS X",
"device": "Other"
},
"timestamp": "12/Sep/2016:16:21:15 +0000"
},
"_ingest": {
"timestamp": "2016-09-13T14:35:58.746+0000"
}
}
}
]
}
İkinici kısımda Filebeat kullanarak ingest pipeline nasıl oluşturulur göstereceğiz ve Elasticsearch ve Kibana ile günlükleri görselleştireceğiz.
Note : Bazı terimlerin çevirisinde anlama sıkıntısı ortaya çıkaracağı için çevirisini yapmadım.
Kaynak : https://www.elastic.co/blog/new-way-to-ingest-part-1