Claude Codeの使用状況をモニタリングする
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