Cloud Run services トレース監視「だいたいぜんぶ」

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている [**AoTo**](https://qiita.com/AoTo0330) です。
Google Cloud で好きなサービスは、圧倒的に **Cloud Run** です！

この投稿は **[<font color="#6495ED">AoTo Advent Calendar 2024</font>](https://qiita.com/advent-calendar/2024/aoto) 16日目**の記事です。

皆さんは　**Cloud Run** の監視、きちんと行えているでしょうか？

**Cloud Run** は **Google Cloud** のマネージドサービスであり、デフォルトで **Cloud Logging, Cloud Monitoring, Cloud Trace** と統合されています。

![Monitoring_CloudRun.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/17ae2c59-bb66-d48b-3a1b-a65c4740fc85.png)

**Cloud Run servivces** を利用すると、自動的に **Cloud Trace** へトレースが記録されることはご存知でしょうか？
本ブログでは **Cloud Run services** におけるトレースの仕組みと利用方法に触れながら、Cloud Run service にデプロイされるアプリケーションのトレースについて解説します🐶

:::note info
メトリクス・ログ監視は以下のブログをご参照ください！
- 『[**Cloud Run services メトリクス監視「だいたいぜんぶ」**](https://qiita.com/AoTo0330/items/d02f7daab46ed54b4339)』
- 『[**Cloud Run services ログ監視「だいたいぜんぶ」**](https://qiita.com/AoTo0330/items/f6e1ca508384a3b8fc7a)』
:::

## Cloud Trace とのネイティブ統合
Cloud Run services はサービスへの受信リクエストを自動的にトレースしスパンデータを **Cloud Trace** に連携します。この時、標準の **W3C Trace Context** に準拠した [`traceparent`](https://www.w3.org/TR/trace-context/#traceparent-header) ヘッダーを Cloud Run services へのリクエストに自動的に入力します。`traceparent` ヘッダーには以下の形式で `version`, `trace-id`, `parent-id`, `trace-flag` が入力されます。

```
traceparent: {version:00}-{trace-id:^[0-9a-f]{32}$}-{parent-id:^[0-9a-f]{16}$}-{trace-flag:01}
```

**W3C Trace Context** の詳細な解説は『[分散トレースを理解する！ Trace Context 解体新書]()』をご参照ください。

https://speakerdeck.com/aoto/understanding-distributed-tracing-trace-context-tabul-anatomic?slide=20

トレースを **Cloud Trace** で可視化するためには、32bit で表記される一意の `trace-id` を利用します。この `traceparent` ヘッダーを適切に伝搬することで、後述するアプリケーションのトレースと接続して表示できます。

Datadog をはじめとする 3rd Party のオブザーバビリティプラットフォームへこの自動トレースを送信することはできません。3rd Party プラットフォームで **Cloud Run services** の分散トレースを行う場合、この自動生成されるルートスパンは利用できません。

ただし、`traceparent` ヘッダーを伝搬できる計装ライブラリを利用している場合は、同一の `trace-id` を利用してアプリケーションをトレースできるため、**Cloud Trace** と 3rd Party プラットフォーム間で相互に検索可能です。

## アプリケーションのトレース
追加で **Cloud Run serices** アプリケーションを計装し、サービスへのリクエスト時に自動的に生成されるルートスパンと接続できます。この時、[アプリケーションの計測方法](https://cloud.google.com/trace/docs/setup?hl=ja#how_to_instrument_applications)を利用して、各言語のアプリケーションからスパンを作成し **Cloud Trace** に送信できます。

![CloudRun_Traces.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2363567/2bb1ffcf-506f-1081-e6dc-7fed2a63163e.png)

Google Cloud が推奨する[アプリケーションの計測方法](https://cloud.google.com/trace/docs/setup?hl=ja#how_to_instrument_applications)は、**OpenTelemetry** による W3C 準拠の計装です。その他にも **Zipkin**, **Spring Boot** による計装が紹介されていますが、Cloud Run の自動生成スパンが伝搬する `traceparent` ヘッダーを受け取ることができないため、個人的には **OpenTelemetry** の利用を推奨します。

**OpenTelemetry** で計装する際、生成されたスパンデータは [**OpenTelemetry Collector**](https://opentelemetry.io/docs/collector/) により **Cloud Trace** に転送します。**OpenTelemetry Collector** は Cloud Run の[マルチコンテナ(サイドカー)機能](https://cloud.google.com/run/docs/deploying?hl=ja#sidecars)を利用してコンテナとしてデプロイします。

具体的な方法は以下のブログをご参照ください。

https://zenn.dev/google_cloud_jp/articles/20230516-cloud-run-otel

**OpenTelemetry Collector** をデプロイするオプションとして、Google Cloud 公式は **observIQ** の **BindPlane** を紹介しています。

https://cloud.google.com/stackdriver/bindplane?hl=ja

これらの利用方法は以下のブログをご参照ください。[**BindPlane Agent**](https://cloud.google.com/chronicle/docs/ingestion/use-bindplane-agent) は **OpenTelemetry Collector** のディストリビューションのため、同様にサイドカーとしてデプロイできます。

https://zenn.dev/k6s4i53rx/articles/2024-advent-calendar-gc-champ

どちらにも共通して **Cloud Trace** にトレース(スパン)データを転送するために、[**Google Cloud Exporeter**](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/googlecloudexporter/README.md) を構成します。**Google Cloud Exporeter** はトレースデータの他にも、メトリクスデータを **Cloud Monitoring** に、ログデータを **Cloud Logging** に転送できるため、Cloud Run にデプロイする統合監視エージェントとしても利用できます。

## おわりに
**Cloud Run service** で利用できるトレース監視の方式を、**Cloud Trace** を中心に図解を交えながら解説しました。**Cloud Trace** を利用することでのみ、トレースのルートスパンとなるリクエストスパンと共にアプリケーションの追加スパンを確認できる点も注意が必要です。

トレース監視まで行うことができれば、より詳細なアプリケーションのパフォーマンスを継続的に監視できます。是非 Cloud Run を利用する際はトレース監視の設計まで検討し、サービスの信頼性向上にお役立てください🐶