はじめに
生成AIを利用してO11yやセキュリティを効率化・高度化するというのはElasticでもAI AssistantやAttack Discoveryという機能により対応しています。
今回ご紹介するのは、それより手前のクエリ文を使ったログ解析の部分で生成AIを使う方法です。
ES|QL
ES|QLはElasticsearchの新しいクエリ言語です。SQLをご存じの方なら何の抵抗もなく利用できるかと思います。
https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql
Qiitaにも記事がありました。
https://qiita.com/wooooo/items/ba46068307e045fd41e9
パイプでどんどん繋いでいくわけですが、その繋ぎ先の一つとして生成AIがあるわけです。
COMPLETION
Processing CommandとしてCOMPLETION
が用意されています。
https://www.elastic.co/docs/reference/query-languages/esql/commands/completion
ROW question = "What is Elasticsearch?"
| COMPLETION question WITH my_inference_endpoint
| KEEP question, completion
COMPLETION
機能は2025年8月21日現在、Technical Preview機能です。
正式リリース時には変更の可能性があります
ユースケース
当然ですが、「What is Elasticsearch?」を聞くために使うわけではありません。
ログを処理しながら生成AIに何かをやらせたいときに使うわけです。
今回ご紹介するユースケースは、NGINXのUser Agentにあるブラウザがいつリリースされたか、というのを生成AIに回答させるというものです。
NGINXのログはこんな感じです
6.143.29.34 - - [20/Aug/2025:06:24:25 ] "PUT /page-8.html HTTP/1.1" 404 4770 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"
ここのFirefox Version 101.0がいつリリースされたか、というのをチェックします。
Webサーバなどで何等かエラーが起きたときにそれがあるブラウザ固有の問題である可能性はあります。ダッシュボードでアクセスしてきているブラウザを円グラフなどで可視化されている方も多いでしょう。
その時に問題のあるブラウザがいつリリースされたのかがわかれば、問題発生日時と照らし合わせることで何らか原因が判明する可能性もあります。
もちろんこれ以外にもいくらでもユースケースはあると思いますが、実装が簡単なので今回はこのユースケースを例に取りながらCOMPLETION
の利用方法を説明していきます。
設定と環境
-
Elasticsearch
v9.1.2 -
Python動作環境
Mac M3
Docker 27.4.0 -
生成AI
gemini-2.5-Pro
手順
git cloneしてコンテナを立ち上げるだけです
Elasticsearchの準備
クラウドもしくはオンプレで用意する
- Elastic Cloud
https://cloud.elastic.co/registration - オンプレ
start localでPCで立てても問題ありません。
https://qiita.com/takeo-furukubo/items/df17ca57203825a45da1
(但しプログラムがElastic Cloudを前提としているので、Elasticsearchに繋ぐ部分は変更が必要)
Inference Endpoint作成
生成AIに投げるためのEndpointを作ります
https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-inference-put
geminiだとこんな感じになります。
一部hogehoge
にしてあります。
PUT _inference/completion/gemini
{
"service": "googlevertexai",
"service_settings": {
"service_account_json": """{
"type": "service_account",
"project_id": "hogehoge",
"private_key_id": "hogehoge",
"private_key": "-----BEGIN PRIVATE KEY-----hogehoge-----END PRIVATE KEY-----\n",
"client_email": "hogehoge",
"client_id": "hogehoge",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/takeo-serviceaccount%40elastic-sa.iam.gserviceaccount.com",
"universe_domain": "googleapis.com"
}
""",
"model_id": "gemini-2.5-pro",
"location": "us-central1",
"project_id": "hogehoge"
}
}
.env
の作成
cloud_id=
esapi_key=
以下を参考にそれぞれの値を入力します。
- Cloud ID
https://qiita.com/takeo-furukubo/items/e5d43fa734e4338b895f#%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95 - API Key
https://qiita.com/takeo-furukubo/items/6e067a361f9e5074f57d#api-key%E3%81%AE%E7%94%A8%E6%84%8F
コンテナ起動
docker compose up -d
NGINX疑似ログ作成 & Elasticへの投入
docker exec -it completion python nginxlog.py
プログラム内部の変数
- Ingest Pipeline
User AgentをパースするためにIngest Pipelineを使用しています。
pipeline_id
で決まっています。すでに存在する場合は上書きはしません
def setup_ingest_pipeline():
pipeline_id = "agent"
- インデックス名
ここのlogs-nginx
ingest pipelineはここでも使います。
def send_to_elasticsearch(log_entry):
"""Elasticsearchに投入"""
es.index(index="logs-nginx", document=log_entry, pipeline="agent")
Discoveryでデータを確認
こんな感じで見えるはずです。
見えない場合は左上のData view
がAll logs
になっているか確認しましょう。
インデックス名を変更している場合はそれに合わせてData View
を作成してください。
ES|QLで見てみる
例えばUser Agentのブラウザ名でGROUP BYしたい場合はこんな感じになります。
FROM logs-nginx
| STATS COUNT() BY user_agent.name.keyword
COMPLETION
してみる
今生成AIで確認したいのはUser Agentの名前とバージョンのリリース日です。
以下のように入れて実行してみます
Inference Endpointはここではgemini
になってますが、違う名前にしている場合は適宜変更します。
LIMIT 2
も適宜変更してください。大きくすると時間がかかる上に生成AIのコストをかかります。
FROM logs-nginx
| LIMIT 2
| EVAL prompt = CONCAT(
"このブラウザバージョンがリリースされた日付をmm/dd/yyyyのフォーマットで回答。日付のみ回答すること ",
"browser: ",user_agent.name, " version: ",user_agent.version)
| COMPLETION release_date = prompt WITH gemini
| EVAL release_date = DATE_PARSE("MM/dd/YYYY", release_date)
| KEEP release_date, prompt
まとめ
ES|QL COMPLETIONを使うと非常に簡単にログ解析に生成AIを取り込むことができます。
Elasticsearchはこれからも生成AIを簡単かつ効果的に利用できるように製品開発を行っていきます。
ぜひともお試しください。