Follow Discord
Sweep 10 Nov 2026 · 02:18Z Build v2.1.322 539 read Stable v2.1.311 Latest v2.1.322 Next v2.1.322 Feeds RSS JSON llms.txt llms-full.txt Unofficial
One change · api

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
/
lines
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 
Feedback