Observability: Google Cloud Runロギング&トレーシング
はじめに
こんにちは!バックエンドとプラットフォームエンジニアのビクトルです。
この記事では、Google Cloud Runをロガーする方法についてお話しし、マイクロサービスアーキテクチャでトレーシングを使用するために試してみたいと思います。
トレーシングとロギング
オブザーバビリティは、トレース、ログ、およびメトリクスを収集および集約することによって分散トレーシングを実現します。
トレースは、リクエストを受信するとそのリクエストがどのようにして始まり、ソースから宛先までどのように流れるかを示し、リクエストの各部分間の遅延を測定します。
ログは、開発者がデバッグを行い、アプリで起きてるイベントを追跡するのに役立ちます。
ログはトレーサビリティと組み合わせることができます。ログを中央に集約している場合、ツールを使用してログをフィルタリングし、トレースに関連するすべてのイベントを表示できます。
Google Cloud Runで使用する方法
Google Cloud Run(以下、Cloud Run)でサービスをデプロイする際、Cloud Runはサービスと他のサービスの間にプロキシレイヤーを作成します。

ログの中には:
trace: "projects/<projectID>/traces/aaaa3cb476111119ff2accccccc2d75"
と書いています。
トレースIDをどのように注入して使用できますか?
マイクロサービスアーキテクチャでは、トラフィックを別のサービスにルーティングするためのゲートウェイサービスがあり、そのサービスからは、トレースIDを使用し、ログに注入します。
ヘッダーからcontextを取得する
Cloud RunはトレースIDをHTTPヘッダーに注入します。2つのヘッダーにそれを注入します:
X-Cloud-Trace-ContextTraceparent
X-Cloud-Trace-Contextヘッダーは最初にGoogle Cloud Platformで使用されましたが、W3Cによって標準として推奨されているTraceparentヘッダー名を使用することが推奨されています。
W3Cヘッダーを使用
ヘッダーのRegexパターンは以下の通りです:
<version>-<traceID>-<parentID>-<traceFlags>
さて、ゲートウェイでは、そのヘッダーを伝播させることで、リクエストをトレースし、ログに表示できるようにします。
ロガーを使用してトレースを注入します
Cloud Runのログのフォーマットを見てみましょう:

よし!これでデータをログに注入し、Cloud Runはフィールドを自動的に解釈します、もしGolangで実装したら:
func SpanKey() string {
return "logging.googleapis.com/spanId"
}
func TraceKey() string {
return "logging.googleapis.com/trace"
}
また、Cloud Runはこれらのログエントリーをそのメトリクスサービスにリンクします。
終わり
私たちはログにトレースヘッダーを含めるように設定しました:
-
W3Cによって推奨されているTraceparentヘッダーを使用 - ゲートウェイでヘッダーを注入し、コンテキストで他のサービスに伝播させる
-
トレースIDを使用し、以下のキーを使用してキーと値のエントリに印刷します:logging.googleapis.com/spanIdlogging.googleapis.com/trace
Discussion