搭配 Claude SDK 使用 OpenTelemetry
追蹤 Claude SDK 傳送的每個請求以及其工具執行器執行的每個工具,並將 span 傳送至您的可觀測性平台。
透過 OpenTelemetry,Claude SDK 可以為其發送的每個請求,以及 tool runner(工具執行器)執行的每次工具使用,各發出一個「Span」(跨度)。您可以在您的可觀測性平台中檢視這些 span,它們會巢狀於您自己的追蹤中。
SDK 會在您的應用程式中發出 span。您應用程式的 OpenTelemetry 匯出器會將它們傳送到您的可觀測性平台。
1. 安裝 SDK
安裝或升級至最新版本的 Claude SDK:
pip install --upgrade anthropic如果您的應用程式尚未使用 OpenTelemetry SDK,請安裝它並搭配一個主控台匯出器,您將在下一步中使用該匯出器來列印 span:
pip install opentelemetry-sdk2. 註冊 tracer provider
「Tracer provider」(追蹤器提供者)是建立 span 並將其傳遞給您匯出器的 OpenTelemetry 物件。SDK 會使用您應用程式所註冊的 tracer provider,因此您的 SDK 呼叫維持不變。請在您想要追蹤的第一個呼叫之前註冊它。
以下範例註冊一個將每個 span 列印到主控台的 tracer provider,然後發出一次呼叫。在連接可觀測性平台之前,您可以用它來查看 span:
from anthropic import Anthropic
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor
# 註冊一個 tracer provider,將每個 span 輸出至主控台。
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)主控台會顯示一個 anthropic.messages.create span。
3. 將 span 傳送到您的可觀測性平台
將主控台匯出器替換為指向您可觀測性平台的 OTLP 匯出器。關於您所用語言的設定方式,請參閱 OpenTelemetry 文件中的 Python 匯出器、TypeScript 匯出器、.NET 匯出器、Go 匯出器、Java SDK 設定、PHP 匯出器、或 Ruby 匯出器。
4. 設定 SDK
使用以下選項來決定 span 中包含哪些內容以及它們傳送到何處。您可以在程式碼中設定選項,或使用其名稱下方列出的環境變數(如果有的話)來設定。
| 選項 | 用途 | 預設值 |
|---|---|---|
traces.content_modeANTHROPIC_OPEN_TELEMETRY_TRACES_CONTENT_MODE=content | 在 span 中包含提示與回應。請參閱內容模式。 | metadata_only |
traces.max_content_bytesANTHROPIC_OPEN_TELEMETRY_TRACES_MAX_CONTENT_BYTES | 變更每個 span 的內容限制。請參閱內容限制。 | 0.75 MB |
conversation_id | 將多個呼叫連結成一段對話。SDK 會將 ID 寫入 gen_ai.conversation.id。此 ID 在兩種內容模式下都會被匯出,因此請勿在其中放入個人資料或機密資訊。 | 無 |
tracer_provider | 選擇接收 SDK span 的 tracer provider。 | 您在註冊 tracer provider 中設定的 tracer provider |
propagationANTHROPIC_OPEN_TELEMETRY_PROPAGATION=false | 停止隨請求傳送 trace context 和 baggage 標頭,例如當您的 HTTP 用戶端檢測已經傳送它們時。SDK 仍會產生 span。適用於 Python、TypeScript、Go、Java、Ruby 和 PHP SDK。 | 開啟 |
open_telemetryANTHROPIC_OPEN_TELEMETRY=false | 為單一用戶端關閉 span,例如當另一個函式庫已在追蹤 SDK 時。 | 開啟 |
以下範例示範如何使用每個選項:
# 使用特定的 tracer provider 並記錄內容。
# 設定 open_telemetry 會覆寫所有 ANTHROPIC_OPEN_TELEMETRY* 環境變數。
client = Anthropic(
open_telemetry={"tracer_provider": provider, "traces": {"content_mode": "content"}}
)
# 為單一用戶端關閉 span。
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"}],
)後續步驟
串流追蹤
串流的 anthropic.messages.create span 會在您的程式碼讀完整個串流或關閉串流時結束,因此若您提前停止讀取串流,請將其關閉。在內容模式下,只有當您使用 messages.stream() 讀取串流時,span 才會包含模型回應。
您在讀取串流期間啟動的 span 是 SDK span 的同層級 span,而非其子 span。若要將它們與請求歸為一組,請在呼叫與讀取迴圈外圍啟動您自己的 span。
Managed Agents 自行託管沙箱追蹤
在 Managed Agents 自行託管沙箱中,工具由您的沙箱執行,因此工具 span 來自 SDK 而非 API。Python、TypeScript 和 Go SDK 中的環境 worker 會為其執行的每個工具以及其傳送的每個請求發出一個 span,並將它們歸入每個工作項目各一個的 anthropic.environment.work span 之下。
若要取得這些 span:
- 在執行 worker 的程序中,依照步驟 1 至 4 設定 SDK 追蹤。
- 允許從沙箱到您的可觀測性平台或 OpenTelemetry Collector 的網路流量。
當 worker 傳送工具結果時,該請求的 API span 會巢狀位於其 SDK span 之下。對於工作程序傳送至 Claude Platform on AWS 的請求,API span 則會位於它們各自的追蹤中。
trace context 和 baggage
SDK 會在每個請求中使用您應用程式的 propagator,透過 traceparent 等標頭將 trace context 傳送給 API。如果該 propagator 也寫入 baggage,SDK 也會傳送您的 baggage。若想傳送不含 baggage 的 trace context,請只註冊 W3C trace context propagator。
若不想讓 SDK 傳送這些標頭(例如您的 HTTP 用戶端檢測已經傳送了它們),請關閉 SDK 的傳播:
client = Anthropic(open_telemetry={"propagation": False})SDK 呼叫 MCP 工具時,SDK 的工具 span 就是目前的 span。部分 MCP 用戶端函式庫會透過 _meta 將 trace context 傳送到 MCP 伺服器,因此讀取它的伺服器可以將自己的 span 加入您的 trace,位於該工具 span 之下。2.0 以上版本的 Python mcp 套件和 C# ModelContextProtocol 套件會這樣做。TypeScript、Go、Java、Ruby 和 PHP 的 MCP SDK 不會自行這樣做。
疑難排解
| 問題 | 檢查項目 |
|---|---|
| 沒有來自 SDK 的 span | 在第一次呼叫之前註冊 tracer provider。請確認您已依照安裝 SDK 安裝 SDK,且 ANTHROPIC_OPEN_TELEMETRY 不是 false。 |
| Java SDK 未將 span 傳送至已註冊的 tracer provider,或未將 trace context 傳送至 API | 另一個相依套件將 opentelemetry-api 設定為低於 1.57.0 的版本。請將 opentelemetry-api 升級至 1.57.0 或更新版本。 |
| SDK span 未巢狀於您的 span 之下,或您的工具所建立的 span 未巢狀於工具 span 之下 | 請從您自己的某個 span 內部呼叫 SDK,如將 API span 連接到您自己的追蹤中的範例所示。在 Go 中,請從工具執行器傳遞給工具的 ctx 啟動您的工具所建立的 span。 |
來自 SDK 的請求沒有 traceparent 標頭 | 向 OpenTelemetry 註冊 W3C trace context propagator。SDK 會使用您應用程式的 propagator 寫入標頭。 |
| 串流的 SDK span 未結束或沒有回應 | 請參閱串流追蹤。 |
| 每個請求都出現兩次 | 請求的 SDK span 和 API span 名稱相同。請使用 span 種類或 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?