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:
auto_instrument() discover it. Disable one installed integration with a
Braintrust-compatible flag such as auto_instrument(openai=False).
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.
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.graph.invoke with wrapTraced to preserve the agent boundary.
Share an application-owned OpenTelemetry provider
Python automatically reuses a global SDKTracerProvider that your
application registered first. You can also pass it explicitly:
Send direct OTLP
Java, Ruby, Go, sidecars, and other OpenTelemetry runtimes can send OTLP/HTTP protobuf without either Atlan SDK: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.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 anEval 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.