コンテンツにスキップ

分散トレース@Datadog

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. トレースエージェント (サーバーの場合)

トレースエージェントとは

デーモンであるdatadogエージェントに含まれている。

アプリケーションから分散トレースを収集し、Datadogに転送する。

datadog-agent_on-server


セットアップ

/etc/datadog-agent/datadog.yamlファイル


02. トレースエージェント (AWS ECS Fargateの場合)

トレースエージェントとは

サーバーの場合と同様にして、アプリケーションから分散トレースを受信し、Datadogに転送する。

サーバーの場合とは異なり、自身が収集しにいくことはできない。

仕組みとして、アプリコンテナの分散トレースのクライアントパッケージはスパンを作成し、datadogコンテナの『http://localhost:8126』にこれを送信する。

datadogコンテナ内のdatadogエージェントはこれをHTTPSプロトコルでDatadogに転送する。

datadog-tracer


セットアップ

▼ エージェント

dockerエージェントにて、DD_APM_ENABLEDの環境変数にtrueを割り当てると、合わせてトレースエージェントが有効になる。

APMエージェントを有効化し、分散トレース監視バックエンドを送信できる。

▼ クライアントパッケージ

記入中...

▼ デバッグ

方法 説明 補足
起動ログの有効化 環境変数のDD_TRACE_STARTUP_LOGSを有効化することにより、起動ログを標準出力に出力可能にする。起動ログから、クライアントパッケージの設定値を確認できる。 https://docs.datadoghq.com/tracing/troubleshooting/#troubleshooting-data-requested-by-datadog-support
デバッグログの有効化 各クライアントパッケージが持つデバッグパラメーターを有効化することにより、デバッグログを標準出力に出力可能にする。デバッグログから、実際にDatadogに送信されるスパンデータを確認できる。 https://docs.datadoghq.com/tracing/troubleshooting/#troubleshooting-data-requested-by-datad
Agent Flareコマンドの実行 datadogコンテナ内でAgent Flareコマンドを実行し、Datadogサポートにdatadogコンテナの構成情報をメール送信する。 https://docs.datadoghq.com/tracing/troubleshooting/#troubleshooting-data-requested-by-datad
https://docs.datadoghq.com/agent/troubleshooting/send_a_flare/?tab=agentv6v7


03. スパンの作成

Datadogにおける分散トレース

▼ 分散トレースの構成

Datadogで、分散トレースは複数のスパンの配列データとして定義される。

[span1, span2, span3]

また、複数の分散トレース自体を配列データとして定義できる。

[trace1, trace2, trace3]

▼ スパンの構成

Datadogで、スパンはJSON型データとして定義される。アプリケーション内のクライアントパッケージで、指定されたJSON型のスパンが作成され、スパンはdatadog-APIに送信される。

*実装例*

[
  [
    {
      "duration": 123, # 処理の所要時間
      "error": 0, # エラーの有無
      "meta": {
          "env": "prd", # タグ
        },
      "metrics": {
          "baz-sum": 123, # マイクロサービスのメトリクス
        },
      "name": "laravel.request", # スパン名
      "parent_id": 123, # 親スパンID
      "resource": "/foo", # アクセスされたリソース
      "service": "laravel", # マイクロサービス名
      "span_id": 123456789, # スパンID
      "start": 0, # 処理開始時間
      "trace_id": 123456789, # トレースID
      "type": "web", # マイクロサービスのタイプ
    },
  ],
]

▼ トレースコンテキスト

スパンのmetaキーにトレースコンテキストのセットを割り当てられる。

トレースコンテキストはタグとして動作する。

*実装例*

PHP用のクライアントパッケージでlaravel内からタグを収集した例

{
    "env": "prd",
    "http": {
        "host": "example.com",
        "method": "GET",
        "path_group": "/foo",
        "status_code": 200,
        "url": "https://example.com/foo/1"
    },
    "laravel": {
        "route": {
            "action": "App\Http\Controllers\Foo\FooController@get",
            "name": "foos.get"
        }
    },
    "php" : {
        "compilation": {
            "total_time_ms": 123.45
        }
    },
    "process_id": 100
}


スパンのメトリクス

▼ スパンのデータポイント化

スパンの持つデータをデータポイントとして集計すると、メトリクスのデータポイントを収集できる。

▼ メトリクス名の構成要素

メトリクス名は『trace.<スパン名>.<メトリクス接尾辞名>』の名前で構成される。

▼ メトリクス名

メトリクス名には、データポイントとなったスパン名が割り当てられる。

*例*

  • trace.web.request.<メトリクス接尾辞名>
  • trace.db.query.<メトリクス接尾辞名>
  • trace.db.commit.<メトリクス接尾辞名>

▼ メトリクスのメトリクス接尾辞名

メトリクスの種類に応じた接尾辞名が割り当てられる。

*例*

  • trace.<スパン名>.hits.***** (該当スパンのヒット数)
  • trace.<スパン名>.duration (該当スパンの処理時間)
  • trace.<スパン名>.duration.by.***** (該当スパンの処理時間の割合)
  • trace.<スパン名>.errors.***** (該当スパンにおけるエラー数)


エラートラッキング

▼ エラートラッキングの仕組み

記入中...


05. マイクロサービスの識別

マイクロサービスタイプ

▼ マイクロサービスタイプとは

分散トレースのクライアントパッケージによって、マイクロサービスは『Web』『DB』『Cache』『Cache』の4個に分類される。

各マイクロサービスのspan.type属性に割り当てられるタイプ名から自動的に割り振られる。

タイプの種類については、以下のリンクを参考にせよ。


マイクロサービスのタグ

▼ マイクロサービスのタグとは

PHP用のクライアントパッケージによって、マイクロサービスにタグを追加できる。

コードから、PHP用のクライアントパッケージがアプリケーションからどのように情報を抜き出し、分散トレースのタグの値を決定しているかがわかる。