otlphttpexporter straight at the engine - no AgentX SDK needed:
Wire formats
Attribute conventions
Each incoming span becomes one trace row, withinput/output/model/token counts pulled
from whichever convention the instrumentation actually sends:
The framework label resolves from the signal itself:
gen_ai.provider.name, then gen_ai.system, then the instrumentation scope name, then
service.name, then the literal otel - so OTel traffic charts on Monitor’s Platforms chart
and filters in Observe → Live Traces without any extra attribute.
Monitor runs against every OTel-ingested root span by default; set AGENTX_OTEL_MONITOR=false
to turn that off.
First-class citizenship
Four attributes make OTel traffic part of the full loop, not just rows in Live Traces:- Sessions - set
session.id,gen_ai.conversation.id, oragentx.session_idand traces group into conversations on the Sessions surface, with session judging applying exactly like SDK traffic. Without one, spans still group by OTel trace id. - Prompt identity - set
agentx.prompt_name(and optionallyagentx.version) and the whole Improve loop lights up: prompt-registry evidence gathering and version comparison treat the trace as if the SDK had tagged it. - Span kinds -
openinference.span.kind,gen_ai.operation.name,mlflow.spanType, andlangfuse.observation.typeare read (in that order) and stored as the span’s stated kind, so a span instrumented for OpenInference or the GenAI semconv arrives in the Execution Timeline already classified - LLM, tool, retrieval, guardrail - instead of being inferred from names. - Tool calls - a child span carrying
gen_ai.tool.name(or an MLflowTOOL-typed span) is folded up into its root interaction’stool_calls, withsuccess/errorderived from span status - so Tool quality, the built-in Tool-failure check, and Tool Schema evidence all work on OTel traffic. In-batch only: a parent exported in an earlier OTLP batch isn’t updated retroactively.
Limits
- 5,000 spans per export request. A larger batch is refused with HTTP 413 before any span is processed, so a conforming exporter can split and resend without duplicates. The OTel SDK’s default batch size is 512, an order of magnitude below the cap.
- 10 MB request body cap on the OTLP endpoint.
- Child spans are skipped by Monitor by default - only root spans (no parent) are checked,
matching how Braintrust and Langfuse scope online scoring. Set
AGENTX_MONITOR_CHILD_SPANS=trueto check every span instead.
Verify it’s flowing
Send one span, then check Observe → Live Traces - OTel spans arrive with their full span tree (Timeline and Graph views) whenever the instrumentation emits parent/child links. OTel traffic is first-class downstream too: online judge scorers sample and score it, low verdicts raise Signals, and the traces carry judge scores in Live Traces - exactly like SDK-ingested traffic. The runnable proof ismonitor_ops/07_otel_ingest_scoring.py in the
sample-scripts repo: pure-OTel export, then the judge’s verdict and the raised Signal read back.

