はじめに
これまで Elastic Observability でフルスタックな観測を実現するには、Fleet Server や Elastic Agent、および各 Integration(System, APM等)の個別設定が必要でした。
しかし、最新の Elastic Observability (v9.2以降) では、OpenTelemetry (OTel) をネイティブにサポート。 これにより、独自エージェントの複雑な管理をスキップして、より標準的かつ柔軟にデータを集約できるようになりました。 本記事では、この新しい機能の使い方を解説します。
開発環境
- Elasticsearch / Kibana: v9.2.4 Basic License
- Python : v3.14
- Docker環境 : 筆者は Windows 上の Rancher Deskop 1.20.1 を利用
※ステータス: OpenTelemetry Integration は、Elasticsearch 9.2 時点で Preview です。
構成図
今回の構成では、Pythonアプリケーションが稼働するコンテナ内に EDOT (Elastic Distribution of OpenTelemetry) Collector を配置し、そこから直接 Elasticsearch へデータを送信します。

事前準備
リポジトリの取得と展開
まずは検証用コードをダウンロードします。
https://github.com/SIOS-Technology-Inc/elastic-blogs/tags にアクセスします。
release-2026-02-02 をクリックします。
Assets の Source code (zip) をクリックします。
elastic-blogs-release-2026-02-02.zip がダウンロードされます。
elastic-blogs-release-2026-02-02.zip を解凍します。
環境変数の設定
Windows などでターミナルを開きます。
2026-02-otel/app フォルダに移動します。
cd 2026-02-otel/app.env.sample をコピーして、パスワードやメモリ制限などの環境変数を設定します。
cp .env.sample .envメモ帳などで .env ファイルを編集します。
...
ELASTIC_PASSWORD=... (Elasticsearchのパスワードを設定します。)
KIBANA_PASSEORD=... (Kibana用の内部パスワードを設定します。)
...
SAVEDOBJECTS_ENCRYPTIONKEY=... (SavedObjects用の暗号化キーを設定します。)
...
ES01_MEM_LIMIT=... (Elasticsearchのメモリ上限を設定します。)
KB_MEM_LIMIT=... (Kibanaのメモリ上限を設定します。)コンテナの起動
docker compose -f docker-compose-es-kibana-python.yml up -dEDOT Collector の設定
5.1. Python コンテナへの接続
※今回は、Python を動かすコンテナに Elastic Distribution of OpenTelemetry (EDOT) Collector をインストールするので、Python コンテナへ接続します。
root 権限でインストールおよび実行するので、-u 0 を指定します。
docker exec -itu 0 app-python-app-1 /bin/bash5.2. EDOT Collector のダウンロード
下記で Elastic 9.2.4 用の EDOT Collector をダウンロードします。
wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-9.2.4-linux-x86_64.tar.gz
tar xvfz elastic-agent-9.2.4-linux-x86_64.tar.gz
cd elastic-agent-9.2.4-linux-x86_64
# 設定用ディレクトリの作成とサンプルのコピー
mkdir data/otel
cp ../otel.yml.sample otel.yml- otel.yml.sample は、あらかじめ elastic-agent-9.2.4-linux-x86_64 内の otel.yml.sample を抽出し、改変したものです。
- exporters/elasticsearch/otel/tls などを改変しています。
※otel.yml の編集は、後で行います。
Elasticsearch との連携設定
6.1. System OpenTelemetry Assets の有効化
Web ブラウザから http://localhost:5601 へアクセスし、
- ユーザーID: elastic
- パスワード: 4.2. で ELASTIC_PASSWORD に設定した文字列
で Kibana にログインします。
Management / Integrations 画面を表示します。

Display: beta integrations を ON にします(※System OpenTelemetry Assets は、Elastic 9.2.4 の時点では Preview 版のため)。

System OpenTelemetry Assets を検索し、クリックします。

右上の [↓ Install System OpenTelemetry Assets] ボタンをクリックします。

Install System OpenTelemetry Assets のダイアログが表示されるので、右下の [Install System OpenTelemetry Assets] ボタンをクリックします。

※Assets欄にあるダッシュボードがインストールされます。
6.2. API Key の生成
EDOT Collector から Elasticsearch へ書き込むための API Key を生成し、控えておきます。
Kibana の Home 画面から Elasticsearch アイコンをクリックします。

[Create API key ] ボタンをクリックします。

- Name : otel
と入力し、[Create API key] をクリックします。

API Key が生成されるので、コピーしておきます(メモ帳などに一時的にペーストしておきます)。

6.3. otel.yml の編集
Python を動作させているコンテナ上で作業します。
vi otel.yml取得した API Key を 5.2. で配置した otel.yml に反映させます。
...
exportes:
elasticsearch/otel:
endpoints: ["https;//es01:9200"]
api_key: "YOUR_API_KEY_HERE"
...6.4. EDOT Collector の起動
今回は、あくまでも検証用のための実行なので、ターミナルからバックグラウンドで実行します。
./otelcol --config ./otel.yml >> /var/log/otelcol.log 2>&1 &これで、Python コンテナのログやメトリクスが Elasticsearch へ送信されるようになります。
このコンテナからは、exit して OK です。
Python アプリのトレース取得
7.1 appuser で Python コンテナへ接続する
docker exec -it app-python-app-1 /bin/bash7.2. 計装 (Instrumentation) の準備
OpenTelemetry のライブラリをインストールします。
edot-bootstrap --action=install
opentelemetry-bootstrap -a install7.3. Python アプリの実行
コードに Elastic 専用の処理を書く必要はありません。 opentelemetry-instrument を冠して実行するだけで、自動的にトレースが送信されます。
実行する Python アプリ (src/test.py) のソースコード
3回ループするだけの単純な Python コードです。
import time
from opentelemetry import trace
def func1_sub(tracer):
with tracer.start_as_current_span("func1_sub"):
print ("Hello")
time.sleep(1)
def func1(tracer):
with tracer.start_as_current_span("func1"):
i = 0
while i < 3:
func1_sub(tracer)
i += 1
if __name__ == "__main__":
tracer = trace.get_tracer(__name__)
func1(tracer)Python アプリを実行します。
opentelemetry-instrument python src/test.pyこのコンテナからは exit して OK です。
観測データの確認
8.1. Dashboard の表示
Kibana の Analytics / Dashboard からダッシュボードを表示してみます。
- [Otel] Hosts Overview
※このダッシュボードは、6.1 で追加されたものです。
EDOT Collector を動作させているホストの稼働状況が可視化されます。

- [Otel] Host Details – Metrics
EDOT Collector を動作させているホストの CPU や Memory, Network など各種メトリクスが可視化されます。

8.2. Logs の表示
Kibana の Discover から logs-* を表示してみます。
EDOT Collector を動作させているホストの /var/log/*.log の内容が表示されます。
※ログが表示されない場合、表示対象期間を調整してみてください。

8.3. トレースの表示
Kibana の Observability / Application 画面を表示します。

Service inventory 画面が表示されます。

my-python-script を選択します。
- “my-python-script” という名前は、python/Dockerfile に OTEL_SERVICE_NAME として記載していたものです。
my-python-script の Overview が表示されます。

Transactions をクリックします。
src/test.py のトランザクションに関する情報が表示されます。

画面の下の方の Transactions の func1 をクリックします。
func1 の trace 情報が表示されます。

func1 内で func1_sub が3回実行され、実行時間はそれぞれ、3秒、1秒となっていることがわかります。
※ “func1” や “func1_sub” といった名前は、src/test.py 内に記載したものです。
まとめ
OpenTelemetry を採用することで、以下の大きなメリットが得られます。
- 運用の簡素化: Fleet Server や複雑な Agent 管理から解放されます。
- 脱ベンダーロックイン: 業界標準のプロトコル(OTLP)を使用するため、将来的なプラットフォームの移行や併用が容易になります。
- ポータビリティ: Elastic 固有のコードをアプリに埋め込む必要がなくなり、コードの純粋性を保てます。
現在 Preview 機能ですが、今後の Observability のデファクトスタンダードになることが予想されます。ぜひ今のうちに触れてみてください。

