LLM observability: what to instrument when the workload is an agent

LLM observability is tracing and metrics for model calls: tokens in and out, dollars per request, latency to first token, which tools the model called, and whether the turn ended in a useful answer. Classic APM carries none of those, which is why the category exists rather than being a dashboard in Datadog.

By the Continuum team. We build a workbench that runs Claude Code, Codex, and their peers, so the model rates quoted here are the ones our own cost analytics ship with.

The short version

LLM observability adds four signals that application performance monitoring never needed: token counts split by cached and fresh, cost per request, tool-call structure inside a turn, and whether the turn succeeded in a way a status code cannot express. The tooling splits into proxy-based (Helicone, Portkey), SDK-based tracing (Langfuse, LangSmith), and provider-native reporting. OpenTelemetry has GenAI semantic conventions covering agent and tool spans, but as of August 2026 every metric in them is still marked Development stability, so portability is a direction rather than a guarantee.

What you need to know
  • The four signals APM lacks: tokens, cost, tool-call structure, and turn outcome. Latency and error rate are the easy part.
  • Split tokens into fresh input, cache reads, cache writes, and output. A single "input" number hides the cheapest optimization you have.
  • The OTel GenAI conventions define gen_ai.client.token.usage and agent-level metrics, but all of them are still Development stability.
  • Proxy tools see every call and add a hop. SDK tools add no hop and miss anything not instrumented. Pick by which blind spot you can live with.
  • Continuum reads agent CLI logs locally and prices them. It is not a tracer for your own applications.

What APM does not carry

A traditional APM span tells you an HTTP call took 340ms and returned 200. For a model call that is nearly content-free. The interesting failures return 200: a truncated answer, a tool loop, a refusal, a correct answer that cost eleven dollars.

The signals that make this a separate category.
SignalWhy APM never needed itWhat it tells you
Token counts, split four waysHTTP calls have no unit of work inside themWhere the money is, and whether the cache is warm
Cost per requestRequests were free at the marginThe only number finance will read
Time to first tokenA response was atomicPerceived speed for a streaming UI
Tool calls inside a turnThere was no nested agent loopWhether the agent is working or thrashing
Turn outcomeThe status code was the outcomeWhether a 200 was actually useful

The agent-specific part

A chatbot makes one model call per user message. A coding agent makes a variable number, interleaved with tool calls, over a turn that can run for minutes. That structural difference is what the newer conventions are trying to capture.

The OpenTelemetry GenAI semantic conventions, which moved to their own repository in 2026, define both client-level and agent-level instruments:

GenAI semantic convention metrics, read from the OpenTelemetry GenAI conventions repository in August 2026. Every one is marked Development stability.
MetricTypeUnitStability
gen_ai.client.token.usageHistogram{token}Development
gen_ai.client.operation.durationHistogramsDevelopment
gen_ai.client.operation.time_to_first_chunkHistogramsDevelopment
gen_ai.invoke_agent.durationHistogramsDevelopment
gen_ai.invoke_agent.inference_callsHistogram{inference_call}Development
gen_ai.invoke_agent.tool_callsHistogram{tool_call}Development
gen_ai.execute_tool.durationHistogramsDevelopment

The tool landscape, honestly

Two architectures, and the choice between them is the real decision. A proxy sits between your code and the provider, sees every call including ones you forgot to instrument, and adds a network hop plus a dependency in your critical path. An SDK instruments your code, adds no hop, and is blind to anything that does not go through it.

List prices read from each vendor's pricing page in August 2026. All of them reprice.
ToolArchitectureFree tierPaid entryNotes
HeliconeProxy (async logging also available)10,000 requests, 1 seat, 7-day retentionPro $79/mo, Team $799/moAlerts and HQL on Pro; SOC 2 and HIPAA on Team
LangfuseSDK tracing, open sourceHobby: 50k units/mo, 2 users, 30-day accessCore $29/mo (100k units, then $8/100k), Pro $199/moSelf-host free; Enterprise cloud $2,499/mo adds audit logs and SCIM
LangSmithSDK tracingDeveloper: 5k base traces/moPlus $39/seat/moOverage in compute and storage units ($1.50 LCU, $1.00 LSU); 14-day base retention
PortkeyGateway, open source coreDeveloper: 10k logs/moProduction $49/mo (100k logs, $9 per extra 100k)Observability plus enforcement: granular budget and rate limits are Enterprise
Provider-nativeReporting APIFreeFreeAnthropic Usage and Cost Admin API, OpenAI /v1/organization/costs; daily granularity on cost

The candid version of that table: Langfuse self-hosted is the best value in the category and the most work. Helicone is the fastest thing to stand up if you accept a proxy. LangSmith is priced for LangChain shops and its unit-based overage is genuinely hard to forecast before you run it. Portkey is not really an observability tool that added routing, it is a gateway that logs, which matters because a gateway can also refuse a request.

The free setup that covers coding agents

If the workload you want visibility into is Claude Code rather than your own application, none of the above is required. Claude Code exports OpenTelemetry metrics and events directly, including a cost metric, and the whole thing is environment variables.

Metric names and variables from Claude Code's monitoring documentation, checked August 2026.
export CLAUDE_CODE_ENABLE_TELEMETRY=1
export OTEL_METRICS_EXPORTER=otlp        # or prometheus, console
export OTEL_LOGS_EXPORTER=otlp
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317

# tag every metric for allocation
export OTEL_RESOURCE_ATTRIBUTES="team.id=platform,cost_center=eng-123"

# metrics emitted:
#   claude_code.cost.usage            (USD)
#   claude_code.token.usage           (tokens)
#   claude_code.session.count
#   claude_code.lines_of_code.count
#   claude_code.commit.count
#   claude_code.pull_request.count
#   claude_code.code_edit_tool.decision
#   claude_code.active_time.total     (seconds)

Prompt and response text is redacted by default and only logged if you opt in with OTEL_LOG_USER_PROMPTS or OTEL_LOG_ASSISTANT_RESPONSES. Leave those off unless you have a policy that says otherwise, because turning them on moves your source code into your observability vendor. The full walkthrough lives in the Claude Code metrics guide.

What Continuum covers, and what it does not

Worth being explicit, because this page competes with vendors who would answer the question differently about themselves.

  • Covered: cost and token analytics for coding agents, parsed from the transcripts the CLIs already write to local disk. Claude under ~/.claude/projects, Codex under ~/.codex/sessions, OpenCode into a local database, and the others into their own state directories. Nothing sits in the request path, so there is no added latency and no proxy to fail.
  • Covered: history you did not instrument in advance. Because it reads files that already exist, the first parse covers however many months of sessions are on the machine rather than starting from install day.
  • Covered: attribution by repo, provider, model, and day, with events priced at each model's own rate.
  • Not covered: tracing arbitrary applications. If you want spans for your own LLM-backed product, use Langfuse, LangSmith, or an OTel SDK. That is a different job and we do not do it.
  • Not covered: prompt and response content. Direct sessions run laptop to provider and report usage only.

Questions people ask

What is LLM observability?

LLM observability is monitoring and tracing for model calls, covering the signals classic application monitoring does not carry: token counts split into fresh input, cache reads, cache writes and output; cost per request; time to first token; the tool calls made inside an agent turn; and whether the turn produced a useful outcome. The failures worth catching mostly return HTTP 200, which is why status codes and latency are not enough.

What is the difference between LLM observability and APM?

APM measures the transport: latency, throughput, error rate. LLM observability measures the work inside the call. An APM span for a model request tells you it took 340ms and succeeded, which says nothing about whether the answer was truncated, whether the agent looped through eleven tool calls, or whether that one request cost four dollars.

Langfuse or LangSmith: which should I use?

Langfuse if you want to self-host or if you are not a LangChain shop. It is open source, free to self-host, and its cloud Core tier is $29 a month for 100k units with $8 per additional 100k, which is easy to forecast. LangSmith is $39 per seat on Plus and bills overage in compute and storage units at $1.50 and $1.00 respectively, which is harder to predict before you run it, and it fits best if you already use LangChain or LangGraph.

Is Helicone free?

There is a free Hobby tier with 10,000 requests a month, one seat, one organization, 7-day retention and a 10 logs per minute ingestion limit, checked August 2026. Paid tiers are Pro at $79 a month, which adds unlimited seats, alerts and a one-month retention window, and Team at $799 a month, which adds SOC 2 and HIPAA coverage and three-month retention.

Are the OpenTelemetry GenAI semantic conventions stable?

No. As of August 2026 every metric defined in the GenAI semantic conventions, including gen_ai.client.token.usage and the agent-level instruments, is marked Development stability, meaning names and shapes can still change. Adopting them is still the right call because the alternative is a proprietary schema that is equally unstable and not portable, but do not plan a migration around the assumption that the names are frozen.

Do I need an observability tool just to see what Claude Code costs?

No. Claude Code exports OpenTelemetry metrics natively, including claude_code.cost.usage in USD, behind CLAUDE_CODE_ENABLE_TELEMETRY=1. For organizations, Anthropic also ships a free Claude Code Analytics API that returns per-user daily sessions, lines of code, commits, pull requests, and estimated cost by model. Tools that read the local transcripts cover the same ground retroactively with no setup.

Sources

Every figure above was read from these pages on August 2026. Vendors reprice without notice; if you find a stale number, tell us.

  1. OpenTelemetry GenAI semantic conventions
  2. Claude Code monitoring with OpenTelemetry
  3. Helicone pricing
  4. Langfuse pricing
  5. LangSmith pricing
  6. Portkey pricing
  7. Anthropic Usage and Cost Admin API
Try it

Cost per repo,
no SDK.

Continuum prices the transcripts your agents already write, so the history is there the day you install it.

free app · your subscriptions · local-first