9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeの利用状況確認用ダッシュボードを作ってみよう

9
Last updated at Posted at 2026-05-12

はじめに

この記事では、Claude Code の利用状況を可視化するために、Claude Codeにあらかじめ実装されているOpenTelemetry(Otel)を使ってNew Relicにデータを送信し、ダッシュボードを作成する手順を紹介します。ダッシュボードを作成することで、トークン使用量、コスト、ユーザーごとの利用状況などを一目で把握できるようになります。

前提条件・設定

基本的な設定方法については、本家のサイトにも詳細な解説もあり、やってみたブログもいくつかあるため、ここでは詳細な手順は割愛し、代わりに設定のサンプルとポイントだけご紹介します。

こちらが設定のサンプルです。

~/.claude/settings.json
{
  "env": {
    "CLAUDE_CODE_ENABLE_TELEMETRY": "1",
    "OTEL_METRICS_EXPORTER": "otlp",
    "OTEL_LOGS_EXPORTER": "otlp",
    "OTEL_TRACES_EXPORTER": "otlp",
    "OTEL_EXPORTER_OTLP_PROTOCOL": "grpc",
    "OTEL_EXPORTER_OTLP_ENDPOINT": "https://otlp.nr-data.net:4317",
    "OTEL_EXPORTER_OTLP_HEADERS": "api-key=<license key に置き換えてください>",
    "OTEL_LOG_TOOL_DETAILS": "1",
    "CLAUDE_CODE_ENHANCED_TELEMETRY_BETA": "1",
    "OTEL_EXPORTER_OTLP_METRICS_PROTOCOL": "http/protobuf",
    "OTEL_LOG_USER_PROMPTS": "1",
    "OTEL_LOG_TOOL_CONTENT": "1",
    "OTEL_LOG_RAW_API_BODIES": "1",
    "OTEL_METRICS_INCLUDE_SESSION_ID": "true",
    "OTEL_METRICS_INCLUDE_VERSION": "true",
    "OTEL_METRICS_INCLUDE_ACCOUNT_UUID": "true"
  }
}
  • OTEL_EXPORTER_OTLP_HEADERSのapi-key=より右はご自身のライセンスキーに置き換えてください。
  • OTEL_LOG_USER_PROMPTSなど、ユーザーの入力や色んな情報がOtelで送信される設定にしています。
  • Claude Codeの設定ファイルは4種類あり、それぞれ優先順位とスコープが異なります。用途に応じて設定するファイルを選択してください。特にmanaged-settings.jsonの設定は優先されるため、注意してください。

設定が完了しNew Relicにデータが送信されていれば、Data explorerのMetricsでclaudeと入力するといくつかのメトリクスが存在していることが確認できます。
image.png

ここからは上記の設定が完了していることを前提として、次に進みます。

ダッシュボードの作成

ここからは、New Relicのダッシュボードの各ウィジットに設定するNRQLと、グラフの種類を紹介していきます。

トークンとコストの監視

1. トークン使用量の合計

合計のトークン使用量を表示します。

SELECT sum(`claude_code.token.usage`) as Token
FROM Metric
WHERE metricName = 'claude_code.token.usage'
  • グラフの種類: Line
  • 解説: claude_code.token.usageを合計すると使用したトークン量がわかります。

image.png

2. トークン使用量の時系列推移

インプット、アウトプット、キャッシュ、合計のトークン使用量の推移を表示します。

SELECT
  filter(sum(`claude_code.token.usage`), where type = 'input') as 'Input Tokens',
  filter(sum(`claude_code.token.usage`), where type = 'output') as 'Output Tokens',
  filter(sum(`claude_code.token.usage`), where type in('cacheCreation','cacheRead')) as 'Cache Tokens',
  sum(`claude_code.token.usage`) as 'Total Tokens'
FROM Metric
WHERE metricName = 'claude_code.token.usage'
TIMESERIES
Since 1 week ago
  • グラフの種類: Line
  • 解説: filter関数を使い、type(input/output/cache)ごとにトークン使用量を分けて表示しています。

image.png

3. 合計コスト

合計コストを表示します。

SELECT sum(`claude_code.cost.usage`) as 'Total Cost'
FROM Metric
WHERE metricName = 'claude_code.cost.usage'
AND `claude_code.cost.usage` IS NOT NULL
  • グラフの種類: Billboard
  • 解説: claude_code.cost.usageメトリクスの合計値を計算し、総コストを表示します。単位はドルです。

image.png

4. 合計コストの時系列推移

合計コストを表示します。

SELECT sum(`claude_code.cost.usage`) as 'Total Cost'
FROM Metric
WHERE metricName = 'claude_code.cost.usage'
WHERE `claude_code.cost.usage` IS NOT NULL
TIMESERIES
  • グラフの種類: Line
  • 解説: TIMESERIES を使うことで時系列で追跡できます。

image.png

プロンプトとレスポンスの監視

5. 合計レスポンス数

AIからの合計レスポンス数を表示します。

FROM Log SELECT count(body.content) as Responses
where entity.name = 'claude-code' and event.name ='api_response_body'
  • グラフの種類: Billboard
  • 解説: api_response_body というイベント名のログの数をカウントし、AIからの総レスポンス数を表示します。

image.png

6. レスポンス数の時系列推移

レスポンス数の時間ごとの推移を折れ線グラフで表示します。

FROM Log SELECT count(body.content) as Responses
where entity.name = 'claude-code' and event.name ='api_response_body'
TIMESERIES auto
since 1 week ago
  • グラフの種類: Line
  • 解説: TIMESERIES を使うことで時系列で追跡できます。

image.png

7. プロンプトとレスポンスの一覧

ユーザーが入力したプロンプトと、それに対するAIのレスポンスをテーブル形式で表示します。

FROM Log SELECT body.content as 'AIレスポンス', prompt as 'ユーザープロンプト'
where entity.name = 'claude-code' and event.name in ('user_prompt','api_response_body')
  • グラフの種類: Table
  • 解説: user_promptapi_response_bodyの両方のイベントログから、プロンプトとレスポンスの内容を並べて表示します。

image.png

モデルごとの分析

8. モデルごとの合計コスト推移

どのモデルにどれくらいのコストがかかっているかを時系列で比較します。

SELECT sum(`claude_code.cost.usage`) as 'Total Cost'
FROM Metric
WHERE metricName = 'claude_code.cost.usage'
AND `claude_code.cost.usage` IS NOT NULL
TIMESERIES
facet model
  • グラフの種類: Line
  • 解説: FACET model を追加することで、model属性(例: claude-sonnet-4-6)ごとにグラフを分割して表示できます。

image.png

9. モデルごとの平均トークン使用量

モデルごとの平均トークン使用量を表示します。

SELECT average(`claude_code.token.usage`)
FROM Metric
WHERE metricName = 'claude_code.token.usage'
FACET model
SINCE 24 hours ago
  • グラフの種類: Table
  • 解説: average()関数で、モデルごとの1リクエストあたりの平均トークン使用量を把握できます。

image.png

ユーザーごとの分析

10. ユーザーごとのトークン使用量

どのユーザーがどれくらいトークンを使用しているかを可視化します。

SELECT sum(`claude_code.token.usage`)
FROM Metric
WHERE metricName = 'claude_code.token.usage'
FACET user.email
  • グラフの種類: Bar
  • 解説: FACET user.email を使うことで、ユーザーのメールアドレスごとにトークン使用量を集計できます。

image.png

11. ユーザーごとの利用時間

どのユーザーがどれくらいClaude Codeを使用しているかを可視化します。

SELECT sum(`claude_code.active_time.total`) as 'seconds'
FROM Metric
WHERE metricName = 'claude_code.active_time.total'
WHERE `claude_code.active_time.total` IS NOT NULL
FACET user.email
  • グラフの種類: Bar
  • 解説: claude_code.active_time.total はユーザーがClaude Codeを実際に操作した時間、例えばユーザー操作やCLI処理の時間の合計になります。

image.png

まとめ

本記事では、OpenTelemetry Collectorを利用してClaude Codeの利用状況をNew Relicで可視化するためのNRQLクエリとダッシュボード作成例を紹介しました。

これらのクエリを組み合わせることで、コスト管理、利用傾向の分析、パフォーマンス監視など、多角的なインサイトを得ることが可能になります。

例えば、Claude Codeを全社的に展開し、活用を促さなければいけない場合に、誰がどの程度活用しているのかを把握したり、トークン消費や料金が予算を超過していないかアラートを鳴らしたり、コンプライアンスの観点で問題がないか、などでもぜひ活用をご検討ください。

New Relic株式会社のQiita Organizationでは、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?