Merhaba, bu makalemizde “Elasticsearch slow query log” nasıl açılır ondan bahsedeceğim.
elasticsearch 8 üzerinde çalışan sorgu sürelerini yakalamak için slow query log’u kullanabiliriz. Bu sayede uzun süren sorguları veya istersek elasticsearch’e gelen tüm sorguları loglayabiliriz.
Elasticsearch’te temelde 2 farklı operasyon mevcut;
Her bir işlem için ayrı ayrı slow query log açılabilir. Ayrıca slow query log index bazlı açılabiliyor. Örneğin elasticsearch cluster’ınızda 100 farklı index olduğunu varsayalım. Bu indexlerin hepsinin değil de sadece performans analizi yapmak istediğiniz index’in slow query log’unu açabilirsiniz.
Slow query log’u açarken belli bir threshold verebiliyoruz. Örneğin sadece 100ms’den uzun süren sorguları logla ya da sadece 100ms-200ms aralığında çalışan sorguları logla gibi.
Slow query log’u açmak için hangi index üzerinde çalışacaksan o index’in slowlog ayarlarını değiştirmemiz gerekiyor.
Indexing sırasında yani veri kaydetme yapan sorguları loglamak için aşağıdaki şekilde üzerinde çalışmak istediğimiz index’in settings’ini değiştiriyoruz.
Burada verdiğimiz aralığa göre log.level belirleniyor. Yani aşağıdaki örnekte json dosyasına yazılacak log.level’lar şöyle olacak;
0ms-100ms aralığında süren sorgular log.level=TRACE
100ms-300ms aralığında süren sorgular log.level=DEBUG
300ms-500ms aralığında süren sorgular log.level=INFO
>500ms süren sorgular ise log.level=WARN
PUT /myindex/_settings
{
"index.indexing.slowlog.threshold.index.warn": "500ms",
"index.indexing.slowlog.threshold.index.info": "300ms",
"index.indexing.slowlog.threshold.index.debug": "100ms",
"index.indexing.slowlog.threshold.index.trace": "0ms",
"index.indexing.slowlog.source": "10000"
}
Ben elasticsearch üzerinde çalışan tüm sorguları loglamak istediğimden en düşük threshold’u 0ms olarak verdim. Bu sayede tüm indexing işlemlerini loglamış oluyorum.
Slow query log’u açtıktan sonra ilgili index’in shard’ları hangi sunucuda ise o sunucuya gidip logs dizini altında sorgulayabiliriz. Loglanan sorgular <cluster_ismi>_index_indexing_slowlog.json şeklinde bir json dosyasına yazılır.
-rw-r--r-- 1 elasticsearch elasticsearch 8.4K Dec 14 15:21 prod-cluster_server.json
-rw-r--r-- 1 elasticsearch elasticsearch 2.2K Dec 14 15:21 prod-cluster.log
-rw-r--r-- 1 elasticsearch elasticsearch 2.6M Dec 21 09:14 prod-cluster_index_search_slowlog.json
-rw-r--r-- 1 elasticsearch elasticsearch 128M Dec 21 12:43 prod-cluster_index_indexing_slowlog.json
Bu json dosyasının içini okuduğumuzda aşağıdaki gibi kayıtlar göreceğiz.
root@proddb1:/elasticdata/log# tail -1 prod-cluster_index_indexing_slowlog.json | jq
{
"@timestamp": "2022-12-21T09:47:47.500Z",
"log.level": "TRACE",
"elasticsearch.slowlog.id": "66377",
"elasticsearch.slowlog.message": "[myindex/-GbSOr-_T-i298lVSLDASD]",
"elasticsearch.slowlog.source": "{\\\"customerId\\\":111111111,\\\"myid\\\":1213123,\\\"companyName\\\":"test company"}",
"elasticsearch.slowlog.took": "510.3micros",
"elasticsearch.slowlog.took_millis": "0",
"ecs.version": "1.2.0",
"service.name": "ES_ECS",
"event.dataset": "elasticsearch.index_indexing_slowlog",
"process.thread.name": "elasticsearch[proddb1][write][T#7]",
"log.logger": "index.indexing.slowlog.index",
"elasticsearch.cluster.uuid": "E7--CBMcRqiNsk7wL3_asdasd",
"elasticsearch.node.id": "Xlw_fRgtRFqRQNvpE_ASD",
"elasticsearch.node.name": "proddb1",
"elasticsearch.cluster.name": "prod-cluster"
}
JSON içerisindeki “elasticsearch.slowlog.took” alanı çalışan indexing işlemini ne kadar sürede tamamlandığını belirtiyor.
Yapılan search işlemlerini loglamak için ise yine ilgili index’in ayarlarına değiştirmem gerekli. Aşağıdaki ayarı yaptığımda yine tüm search sorgularını loglamış oluyorum.
Search işlemlerini loglarken 2 ayrı seçenek mevcut; query ve fetch. Her bir işlem ayrı threshold’lara sahip olabilir.
PUT /myindex/_settings
{
"index.search.slowlog.threshold.query.warn": "500ms",
"index.search.slowlog.threshold.query.info": "300ms",
"index.search.slowlog.threshold.query.debug": "100ms",
"index.search.slowlog.threshold.query.trace": "0ms",
"index.search.slowlog.threshold.fetch.warn": "500ms",
"index.search.slowlog.threshold.fetch.info": "300ms",
"index.search.slowlog.threshold.fetch.debug": "100ms",
"index.search.slowlog.threshold.fetch.trace": "0ms"
}
Yukarıdaki konfigürasyonu yaptıktan sonra yine elasticsearch log dizininde <cluster_ismi>_index_search_slowlog.json dosyasına loglanıyor. Örnek bir kayıt aşağıdaki gibi;
root@proddb1:/elasticdata/log# tail -1 prod-cluster_index_search_slowlog.json | jq
{
"@timestamp": "2022-12-21T06:14:45.219Z",
"log.level": "TRACE",
"elasticsearch.slowlog.id": null,
"elasticsearch.slowlog.message": "[myindex][0]",
"elasticsearch.slowlog.search_type": "QUERY_THEN_FETCH",
"elasticsearch.slowlog.source": "{\\\"from\\\":0,\\\"size\\\":10,\\\"query\\\":{\\\"query_string\\\":{\\\"query\\\":\\\"((companyName:*test*)",
"elasticsearch.slowlog.stats": "[]",
"elasticsearch.slowlog.took": "1.2ms",
"elasticsearch.slowlog.took_millis": 1,
"elasticsearch.slowlog.total_hits": "6 hits",
"elasticsearch.slowlog.total_shards": 1,
"ecs.version": "1.2.0",
"service.name": "ES_ECS",
"event.dataset": "elasticsearch.index_search_slowlog",
"process.thread.name": "elasticsearch[proddb1][search][T#12]",
"log.logger": "index.search.slowlog.fetch",
"trace.id": "19efba8a59598easdasd103e1e",
"elasticsearch.cluster.uuid": "E7--CBMcRqiNsk7wL3_asdasd",
"elasticsearch.node.id": "Xlw_fRgtRFqRQNvpE_ASD",
"elasticsearch.node.name": "proddb1",
"elasticsearch.cluster.name": "prod-cluster"
}
search loglarında elasticsearch.slowlog.took süresinin yanı sıra elasticsearch.slowlog.total_hits field’inden sorgunun kaç adet doküman döndürdüğünü de görebiliriz.
Slow query log’u açıp ilgili logları yakaladıktan sonra query log’u kapatmak için tüm değerleri default olan -1’e çekmemiz gerekir. Bu sayede gereksiz log büyümesinden ve az da olsa performans kaybından kurtulmuş oluruz.
PUT /myindex/_settings
{
"index.search.slowlog.threshold.query.warn": "-1",
"index.search.slowlog.threshold.query.info": "-1",
"index.search.slowlog.threshold.query.debug": "-1",
"index.search.slowlog.threshold.query.trace": "-1",
"index.search.slowlog.threshold.fetch.warn": "-1",
"index.search.slowlog.threshold.fetch.info": "-1",
"index.search.slowlog.threshold.fetch.debug": "-1",
"index.search.slowlog.threshold.fetch.trace": "-1"
}
PUT /myindex/_settings
{
"index.indexing.slowlog.threshold.index.warn": "-1",
"index.indexing.slowlog.threshold.index.info": "-1",
"index.indexing.slowlog.threshold.index.debug": "-1",
"index.indexing.slowlog.threshold.index.trace": "-1",
"index.indexing.slowlog.source": "10000"
}
Umarım faydalı olmuştur. Keyifli okumalar.
Elasticsearch konusunda bu tarz bir hizmete ihtiyacınız olursa bizimle iletişime geçebilirsiniz.