Menggunakan OpenTelemetry dengan Claude SDK
Lacak setiap permintaan yang dikirim oleh Claude SDK dan setiap alat yang dijalankan oleh tool runner-nya, lalu kirim span ke platform observabilitas Anda.
Dengan OpenTelemetry, Claude SDK dapat memancarkan Span (rentang) untuk setiap permintaan yang dikirimnya dan setiap penggunaan alat yang dijalankan oleh tool runner. Anda dapat melihat span ini di platform observabilitas Anda, bersarang di dalam trace Anda sendiri.
SDK memancarkan span di aplikasi Anda. "Exporter" (pengekspor) OpenTelemetry aplikasi Anda mengirimkannya ke platform observabilitas Anda.
1. Instal SDK
Instal atau tingkatkan ke versi terbaru Claude SDK:
pip install --upgrade anthropicJika aplikasi Anda belum menggunakan SDK OpenTelemetry, instal SDK tersebut beserta exporter konsol, yang Anda gunakan pada langkah berikutnya untuk mencetak span:
pip install opentelemetry-sdk2. Daftarkan tracer provider
Tracer provider (penyedia tracer) adalah objek OpenTelemetry yang membuat span dan meneruskannya ke exporter Anda. SDK menggunakan tracer provider yang didaftarkan oleh aplikasi Anda, sehingga panggilan SDK Anda tetap sama. Daftarkan tracer provider sebelum panggilan pertama yang ingin Anda telusuri.
Contoh berikut mendaftarkan tracer provider yang mencetak setiap span ke konsol, lalu melakukan satu panggilan. Gunakan contoh ini untuk melihat span sebelum Anda menghubungkan platform observabilitas:
from anthropic import Anthropic
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import ConsoleSpanExporter, SimpleSpanProcessor
# Daftarkan tracer provider yang mencetak setiap span ke konsol.
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)Konsol menampilkan satu span anthropic.messages.create.
3. Kirim span ke platform observabilitas Anda
Ganti exporter konsol dengan exporter OTLP yang mengarah ke platform observabilitas Anda. Untuk penyiapan dalam bahasa Anda, lihat dokumentasi OpenTelemetry tentang exporter Python, exporter TypeScript, exporter .NET, exporter Go, konfigurasi SDK Java, exporter PHP, atau exporter Ruby.
4. Konfigurasikan SDK
Gunakan opsi berikut untuk menentukan apa yang masuk ke dalam span Anda dan ke mana span tersebut dikirim. Anda dapat mengatur sebuah opsi di dalam kode Anda atau, jika opsi tersebut memilikinya, melalui variabel lingkungan yang tercantum di bawah namanya.
| Opsi | Gunakan untuk | Default |
|---|---|---|
traces.content_modeANTHROPIC_OPEN_TELEMETRY_TRACES_CONTENT_MODE=content | Menyertakan prompt dan respons dalam span. Lihat Mode konten. | metadata_only |
traces.max_content_bytesANTHROPIC_OPEN_TELEMETRY_TRACES_MAX_CONTENT_BYTES | Mengubah batas konten setiap span. Lihat Batas konten. | 0,75 MB |
conversation_id | Menautkan beberapa panggilan menjadi satu percakapan. SDK menulis ID tersebut ke gen_ai.conversation.id. ID diekspor di kedua mode konten, jadi jangan masukkan data pribadi atau rahasia ke dalamnya. | Tidak ada |
tracer_provider | Memilih tracer provider yang menerima span dari SDK. | Tracer provider yang Anda siapkan di Daftarkan tracer provider |
propagationANTHROPIC_OPEN_TELEMETRY_PROPAGATION=false | Berhenti mengirim header konteks trace dan baggage bersama permintaan, misalnya ketika instrumentasi klien HTTP Anda sudah mengirimnya. SDK tetap menghasilkan span. Tersedia di SDK Python, TypeScript, Go, Java, Ruby, dan PHP. | Aktif |
open_telemetryANTHROPIC_OPEN_TELEMETRY=false | Menonaktifkan span untuk satu klien, misalnya ketika pustaka lain sudah menelusuri SDK. | Aktif |
Contoh berikut menunjukkan cara menggunakan setiap opsi:
# Gunakan tracer provider tertentu dan rekam kontennya.
# Mengatur open_telemetry akan menimpa semua variabel lingkungan ANTHROPIC_OPEN_TELEMETRY*.
client = Anthropic(
open_telemetry={"tracer_provider": provider, "traces": {"content_mode": "content"}}
)
# Nonaktifkan span untuk satu klien.
quiet_client = Anthropic(open_telemetry=False)
# Tetapkan ID percakapan dengan with_options(), yang mengembalikan salinan klien.
# with_options() mengganti seluruh opsi, jadi mulailah dari 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"}],
)Langkah selanjutnya
Dapatkan observabilitas ke dalam Claude API.
Ikuti permintaan dari klien Anda hingga ke Claude API.
Penelusuran stream
Span anthropic.messages.create dari sebuah stream berakhir ketika kode Anda telah membaca seluruh stream atau menutupnya, jadi tutuplah stream yang berhenti Anda baca lebih awal. Dalam mode konten, span berisi respons model hanya jika Anda membaca stream dengan messages.stream().
Span yang Anda mulai saat membaca stream adalah saudara (sibling) dari span SDK, bukan turunannya. Untuk mengelompokkannya dengan permintaan, mulailah span Anda sendiri yang mencakup panggilan dan loop pembacaan.
Penelusuran sandbox self-hosted Managed Agents
Dalam sandbox self-hosted Managed Agents, sandbox Anda yang menjalankan alat, sehingga span alat berasal dari SDK, bukan dari API. Environment worker di SDK Python, TypeScript, dan Go memancarkan span untuk setiap alat yang dijalankannya dan setiap permintaan yang dikirimnya. Worker mengelompokkannya di bawah satu span anthropic.environment.work untuk setiap item pekerjaan.
Untuk mendapatkan span ini:
- Di proses yang menjalankan worker, siapkan tracing SDK seperti pada langkah 1 hingga 4.
- Izinkan lalu lintas jaringan dari sandbox ke platform observabilitas atau OpenTelemetry Collector Anda.
Ketika worker mengirim hasil tool, span API untuk permintaan tersebut bersarang di bawah span SDK-nya. Untuk permintaan yang dikirim worker ke Claude Platform on AWS, span API berada di trace-nya sendiri sebagai gantinya.
Konteks trace dan baggage
Pada setiap permintaan, SDK menggunakan propagator aplikasi Anda untuk mengirim konteks trace ke API dalam header seperti traceparent. Jika propagator tersebut juga menulis baggage, SDK juga mengirim baggage Anda. Untuk mengirim konteks trace tanpa baggage, daftarkan hanya propagator konteks trace W3C.
Agar SDK tidak mengirim header ini, misalnya ketika instrumentasi klien HTTP Anda sudah mengirimnya, nonaktifkan propagasi SDK:
client = Anthropic(open_telemetry={"propagation": False})Saat SDK memanggil alat MCP, span alat milik SDK adalah span saat ini. Beberapa pustaka klien MCP mengirim konteks trace ke server MCP di _meta, sehingga server yang membacanya dapat menambahkan span-nya ke trace Anda di bawah span alat tersebut. Paket Python mcp mulai versi 2.0 dan paket C# ModelContextProtocol melakukannya. SDK MCP untuk TypeScript, Go, Java, Ruby, dan PHP tidak melakukannya sendiri.
Pemecahan masalah
| Masalah | Yang perlu diperiksa |
|---|---|
| Tidak ada span dari SDK | Daftarkan tracer provider sebelum panggilan pertama. Pastikan Anda telah menginstal SDK seperti pada Menginstal SDK dan bahwa ANTHROPIC_OPEN_TELEMETRY tidak bernilai false. |
| Java SDK tidak mengirim span ke tracer provider yang terdaftar, atau tidak mengirim konteks trace ke API | Dependensi lain menetapkan opentelemetry-api di bawah 1.57.0. Tingkatkan opentelemetry-api ke 1.57.0 atau lebih baru. |
| Span SDK tidak bersarang di bawah span Anda, atau span yang dibuat alat Anda tidak bersarang di bawah span alatnya | Panggil SDK dari dalam salah satu span Anda sendiri, seperti yang dilakukan contoh di Hubungkan span API ke trace Anda sendiri. Di Go, mulai span yang dibuat alat Anda dari ctx yang diteruskan tool runner kepadanya. |
Permintaan dari SDK tidak memiliki header traceparent | Daftarkan propagator konteks trace W3C dengan OpenTelemetry. SDK menulis header dengan propagator dari aplikasi Anda. |
| Span SDK dari sebuah stream tidak berakhir atau tidak memiliki respons | Lihat Penelusuran stream. |
| Setiap permintaan muncul dua kali | Span SDK dan span API dari sebuah permintaan memiliki nama yang sama. Gunakan jenis span atau service.name untuk membedakannya. Jika library lain juga melakukan trace pada SDK, nonaktifkan salah satu dari keduanya. |
Compatibility
- Supported platforms
- Claude APIBeta
- Claude Platform on AWSBeta
- Amazon BedrockBeta
- Google CloudBeta
- Microsoft FoundryBeta
- Berfungsi dengan
- Messages API, Claude Managed Agents
Was this page helpful?