🪵

Observability: Google Cloud Runロギング&トレーシング

2024/01/30に公開

はじめに

こんにちは!バックエンドとプラットフォームエンジニアのビクトルです。

この記事では、Google Cloud Runをロガーする方法についてお話しし、マイクロサービスアーキテクチャでトレーシングを使用するために試してみたいと思います。

トレーシングとロギング

オブザーバビリティは、トレース、ログ、およびメトリクスを収集および集約することによって分散トレーシングを実現します。

トレースは、リクエストを受信するとそのリクエストがどのようにして始まり、ソースから宛先までどのように流れるかを示し、リクエストの各部分間の遅延を測定します。

ログは、開発者がデバッグを行い、アプリで起きてるイベントを追跡するのに役立ちます。

ログはトレーサビリティと組み合わせることができます。ログを中央に集約している場合、ツールを使用してログをフィルタリングし、トレースに関連するすべてのイベントを表示できます。

Google Cloud Runで使用する方法

Google Cloud Run(以下、Cloud Run)でサービスをデプロイする際、Cloud Runはサービスと他のサービスの間にプロキシレイヤーを作成します。

google cloud request

ログの中には:

trace: "projects/<projectID>/traces/aaaa3cb476111119ff2accccccc2d75"

と書いています。

トレースIDをどのように注入して使用できますか?

マイクロサービスアーキテクチャでは、トラフィックを別のサービスにルーティングするためのゲートウェイサービスがあり、そのサービスからは、トレースIDを使用し、ログに注入します。

ヘッダーからcontextを取得する

Cloud RunトレースIDHTTPヘッダーに注入します。2つのヘッダーにそれを注入します:

  • X-Cloud-Trace-Context
  • Traceparent

X-Cloud-Trace-Contextヘッダーは最初にGoogle Cloud Platformで使用されましたが、W3Cによって標準として推奨されているTraceparentヘッダー名を使用することが推奨されています。

W3Cヘッダーを使用

ヘッダーのRegexパターンは以下の通りです:

<version>-<traceID>-<parentID>-<traceFlags>

https://www.w3.org/TR/trace-context/#trace-context-http-headers-format

さて、ゲートウェイでは、そのヘッダーを伝播させることで、リクエストをトレースし、ログに表示できるようにします。

ロガーを使用してトレースを注入します

Cloud Runのログのフォーマットを見てみましょう:

https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry

cloud run logentry

よし!これでデータをログに注入し、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
株式会社HRBrain

Discussion