If you’re already instrumented with OpenTelemetry, OpenInference, or Traceloop and want to know where your attributes land in HoneyHive’s schema, this is the page to consult. Use it to look up which bucket.key to query and to understand how HoneyHive normalizes across ecosystems.
OTel GenAI columns are pinned to semantic conventions v1.36 (stable release). Attributes introduced in v1.37 are noted inline.
How to read this matrix
Each section covers one concept group. Columns are:
| Column | Instrumentation source |
|---|
| OTel GenAI | Official OpenTelemetry GenAI semantic conventions (v1.36+) |
| OpenInference | Arize AI OpenInference instrumentation (openinference-* packages) |
| Traceloop | Traceloop OpenLLMetry (opentelemetry-instrumentation-* packages) |
| HoneyHive canonical | Destination key in HoneyHive schema (bucket.key notation; see Semantic Convention Reference for the full seven-bucket schema) |
A - in a source column means no standard attribute exists in that ecosystem for this concept. Where HoneyHive canonical also shows -, the attribute is a confirmed gap and must be set manually.
Span / Operation Kinds
Each ecosystem classifies spans by type (LLM call, tool call, agent step, chain, etc.) using a different attribute:
| Ecosystem | Span kind attribute | Common values |
|---|
| OTel GenAI v1.37+ | gen_ai.agent.type | llm, tool, agent |
| OpenInference | openinference.span.kind | LLM, TOOL, AGENT, CHAIN, RETRIEVER, EMBEDDING |
| Traceloop | traceloop.span.kind | llm, tool, agent, task, workflow |
| HoneyHive canonical | metadata.span_kind | normalized from whichever is present |
Why this matters for attribute routing: Tool attributes (config.tool_name, config.tool_description, metadata.tool_call_id) are surfaced in HoneyHive’s Tool section only on spans classified as tool calls. If these attributes are missing in the UI, check that your instrumentation sets the span kind correctly.
Pure OTel v1.36 tool spans: OTel v1.36 has no gen_ai.agent.type attribute. If you’re on pure OTel v1.36, gen_ai.tool.* attributes are still captured and mapped to their canonical destinations (config.tool_name, etc.), they just won’t have a metadata.span_kind set, since there is no source attribute to derive it from. The gen_ai.agent.type attribute arriving in v1.37 will give OTel parity with OpenInference and Traceloop for span kind classification.
Token Counts
| Attribute | OTel GenAI | OpenInference | Traceloop | HoneyHive canonical |
|---|
| Input / prompt tokens | gen_ai.usage.input_tokens (v1.36+, preferred)
gen_ai.usage.prompt_tokens (legacy alias) | llm.token_count.prompt
gen_ai.usage.prompt_tokens | llm.token_count.prompt
gen_ai.usage.prompt_tokens | metadata.input_tokens
metadata.prompt_tokens |
| Output / completion tokens | gen_ai.usage.output_tokens (v1.36+, preferred)
gen_ai.usage.completion_tokens (legacy alias) | llm.token_count.completion
gen_ai.usage.completion_tokens | llm.token_count.completion
gen_ai.usage.completion_tokens | metadata.output_tokens
metadata.completion_tokens |
| Total tokens | - (derived by normalizer) | llm.token_count.total
gen_ai.usage.total_tokens | llm.token_count.total
llm.usage.total_tokens | metadata.total_tokens (auto-computed if absent) |
| Cache read tokens | gen_ai.usage.cache_read_input_tokens | gen_ai.usage.cache_read_input_tokens | gen_ai.usage.cache_read_input_tokens | metadata.cache_read_input_tokens |
| Cache write tokens | gen_ai.usage.cache_write_input_tokens | - | gen_ai.usage.cache_write_input_tokens | metadata.cache_write_input_tokens |
| Reasoning tokens | gen_ai.usage.reasoning_tokens | gen_ai.usage.reasoning_tokens | gen_ai.usage.reasoning_tokens | metadata.reasoning_tokens |
metadata.total_tokens is auto-computed by the normalizer from prompt_tokens + completion_tokens (or input_tokens + output_tokens) when not explicitly set. It is the source for the Total Tokens stat in Session Summary.Traceloop uses llm.usage.total_tokens. The llm.usage prefix (instead of gen_ai.usage) is intentional in Traceloop’s instrumentation, not a typo.
Model Identity
| Attribute | OTel GenAI | OpenInference | Traceloop | HoneyHive canonical |
|---|
| Request model | gen_ai.request.model | gen_ai.request.model | gen_ai.request.model
llm.model_name | config.model |
| Response model | gen_ai.response.model | gen_ai.response.model | gen_ai.response.model | metadata.response_model |
| Resolved model name | - | llm.model_name | llm.model_name | metadata.model_name
metadata.llm.model_name (legacy dotted key) |
| Provider / system | gen_ai.system
gen_ai.provider.name (v1.37+) | gen_ai.system
llm.provider | gen_ai.system
llm.provider | metadata.system
config.provider |
| Response ID | gen_ai.response.id | gen_ai.response.id | gen_ai.response.id | metadata.response_id |
metadata.model_name is the resolved model name shown in the HoneyHive UI. The normalizer sets it from config.model (request model) as a fallback when no response model is available. Use metadata.response_model for the exact model returned by the API.Provider / system mapping: gen_ai.system (all three ecosystems) maps to metadata.system. gen_ai.provider.name (OTel v1.37+) and llm.provider (OpenInference/Traceloop) map to config.provider.
Finish Reason
| Attribute | OTel GenAI | OpenInference | Traceloop | HoneyHive canonical |
|---|
| Finish reason (scalar) | First element of gen_ai.response.finish_reasons (extracted by normalizer) | gen_ai.response.finish_reason | First element of gen_ai.response.finish_reasons (extracted by normalizer) | metadata.finish_reason |
| Finish reasons (array) | gen_ai.response.finish_reasons | gen_ai.response.finish_reasons | gen_ai.response.finish_reasons | metadata.finish_reasons
metadata.response_finish_reasons (OpenInference alias) |
OTel GenAI defines gen_ai.response.finish_reasons as a string array. HoneyHive extracts the first element into metadata.finish_reason for single-choice filtering and also stores the full array in metadata.finish_reasons. OpenInference’s singular gen_ai.response.finish_reason maps directly to metadata.finish_reason.
Agent Context
| Attribute | OTel GenAI | OpenInference | Traceloop | HoneyHive canonical |
|---|
| Agent name | gen_ai.agent.name | gen_ai.agent.name | gen_ai.agent.name | metadata.agent_name |
| Agent description | gen_ai.agent.description | gen_ai.agent.description | gen_ai.agent.description | metadata.agent_description |
| Agent ID | gen_ai.agent.id | gen_ai.agent.id | gen_ai.agent.id | metadata.agent_id |
| Span / operation kind | - (gen_ai.agent.type in v1.37+) | openinference.span.kind (LLM, AGENT, TOOL, CHAIN, …) | traceloop.span.kind | metadata.span_kind |
| Agent handoff context | - (gap - no cross-ecosystem standard) | - (gap) | - (gap) | - (gap - set manually via metadata) |
Gap: agent handoff context. None of the three ecosystems has a stable standard attribute for passing context between agents in a handoff (e.g., handoff reason, receiving agent name, continuation pointer). If you need this in HoneyHive, set it manually as arbitrary metadata sub-keys. A naming convention such as metadata.handoff_reason and metadata.handoff_target_agent is recommended for consistency.
| Attribute | OTel GenAI | OpenInference | Traceloop | HoneyHive canonical |
|---|
| Tool name | gen_ai.tool.name | gen_ai.tool.name | gen_ai.tool.name | config.tool_name |
| Tool description | gen_ai.tool.description | gen_ai.tool.description | gen_ai.tool.description | config.tool_description |
| Tool call ID | gen_ai.tool.call.id | gen_ai.tool.call.id | gen_ai.tool.call.id | metadata.tool_call_id |
| Tool status | gen_ai.tool.status | gen_ai.tool.status | gen_ai.tool.status | metadata.tool_status |
Session / Conversation Context
| Attribute | OTel GenAI | OpenInference | Traceloop | HoneyHive canonical |
|---|
| Conversation / Session ID | gen_ai.conversation.id | session.id | - (no standard) | metadata.conversation_id root session_id (when set via honeyhive.session_id) |
| User ID | - (no standard) | user.id | - (no standard) | metadata.user_id |
Gaps Summary
The following concepts have no stable attribute in any of the three instrumentation ecosystems:
| Concept | Recommended workaround |
|---|
| Agent handoff context | Set manually: metadata.handoff_reason, metadata.handoff_target_agent |
Related pages