Why capturing every agent decision gets expensive fast

You want a full reasoning trace for every agent decision. At production scale, the volume, cardinality, and storage cost of that wish are the real problem, and the answer is not capture everything.

B

Balagei G Nagarajan

5 MIN READ


A funnel pouring a flood of agent trace spans into a small storage tank that is overflowing
Multiply that by production traffic and the cost is not theoretical.
— from “Why capturing every agent decision gets expensive fast”

Key facts.

  • The OpenTelemetry GenAI semantic conventions define structured attributes for model, agent, and tool spans (model name, input and output token counts, finish reasons), giving agent traces a vendor-neutral shape. Most of the conventions were still marked experimental in early 2026. source
  • Storing full prompt and completion text inside span attributes is a documented anti-pattern: attributes are size-limited, always indexed, and leak sensitive content into your backend. The conventions put that content in span events instead, so it can be filtered or dropped at the Collector. source
  • High-cardinality dimensions (session and trace IDs, prompt-template variants, model versions, tool names, per-user context) multiply the unique series an observability backend must index, which is the classic driver of storage and query cost. source
  • Tail-based sampling keeps every error, slow, or costly trace and samples the rest, but it requires buffering full traces before deciding. Head-based sampling is cheaper and can throw away the failing trace before anyone sees it. The OpenTelemetry Collector supports both. source

Why does an agent generate so much more telemetry than a normal service?

A traditional request fans out into a few spans: receive, query a database, return. An agent run fans out into a plan, several reasoning steps, multiple tool calls, retrievals, and sometimes sub-agent handoffs, each of which you want as its own span with its own context. Vendors report agent and LLM workloads producing on the order of 10x to 100x the telemetry of a comparable traditional app (treat those multiples as reported vendor figures, not an independent benchmark). The payloads are the second problem. A span that records a prompt, the documents it retrieved, and the model's full output is not a few bytes of numbers. It is kilobytes of text, repeated for every decision, for every run.

Multiply that by production traffic and the cost is not theoretical. Several practitioner and vendor accounts describe observability bills that rival the compute bill for the agent itself. The data you most want for debugging (the full reasoning, not just the outcome) is precisely the data that is most expensive to store.

Heatmap showing trace storage cost rising as both span count per run and payload size per span increase

So how do teams keep the context that matters without keeping all of it?

The working answer is selective, not exhaustive. Keep numbers and identifiers as attributes so they stay queryable, and push large free text (prompts, retrieved documents, raw outputs) into events that can be dropped or masked at the Collector before they ever hit storage. Use tail-based sampling so every failed, slow, or expensive run is retained in full while routine successes are sampled down. Mask sensitive fields at capture so you are not paying to store, and exposing, customer data you never needed. The OpenTelemetry GenAI conventions exist so you can do all of this on a standard schema instead of a bespoke one per backend.

DecisionCapture everythingCapture selectively
Prompts and outputsStored as indexed attributes, full text, alwaysStored as events, droppable and maskable at the Collector
Which runs kept in fullAll of them, until the bill forces a cutEvery error, slow, or costly run, plus a sample of the rest
High-cardinality fieldsIndexed unbounded, cost grows with trafficBounded and chosen on purpose
Sensitive contextLands in the backend by defaultMasked at capture, never stored raw

An agent run emits hundreds of spans, so the hard part is keeping the trace that explains a failure, and a stronger model does not rescue you, since MAKER shows 99% per-step accuracy derails. (source)

This is where the Pattern Intelligence Layer changes the question. Reliability at the pattern level means you decide, once and consistently, which decisions are worth capturing in full and which can be summarized, based on the failure patterns that actually recur. You are not trying to store every token forever. You are keeping the semantic context that explains the failures you keep seeing, enforced the same way on every run, so the bill stays sane and the trace you need is still there when an incident review asks for it.

Frequently asked questions

Should I just store full prompts and outputs as span attributes?
No. That is a documented anti-pattern: attributes are size-limited, indexed, and expose sensitive text. Put large content in events you can filter or drop at the Collector.

Is head-based or tail-based sampling better for agents?
Tail-based, in most cases. A single failed sub-step is the thing you most need, and head-based sampling can discard it before completion. Tail-based keeps every error and slow run.

Are the 10x-100x telemetry figures reliable?
Treat them as reported vendor numbers, not an independent benchmark. The direction (agents produce far more telemetry per request) is well supported; the exact multiple depends on your workload.


Share this post

Join the discussion

Have a take, a war story, or a question? Sign in with GitHub to comment and react. Comments are powered by GitHub Discussions, ad-free and yours to moderate.

Continue Reading

Find where your agent breaks, before you build it

Faultmap maps where your agent will fail from the goal and your data, then hands you the first test suite it has to pass.