Datadog って OpenTelemetry に対応しているの？

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。

この記事は **[<font color="#6495ED">AoTo Advent Calendar 2023</font>](https://qiita.com/advent-calendar/2023/aoto) 7日目**の記事です。

Datadog は OpenTelemetry に対応しているのか、何ができるのか、あまり知られていないかもしれません。結論から述べると Datadog は OpenTelemetry に**対応しており**、多くのことを実現できます。

2023年に発表された Datadog の OpenTelemetry をはじめとする OSS への取り組みの[公式ブログ](https://www.datadoghq.com/ja/blog/datadog-supports-opentelemetry-open-source/)をベースに、Datadog が OpenTlemetry で計装・収集した監視テレメトリデータをどのように扱えるのか紐解いていきます。

https://www.datadoghq.com/ja/blog/datadog-supports-opentelemetry-open-source/

## 経緯
Datadog は Opentelemetry プロジェクトの発足前、**StatsD** をはじめとして **OpenTracing** や **penCensus**、**OpenMetrics** に対するサポートに注力してきました。

https://www.datadoghq.com/ja/blog/statsd/

https://www.datadoghq.com/ja/blog/instrument-opencensus-opentracing-and-openmetrics/

そのため、OpenTracing と OpenCensus が統合され OpenTelemetry としての単一プロジェクトの発足当初から、Datadog は独自の計装ライブラリをコミュニティに提供してきました。

https://www.datadoghq.com/ja/blog/opentelemetry-instrumentation

:::note info
OpenTracing と OpenCensus の統合に至る経緯は、Cloud Native Computing Foundation(CNCF) の[記事](https://www.cncf.io/blog/2019/05/21/a-brief-history-of-opentelemetry-so-far/)から確認できます。
:::

## バックエンドとしての Datadog
OpenTelemetry はその特性から、データの保存と可視化は意図して他のツールに委任しています。この記述は OpenTelemetry の概要ページの最後「[What OpenTelemetry is not](https://opentelemetry.io/docs/what-is-opentelemetry/#what-opentelemetry-is-not)」から引用したものです。
>  The storage and visualization of that data is intentionally left to other tools.

そのため、OpenTelemetry で計装・収集した監視テレメトリデータは何か知らのツールで保存・可視化する必要があり、Datadog がその最適な選択肢となるよう、様々な方法での統合がなされています。

### 監視テレメトリデータの取得
公式ドキュメントの「[Datadog の OpenTelemetry](https://docs.datadoghq.com/ja/opentelemetry/)」ページでは、OTel から監視テレメトリデータを Datadog に送信する方法を2つ紹介しています。

![otel-flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/7c0e0f67-c865-c1ba-3a17-0ff9d541578c.png)

#### OTel Collector でデータを収集し、Datadog に送信
監視テレメトリの収集から Datadog への送信までを **OTel Collector** とそのディストリビューションの機能によって実現する方法です。

![datadogexporter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/8dfa1db9-7a72-5e23-94e3-a5daa8a3a0af.png)

Datadog は **OTel Collector** の3つの主要コンポーネントである、**Receiver** と **Processor**、そして **Exporter** それぞれの[ディストリビューション](https://github.com/open-telemetry/opentelemetry-collector-releases/blob/main/distributions/otelcol-contrib/manifest.yaml)が用意されています。

OTel Collector によって収集された**メトリクス・トレース・ログ**などの監視テレメトリデータは、これらの内の **Datadog Exporter** によって Datadog バックエンドに送信することができます。これらのテレメトリデータは Datadog 上のプラットフォーム上で、Datadog ネイティブで取得されたものと同じように可視化することができます。

#### Datadog Agent でデータを収集し、Datadog に送信
[**Datadog Agent**](https://docs.datadoghq.com/ja/agent/) でも OTel SDK/Library によって計装・取得された監視テレメトリデータを収集し、Datadog バックエンドに送信することもできます。

![otlp_ingestion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/993c5e50-18d6-5c92-2c3a-d1bfd988c2ab.png)

OTel は汎用なテレメトリデータ配信プロトコルである [**OpenTelemetry Protocol(OTLP)**](https://opentelemetry.io/docs/specs/otlp/) を利用して監視テレメトリデータを配信しています。
Datadog Agent は OTLP で配信されたテレメトリデータを受け取れるよう、[OpenTelemetry Collector OTLP レシーバー構成スキーマ](https://github.com/open-telemetry/opentelemetry-collector/blob/main/receiver/otlpreceiver/config.md)に従った Receiver が用意されています。この Receiver によって、gRPC/HTTP を通じた [OTLP トレース](https://opentelemetry.io/docs/concepts/signals/traces/)と [OTLP メトリクス](https://opentelemetry.io/docs/concepts/signals/metrics/)の取り込みが可能となります。

### 監視テレメトリデータの可視化
Datadog は OTel によって計装・収集された監視テレメトリデータを、扱いやすくするためにさまざまな機能を備えています。

#### トレースデータのサンプリング
トレースデータのように、処理ごとに発生する大量のデータはその全てを収集する必要はなく、重要なデータの取り分けやネットワーク・保管コストの最適化のためにサンプリングを行うことも重要となります。

[OTel SDK/Library](https://docs.datadoghq.com/opentelemetry/guide/ingestion_sampling_with_opentelemetry/#sdk-level-sampling) や [OTel Collector](https://docs.datadoghq.com/opentelemetry/guide/ingestion_sampling_with_opentelemetry/#collector-level-sampling) ではもちろん、[Datadog Agnet](https://docs.datadoghq.com/opentelemetry/guide/ingestion_sampling_with_opentelemetry/#sampling-with-the-datadog-agent) や [Datadog バックエンド](https://docs.datadoghq.com/tracing/trace_pipeline/trace_retention/)によるサンプリングも行うことができます。

![otel_apm_metrics_computation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/fc529523-328c-3d68-135a-2c82497bc3d4.png)

サンプリングを行う手法や場所でその効果や意味合いが変わってきますが、[ヘッドベースサンプリング](https://opentelemetry.io/docs/concepts/sampling/#head-sampling)や[テールベースサンプリング](https://opentelemetry.io/docs/concepts/sampling/#tail-sampling)が必要に応じて実現できることを意味します。

#### OTLP ヒストグラムのヒートマップ
OTLP は ヒストグラム形式のメトリクスをサポートしており、Datadog ではこうした[メトリクスの最適な可視化方法としてヒートマップ](https://docs.datadoghq.com/ja/opentelemetry/guide/otlp_histogram_heatmaps/)をサポートしています。

[OTLP ヒストグラムメトリクス](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#histogram)は記録された測定値の母集団(合計、カウント、最小、最大などの集計統計情報)を圧縮形式で記録するメトリクスです。

[ヒートマップウィジット](https://docs.datadoghq.com/ja/dashboards/widgets/heatmap/)はこうした母集団の集計統計情報を可視化するのに最適な手段で、視覚的にデータの特性や傾向を把握するのに役立ちます。

## Datadog と OpenTelemetry の統合
Datadog はもちろん、単独での Observability を実現するプラットフォームとして様々な方式での監視テレメトリデータ収集が可能です。こうした Datadog によって取得されたテレメトリデータと OTel のテレメトリデータを必要に応じて紐づけることで、測定ツールに依存しない形での Observability が実現できます。

### トレースの相互運用
Datadog では [W3C Trace Context](https://www.w3.org/TR/trace-context/) への対応をはじめとして、さまざまな方式で Datadog テレメトリデータと OTel テレメトリデータを統合する手法があります。

#### トレースコンテキストの伝搬
Datadog APM は、それぞれの言語のトレーシングライブラリの[トレースコンテキストの伝搬](https://docs.datadoghq.com/ja/tracing/trace_collection/trace_context_propagation/)によって、 [B3](https://github.com/openzipkin/b3-propagation) と [W3C Trace Context](https://www.w3.org/TR/trace-context/) のヘッダー抽出と挿入をサポートしています。[^1]
[^1]: B3 は主に [Zipkin](https://zipkin.io/) で利用されており、W3C Trace Context　は OTel を中心に利用される標準化された仕様です。

![diagram_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/7983893e-3e2a-cffd-d33d-7b3f02fac612.png)

このように　Datadog APM は Datadog とは異なる形式のトレースコンテキストを受け取り、そのコンテキストを利用することができるため、アプリケーションの計装方法を単一のツールに依存することなく実装することが可能です。

https://www.datadoghq.com/ja/blog/monitor-otel-with-w3c-trace-context/

#### 128ビットトレースID
Datadog は[トレースとスパン ID のフォーマット](https://docs.datadoghq.com/ja/tracing/guide/span_and_trace_id_format/
)に、**64ビットの符号なし整数**を使用します。これに対し、W3C トレースは**128ビットのトレース ID** が暗黙的に含まれています。

Datadog の最新の APM ライブラリでは [W3C Trace Context の推奨事項](https://www.w3.org/TR/trace-context/#handling-trace-id-for-compliant-platforms-with-shorter-internal-identifiers)に従って、下位64ビットをランダムに生成する128ビットのトレース ID も生成するようにデフォルトで構成されています。[^2]これにより、128ビットのトレース ID はもちろん、64ビットのトレース ID への**下位互換性**も提供します。
[^2]: この構成は`DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED`を`ｔrue`とすることで有効化されますが、最新のライブラリではデフォルトで`ｔrue`となります。

![128-62-bit-trace-ids.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/887dc4d3-a955-8d58-5817-157143a6a218.png)

#### Datadog RUM との統合
Datadog RUM と APM の連携を利用することで、各 Datadog SDK はデフォルトで [Datadog 形式の HTTP ヘッダー](https://docs.datadoghq.com/ja/real_user_monitoring/connect_rum_and_traces/?tab=datadog#rum-リソースはどのようにトレースにリンクされていますか？)を挿入します。

Datadog RUM の [OpenTelemetry のサポート](https://docs.datadoghq.com/ja/real_user_monitoring/connect_rum_and_traces/#opentelemetry-のサポート)により、`propagatorTypes`や`TracingHeaderType`を追加することで [W3C Trace Context](https://docs.datadoghq.com/ja/real_user_monitoring/connect_rum_and_traces/?tab=w3ctracecontext#rum-リソースはどのようにトレースにリンクされていますか？) の形式で HTTP ヘッダーを挿入します。

これにより、Otel によって計装されているアプリケーションであっても、Datadog RUM によって生成されたスパンと接続することができます。実際の画面としては、Dataog RUM の Session Explorer ページの各セッションから、単一のビューを選択して Trace タブを確認することで、対象の Flame Graph 確認できるようになります。

https://www.datadoghq.com/ja/blog/correlate-traces-datadog-rum-otel/

### 監視テレメトリデータ形式の統合
Datadog はバックエンドに収集された監視テレメトリデータにタグという形でディメンションを付与することで、Datadog の可視化機能によって情報の連携・絞り込み・集計・比較を行いやすくします。

[**統合サービスタグ付け**](https://docs.datadoghq.com/ja/getting_started/tagging/unified_service_tagging)は `env`、`service`、`version`の3 つの**予約済みタグ**により、それぞれの情報の連携に利用できます。

#### セマンティック規則のマッピング
OTel では[セマンティック規則](https://opentelemetry.io/docs/concepts/semantic-conventions/)によってさまざまなデータタイプの名前を指定していますが、これを Datadog のタグに置き換える際のマッピングを[公式ドキュメント](https://docs.datadoghq.com/ja/opentelemetry/guide/semantic_mapping/)で案内をしています。

一例として統合サービスタグ付けに使用される、予約済みタグは以下の表のようにマッピング可能です。
| OPENTELEMETRY 規則 | DATADOG 規則 |
| ---- | ---- |
| deployment.environment | env |
| service.name | service |
| service.version | version |

#### メトリクスのマッピング
Datadog は独自の命名パターンでメトリクスとタグを管理しています。Datadog に送信される OTLP メトリクスは、必要に応じて対応する Datadog メトリクスにマッピングされます。

OTLP メトリクスを Datadog メトリクスにマッピングするプロセス配下の通りで、自動的にマッピングされます。マッピングされる対象のメトリクスは、[ホストメトリクス](https://docs.datadoghq.com/opentelemetry/guide/metrics_mapping/#host-metrics)と[コンテナのメトリクス](https://docs.datadoghq.com/opentelemetry/guide/metrics_mapping/#container-metrics)にです。

![mapping_process.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/56316580-4ace-3a07-cf00-657905f0305d.png)

#### デルタ一時性メトリクスの生成
OTel メトリクスは、大きく分けて「累積集計一時性」か「デルタ一時性」の[どちらかの一時性](
https://docs.datadoghq.com/ja/opentelemetry/guide/otlp_delta_temporality/)を持つメトリクスを取り扱います。Datadog は StatsD をはじめとするデルタ一時性のメトリクスを中心に構成されており、OTel や Prometheus で生成される累積的な一時性のメトリクスから Processor を利用してデルタ一時性のメトリクスを生成することができます。

[OTel Cumulative to Delta Processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/processor/cumulativetodeltaprocessor) は累積集計一時性からデルタ一時性に変換する OTel Processor であり、Datadog で表示するメトリクスに最適化することができます。

<details><summary>一時性について</summary>

[一時性](https://opentelemetry.io/docs/specs/otel/metrics/data-model/#temporality)はメトリクスデータを定義するタイムスタンプに対して、集計対象の時間範囲を表す言葉です。

累積集計一時性とは、連続するデータ ポイントが開始タイムスタンプを繰り返すことを意味します。たとえば、開始時間 $T0$ から、累積データポイントは時間範囲 $(T0, T1]$, $(T0, T2]$, $(T0, T3]$ などをカバーします。
デルタ一時性とは、連続するデータ ポイントが開始タイムスタンプを進めることを意味します。たとえば、開始時間 $T0$ から、デルタデータポイントは時間範囲 $(T0, T1]$, $(T1, T2]$, $(T2, T3]$ などをカバーします。

つまり、累積集計一時性の場合、特定の開始時点からの累積時間全体の和などによって計算され、データの取得に失敗した期間は累積測定値から自然に平均化できるメリットがあります。
そして、デルタ一時性の場合、測定毎に対象の測定期間と値を更新することで計算され、サンプリングを行ったりデータのカーディナリティを低く保つことができるメリットがあります。

</details>

## おわりに
上記では基本的な Datadog の OTel への対応をまとめましたが、細かい仕様についても Datadog による監視テレメトリの計装・収集を追随する形でサポートを拡大しています。

OTel を利用している場合は、監視テレメトリデータを可視化するバックエンドとして Datadog を検討いただければ嬉しいです🐶
OTel での情報が不足している場合にも、Datadog のプロダクトを利用して　Observability をシステムの隅々まで行き渡らせることができます🔭

Datadog と OpenTelemetry のさらなる発展を期待しましょう！