OTLP attributes reference
The authoritative mapping of OpenTelemetry span attributes to Boidra Platform's stored fields. Boidra Platform follows the OpenTelemetry GenAI semantic conventions and reads the keys below (first match wins where fallbacks are listed).
Span classification
gen_ai.operation.name decides the span type. Span-name prefixes/suffixes are used as a fallback when the attribute is absent.
| Value / pattern | Stored span_type |
|---|---|
invoke_agent (or name starts invoke_agent) | invoke_agent |
execute_tool (or name starts execute_tool) | execute_tool |
chat / text_completion (or name starts chat) | chat |
name ends with _tool | execute_tool |
| anything else | (span skipped) |
Non-GenAI spans (e.g. HTTP client spans), framework "workflow" wrappers (traceloop.span.kind = "workflow"), and zero-duration empty invoke_agent wrappers are dropped so only meaningful agent/LLM/tool spans are kept.
Field mapping
| Stored field | Attribute (first match wins) |
|---|---|
agent_name | gen_ai.agent.name → agent_name → gen_ai.request.model; for invoke_agent, falls back to resource service.name |
tool_name | gen_ai.tool.name → tool_name (or the span name if it ends _tool) |
tool_type | gen_ai.tool.type → tool_type (defaults to function when a tool name is present) |
model | gen_ai.request.model → gen_ai.response.model → model |
input_tokens | gen_ai.usage.input_tokens → gen_ai.usage.prompt_tokens |
output_tokens | gen_ai.usage.output_tokens → gen_ai.usage.completion_tokens |
context_id | gen_ai.conversation.id → a2a.context_id → conversation_id → context_id (kept only on invoke_agent spans, when it's a valid conversation id) |
tenant_id | sap.tenancy.tenant_id → tenant_id |
user_id | user.id → user_id |
extension_name | extension_name → sap.extension.name |
extension_type | extension_type |
prompt_text | gen_ai.prompt → prompt_text → gen_ai.input.messages |
Timing & status
| Stored field | Source |
|---|---|
duration_ms | endTimeUnixNano − startTimeUnixNano (nanoseconds → ms) |
timestamp | startTimeUnixNano (ISO 8601) |
status | ERROR if OTel span status is ERROR (code 2) or error = true or outcome = "error"; otherwise OK |
error_message | error.message → OTel span status message |
Identity fields
| Stored field | Source |
|---|---|
span_id | span spanId (hex) |
trace_id | span traceId (hex) |
parent_span_id | span parentSpanId (hex), or null |
Notes
- Every attribute is also preserved verbatim (JSON) and viewable in the span detail pane.
- Tokens in OTLP/JSON are integers sent as string
intValue— Boidra Platform parses them numerically. - Cost is not an attribute you send: Boidra Platform computes it from
model+ token counts using the editable price table on the Settings page.
