Cloud Run 上の Next.js を OpenTelemetry で計装する
Cloud Run はコンテナ化されたアプリケーションを実行するための Google Cloud のフルマネージドサービスです。
Google Cloud 上でコンテナアプリを動かす場合、Cloud Run がファーストチョイスとなります。
Next.js のデプロイ先としては Vercel が有名ですが、Google Cloud 上で動かしたい場合は Cloud Run になるでしょう。
Next.js には Experimental ではありますが OpenTelemetry サポートがあり、Vercel でも Pro 以上のプランにすることでテレメトリを収集することができます。
今回は Cloud Run にデプロイする場合の OpenTelemetry の収集を試していきます。
準備
Google Cloud でのプロジェクト作成、課金と各種 API の有効化、gcloud
コマンドのセットアップは済んでいるとします。
まずは Next.js アプリを準備していきます。
npx create-next-app@latest
cd my-app
Next.js の OpenTelemetry サポートを有効にします。
npm install @vercel/otel @opentelemetry/sdk-logs @opentelemetry/api-logs @opentelemetry/instrumentation
/** @type {import('next').NextConfig} */
const nextConfig = {
experimental: {
instrumentationHook: true,
},
};
export default nextConfig;
import { registerOTel } from "@vercel/otel";
export function register() {
registerOTel({ serviceName: "next-app" });
}
Next.js アプリを Cloud Run にデプロイします。
Cloud Run はコンテナアプリのためのサービスですが、ソースコードからのデプロイもサポートしているので今回はそちらを利用します。
(ソースコードからのデプロイでは裏で Buildpack と Cloud Build によってビルドされます)
gcloud run deploy
実行中に Artifact Registry のリポジトリを作成するか聞かれるので今回は Yes で進めます。
(こちらのリポジトリはこの後また使います)
デプロイが完了すると Service URL に表示された URL から Next.js アプリにアクセスできます。
テレメトリの収集
Cloud Run ではメインのコンテナの他にサイドカーコンテナをデプロイすることができます。
OpenTelemetry を収集する場合も OpenTelemetry Collector をサイドカーとしてデプロイすることが推奨されています。
Next.js アプリからテレメトリを受け取り、Cloud Trace に送信するような OpenTelemetry Collector を準備します。
receivers:
otlp:
protocols:
http:
processors:
batch:
exporters:
googlecloud:
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [googlecloud]
FROM otel/opentelemetry-collector-contrib:0.107.0
COPY otelcol-config.yaml /etc/otelcol-contrib/config.yaml
otelcol コンテナをビルドし、リポジトリにプッシュします。
gcloud builds submit --tag {準備のときに作成したリポジトリ}/otelcol
otelcol コンテナをデプロイします。
ここまでに作成した Cloud Run サービスの画面から「新しいリビジョンの編集とデプロイ」を押下し、「コンテナを追加」で先ほどプッシュした otelcol コンテナを指定します。
動作確認
Cloud Trace の画面で取得したトレースを見ることができます。
以上です。
参考文献
Discussion