Claude SDKでOpenTelemetryを使用する
Claude SDKが送信する各リクエストと、そのツールランナーが実行する各ツールをトレースし、スパンをオブザーバビリティプラットフォームに送信します。
OpenTelemetryを使用すると、Claude SDKは送信する各リクエストと、ツールランナーが実行する各ツール使用について、「span」(スパン)を出力できます。これらのスパンは、オブザーバビリティプラットフォームで、独自のトレース内にネストされた形で確認できます。
SDKはアプリケーション内でスパンを出力します。アプリケーションのOpenTelemetryエクスポーターがそれらをオブザーバビリティプラットフォームに送信します。
1. SDKをインストールする
Claude SDKの最新バージョンをインストールするか、最新バージョンにアップグレードします:
pip install --upgrade anthropicアプリケーションでまだOpenTelemetry SDKを使用していない場合は、次のステップでスパンを出力するために使用するコンソールエクスポーターとともにOpenTelemetry SDKをインストールします:
pip install opentelemetry-sdk2. トレーサープロバイダーを登録する
「tracer provider」(トレーサープロバイダー)とは、スパンを作成してエクスポーターに渡すOpenTelemetryのオブジェクトです。SDKはアプリケーションが登録したトレーサープロバイダーを使用するため、SDKの呼び出しは変更不要です。トレースしたい最初の呼び出しの前に登録してください。
次の例では、各スパンをコンソールに出力するトレーサープロバイダーを登録し、1回の呼び出しを行います。オブザーバビリティプラットフォームに接続する前にスパンを確認するために使用してください:
from anthropic import Anthropic
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor
# 各スパンをコンソールに出力する tracer provider を登録します。
provider = TracerProvider()
provider.add_span_processor(SimpleSpanProcessor(ConsoleSpanExporter()))
trace.set_tracer_provider(provider)
client = Anthropic()
message = client.messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(message.content)コンソールには1つのanthropic.messages.createスパンが表示されます。
3. スパンをオブザーバビリティプラットフォームに送信する
コンソールエクスポーターを、オブザーバビリティプラットフォームを指すOTLPエクスポーターに置き換えます。お使いの言語での設定については、OpenTelemetryドキュメントのPythonエクスポーター、TypeScriptエクスポーター、.NETエクスポーター、Goエクスポーター、Java SDKの設定、PHPエクスポーター、またはRubyエクスポーターを参照してください。
4. SDKを設定する
次のオプションを使用して、スパンに含める内容と送信先を決定します。オプションは、コードで設定することも、環境変数がある場合はオプション名の下に記載されている環境変数で設定することもできます。
| オプション | 用途 | デフォルト |
|---|---|---|
traces.content_modeANTHROPIC_OPEN_TELEMETRY_TRACES_CONTENT_MODE=content | プロンプトとレスポンスをスパンに含めます。コンテンツモードを参照してください。 | metadata_only |
traces.max_content_bytesANTHROPIC_OPEN_TELEMETRY_TRACES_MAX_CONTENT_BYTES | 各スパンのコンテンツ上限を変更します。コンテンツの制限を参照してください。 | 0.75 MB |
conversation_id | 複数の呼び出しを1つの会話として関連付けます。SDKはIDをgen_ai.conversation.idに書き込みます。IDはどちらのコンテンツモードでもエクスポートされるため、個人データやシークレットを含めないでください。 | なし |
tracer_provider | SDKのスパンを受け取るトレーサープロバイダーを選択します。 | トレーサープロバイダーを登録するで設定したトレーサープロバイダー |
propagationANTHROPIC_OPEN_TELEMETRY_PROPAGATION=false | リクエストでトレースコンテキストとbaggageのヘッダーを送信しないようにします。たとえば、HTTPクライアントのインストルメンテーションがすでにこれらを送信している場合に使用します。SDKは引き続きスパンを生成します。Python、TypeScript、Go、Java、Ruby、PHPのSDKで使用できます。 | オン |
open_telemetryANTHROPIC_OPEN_TELEMETRY=false | 1つのクライアントのスパンをオフにします。たとえば、別のライブラリがすでにSDKをトレースしている場合に使用します。 | オン |
次の例は、各オプションの使用方法を示しています:
# 特定の tracer provider を使用し、コンテンツを記録します。
# open_telemetry を設定すると、すべての ANTHROPIC_OPEN_TELEMETRY* 環境変数が上書きされます。
client = Anthropic(
open_telemetry={"tracer_provider": provider, "traces": {"content_mode": "content"}}
)
# 1 つのクライアントでスパンを無効にします。
quiet_client = Anthropic(open_telemetry=False)
# with_options() で会話 ID を設定します。これはクライアントのコピーを返します。
# with_options() はオプション全体を置き換えるため、client.open_telemetry から始めます。
message = client.with_options(
open_telemetry={**client.open_telemetry, "conversation_id": "conv_42"}
).messages.create(
model="claude-opus-5-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
)次のステップ
Claude APIのオブザーバビリティを得られます。
クライアントからClaude APIへのリクエストを追跡します。
ストリームのトレース
ストリームのanthropic.messages.createスパンは、コードがストリーム全体を読み終えるか、ストリームを閉じた時点で終了します。そのため、途中で読み取りをやめるストリームは閉じてください。コンテンツモードでは、messages.stream()でストリームを読み取った場合にのみ、スパンにモデルのレスポンスが含まれます。
ストリームの読み取り中に開始したスパンは、SDKスパンの子ではなく兄弟になります。それらをリクエストとまとめるには、呼び出しと読み取りループの両方を囲む独自のスパンを開始してください。
Managed Agentsのセルフホストサンドボックスのトレース
Managed Agentsのセルフホストサンドボックスでは、サンドボックスがツールを実行するため、ツールスパンはAPIではなくSDKから出力されます。Python、TypeScript、およびGo SDKの環境ワーカーは、実行する各ツールと送信する各リクエストについてスパンを出力します。これらのスパンは、作業項目ごとに1つのanthropic.environment.workスパンの下にまとめられます。
これらのスパンを取得するには:
- ワーカーを実行するプロセスで、手順1~4に従ってSDKトレーシングをセットアップします。
- サンドボックスからオブザーバビリティプラットフォームまたはOpenTelemetry Collectorへのネットワークトラフィックを許可します。
ワーカーがツール結果を送信すると、そのリクエストのAPIスパンがそのSDKスパンの下にネストされます。ワーカーがClaude Platform on AWSに送信するリクエストについては、APIスパンは代わりにそれぞれ独自のトレースに含まれます。
トレースコンテキストとbaggage
SDKは各リクエストで、アプリケーションのプロパゲーターを使って、traceparentなどのヘッダーでトレースコンテキストをAPIに送信します。そのプロパゲーターがbaggageも書き込む場合、SDKはbaggageも送信します。baggageなしでトレースコンテキストを送信するには、W3Cトレースコンテキストプロパゲーターだけを登録してください。
SDKがこれらのヘッダーを送信しないようにするには(HTTPクライアントのインストルメンテーションがすでに送信している場合など)、SDKのプロパゲーションをオフにします。
client = Anthropic(open_telemetry={"propagation": False})SDKがMCPツールを呼び出している間は、SDKのツールスパンが現在のスパンです。一部のMCPクライアントライブラリは、トレースコンテキストを_metaでMCPサーバーに送信します。これを読み取るサーバーは、そのツールスパンの下にスパンを追加してトレースに加えることができます。バージョン2.0以降のPythonのmcpパッケージと、C#のModelContextProtocolパッケージがこれを行います。TypeScript、Go、Java、Ruby、PHPのMCP SDKは、自動ではこれを行いません。
トラブルシューティング
| 問題 | 確認事項 |
|---|---|
| SDKからのスパンがない | 最初の呼び出しの前にトレーサープロバイダーを登録してください。SDKのインストールのとおりにSDKをインストールしていること、およびANTHROPIC_OPEN_TELEMETRYがfalseでないことを確認してください。 |
| Java SDKが登録されたトレーサープロバイダーにスパンを送信しない、またはAPIにトレースコンテキストを送信しない | 別の依存関係がopentelemetry-apiを1.57.0未満に設定しています。opentelemetry-apiを1.57.0以降にアップグレードしてください。 |
| SDKスパンが自分のスパンの下にネストされない、またはツールが作成するスパンがそのツールスパンの下にネストされない | 「APIスパンを独自のトレースに接続する」の例のように、自分のスパンのいずれかの内部からSDKを呼び出してください。Goでは、ツールが作成するスパンを、ツールランナーがツールに渡すctxから開始してください。 |
SDKからのリクエストにtraceparentヘッダーがない | OpenTelemetryにW3Cトレースコンテキストプロパゲーターを登録してください。SDKはアプリケーションのプロパゲーターを使用してヘッダーを書き込みます。 |
| ストリームのSDKスパンが終了しない、またはレスポンスが含まれない | ストリームのトレースを参照してください。 |
| 各リクエストが2回表示される | リクエストのSDKスパンとAPIスパンは同じ名前を持ちます。スパンの種類またはservice.nameを使用して区別してください。別のライブラリもSDKをトレースしている場合は、どちらか一方をオフにしてください。 |
Compatibility
- Supported platforms
- Claude APIBeta
- Claude Platform on AWSBeta
- Amazon BedrockBeta
- Google CloudBeta
- Microsoft FoundryBeta
- 対応製品
- Messages API, Claude Managed Agents
Was this page helpful?