OpenTelemetry for LLM Applications: A Practical Guide
How to instrument LLM applications with OpenTelemetry using the GenAI semantic conventions, why gen_ai.system is now gen_ai.provider.name, what belongs on a span, a…
The honest argument is not technical elegance. It is that LLM observability vendors have been acquired, relicensed and repositioned repeatedly over the past two years, and instrumentation is the most expensive thing to redo. Every service you instrument is a code change, a review and a deploy. Doing that twice because your vendor changed is a bad use of a quarter.
The semantic conventions, and where they moved
The genai. namespace is the OpenTelemetry semantic convention for generative AI. Worth knowing where it came from: Traceloop's OpenLLMetry project developed conventions that became the basis for the official OTel GenAI effort, and its README notes that its semantic conventions are now part of OpenTelemetry. OpenLIT states that it follows and maintains the conventions with the OTel community.
What a useful span actually looks like
Here is a minimal manual instrumentation in Python. Adapt the attribute set, not the structure.
The two mistakes that make traces useless
Mistake one: putting prompts and completions on span attributes by default
Sessions and multi-turn conversations
A conversation is not a trace. It is a sequence of traces that need grouping.
Which generation is your backend on
The rename split the ecosystem in half, and it is the sort of thing nobody writes down. As of August 2026: