Send BYOA Telemetry
A BYOA (Bring Your Own Agent) is an agent you operate yourself, outside Redpanda’s managed runtime. To make it visible across transcripts, cost rollups, and the agent registry, your agent must emit OpenTelemetry traces with a specific minimum set of resource attributes and span attributes. Emit the right attributes from the start to avoid missing traces and misattributed cost data.
For the full OTLP ingestion flow (deploying the Connect pipeline, authenticating, sending traces over HTTP or gRPC), see Ingest custom traces. This page focuses on what to emit; that page covers how to send it.
After reading this page, you will be able to:
-
Identify the resource attributes and span attributes a BYOA agent must emit so transcripts and cost rollups can attribute calls correctly
-
Choose between optional enrichment attributes that improve cost and usage reporting fidelity (model, tool, agent name, conversation, cache tokens)
-
Validate a BYOA agent’s telemetry by reading the resulting transcript and confirming non-zero metric values
Why this matters
When an agent runs, the Agentic Data Plane reconstructs a turn-by-turn transcript from the spans the agent (and its LLM, MCP server, sub-agent calls) emit. The transcripts UI groups, labels, and totals fields read directly from span attributes. If your agent omits a required attribute, the corresponding column in cost and usage reporting or in transcripts shows as empty, zero, or unattributed.
Redpanda-managed agents emit the contract automatically through the runtime. BYOA agents must emit it themselves.
Minimum required contract
These attributes must appear on your agent’s spans for transcripts and cost rollups to surface non-empty values.
Resource attributes
Set on the OTel Resource so every span the agent emits inherits them:
| Attribute | Required value |
|---|---|
|
A stable identifier for your agent. Surfaces as the agent identity on transcripts and as the |
Span attributes
Set on every relevant span:
| Attribute | Required value |
|---|---|
|
A stable identifier shared across every span in the same conversation (system prompt, user turn, assistant turn, tool call, sub-agent call). Drives the |
|
One of |
|
The LLM model identifier the agent calls. Surfaces in the transcript turn header and in the Cost & Usage model breakdown. Required on |
|
Token counts on LLM-call spans. Drive the token totals in cost and usage reporting and the per-turn USD-cost calculation in transcripts. Without them the cost column reads |
If your agent emits these five attributes plus the resource service.name, every cost and usage report and every transcript field has a non-empty value to render.
Recommended enrichment
Cost and usage reporting degrades gracefully without these, but their presence lets the UI build richer views.
| Attribute | Why it helps |
|---|---|
|
Labels the LLM provider ( |
|
A human-readable agent label distinct from |
|
On |
|
Cache-hit token count on LLM-call spans. Surfaces in the |
|
Conversation content. Used to reconstruct turn content, and required for transcript history reconstruction when older spans are evicted from |
|
Latency and timestamps come from OTel span |
Span hierarchy
Transcripts read your agent’s span tree to lay out turns. The recognized span types (matched by gen_ai.operation.name and span name) are documented in Observability. The four span shapes are:
-
Top-level span: One per agent invocation. Sets
gen_ai.operation.name = "invoke_agent", carries the conversation ID and service name. -
Reasoning or chat spans: Set
gen_ai.operation.name = "chat"for LLM calls. Carry the model, token counts, and provider attributes. -
Tool spans: Set
gen_ai.operation.name = "execute_tool"for tool invocations. Carry the tool name and arguments. -
Sub-agent spans: Set
gen_ai.operation.name = "invoke_agent"nested under a parent agent’s span when one BYOA agent calls another.
Parent-child relationships are expressed through OTel’s standard parent_span_id. Keep the tree faithful to your agent’s call graph; the transcript turn order follows it.
Validate with a transcript
After your agent emits a few traces, confirm they surface in ADP:
-
Confirm the
Namecolumn in the governance Agents list shows yourservice.namevalue. If it shows blank orunknown, the resource attribute didn’t make it through. -
Open one of the agent’s transcripts and confirm the
Conversation IDin the summary header matches the UUID your agent emitted. -
Look at the assistant turn in the Detailed view for token counts and latency. Non-zero values mean the LLM-call span attributes are correctly emitted.
-
If you sent a tool call, expand the TOOL turn and confirm the
Tool namerenders.
If any field shows blank or zero unexpectedly, the corresponding attribute is missing or misnamed in your agent’s instrumentation.
Authentication
BYOA agents authenticate against the OTLP ingest endpoint with a service-account access token from your organization. Send the token in Authorization: Bearer <token> (HTTP) or authorization: Bearer <token> (gRPC).
For the token-acquisition flow and endpoint URL format, see Ingest custom traces.
Where to find code examples
The Ingest custom traces page has full HTTP and gRPC examples in Python, Node.js, and Go, each instrumenting an LLM call with the GenAI semantic-convention attributes. Adapt the examples to your agent’s framework. The attribute set is the same; only the OTel SDK ergonomics differ.
Troubleshooting
Common symptoms and fixes:
| Symptom | What to check |
|---|---|
Agent missing from the governance Agents list |
Resource |
|
|
Token / USD cost columns show |
|
Tool calls not visible in the transcript |
|
Agent shows up in transcripts but not in the agent registry ( |
Transcripts attribute by |
Older turns in a long conversation render as |
Spans were evicted from |