@int128

int128.hatenablog.com

ZipkinのトレースIDを生成して引き継ぐ

ZipkinのトレースIDを引き継ぐ方法のメモです。

ブラウザ or 外部サービス
↓
フロントエンド(トレースIDを生成)
↓
↓ X-B3-TraceId: xxxx
↓
バックエンドAPI(トレースIDを中継)
↓
↓ X-B3-TraceId: xxxx
↓
バックエンドAPI

フロントエンドがPHPの場合は以下のようにトレースIDを生成すると簡単です。

// Generate 128bit random value
$traceId = bin2hex(openssl_random_pseudo_bytes(16));
define('ZIPKIN_TRACE_ID', $traceId);

// Add header (depends on API client)
$apiClient->addHeader('X-B3-TRACEID', ZIPKIN_TRACE_ID);

ブラウザにもトレースIDをヘッダで返しておくと、問題発生時の調査で役に立つでしょう。

Springの場合は依存関係に spring-cloud-starter-sleuth を追加すると以下を行ってくれます。

  • リクエストヘッダに X-B3-TRACEID がある場合はAPIクライアントに引き継ぐ。そうでない場合はトレースIDを生成する。
  • APIクライアントのリクエストヘッダに X-B3-TRACEID を付与する。
  • ログにトレースIDやスパンIDを出力する。