Most agent teams do not have a data problem, they have a filing problem. A single agent step can produce a model name, a prompt, 4,000 tokens of retrieved context, two tool calls, a retry and a safety verdict, and all of it tends to land in whichever pipe was easiest to open. The result is either a trace so fat it costs more than the model calls, or a log pile where nothing can be grouped.
The table below maps each piece of observability data from an agent step to one of four signals. Read it left to right: the question you will ask of the data decides the signal.
| Question you will ask later | Signal | Retention model | Relative cost |
|---|---|---|---|
| "What is p95 latency for tool X across all steps?" | Span attribute | Same as trace retention | Low per attribute, paid once per span |
| "When exactly did retrieval start and end inside this step?" | Span event (or log-based event) | Same as trace retention | Low, but increments the event count |
| "What was the actual query and the tool error text for this one failing step?" | Log line with trace ID | Log retention, usually longer than traces | Medium, scales with body size |
| "Which queries returned nothing last month, and what did we bill?" | Separate event store | Independent, defined by you | Highest per record, but queryable forever |
The ordering matters. Attributes are the cheapest useful thing you can emit, which is why the Honeycomb guidance on custom instrumentation says adding data to the current span is usually the best choice (Honeycomb). Each step up that table buys you more retention or more detail and costs you more storage, more cardinality, or both.



