Tracing captures workflows and spans for observability. The tracing system is available today, but it is not auto-wired into the Runner yet, so you create traces and spans explicitly.
Overview
Tracing is built from:
TraceProviderfor global configuration and processor registrationTraceContextfor context propagationTraceandSpanfor the actual trace data- Processors/exporters for output (console or OpenAI)
Quick Start (Console Tracing)
TraceProcessor processor = new ConsoleTraceProcessor(true);
TraceProvider provider = TraceProvider.getGlobalTraceProvider();
provider.registerProcessor(processor);
Trace trace =
provider.createTrace(
Trace.builder()
.traceId(TracingUtils.generateTraceId())
.name("Example workflow")
.build());
TraceContext.withTrace(
trace,
() -> {
Span<CustomSpanData> span =
provider.createSpan(
Span.<CustomSpanData>builder()
.spanId(TracingUtils.generateSpanId())
.data(CustomSpanData.builder().name("custom-op").build())
.build());
span.start();
try {
// Do work
return null;
} finally {
span.end();
}
});
Export to OpenAI Tracing
The SDK includes an OpenAI exporter and a batch processor:
TraceProvider.initializeWithDefaultCloudTracing();
This configures:
OpenAITraceExporter(usesOPENAI_API_KEY)BatchTraceProcessor(batching and retries)
Disabling Tracing
Tracing can be disabled globally:
- Environment variable:
OPENAI_AGENTS_DISABLE_TRACING=1ortrue - Runtime:
TraceProvider.getGlobalTraceProvider().setDisabled(true)
When disabled, NoopTrace and NoopSpan are returned with near-zero overhead.
Context Propagation
Tracing uses ThreadLocal. For async code, use helpers to preserve context:
Trace trace = Trace.builder().traceId(TracingUtils.generateTraceId()).name("async").build();
TraceContext.withTrace(
trace,
() ->
TraceContext.supplyAsync(
() -> {
// Trace context is preserved here
return "ok";
}));
Processor Options
Built-in processors and exporters:
ConsoleTraceProcessor: prints trace/span JSON to stdout (good for local dev).OpenAITraceExporter: HTTP export to OpenAI tracing endpoint.BatchTraceProcessor: buffers and sends traces/spans in batches.
You can also register multiple processors with the global provider.
Examples
TracingExample.java- end-to-end trace and span creation (console only).AgentWithTracingExample.java- manual tracing around an agent run.