[v9.0] Elastic Distributions of OpenTelemetry (EDOT)を試す

# はじめに
APMによるトレースの取得はOpenTelemetryで行うようになってきましたが、通常のログやメトリクスの取得も含めて全てOpenTelemetryで行えるようになってきています。
Elasticはそのような要望に応えるためにElastic Distributions of OpenTelemetry (EDOT)をリリースしています。
https://elastic.github.io/opentelemetry/

EDOTをを利用することでElastic Common Schema(ECS)に準拠しながら標準のOpenTelemetryを利用することが出来ます。

本記事ではごく簡単なFlaskのアプリケーションのトレースをEDOTで取得する手順について説明します。

:::note

2025/04/16現在の最新バージョンであるv9.0.0をベースに記載
:::

# 環境
OS: Ubuntsu 24.04
Python: 3.12.3
pip: 25.0.1

# 手順
1. pipでパッケージインストール
1. EDOT Collector(=Elastic Agent)をダウンロードして設定
1. 環境変数設定
1. redisインストール&起動
1. `opentelemetry-instrument`で起動

## パッケージインストール
下記のGitレポジトリをcloneします。
https://github.com/legacyworld/edot

requirements.txtがあるのでそれでインストールしてもいいですし、`flask`,`redis`,`elastic-opentelemetry`を別個にインストールしてもよいです。
```
pip install -r requirements.txt
```
## Instrumentationインストール
```
edot-bootstrap --action=install
```

## EDOT Collector
基本はこのページの通りに行います。
https://elastic.github.io/opentelemetry/quickstart/

送信先がElastic CloudやSelf Managedによって少し異なるが基本は同じです。
例えば今回のようにVM上でプログラムを動かしている＆Elastic Cloudに送る場合はこちら。
https://elastic.github.io/opentelemetry/quickstart/ech/hosts_vms

### ダウンロード
こちらのページからダウンロード
https://elastic.github.io/opentelemetry/edot-collector/download.html

### 設定
ダウンロードしたファイルを展開して、作成されたディレクトリに移動して下記を実行します。
`otel.yml`ファイルに設定を入れているのがわかります。
`<ELASTICSEARCH_ENDPOINT>`と`<ELASTIC_API_KEY>`は環境に合わせて変更します。

```
 ELASTICSEARCH_ENDPOINT=<ELASTICSEARCH_ENDPOINT> && \
 ELASTIC_API_KEY=<ELASTIC_API_KEY> && \
 cp ./otel_samples/logs_metrics_traces.yml ./otel.yml && \
 mkdir -p ./data/otelcol && \
 sed -i "s#\${env:STORAGE_DIR}#${PWD}/data/otelcol#g" ./otel.yml && \
 sed -i "s#\${env:ELASTIC_ENDPOINT}#${ELASTICSEARCH_ENDPOINT}#g" ./otel.yml && \
 sed -i "s#\${env:ELASTIC_API_KEY}#${ELASTIC_API_KEY}#g" ./otel.yml
```
- ELASTICSEARCH_ENDPOINT
Elastic Cloudであれば`Copy Endpoint`でコピーされる部分
![スクリーンショット 2025-03-31 17.11.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/ebf37746-bac5-4b3d-b83e-9ce3bcc7fab4.png)
- ELASTIC_API_KEY
    - https://www.elastic.co/guide/en/kibana/current/api-keys.html

### EDOT Collector起動
```
sudo ./otelcol --config otel.yml
```

## 環境変数
今回はElasticsearchに直接データをいれるので何もしなくてもよいですが、APMのページに表示される名前が`unknown_service`になってしまってわかりにくいです。
わかりやすくするために`OTEL_RESOURCE_ATTRIBUTES`だけは設定しておきます。
```
export OTEL_RESOURCE_ATTRIBUTES="service.name=edot,service.version=1.0.0,deployment.environment=dev"
```
## Redis
Redisを使います。何もせず起動すればOKです

```
apt install redis
```

## プログラム起動
```
opentelemetry-instrument python edot.py
```
`http://<IP address>:5011/endpoint1`
にアクセスしてトレースを発生させます。
`curl`でも問題ありません。
以下のようなログが吐き出されればOKです。
```
Received request
connecting to Redis 20 times
INFO-1000,fast request
Received request
connecting to Redis 20 times
ERR-1000,slow request
CRITICAL-1000,expected error, will be handled
```
# データ確認
Kibanaから`Observability`->`Application`とクリックします。
（以前のバージョンではAPMでした）
データが表示されるまで少し時間がかかります。

![スクリーンショット 2025-03-31 17.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/5575a001-0007-4ea7-9984-36367d6e02fb.png)
`OTEL_RESOURCE_ATTRIBUTES`で指定した値が表示されています。

`edot`をクリックして真ん中あたりにある以下の部分の`GET /endpoint1`をクリックします。
![スクリーンショット 2025-03-31 17.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/927c53d8-04b0-4975-aac6-0da2ef1b8ddd.png)

Redisへ送ったコマンドなどがトレースとして表示されます。
![スクリーンショット 2025-03-31 17.40.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603229/f9714ba7-3b65-4e40-8ce0-16a032843581.png)

# まとめ
非常にシンプルなFlaskアプリでしたが、EDOTを利用すると非常に簡単にOpenTelemetryでトレースデータを直接Elasticsearchに送ることができるのがおわかりいただけたと思います。
これまではIntegrationsサーバ経由でしたがそれもなくなりました。
勿論これまで通りにIntegrationsサーバ経由でも送ることは出来ます。
この機会にぜひElasticsearch＋OpenTelemetryをお試しください。