sdk changedmanage-claude/opentelemetry/sdk
Nearest release: v2.1.322, published 2 hours before this site recorded the change. Shown because the two are within 24 hours of each other. Nothing here says the release caused the edit.
Recorded here
Lines+154added
Lines−7removed
From line
256
where the diff opens
First seen
14 Oct 2026
this site's first read of the page
Recorded edits25to this page, all time
### Identify your end users
The whole hunk
from line 256, old and new numbered
/
from line 256
256256 defer provider.Shutdown(ctx)
257257 otel.SetTracerProvider(provider)
258258 // OpenTelemetry for Go doesn't register a propagator by default, so
259 // register the W3C trace context propagator.
260 otel.SetTextMapPropagator(propagation.TraceContext{})
259 // register the W3C trace context and baggage propagators.
260 otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
261261
262262 client := anthropic.NewClient()
263263
from line 279
279279 import com.anthropic.client.okhttp.AnthropicOkHttpClient;
280280 import com.anthropic.models.messages.MessageCreateParams;
281281 import com.anthropic.models.messages.Model;
282 import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
282283 import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
283284 import io.opentelemetry.context.propagation.ContextPropagators;
285 import io.opentelemetry.context.propagation.TextMapPropagator;
284286 import io.opentelemetry.exporter.logging.LoggingSpanExporter;
285287 import io.opentelemetry.sdk.OpenTelemetrySdk;
286288 import io.opentelemetry.sdk.trace.SdkTracerProvider;
from line 296
294296 OpenTelemetrySdk.builder()
295297 .setTracerProvider(tracerProvider)
296298 // OpenTelemetry for Java doesn't register a propagator when you build
297 // it in code, so register the W3C trace context propagator.
298 .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
299 // it in code, so register the W3C trace context and baggage propagators.
300 .setPropagators(ContextPropagators.create(TextMapPropagator.composite(
301 W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance())))
299302 .buildAndRegisterGlobal();
300303
301304 var client = AnthropicOkHttpClient.fromEnv();
from line 317
314317 ```php PHP
315318 use Anthropic\Client;
316319 use Anthropic\Messages\Model;
320 use OpenTelemetry\API\Baggage\Propagation\BaggagePropagator;
317321 use OpenTelemetry\API\Trace\Propagation\TraceContextPropagator;
322 use OpenTelemetry\Context\Propagation\MultiTextMapPropagator;
318323 use OpenTelemetry\SDK\Sdk;
319324 use OpenTelemetry\SDK\Trace\SpanExporter\ConsoleSpanExporterFactory;
320325 use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;
from line 332
327332 Sdk::builder()
328333 ->setTracerProvider($tracerProvider)
329334 // OpenTelemetry for PHP doesn't register a propagator when you build
330 // it in code, so register the W3C trace context propagator.
331 ->setPropagator(TraceContextPropagator::getInstance())
335 // it in code, so register the W3C trace context and baggage propagators.
336 ->setPropagator(new MultiTextMapPropagator([
337 TraceContextPropagator::getInstance(),
338 BaggagePropagator::getInstance(),
339 ]))
332340 ->buildAndRegisterGlobal();
333341
334342 $client = new Client();
from line 602
594602
595603## Trace context and baggage
596604
597With each request, the SDK uses your application’s propagator to send the trace context to the API in headers such as `traceparent`. If that propagator also writes baggage, the SDK sends your baggage too. To send the trace context without baggage, register only the W3C trace context propagator.
605With each request, the SDK uses your application’s propagator to send the trace context to the API in headers such as `traceparent`. If that propagator also writes baggage, the SDK sends your baggage too, which is how you can [identify your end users](https://platform.claude.com/docs/en/manage-claude/opentelemetry/sdk#identify-your-end-users). To send the trace context without baggage, register only the W3C trace context propagator.
598606
599607To stop the SDK from sending these headers, for example when your HTTP client instrumentation already sends them, turn off the SDK’s propagation:
600608
from line 676
668676</CodeGroup>
669677
670678While the SDK calls an [MCP tool](https://platform.claude.com/docs/en/agents-and-tools/mcp-connector#client-side-mcp-helpers), the SDK’s tool span is the current span. Some MCP client libraries send the trace context to the MCP server in `_meta`, so a server that reads it can add its spans to your trace under that tool span. The Python `mcp` package from version 2.0 and the C# `ModelContextProtocol` package do this. The TypeScript, Go, Java, Ruby, and PHP MCP SDKs don’t do it on their own.
679
680### Identify your end users
681
682[Baggage](https://opentelemetry.io/docs/concepts/signals/baggage/) is a set of key-value pairs that a request carries in its W3C `baggage` header. To set the [`user.id`](https://platform.claude.com/docs/en/api/opentelemetry/spans#user.id) attribute on the API spans for a request, send the request with a `user.id` baggage entry set to your end user’s ID. Use an opaque ID, not an email address: to protect user privacy, the API drops any `user.id` that contains one.
683
684<CodeGroup>
685 ```bash cURL
686 curl https://api.anthropic.com/v1/messages \
687 -H "x-api-key: $ANTHROPIC_API_KEY" \
688 -H "anthropic-version: 2026-10-21" \
689 -H "content-type: application/json" \
690 -H "baggage: user.id=4f2a" \
691 -d '{
692 "model": "claude-opus-5-5",
693 "max_tokens": 1024,
694 "messages": [
695 {"role": "user", "content": "Hello, Claude"}
696 ]
697 }'
698 ```
699
700 ```bash CLI
701 ANTHROPIC_CUSTOM_HEADERS="baggage: user.id=4f2a" ant messages create \
702 --model claude-opus-5-5 \
703 --max-tokens 1024 \
704 --message '{role: user, content: "Hello, Claude"}'
705 ```
706
707 ```python Python
708 from opentelemetry import baggage, context
709
710 client = Anthropic()
711
712 token = context.attach(baggage.set_baggage("user.id", "4f2a"))
713 try:
714 message = client.messages.create(
715 model="claude-opus-5-5",
716 max_tokens=1024,
717 messages=[{"role": "user", "content": "Hello, Claude"}],
718 )
719 finally:
720 context.detach(token)
721 ```
722
723 ```typescript TypeScript
724 import { context, propagation } from "@opentelemetry/api";
725
726 const client = new Anthropic();
727
728 const userBaggage = propagation.createBaggage({ "user.id": { value: "4f2a" } });
729 const message = await context.with(propagation.setBaggage(context.active(), userBaggage), () =>
730 client.messages.create({
731 model: "claude-opus-5-5",
732 max_tokens: 1024,
733 messages: [{ role: "user", content: "Hello, Claude" }]
734 })
735 );
736 ```
737
738 ```csharp C#
739 using System.Diagnostics;
740 // ...
741 // Register this source with AddSource on your tracer provider, so that it records the activity.
742 ActivitySource source = new("MyApp");
743 AnthropicClient client = new();
744
745 // The SDK sends the current activity's baggage.
746 using var activity = source.StartActivity("chat");
747 activity?.SetBaggage("user.id", "4f2a");
748 var message = await client.Messages.Create(new MessageCreateParams
749 {
750 Model = Model.ClaudeOpus5_5,
751 MaxTokens = 1024,
752 Messages = [new UserMessageParam { Content = "Hello, Claude" }],
753 });
754 ```
755
756 ```go Go
757 client := anthropic.NewClient()
758
759 member, _ := baggage.NewMember("user.id", "4f2a")
760 userBaggage, _ := baggage.New(member)
761 ctx := baggage.ContextWithBaggage(context.Background(), userBaggage)
762 message, err := client.Messages.New(ctx, anthropic.MessageNewParams{
763 Model: anthropic.ModelClaudeOpus5_5,
764 MaxTokens: 1024,
765 Messages: []anthropic.MessageParam{
766 anthropic.NewUserMessage(anthropic.NewTextBlock("Hello, Claude")),
767 },
768 })
769 ```
770
771 ```java Java
772 import io.opentelemetry.api.baggage.Baggage;
773
774 void main() {
775 var client = AnthropicOkHttpClient.fromEnv();
776
777 try (var scope = Baggage.current().toBuilder().put("user.id", "4f2a").build().makeCurrent()) {
778 var message = client.messages().create(MessageCreateParams.builder()
779 .model(Model.CLAUDE_OPUS_5_5)
780 .maxTokens(1024)
781 .addUserMessage("Hello, Claude")
782 .build());
783 }
784 }
785 ```
786
787 ```php PHP
788 use OpenTelemetry\API\Baggage\Baggage;
789
790 $client = new Client();
791
792 $scope = Baggage::getBuilder()->set('user.id', '4f2a')->build()->activate();
793 try {
794 $message = $client->messages->create(
795 maxTokens: 1024,
796 messages: [['role' => 'user', 'content' => 'Hello, Claude']],
797 model: Model::CLAUDE_OPUS_5_5,
798 );
799 } finally {
800 $scope->detach();
801 }
802 ```
803
804 ```ruby Ruby
805 require "opentelemetry/sdk"
806
807 client = Anthropic::Client.new
808
809 OpenTelemetry::Context.with_current(OpenTelemetry::Baggage.set_value("user.id", "4f2a")) do
810 client.messages.create(
811 model: Anthropic::Model::CLAUDE_OPUS_5_5,
812 max_tokens: 1024,
813 messages: [{role: "user", content: "Hello, Claude"}]
814 )
815 end
816 ```
817</CodeGroup>
671818
672819## Troubleshooting
673820
No line in this hunk matches that.