複数環境でのClaude Code利用統計をOpenTelemetryで一元管理する
Claude Codeの利用統計の可視化ツールとしてccusageが有名ですが、リモートサーバなど複数の環境で利用している場合では、それぞれの環境ごとにしか集計することができません。私の場合は手元のラップトップに始まり、Kaggleなどのデータコンペ用のGPUサーバやProxmoxで構築した各種開発環境などがいくつもあります。それらを横断してClaude Codeの利用統計を見る必要がありました。
Claude Codeには、標準でOpenTelemetryによるテレメトリ送信機能が実装されています。これを使うことで、自前のサーバにメトリクス・ログを集約し、複数環境の利用統計を一元管理できるようになります。単なる利用コストの確認のみならず、利用モデルの確認などにも使えて、とても便利です。
この記事では、Claude CodeのOpenTelemetryによる利用統計の集約および可視化までの流れを大まかに紹介します。
全体構成
Claude Codeを起点としたログの流れは以下の通りです。
Claude Code → OTLP → OpenTelemetry Collector ─┬─→ VictoriaMetrics ─→ Grafana
└─→ Loki ────────────┘
各環境のClaude CodeからOTLP形式でテレメトリを送信し、自前のサーバでOpenTelemetry Collectorが受信します。メトリクスはVictoriaMetrics、ログはLokiに保存され、Grafanaで可視化する構成になっています。
端末間の通信にはTailscaleを利用しています。そうすることで、ネットワーク設定を気にせずどの環境からでもテレメトリを送信できます。また、特段外部公開しているサーバやクラウドのインスタンスがなくとも、自宅で常時動いているミニPCなどにホストしておくことで簡単に環境構築できるのも嬉しいところです。
設定
Claude Code
~/.claude/settings.jsonのenvセクションで環境変数を設定します。
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_LOGS_EXPORTER": "otlp",
"OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://my-selfhost-server:4317",
"OTEL_RESOURCE_ATTRIBUTES": "host.name={{ .chezmoi.hostname }}"
}
}
私は~/.claude/settings.jsonをchezmoi管理下に置いて、テンプレート機能で{{ .chezmoi.hostname }}を使って各環境のホスト名を自動設定しています。これにより、Grafanaダッシュボードでどの環境からのメトリクスかを識別できます。
サーバ側
サーバ側はdocker composeで以下の4つのサービスを構成しています。
- OpenTelemetry Collector: テレメトリの受信とルーティングを担当
- VictoriaMetrics: Prometheus互換の時系列データベース
- Loki: Grafana製のログ集約システム
- Grafana: 可視化ダッシュボード
当初はPrometheusで構築していましたが、データ容量などの観点で互換性のあるVictoriaMetricsに移行しています。
Grafanaダッシュボード
GrafanaのダッシュボードはColeMurray/claude-code-otelを参考にしています。

このスクショはデータ分析コンペ終盤でスコアが伸びずにあれこれ試行錯誤していたときのものです。流石にこれくらい激しく叩くことは普段あまりないですが、定量的に比較したり振り返れるのが個人的に気に入っています。
まとめ
複数環境でのClaude Codeの利用統計を把握するには、OpenTelemetryによるテレメトリ集計が便利です。Claude Code側の設定はsettings.jsonに環境変数を追加するだけで、あとはサーバ側でOpenTelemetry Collector + VictoriaMetrics + Loki + Grafanaの構成を立てれば完了です。
ついccusageを見てニヤけてしまう人にはおすすめです。