メインコンテンツまでスキップ

Claude Codeの使用状況をモニタリングする

· 約3分

Claude Codeで設定を行うことでトークンや料金の状況を確認できるらしい
https://docs.anthropic.com/ja/docs/claude-code/monitoring-usage

のでやってみた

Claude Codeのドキュメントによれば以下の環境変数を設定すればよいとのこと

  • CLAUDE_CODE_ENABLE_TELEMETRY
  • OTEL_METRICS_EXPORTER
  • OTEL_EXPORTER_OTLP_PROTOCOL
  • OTEL_EXPORTER_OTLP_ENDPOINT

メトリクスのエクスポートはPrometheus形式かOTLPかを選べるようだが、サーバーからスクレイピングしに来る形だとスケールさせづらそうなのでOTLPでやってみることにした

メトリクスの収集はとりあえずPrometheusとして、OTLPで待ち受けるアプリケーションを別途用意する必要があるかと調べていたが、PrometheusでもOTLPのサポートをしていたようでその必要はなかった
https://prometheus.io/docs/guides/opentelemetry/

起動時に --web.enable-otlp-receiver を追加で渡せばOTLPを待ち受けてくれるらしい
gRPCはサポートしていないようなので、Claude Codeからはprotobufで送るように指定が必要になる

双方のドキュメントを見る限り以下の設定を行えば実現できそうだったが、Prometheusでエラーが出ており上手くいかなかった

CLAUDE_CODE_ENABLE_TELEMETRY=1
OTEL_METRICS_EXPORTER='otlp'
OTEL_EXPORTER_OTLP_PROTOCOL='http/protobuf'
OTEL_EXPORTER_OTLP_ENDPOINT='http://localhost:9090/api/v1/otlp'

以下のログが出ており、メトリクスの形式が期待したものではないらしい

level=WARN source=write_handler.go:601 msg="Error translating OTLP metrics to Prometheus write request" component=web err="invalid temporality and type combination for metric \"claude_code.session.count\""

OpenTelemetryについてまだあまりわかっていなかったので、この解決にしばらくかかった
どうも OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE=CUMULATIVE の設定が必要だったらしい
https://opentelemetry.io/docs/specs/otel/metrics/sdk_exporters/otlp/#additional-environment-variable-configuration

最終的には以下の設定でClaude Codeを実行すると、Prometheusでメトリクスが収集されていることが確認できた

CLAUDE_CODE_ENABLE_TELEMETRY=1
OTEL_METRICS_EXPORTER='otlp'
OTEL_EXPORTER_OTLP_PROTOCOL='http/protobuf'
OTEL_EXPORTER_OTLP_ENDPOINT='http://localhost:9090/api/v1/otlp'
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE='CUMULATIVE',
OTEL_METRIC_EXPORT_INTERVAL=1000

この辺はそれこそClaude Codeでモックサーバーつくらせたりログ食わせたりして解決したのでまだよくわかってない
OpenTelemetryはずっと調べようとリストに入れたきり動けていなかったので、そろそろちゃんと知らないとなというところ

検証につかったDocker Compose
https://gitlab.com/yokotano/study-prometheus