分散トレース@Datadog¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. トレースエージェント (サーバーの場合)¶
トレースエージェントとは¶
デーモンであるdatadogエージェントに含まれている。
アプリケーションから分散トレースを収集し、Datadogに転送する。
セットアップ¶
▼ /etc/datadog-agent/datadog.yaml
ファイル¶
02. トレースエージェント (AWS ECS Fargateの場合)¶
トレースエージェントとは¶
サーバーの場合と同様にして、アプリケーションから分散トレースを受信し、Datadogに転送する。
サーバーの場合とは異なり、自身が収集しにいくことはできない。
仕組みとして、アプリコンテナの分散トレースのクライアントパッケージはスパンを作成し、datadogコンテナの『http://localhost:8126
』にこれを送信する。
datadogコンテナ内のdatadogエージェントはこれをHTTPSプロトコルでDatadogに転送する。
セットアップ¶
▼ エージェント¶
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用のクライアントパッケージがアプリケーションからどのように情報を抜き出し、分散トレースのタグの値を決定しているかがわかる。