Datadog APM でもしかしてトレースが欠損してる？と思ったら

この記事は [Datadog Advent Calendar 2023](https://qiita.com/advent-calendar/2023/datadog)  の 12/14 の記事です。

# TL;DR
- Datadog APM 取り込み量制御の仕組みによって、トレーススパンが欠損するときがあるよ
- DDTRACE や Datadog Agent の設定で、いくつか対策はできるよ
- 全く欠損させない状態を目指すと、コストは増えるのでトレードオフを考慮しよう
- トレースはそもそも反復性が高いので、100%残す必要は必ずしもないよ

# はじめに
サービスがリクエストを受けているのに、Datadog APM の画面で表示されないぞ...？リクエストした回数に対して、表示される件数が合わないぞ...？と思ったことはありませんか？

多くの場合、以下の2パターンの理由により欠損しているのではないでしょうか？
- Datadog APM の取り込み量制御の仕組みにより、サンプリングされている
- Datadog Agent のリソース使用量高騰に伴い、Agentのプロセスがkillされている

この記事では、主に前者について説明します。

# まずは何を見たら良いか？

取り込み量制御により欠損が発生しているかどうかについては、Datadog の [Ingestion Control](https://app.datadoghq.com/apm/traces/ingestion-control) の TRAFFIC BREAKDOWN などを見てみると良いでしょう。

いくつか例示します。
以下は、[ヘッドベースサンプリング](ヘッドベースサンプリング)という機能により、14.3% のトレーススパンがサンプリングされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55537/5deeb858-f295-19d6-f7f2-0e1422265c35.png)

また以下では、レートリミット機能により、57.6% のトレーススパンが送信制限されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55537/0dfdcf3f-f94c-cfed-cedd-fa3cd9cb66cb.png)

# トレーススパンのフローと制御
このように、トレーススパンが送信される過程で、様々な理由で取り込む量を制限するようなポイントが存在しています。
かなりざっくりした図で恐縮ですが、Datadog Agent を利用している環境において、トレーススパンは以下のようなフローを辿り、サンプリングやレートリミットが発動されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55537/1a1dbb42-7488-d376-26d0-876b7eaf829a.png)

# 対策
これらの対処については以下が有効な対策です。
具体的な設定は、リンクも合わせて記載していますので、Datadogの公式Docも参照しながら読んでいただければと思います。

- ヘッドベースサンプリングにより、トレース欠損を発生しづらくする
  - DDTRACEの設定で[サンプリングレート（DD_TRACE_SAMPLING_RULES）]((https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB))を任意の値（例えば100%）などに固定することで、ヘッドベースサンプリングの対象外にする
  - Datadog Agent の持つ[ヘッドベースサンプリングの値（DD_APM_MAX_TPS）](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E6%A7%8B%E6%88%90)を緩和する（デフォルトは10トレース/秒）
- トレースレートリミットを発生しづらくする
  - DDTRACEの設定で[レートリミットの値（DD_TRACE_RATE_LIMIT）](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9A%E7%BE%A9%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB)を緩和する（デフォルトは100トレース/秒）
- エラースパンサンプリングにより、エラートレースの欠損を発生しづらくする
  - Datadog Agent の設定で[エラースパンサンプリングのレート（DD_APM_ERROR_TPS）](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9)を緩和する（デフォルトは10トレース/秒）
- レアトレースサンプリングを有効にし、レアトレースの欠損を発生しづらくする
  - [Datadog Agent のレアトレースサンプリング機能を停止する](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/?tab=java#%E3%83%AC%E3%82%A2%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9)

# そもそもどこまで対策したら良いの？
ここまで読んでお気づきの人もいるかもしれませんが、上記のようなあらゆる対策を仕込んで、トレーススパンの欠損を防ごうとすると、[Indexed/Ingested Spans のコスト](https://docs.datadoghq.com/ja/account_management/billing/apm_tracing_profiler/)が増大します。また、トレーススパンの送信量が増えると、Datadog Agentのリソース負荷も高くなりますので、Agent を稼働させるインフラコストも高くなります。

以下に、[Datadog 公式 Doc](トレースデータは非常に反復性が高いため、取り込みサンプリングでも問題を調査するためのトレースサンプルは利用可能です。高スループットのサービスでは、通常、すべてのリクエストを収集する必要はありません。十分重要な問題は、常に複数のトレースで症状を示すはずです。取り込み制御は、予算の範囲内で、問題のトラブルシューティングに必要な可視性を確保するのに役立ちます。) から引用します。
> トレースデータは非常に反復性が高いため、取り込みサンプリングでも問題を調査するためのトレースサンプルは利用可能です。
高スループットのサービスでは、通常、すべてのリクエストを収集する必要はありません。十分重要な問題は、常に複数のトレースで症状を示すはずです。
取り込み制御は、予算の範囲内で、問題のトラブルシューティングに必要な可視性を確保するのに役立ちます。

これは自分のサービス監視の経験を通じても同感です。
開発・試験中はすべてのトレーススパンを確認したくなるときもありますが、本番環境の監視運用で、特に高スループットなサービスにおいて、すべてのトレースを参照するようなケースはありません。本番環境で障害やアラート発砲があった際に、エラートレースや、レアなトレースを分析するということがほとんどです。
これはサービスの性質にも依存しますので、自分たちが抱えるサービスの監視・運用業務や開発・試験業務において十分な可観測性を保つためには、どのような設定が適切なのか、トレードオフを考慮していくべきです。

# おわりに
本記事では、Datadog APM の取り込み量制御の仕組みとその対策を紹介しました。
単純に取り込み量制御によって、全く欠損しない状態を目指すのが必ずしも正しいわけではなく、コストやサービス性質を鑑み、トレードオフを考慮しながら、自分たちのサービスの安定稼働を支える可観測性を獲得していきましょう！

# 参考資料
- [APM 分散型トレーシングによる取り込み量制御](https://docs.datadoghq.com/ja/tracing/guide/trace_ingestion_volume_control/)
- [取り込みのメカニズム](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_mechanisms/)
- [Ingestion Controls](https://docs.datadoghq.com/ja/tracing/trace_pipeline/ingestion_controls/)
- [APM 料金](https://docs.datadoghq.com/ja/account_management/billing/apm_tracing_profiler/)