Skip to main content
The Atlan SDK accepts native SDK spans, third-party OpenTelemetry spans, and framework callback spans through one exporter. You do not need a separate trace model for each provider. Choose the narrowest integration path your stack supports: All four paths use asynchronous batch export by default. Call flush() before a short-lived process exits. Eval does this automatically, then reads every case trace back through the experiment filter before it writes results and finalizes a run. Registry derives the durable score summary during finalization. initLogger captures every OpenTelemetry scope by default. This includes any HTTP, database, or application instrumentors already attached to the same provider. Pass captureAll: false / capture_all=False to return to Atlan’s AI-focused allowlist, and apply privacy controls before sending third-party spans that may contain protected content.

Discover installed Python instrumentors

auto_instrument() discovers the standard opentelemetry_instrumentor entry points already installed in your environment. It enables only recognized AI instrumentors and does not begin tracing unrelated database or web-framework libraries. Call it before importing provider clients, then initialize the logger:
The Atlan package does not install every vendor instrumentor. Install the OTel instrumentation package approved for your provider, then let auto_instrument() discover it. Disable one installed integration with a Braintrust-compatible flag such as auto_instrument(openai=False).
Treat report.failed as a deployment failure when complete traces are a requirement. A running application does not prove that its provider spans were instrumented.

Vercel AI SDK

wrapAISDK injects the AI SDK’s native experimental_telemetry option into generation, streaming, embedding, reranking, and agent calls. It preserves telemetry metadata supplied by the caller and leaves unrelated exports untouched.
If you prefer not to wrap the module, pass telemetry to one call:
Initialize the logger before the first AI SDK call. If a call already contains a tracer, wrapAISDK preserves it by default. Pass replaceTracer: true only when Atlan should replace that tracer.

LangChain and LangGraph

The Python callback maps framework run IDs, parents, model usage, tool calls, errors, and LangGraph interrupt/resume flow into one trace tree.
For LangChain.js, use its OpenTelemetry integration when available. Otherwise, wrap graph.invoke with wrapTraced to preserve the agent boundary.

Share an application-owned OpenTelemetry provider

Python automatically reuses a global SDK TracerProvider that your application registered first. You can also pass it explicitly:
OpenTelemetry JS allows only one global provider and does not let another SDK mutate it later. If your application owns that provider, initialize Atlan in isolated mode and add its processor when constructing the application provider:
Create provider and framework clients after this setup. Otherwise, those clients may retain a tracer from a different provider and their spans will not reach Registry.

Send direct OTLP

Java, Ruby, Go, sidecars, and other OpenTelemetry runtimes can send OTLP/HTTP protobuf without either Atlan SDK:
Populate these values through an approved secret store. Do not put headers in source code, container images, or deployment manifests.

Wrap an unsupported framework

Manual wrapping guarantees the agent boundary, input, output, latency, and failure. Calls from instrumented providers inside the wrapper become child spans automatically.
Manual wrapping cannot invent model, tool, token, or cost details that the framework does not expose. Add child spans or span.update(...) calls for those fields when you own the call site.

Integration coverage

Coverage describes the delivery contract, not every version of a third-party package:

Tracing libraries

Agent frameworks

Run one representative request after every framework or instrumentor upgrade. Confirm the root, provider call, tool calls, usage, and expected parent relationships in Agent Registry before promoting the build.

Preserve evaluation joins

Third-party spans created inside an Eval task inherit atlan.eval.experiment_id from the active context. The experiment result then stores the case’s root trace_id. Bench filters use the experiment attribute; case drill-down uses the result-to-trace join. If you run your own harness, execute it inside run.trace() in Python or propagateAttributes(run.traceOptions, fn) in TypeScript. Flush and verify the traces, upload complete result rows with their numeric score snapshots, then mark the experiment completed with one update. Consume the returned experiment’s summary; no separate summarize request is needed.

Next steps

Run evaluations

Create one trace and durable result for every case.

Privacy controls

Suppress or mask content from first-party and third-party spans.

Serverless delivery

Keep asynchronous exports alive before a function freezes.

Verify traces

Confirm ingestion and parent-child structure end to end.