はじめに
本記事は2023.12.13のElasticsearch勉強会で話した内容です。デモを見たい場合、Youtubeにこれから上がる勉強会の動画(最後のセッション)をご覧ください。
利用環境はElasticsearch v8.11, Elastic APM Python Agent 6.xですが、これより多少古くても同じように動くと思います。
以下のように、APMを使うことで、Elasticsearch Clientから実行されるクエリーなどを捕捉し、そのデータをKibanaで分析するなどできます。
これをクイックに検証できるようにしたサンプルコードがこちらです。
https://github.com/nobuhikosekiya/elasticseach-query-apm-analyze-sample
Jupyter Notebook形式のPythonプログラムとなっていて、コードを順番に実行していくことができます。
- テストできるElastic Cloudがある場合、Open in ColabボタンからGoogle Colabでそのまま実行し、Elastic Cloudへの接続情報を入力して実行できます。
- ローカルPCなどにオンプレのElasticsearch + APMサーバーがある場合、NotebookファイルをローカルのJupyter環境で開き、実行してElasticsearchに接続できます。
検証結果
Manual Instrumentationの場合でできること
コードの抜粋ですが、このように自分で記録したいデータをelasticapm.labelとして入れることができます。この場合は、検索クエリー、検索ワード、検索ヒット数を取得しているという一例です。
search_key_word="iPhone"
query={"match": {"question": search_key_word}}
query_user_input=search_key_word
# set labels to the current transaction
elasticapm.label(query=query, search_key_word=search_key_word, execution_count=j)
response = es.search(index=INDEX_NAME, query=query)
print(response.body)
hit_count=response['hits']['total']['value']
# set labels to the current transaction
elasticapm.label(hits=hit_count)
今回は普通のAPMの使い方ではなく、独自の分析となるので、DiscoverやDashboardで分析します。データはDiscoverのAPM Dataviewで確認できます。それらのデータを検索ログの分析という用途でダッシュボード化したのがこちらです。(export_dashboard.ndjsonのダッシュボードのエクスポートをKibanaからImportしてください)
Auto-Instrumentationでできること
Elasticsearch ClientのAPIが呼ばれる箇所が自動的に補足され、以下のようにAPM画面で見ることができます。
上の図のES POST ... のSpanデータを開くと、実際のクエリー文も確認できますが、このフィールド(span.db.statement)はデフォルトではインデックスされたフィールドではないので、分析にかけることはできません。(インデックスするように変更はできますが、JSON文字列なので、それもまた解析できる形に頑張る必要あり)
おわり
本格的にこのやり方を本番に入れてみたいという場合は、ぜひご相談ください。