📈

Claude Codeの利用状況をGoogle Cloud Monitoringで可視化する

に公開

はじめに

こんにちは、TimelabLynxというカレンダーサービスを開発している諸岡(@hakoten)です。

この記事では、Claude Codeの実行状況をOpenTelemetry Collectorを使ってGoogle Cloud Monitoringに送信し、モニタリングする仕組みを紹介します。

どのような目的でモニタリングを行っているか?

弊社では、社内のAIコーディングツールをClaude Codeで統一しています。
Claude Code以外を利用することも基本的には自由ですが、社内でサポートしているツールがClaude Codeであり、フルタイムのエンジニアには社員・業務委託を問わず Claude Max Plan を配布しています。

主な利用目的は以下の通りです:

  • メンバーのClaude Code利用率の可視化
  • Claude Codeによるコード変更率の可視化

中長期的な観点では、Claude Codeをより効果的に活用するための生産性向上施策に結びつけることを目指しています。

Claude Codeのモニタリングの仕組み

Claude Codeは現在ベータ版ですが、OpenTelemetryに対応したメトリクスを送信する機能があります。

詳細は公式ドキュメントを参照してください:
https://docs.claude.com/ja/docs/claude-code/monitoring-usage

OpenTelemetryは、テレメトリーデータ(メトリクス、ログ、トレース)を収集・送信するための業界標準規格です。Claude CodeはこのOpenTelemetryプロトコル(OTLP)を使って、実行状況のデータを外部に送信できます。

システム構成

システム構成は次のようになっています。

モニタリング情報を送信するために、OpenTelemetry CollectorをCloud Runで構築しています。

Claude Codeから送信されたメトリクスとログは、OpenTelemetry Collectorで受け取り、Google Cloud MonitoringとCloud Loggingに転送されます。

OpenTelemetry Collector の Cloud Run設定

ここからは、OpenTelemetry CollectorをCloud Runで動かすための設定を説明します。

Dockerfileの準備

Cloud Runの実行イメージとして、OpenTelemetry Collectorの公式イメージをベースに、設定ファイルを組み込んだDockerイメージを作成します。

Dockerファイルの詳細は割愛しますが、ビルドしたイメージはGoogle CloudのArtifact Registryにアップロードしておきます。

# OpenTelemetry Collector ベースイメージを使用
FROM otel/opentelemetry-collector-contrib:0.91.0

# Note: OpenTelemetry Collector イメージは既にディストロレスイメージで、
# 非rootユーザー(UID 10001)で実行されています。

# デフォルトポートを公開
EXPOSE 4317 4318 8888 8889 13133 55679

# 環境変数の設定
ENV OTEL_LOG_LEVEL=info
ENV OTEL_CONFIG_FILE=/etc/otelcol-contrib/config.yaml

# 設定ファイルをコピー (UID 10001 に合わせる)
COPY --chown=10001:10001 config.yaml /etc/otelcol-contrib/config.yaml

# デフォルト設定ファイルで起動
ENTRYPOINT ["/otelcol-contrib"]
CMD ["--config=/etc/otelcol-contrib/config.yaml"]

ポイント:

  • otel/opentelemetry-collector-contribイメージには、GCP向けのエクスポーターが含まれています
  • gRPC(4317)とHTTP(4318)の両方のポートを公開し、Claude Codeからの接続を受け付けます

設定ファイル(config.yaml)の作成

OpenTelemetry Collectorの動作を定義する設定ファイルを作成します。この設定で、データの受信方法、処理方法、送信先を指定します。

config.yaml
# OpenTelemetry Collector設定ファイル (Cloud Run用)
# テレメトリーデータの受信、処理、エクスポートを定義

receivers:
  # OTLP (OpenTelemetry Protocol) レシーバー
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

exporters:
  # Google Cloud Monitoring エクスポーター
  googlecloud:
    project: ${GOOGLE_CLOUD_PROJECT}
    metric:
      prefix: "custom.googleapis.com/"

  # Google Cloud Logging エクスポーター
  googlecloud/logs:
    project: ${GOOGLE_CLOUD_PROJECT}

  # デバッグ用ロギングエクスポーター
  logging:
    verbosity: detailed

processors:
  # バッチプロセッサー
  batch:
    timeout: 10s

  # リソースプロセッサー (Cloud Run環境用のメタデータ追加)
  resource:
    attributes:
      - key: gcp.resource.type
        value: "cloud_run_revision"
        action: upsert
      - key: service.name
        value: "otel-collector"
        action: upsert
      - key: service.version
        value: "1.0.0"
        action: upsert

extensions:
  # ヘルスチェック拡張
  health_check:
    endpoint: 0.0.0.0:13133

  # zpages拡張 (デバッグ用)
  zpages:
    endpoint: 0.0.0.0:55679

service:
  extensions: [health_check, zpages]

  pipelines:
    # メトリクス用パイプライン
    metrics:
      receivers: [otlp]
      processors: [resource, batch]
      exporters: [googlecloud, logging]

    # ログ用パイプライン
    logs:
      receivers: [otlp]
      processors: [resource, batch]
      exporters: [googlecloud/logs, logging]

※ GOOGLE_CLOUD_PROJECTは、Cloud Run起動時に環境変数で設定します。

Receivers(受信者)

  • otlp: Claude CodeからOTLP(OpenTelemetry Protocol)形式でデータを受信
    • gRPC(ポート4317)とHTTP(ポート4318)の両方に対応

Exporters(エクスポーター)

  • googlecloud: メトリクスをCloud Monitoringに送信
    • custom.googleapis.com/プレフィックスでカスタムメトリクスとして登録
  • googlecloud/logs: ログをCloud Loggingに送信
  • logging: デバッグ用にコンソールにも出力

Processors(プロセッサー)

  • batch: データをバッチ化して効率的にエクスポート(10秒ごと)
  • resource: Cloud Run環境のメタデータを追加(サービス名、バージョンなど)

Pipelines(パイプライン)

OpenTelemetry Collectorにおけるデータ処理の流れを定義します。

  • metrics: メトリクスデータの処理フロー(レシーバー → プロセッサー → エクスポーター)
  • logs: ログデータの処理フロー

Cloud Runの起動

詳細は割愛しますが、前述のArtifact Registryに登録したイメージからCloud Runを起動し、メトリクスの送信を受信できるようにします。

Claude Codeの環境変数設定

Cloud Runが起動したら、Claude Codeからメトリクスを送信する設定を行います。

公式ページを参考に、Claude Code側でOpenTelemetry Collectorにデータを送信するための環境変数を設定します。

export CLAUDE_CODE_ENABLE_TELEMETRY=1

export OTEL_METRICS_EXPORTER=otlp
export OTEL_LOGS_EXPORTER=otlp

export OTEL_EXPORTER_OTLP_PROTOCOL=grpc
export OTEL_EXPORTER_OTLP_ENDPOINT=<Cloud Run の公開URL>

export OTEL_METRIC_EXPORT_INTERVAL=60000
export OTEL_LOGS_EXPORT_INTERVAL=5000

設定後、実際にClaude Codeを動かして、OpenTelemetry Collector側にデータが送信されているかを確認してください。

正しく送信されていれば、Cloud Loggingからログを確認できます。

Cloud Monitoringの設定

最後に、Google Cloud Monitoringでダッシュボードを作成し、Claude Codeの利用状況を可視化します。

ユーザーごとの生成コード行数を集計

例えば、ユーザーごとの生成コード行数はclaude_code.lines_of_code.countから取得できます。

以下のPromQLクエリを使って、ユーザーごとに1日あたりの生成コード行数を集計できます。

sum by ("user_email")(
  increase(
    {"__name__"="custom.googleapis.com/claude_code.lines_of_code.count",monitored_resource="generic_node"}[1d]
  )
)

その他のメトリクス

https://docs.claude.com/ja/docs/claude-code/monitoring-usage#メトリクス

Claude Codeからは、以下のようなメトリクスが送信されます。

メトリクス名 説明 単位
claude_code.session.count 開始されたCLIセッション数 count
claude_code.lines_of_code.count 変更されたコード行数 count
claude_code.pull_request.count 作成されたプルリクエスト数 count
claude_code.commit.count 作成されたgitコミット数 count
claude_code.cost.usage Claude Codeセッションのコスト USD
claude_code.token.usage 使用されたトークン数 tokens
claude_code.code_edit_tool.decision コード編集ツール許可決定の数 count
claude_code.active_time.total 総アクティブ時間(秒) s

おわりに

今回は、OpenTelemetry CollectorとGoogle Cloud Monitoringを使って、Claude Codeの利用状況を可視化する仕組みを紹介しました。

Google Cloud Monitoringはそれほどリッチな表現はできませんが、複雑な表現が不要な場合はシンプルに実装できますので、参考にしていただければ幸いです。

Timelabテックブログ

Discussion