はじめに
現代のシステム運用では、メトリクス、ログ、トレース、構成情報など、さまざまなデータソースを組み合わせて分析する オブザーバビリティ が重要になっています。
たとえば「特定のホストでCPU使用率が高い原因はどのリージョンやラックに設置されたどのハードウェアか?」といった問いに答えるには、複数のデータを正確に突き合わせる必要があります。
ElasticsearchのES|QLでは、これまでLOOKUP JOINを使うことで異なるインデックスのデータを結合できましたが、単一キーでの結合しかサポートされていなかったため、同じホスト名が複数リージョンに存在する場合などには誤った結合が発生することがありました。
しかし最新のアップデートにより、複数キーでのLOOKUP JOINがサポートされるようになりました。
これにより、host.name と cloud.region のような複合キーで正確にデータを結合でき、Observabilityデータの分析精度が格段に向上します。
本記事では、この新機能を活用して サンプルデータを作成・Elasticsearchに投入し、複合キーJOINでメトリクスとインベントリ情報を結合する方法 を紹介します。
Elasticクラスタの作成
start localでPC上に作ってもクラウドでもOKです
Observability Solution Viewを前提にしています
-
クラウド
https://cloud.elastic.co/registration
HostedとServerlessがありますが、Serverlessは東京リージョンはまだAWSにしかありませんので、今回はhostedをベースに話を進めます
作成する際にObservabilityを選ぶと今回の用途には何かと便利です。
このキャプチャだと真ん中です。

-
ローカル
- start local
https://qiita.com/takeo-furukubo/items/df17ca57203825a45da1 - Solution view
start localで作るとKibanaの見た目がClassicというこれまで通りのものになります。
下記の記事を参考にObservability Viewにします
https://qiita.com/takeo-furukubo/items/b041b2aff9cf068c21f1
- start local
サンプルデータの準備
まず、Observabilityでよく使われる メトリクス情報 (metrics) と インベントリ情報 (inventory) の2種類のサンプルデータを用意します。
以下のGitHubリポジトリをクローンします
https://github.com/legacyworld/smart_join
環境変数
ES_ENDPOINT=https://your-deployment-id.region.cloud.es.io:443
ES_API_KEY=your_api_key_here
ES_INDEX_METRICS=metrics
ES_INDEX_INVENTORY=inventory
ここでENDPOINTとAPI_KEYが必要になります。
-
ENDPOINT
メニュー左下のデータベースアイコンをクリックして右上のConnection detailsをクリックすると表示されますので、Elasticsearch endpointをコピーします。

-
API KEY
メニュー左下の歯車をクリックしてAPI keysを選び、右上のCreate API keyをクリックすると作成画面が表示されます

プログラム実行
プログラムの中身
Pythonスクリプトでは以下を行います:
- .env から接続情報を読み込む
- metrics インデックスを存在する場合は削除して再作成
- inventory インデックスを LOOKUP JOIN 用に index.mode=lookup で作成
- サンプルデータを Elasticsearch に投入
実行
dockerで実行できます。
docker compose up -d
docker exec -it python python create.py
start localなどでElasticをローカルに立てている場合は、Elasticsearchにlocalhost:9200でアクセスできない(コンテナ自身になってしまう)ため、create.pyをPC上で実行するなどしてください
ES|QLでJOIN
Discoverに行って、右上にあるTry ES|QLをクリックします。

以下のように入れてみます
FROM metrics
| LOOKUP JOIN inventory ON host.name.keyword, cloud.region.keyword
| EVAL cpu_pct = system.cpu.usage * 100
| KEEP host.name, cloud.region, cpu_pct, system.memory.used_pct, hardware.model, hardware.rack
| SORT cloud.region, cpu_pct DESC
複数キーで突合できていることがわかります
まとめ
v9.0でJOINがリリースされて以来、いろいろご利用いただいていると思います。
今回はご要望の多かった複数キーでのJOINについて取り上げました。
これからもJOIN機能は増えていく予定です。様々な場面でぜひ使ってみてください
