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-Context
Traceparent
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/spanId
logging.googleapis.com/trace
Discussion