LLM Observability in Production

Which Signal Answers Which Question

Four systems are in place: dashboards, a trace store, an evaluation harness, and thumbs up and down on every response. At half past two in the morning, with a customer escalation open, nobody can say which one to open first.


The Problem at Scale

There are four signals available for an LLM system and they answer different questions. Teams tend to fail in one of two directions: building one and expecting it to cover everything, or building all four and having no order of operations when it matters.

  metrics       is something wrong, and how widespread
  traces        what actually happened in this request
  evaluations   is quality different from before
  feedback      did a human think it was bad

Each is authoritative for its own question and misleading outside it, and the ways they mislead are specific enough to name.

KEY CONCEPT

Build traces before metrics. That is the opposite of the order you would use for any other system, and it follows from the previous lessons: the failure mode that matters returns a 200, so metrics cannot see it, while a trace containing the prompt and the completion can. Metrics remain necessary and they are the detector rather than the explanation, and in this domain you will be asked to explain a specific response far sooner than you will be asked about an aggregate.


How It Works

What each is authoritative for

Metrics. Availability, latency, throughput, cost, and the presence of a change. Excellent at telling you that something moved and how many requests are affected.

Traces. What happened in one request: the prompt, the retrieved context, the model call, the completion, the timing of each hop. The only signal that answers why a specific answer was wrong.

Evaluations. Whether output quality differs from a baseline, measured against something. The only signal that quantifies quality rather than describing symptoms.

Feedback. Whether a human considered a response bad. The only ground truth in the entire system, and the most biased.

Where each one misleads

This is the part worth memorising, because every one of these has caused an incorrect conclusion somewhere.

Metrics mislead by aggregation. An unsegmented percentile over incomparable populations, and a mean over a bimodal quality distribution. Both from the previous lesson.

Traces mislead by sampling and by singularity. You are looking at the traces you kept, which is a biased sample unless you designed the sampling with that in mind, which is Module 4. And more subtly: a trace is one instance of a non-deterministic process. A single terrible trace does not establish that the system is broken, because the same input would plausibly have produced a fine answer. One trace proves the failure is possible, not that it is prevalent.

Evaluations mislead through the judge and the dataset. An LLM judge has its own biases, preferring longer answers, particular formats, its own family of models. And the evaluation set drifts away from production traffic the moment traffic changes, so a stable score can mean quality held or can mean you are measuring last quarter's questions.

Feedback misleads by selection, severely. Almost nobody submits feedback. Those who do are overwhelmingly reporting failures, because a good answer produces no impulse to click anything. So a thumbs down rate is not a quality rate and is not even proportional to one, and its absolute level says more about how visible the button is than about the product.

The order to reach for them

At half past two in the morning, in this order:

  1. metrics      is this real, and how many requests
  2. traces       what happened in the failing ones
  3. evaluations  is quality actually different, or is this
                  one bad instance of a normal distribution
  4. feedback     is the user impact what I think it is

The anti-pattern is starting at four. One escalated ticket becomes a theory, the theory becomes the investigation, and the investigation confirms it because a search for supporting traces will always find some. Feedback tells you a human was unhappy. It is very poor evidence about scale, and scale is what decides whether this is an incident.

The minimum viable setup

If you have nothing, build in this order. It is not the familiar order and the reasoning is in the callout above.

Traces with payloads, sampled, with short retention. Nothing else answers the question you will be asked first. Short retention keeps the volume arithmetic from Module 1 lesson two manageable while you learn what you actually need.

A small number of segmented metrics, with exemplars pointing into those traces. Segmented by model and task type at minimum. Exemplars are what turn a spike into a click rather than a search.

Feedback capture on responses. Cheap to add, and it is the only ground truth you will ever have. Capture it linked to a trace identifier or it is an anecdote.

Evaluations last. They are the most work, they need a dataset, and the best source of a dataset is production traces you have already collected, which is Module 7. Building evals before you have traces means inventing the test set, and an invented test set drifts from reality immediately.

Teams reverse this constantly, usually building dashboards first because that is what they have always done first, and then discovering that the dashboard cannot answer any of the questions the product generates.


Building and Operating It

Capture feedback against a trace, or it is unusable.

# A thumbs down that is not linked to a trace is an anecdote. Linked,
# it is the start of an investigation and a candidate for a dataset.
langfuse.score(
    trace_id=trace_id,          # the request this refers to
    name="user_feedback",
    value=0,                    # 0 down, 1 up
    comment=user_comment,       # optional, and the most useful field
)

Make metrics lead into traces rather than stopping at a number.

# Exemplars attach a trace id to histogram samples, which is what
# turns "p99 spiked at 02:14" into a specific request you can open.
# Without this the detection works and the explanation starts blank.
storage:
  exemplars:
    max_exemplars: 100000

Weight feedback by how little of it there is.

# Thumbs down as a share of RESPONSES, next to the share of responses
# that got any feedback at all. The second number is usually under a
# percent, which is the context the first number needs.
sum(rate(llm_feedback_total{value="down"}[1d])) / sum(rate(llm_responses_total[1d]))
sum(rate(llm_feedback_total[1d]))               / sum(rate(llm_responses_total[1d]))

And check whether your evaluation set still resembles production.

# Distribution of task types in the eval set against live traffic.
# Divergence here means a stable score is measuring the wrong thing,
# which is the quiet failure of every evaluation programme.
curl -s -u "$LF_PUBLIC_KEY:$LF_SECRET_KEY" \
  "$LANGFUSE_HOST/api/public/datasets/$DATASET/items?limit=500" \
  | jq -r '[.data[].metadata.task_type] | group_by(.) | map({(.[0]): length}) | add'
PRO TIP

When somebody asks whether a bad answer they were shown means the system is broken, the honest answer needs two signals rather than one. The trace establishes that the failure is possible and shows exactly how it happened. Only an evaluation over a population establishes whether it is prevalent. A single trace is compelling, it is one draw from a non-deterministic process, and treating it as evidence of scale is how a team spends a week on something that happens once in ten thousand requests while a real regression sits unexamined.


Tradeoffs and Decision Framework

SignalAuthoritative forMisleads throughCost
MetricsAvailability, latency, cost, scale of changeAggregation over incomparable populationsLow
TracesWhat happened in one requestSampling bias, and one instance of a random processHigh, see Module 1 lesson two
EvaluationsWhether quality changedJudge bias, and dataset driftHigh, and it is a second inference workload
FeedbackThat a human was unhappySevere selection biasVery low
Build orderWhy
1. Traces with payloadsThe only answer to the first question you will be asked
2. Segmented metrics with exemplarsDetection, and a path into the traces
3. Feedback linked to trace idsThe only ground truth, and nearly free
4. EvaluationsMost work, and the dataset comes from the traces

Three questions before concluding anything. Which signal is authoritative for the question being asked, since three of the four will offer an opinion regardless. Is this one instance or a population, because a trace cannot tell you and an evaluation can. And how much feedback exists at all, as the rate is usually under a percent and the level says more about the button than the product.

Default: traces first with payloads and short retention, then a small segmented metric set with exemplars into them, feedback captured against trace identifiers, and evaluations last built from datasets drawn out of production traces.


Failure Modes and Common Mistakes

Building dashboards first. It is the familiar order and it answers none of the questions this product generates.

Starting an investigation from one ticket. Feedback establishes unhappiness, not scale, and a search for supporting traces always finds some.

Treating one bad trace as a regression. It is one draw from a non-deterministic process.

Reading a thumbs down rate as a quality rate. Almost nobody gives feedback and those who do are reporting failures.

Trusting a stable evaluation score. The set drifts from production traffic, so stability can mean nothing changed or that you are measuring last quarter.

Feedback not linked to a trace. It is an anecdote you cannot investigate.

Metrics with no exemplars. Detection works and every explanation starts from an empty search box.

KNOWLEDGE CHECK

A customer escalates one badly wrong answer. The trace clearly shows retrieval returned irrelevant chunks and the model answered from them. What can you conclude, and what would you do next?

INTERVIEW QUESTION

You are starting from nothing on an LLM platform. Which observability signal would you build first, and why?