OpenTelemetry の Community Demo のトレースとメトリクスを Datadog に送信してみた

:::note info
2024年4月更新
同じトピックが公式ドキュメントに追加されています。最新情報はこちらをご参照ください。

[Sending Data from the OpenTelemetry Demo to Datadog](https://docs.datadoghq.com/opentelemetry/guide/otel_demo_to_datadog/)
:::

# はじめに

OpenTelemetryのブログに以下のような記事が出ていました

>Announcing a Community Demo for OpenTelemetry
https://opentelemetry.io/blog/2022/demo-announcement/

これはOpenTelemetryのデモキットで、ECサイトがさまざまな言語のマイクロサービスで作られています。さらにメトリクスやトレースの計装もすでに行われていて、手元にDocker環境があれば`docker compose up`だけで動かすことができます。
OpenTelemetryのデモとしては、JeagerやPrometheusでトレースやメトリクスを見られるようになっています。今回は、それらをDatadogに送って、Datadogで見られるようにしたいと思います。

# 構成
いくつかのマイクロサービスで構成され、それぞれ異なる言語で作られています。(画像はREADMEより引用）

```mermaid
graph TD

subgraph Service Diagram
adservice(Ad Service):::java
cache[(Cache<br/>&#40redis&#41)]
cartservice(Cart Service):::dotnet
checkoutservice(Checkout Service):::golang
currencyservice(Currency Service):::cpp
emailservice(Email Service):::ruby
frontend(Frontend):::golang
loadgenerator([Load Generator]):::python
paymentservice(Payment Service):::nodejs
productcatalogservice(ProductCatalog Service):::golang
recommendationservice(Recommendation Service):::python
shippingservice(Shipping Service):::rust

Internet -->|HTTP| frontend
loadgenerator -->|HTTP| frontend

checkoutservice --> cartservice --> cache
checkoutservice --> productcatalogservice
checkoutservice --> currencyservice
checkoutservice --> emailservice
checkoutservice --> paymentservice
checkoutservice --> shippingservice
checkoutservice --> |evalFlag| featureflagfeservice

frontend --> adservice
frontend --> cartservice
frontend --> productcatalogservice
frontend --> checkoutservice
frontend --> currencyservice
frontend --> recommendationservice --> productcatalogservice
frontend --> shippingservice
frontend --> |evalFlag| featureflagfeservice

productcatalogservice --> |evalFlag| featureflagfeservice

featureflagbeservice(Flag Server):::erlang
featureflagfeservice(Flag UI/API):::erlang
featureflagstore[(Flag Store<br/>&#40PostgreSQL DB&#41)]

featureflagfeservice --> featureflagbeservice --> featureflagstore

end
classDef java fill:#b07219,color:white;
classDef dotnet fill:#178600,color:white;
classDef golang fill:#00add8,color:black;
classDef cpp fill:#f34b7d,color:white;
classDef ruby fill:#701516,color:white;
classDef python fill:#3572A5,color:white;
classDef nodejs fill:#f1e05a,color:black;
classDef rust fill:#dea584,color:black;
classDef erlang fill:#b83998,color:white;
classDef php fill:#4f5d95,color:white;
```

```mermaid
graph TD
subgraph Service Legend
  javasvc(Java):::java
  dotnetsvc(.NET):::dotnet
  golangsvc(Go):::golang
  cppsvc(C++):::cpp
  rubysvc(Ruby):::ruby
  pythonsvc(Python):::python
  nodesvc(Node.js):::nodejs
  rustsvc(Rust):::rust
  erlangsvc(Erlang/Elixir):::erlang
end

classDef java fill:#b07219,color:white;
classDef dotnet fill:#178600,color:white;
classDef golang fill:#00add8,color:black;
classDef cpp fill:#f34b7d,color:white;
classDef ruby fill:#701516,color:white;
classDef python fill:#3572A5,color:white;
classDef nodejs fill:#f1e05a,color:black;
classDef rust fill:#dea584,color:black;
classDef erlang fill:#b83998,color:white;
classDef php fill:#4f5d95,color:white;
```

# デモの動かし方
Githubのレポジトリをクローンして、`docker compose up`すると動きます。初回はビルドに時間がかかります。

>Webstore Demo
https://github.com/open-telemetry/opentelemetry-demo

立ち上がったら、ブラウザで`http://localhost:8080`にアクセスすると、以下のようなECサイトが現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/ff645144-d098-1a46-50da-c483f488eb4d.png)
同様に、`http://localhost:9090`でPrometheusに、`http://localhost:16686`でJeagerにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/56f4bf5c-0dc1-3f82-acd8-ba1b10f0a82c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/9479887e-2e53-1c37-7e0f-75c7e987b158.png)

# Datadog Exporter

ではこれらのメトリクスとトレースをDatadogに送信してみます。OpenTelemetryのCollectorに対応したDatadog Exporterは現在betaですので、あくまでお試し用途となります。

>OpenTelemetry collector Datadog exporter (Datadog document)
https://docs.datadoghq.com/tracing/setup_overview/open_standards/otel_collector_datadog_exporter

>Datadog Exporter (Github)
https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/datadogexporter

変更点は以下のとおりで、Collectorの設定ファイルにDatadogの設定を追加します。

`exporters`にDatadogの設定を追加します。`<API_KEY>`はそれぞれお使いのAPI Keyに置き換えてください。`env`タグやその他のタグもここで設定できます。あとは、`pipelines`で`trace`と`metrics`に`datadog`を追加して送信されるようにします。
下記の設定では、PrometheusやJeagerにも引き続き送信されます。

```diff_yaml:src/otelcollector/otelcol-config.yml
...
exporters:
  jaeger:
    endpoint: "jaeger:14250"
    tls:
      insecure: true
  logging:
  prometheus:
    endpoint: "otelcol:9464"
+ datadog:
+   api:
+     key: <API_KEY>
+   host_metadata:
+     tags:
+       - otel:true

 processors:
   batch:
+  resource:
+    attributes:
+    - key: deployment.environment  # Set env tag for Datadog
+      value: "otel"
+      action: upsert

service:
  pipelines:
    traces:
      receivers: [otlp]
-     processors: [batch]
+     processors: [batch, resource]
-     exporters: [logging, jaeger]
+     exporters: [logging, jaeger, datadog]
    metrics:
      receivers: [otlp]
-     processors: [batch]
+     processors: [batch, resource]
-     exporters: [prometheus, logging]
+     exporters: [prometheus, logging, datadog]
```

あと、Datadog Exporterはオリジナルの`docker-compose.yaml`にあるコンテナイメージには含まれていないので、contribを含むイメージに変更します。

```diff_yaml:./docker-compose.yaml
  # Collector
  otelcol:
-   image: otel/opentelemetry-collector:0.56.0
+   image: otel/opentelemetry-collector-contrib:0.56.0
    command: [ "--config=/etc/otelcol-config.yml" ]
```

# Datadogに表示された！

再度`docker compose up`してECサイトにアクセスしてみると、Datadogにもトレースとメトリクスが表示されました！
本当にシンプルで簡単で感動しました。

サービスマップ：マイクロサービス間の呼び出し関係や、トラフィックの流れが見えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/b7974ac5-3e25-16ab-ced7-e38c349d8c71.png)

トレース：個別のトレースの中で、バックエンドの呼び出し関係や、かかった時間、その他詳細情報が見えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/096006ea-3997-d02f-57b5-ac1bac7ca015.png)

メトリクス：メトリクスも送信されていて、タグが付加されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/f2501d02-3250-1d61-dc64-cff38b9796e7.png)

# Datadog Agentでも受信できます

今回のデモ環境では、OpenTelemetry Collectorでメトリクスやトレースを受け取って、Datadogに送信していますが、この代わりにDatadog Agentを使うことも可能です。
現状すでにDatadog Agentが動いているような場合は、そのまま使うことが可能です。（ただしAgentは最新バージョンにしてください）
以下の図のように、OpenTelemetryとの組み合わせはいくつか方法があります。詳細はDatadogのブログ記事をご参照ください。

>Ingest OpenTelemetry traces and metrics with the Datadog Agent
https://www.datadoghq.com/blog/ingest-opentelemetry-traces-metrics-with-datadog-agent/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325973/c4a003d5-5f82-03b6-f376-e7c99926e88d.png)