Good abstractions hide complexity, not evidence
An abstraction can reduce how much infrastructure a user needs to know without reducing the evidence they need to diagnose a problem.
The idea in brief
A shared platform for model access hides a lot on purpose: deployments, networking, credentials and provider APIs. The question this post looks at is narrower: which signals should still reach the teams calling it, so they can tell where a problem sits. Public standards from OpenTelemetry and the W3C already cover a good part of this.
A shared vocabulary from OpenTelemetry
OpenTelemetry's GenAI semantic conventions define standard names for telemetry about model calls, agent operations and tool execution. The OpenTelemetry project's own 2026 walkthrough of GenAI observability shows what this looks like in practice:
- Token usage is recorded on spans as
gen_ai.usage.input_tokensandgen_ai.usage.output_tokens, and aggregated in thegen_ai.client.token.usagehistogram. - Latency is recorded in the
gen_ai.client.operation.durationhistogram, which can be split bygen_ai.request.model. - Tool calls appear as
execute_toolspans nested under aninvoke_agentspan, next to the model call spans.
Mapped to the questions an application team is likely to ask, the conventions cover several of them directly:
| Question | Signal | Defined in |
|---|---|---|
| Which request is this? | traceparent header (trace ID, parent ID) | W3C Trace Context |
| Which model was requested and which answered? | gen_ai.request.model, gen_ai.response.model | OTel GenAI conventions |
| How many tokens did it use? | gen_ai.usage.input_tokens, gen_ai.usage.output_tokens | OTel GenAI conventions |
| How long did it take? | gen_ai.client.operation.duration | OTel GenAI conventions |
| Did a tool call fail? | execute_tool spans | OTel GenAI conventions |
| Was there a retry, fallback or policy change? | No standard name today | Left to each platform |
The last row is the gap. Retries, fallbacks and policy decisions happen inside the platform, so they only become visible if the platform chooses to emit them.
How settled the conventions are
The conventions are still evolving. According to the project's repository and Dash0's guide, they are marked as Development, and in June 2026 (semantic conventions v1.42.0) they moved into a dedicated semantic-conventions-genai repository so they can change faster than the core conventions. Dash0 notes that the only Stable attributes on a typical GenAI span are inherited from the core conventions, such as error.type and server.address.
A practical consequence is that attribute names may still change. Teams adopting them may find it easier to emit these signals from one shared place, such as a gateway or a common client library, rather than in every application.
Connecting what each side sees
The W3C Trace Context Recommendation defines the traceparent header, which carries a trace ID, the caller's span ID and a sampled flag between services. When the same trace ID shows up in the application's logs and in the platform's traces, both sides can look at one request together. An example value from the specification's format:
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
^ ^ trace ID ^ parent span ID ^ flags
What usually stays out by default
Prompt and response content is handled differently from metadata. The OpenTelemetry walkthrough describes content capture as off by default: without it, spans carry model names, token counts and durations, but no prompts or tool arguments. It also points out that captured content can be sensitive. Metadata alone is often enough to tell whether a problem is in the application, the platform, the model or a tool.
Limitations
The conventions are not final.
Attribute names and structure can still change while the GenAI conventions are in Development.
Standards cover only part of the picture.
Retries, fallbacks and policy decisions have no standard names yet, so each platform defines its own.
Content capture needs care.
Prompts and tool arguments can contain sensitive data, which is why capture is opt-in.
Telemetry has a cost.
More attributes and more spans mean more storage and processing, so sampling choices matter.
Sources
Cite this post
Adam, Ammar. (Oct 2026). Good abstractions hide complexity, not evidence. www.ammaradam.dev. https://www.ammaradam.dev/posts/hide-complexity-not-evidence/.
BibTeX
@article{adam2026hidecomplexitynotevidence,
title = {Good abstractions hide complexity, not evidence},
author = {Adam, Ammar},
journal = {www.ammaradam.dev},
year = {2026},
month = {Oct},
url = {https://www.ammaradam.dev/posts/hide-complexity-not-evidence/}
}
Comments
Sign in with GitHub to like this post or join the discussion.