Read our operating thesis — Machines work better in tandem
JOURNALOBSERVABILITY · JULY 2026

Agent observability: Langfuse vs Arize Phoenix vs Braintrust

Before choosing a tool, decide what a trace has to contain to answer “why did it do that?”. Then one architectural question — OpenTelemetry-native or proprietary SDK — narrows the field faster than any feature matrix.

WRITTEN BYTandem Machines
Coordinated Intelligence
PUBLISHED
READING TIME15 minutes
SHARE
LinkedInX
KEY TAKEAWAYS
  • 01Decide what a trace must contain before you shortlist tools. The requirement is stable; the vendors are not.
  • 02One question narrows the field faster than any feature matrix: OpenTelemetry-native, or a proprietary SDK?
  • 03Langfuse and Phoenix are both open source and self-hostable. Braintrust's docs present a cloud platform.
  • 04Observability is a prerequisite for evaluation — agent evals need real trajectories as test cases.
  • 05None of the three will tell you which permission rule allowed an action. That span is yours to emit.

A note on method.This is a capability mapping drawn from each vendor’s current documentation, not a hands-on bake-off: we have not run the same instrumented agent through all three and measured them. Where that matters — and for anything that changes quickly, like pricing and deployment options — verify against the primary sources listed at the end. What follows that is durable: the trace requirement and the architectural decision, which outlive any of these products.

What agent observability means

Agent observability is capturing enough of an agent’s execution to reconstruct why it did what it did. It differs from application monitoring in its unit of interest: not a request, but a trajectory — a sequence of model calls, tool calls and results, where the same final answer can be reached through an acceptable path or an alarming one.

That distinction is the whole reason a dedicated tool exists. A conventional APM will happily tell you that a request took 14 seconds and returned 200. For an agent, neither number is the interesting part. The interesting part is that on step four it read a document it should not have had access to, and on step five it acted on what it found there.

Trajectory
The ordered sequence of decisions and actions in one agent run — including the reasoning that selected each action and the state the agent observed before choosing. Two runs producing identical output can have entirely different trajectories, and only one may be acceptable.

The minimum trace

A trace is sufficient when it answers “why did it do that?” without re-running anything. That requires seven things: the objective, each model call with its resolved prompt and token accounting, each tool call with arguments and result, the reasoning that selected it, the permission decision that allowed it, any human approval, and the terminal outcome.

Work out this list before you shortlist anything. It is what you are actually buying, and it is the only basis on which a feature matrix means anything.

#SpanMust carryWho emits it
01RunObjective, initiator, session, terminal outcomeYour harness
02Model callResolved prompt, model ID, tokens in/out/cached, latencyAuto-instrumentation
03Tool callTool name, arguments, result, error flag, durationAuto-instrumentation
04ReasoningWhat the agent believed when it chose this actionAuto-instrumentation (where thinking is surfaced)
05Permission decisionWhich rule allowed or denied the call, and at which stepYou
06Human approvalWho approved, when, what they sawYou
07Escalation / stopWhich condition ended the run, and what remained undoneYour harness
ROWS 5 AND 6 ARE THE ONES NO TOOL EMITS FOR YOU — THEY TURN A TRANSCRIPT INTO AN AUDIT TRAIL

Rows two through four come nearly free from any of these tools once instrumented. Rows one and seven need a little work. Rows five and six need real work, and nobody sells them — which is worth knowing before you assume a purchase has covered your audit requirement. If your governance layer decides what an agent may do, then the record of which rule fired is part of the evidence, and it has to be emitted deliberately.

“An agent trace that shows what happened but not which rule allowed it is a debugging aid. It is not an audit trail.”

Token accounting is not a nice-to-have

Row two’s token fields deserve emphasis because they are the fastest way to find the expensive bug. Cached versus uncached input tokens tell you whether your prompt cache is working at all — and a cache-read count of zero across repeated, apparently-identical requests is the signature of a silent invalidator, usually a timestamp or an ID interpolated into the system prompt. Without that field in the trace, you are guessing.

The question that actually decides it

Are agent traces part of your existing telemetry, or their own system? An OpenTelemetry-native tool puts agent spans in the same pipeline as the rest of your services, so one collector, one retention policy and one set of dashboards cover everything. A proprietary SDK gives richer LLM-specific semantics at the cost of a second, parallel pipeline.

This is a platform decision, not a features decision, and answering it first eliminates candidates faster than reading any comparison table. Both answers are defensible.

OTel-nativeProprietary SDK
PipelineOne collector; agent spans alongside service spansSecond pipeline, parallel to your existing telemetry
PortabilitySwap backend without re-instrumentingRe-instrument to change vendor
SemanticsGeneric spans plus GenAI conventionsNative generations, sessions, scores, datasets
SuitsTeams with existing observability practiceTeams treating the LLM app as its own system

The portability row is the one people underweight and later regret. The instrumentation is the expensive, invasive part of adoption; the dashboard is not. A pipeline you can point at a different backend is worth more than any single feature you are comparing today, because this product category is about eighteen months old and will not look like this in two years.

The three tools

Langfuse and Arize Phoenix are both open source with self-hosting, and overlap heavily on tracing, evaluations and datasets. Phoenix is built on OpenTelemetry and OpenInference. Langfuse is LLM-native with strong prompt management. Braintrust’s documentation presents a cloud platform positioned around actively analysing agent traces.

Langfuse

Open source and self-hostable, and explicitly positioned as purpose-built for LLM applications rather than a general APM — with native handling of LLM concepts like token usage and model parameters. Traces capture the full request lifecycle including model calls, retrieval, tool executions and custom logic, organised as traces, sessions and observations.

Beyond tracing it documents LLM-as-a-judge evaluation, datasets and experiments, prompt management with versioning, and custom dashboards. The SDKs send data asynchronously in the background, which matters more than it sounds: instrumentation that blocks your agent loop is instrumentation you will eventually remove.

Arize Phoenix

Built by Arize AI with the open-source community, and architecturally the most conventional of the three: it accepts traces over OTLP and uses OpenInference as its instrumentation framework. That gives it broad auto-instrumentation — documented coverage includes LlamaIndex, LangChain, DSPy, Mastra and the Vercel AI SDK, plus model providers including OpenAI, Bedrock and Anthropic, across Python, TypeScript and Java.

Feature coverage is comparable to Langfuse: tracing of model calls, retrieval and tool use; evaluation via LLM-based evaluators, code-based checks or human annotation; prompt versioning with a playground and span replay; and datasets and experiments for comparing versions. Deployment runs local, self-hosted via Docker or Kubernetes, or cloud.

Span replay is the underrated item on that list. Re-running a single historical span against a changed prompt is the tightest possible iteration loop for a specific failure, and it is much faster than reproducing the whole trajectory.

Braintrust

Positions itself as an active observability platform for instrumenting, understanding and improving agents, with the emphasis on applying intelligence to traces and surfacing significant patterns automatically rather than leaving you to find them. Documented surface includes tracing, evaluations, playgrounds, datasets, a bt CLI for scriptable instrumentation, and an MCP server for IDE integration. The documented workflow runs instrument → observe → annotate → evaluate → deploy.

Two things to establish yourself before shortlisting it: its docs present a cloud offering without advertising the open-source self-hosted path that Langfuse and Phoenix both do, and open-source status is not stated. If either matters to you, confirm directly — those are hard constraints, and hard constraints should do the filtering before features get a vote.

Choosing

Filter on constraints first: self-hosting requirement, existing telemetry pipeline, and whether the data can leave your infrastructure. Those three eliminate most of the field. Only then compare features, and expect the remaining difference to be smaller than the marketing suggests.
THE ORDER TO EVALUATE IN
01Data residencyCan prompts and outputs leave your infrastructure at all?
02Pipeline fitOTel-native if you already run OpenTelemetry; otherwise open
03Eval couplingHow easily do production traces become eval test cases?
04Instrumentation costAuto-coverage for your actual framework, not a logo list
MOST TEAMS DO THIS BACKWARDS AND SPEND WEEKS ON A DECISION CONSTRAINTS ALREADY MADE

On the first row: prompts and outputs are among the most sensitive data your system handles, because they contain whatever your users and your documents contain. A tool that requires sending them to a third party is a data-processing decision, not a tooling decision, and it belongs with whoever owns that call.

On the last row, check auto-instrumentation against the framework you actually use, not the length of the supported list. Coverage for a framework you do not use is worth nothing, and hand-instrumenting an unsupported one is the single largest adoption cost in this category.

What none of them do for you

No observability tool decides what to log, what an acceptable trajectory is, or which permission rule allowed an action. Those are properties of your system that must be emitted deliberately. A tool bought expecting an audit trail delivers a very good debugging surface and an incomplete record.

Three gaps are consistent across the category.

The authority record. Rows five and six of the minimum trace. Your governance layer knows which rule fired and who approved what; the observability tool only knows a call happened. Emitting that as a span attribute is a few lines of work and it is the difference between reconstructing an incident and speculating about one.

The definition of good. Every one of these ships LLM-as-a-judge evaluators, and none of them can tell you what your acceptance criteria are. That work is yours, it is domain-specific, and it is the part that actually determines whether the eval suite is worth running.

Retention that matches your obligation. Default retention is set for debugging — weeks. If a trace is your evidence that an agent acted within its authority, the retention requirement comes from your compliance posture, not from a pricing tier. Check this before you need it.

Instrument before you choose

Emit structured spans behind a thin interface of your own from the start, even before selecting a tool. The instrumentation points are the expensive, invasive part; the backend is a configuration detail. Doing it in this order makes the choice reversible.
A vendor-neutral seam
// The point is not the abstraction — it is that the call sites,
// which are scattered through your agent, never name a vendor.
interface AgentTracer {
  run(objective: string): Span;
  modelCall(span: Span, d: { model: string; tokensIn: number; tokensOut: number; cachedIn: number }): void;
  toolCall(span: Span, d: { tool: string; args: unknown; result: unknown; isError: boolean }): void;

  // The two nobody provides — emit them yourself.
  permissionDecision(span: Span, d: { tool: string; decision: "allow" | "deny" | "ask"; rule: string; step: string }): void;
  approval(span: Span, d: { actor: string; decidedAt: string; shown: string }): void;

  finish(span: Span, outcome: "completed" | "exhausted" | "escalated" | "failed"): void;
}
SWAPPING BACKENDS SHOULD TOUCH ONE FILE, NOT EVERY TOOL HANDLER

The two highlighted methods are the ones this article exists to argue for. They cost almost nothing to add at the start, they cannot be backfilled, and they are what makes the trace usable by someone other than the engineer debugging it.

For where this layer sits relative to everything else — and why building it before the governance layer rather than after is the right order — see the seven-layer stack. For what the permission decisions you are recording actually look like, see the Agent SDK’s six-step evaluation order.

Frequently asked questions

What is agent observability?

Agent observability is the practice of capturing enough of an agent's execution to reconstruct why it did what it did. It differs from application monitoring because the unit of interest is a trajectory — a sequence of model calls, tool calls and results — rather than a single request, and because the same final answer can be reached through an acceptable path or an unacceptable one.

What should an agent trace contain?

The objective, every model call with its resolved prompt and token counts, every tool call with arguments and result, the reasoning that selected each action, which permission rule allowed it, any human approval, and the terminal outcome. The last three are what turn a debugging transcript into an audit trail.

Is Langfuse or Arize Phoenix better?

They overlap heavily and both are open source and self-hostable, so the choice usually comes down to instrumentation strategy. Phoenix is built on OpenTelemetry and OpenInference, which suits teams that want agent traces in the same pipeline as the rest of their telemetry. Langfuse is LLM-native with strong prompt management and dataset tooling, which suits teams treating the LLM application as its own system.

Is Braintrust open source?

Braintrust's documentation presents it as a cloud platform and does not advertise an open-source self-hosted deployment the way Langfuse and Phoenix do. If running the tool inside your own infrastructure is a requirement, verify current deployment options directly before committing — that constraint eliminates candidates faster than any feature comparison.

Do I need a dedicated LLM observability tool, or can I use my existing APM?

A general APM will show you latency and errors but not the things that matter for agents: the resolved prompt, token accounting, tool arguments, and which trajectory led to an output. If your telemetry is already OpenTelemetry-based you can send agent spans into the same backend, but you will still want a tool that understands generations, evaluations and datasets natively.

What is the difference between observability and evaluation?

Observability tells you what happened in production; evaluation tells you whether a change makes behaviour better or worse. They are coupled in practice because agent evaluation needs real trajectories as its test cases, which means the observability layer is a prerequisite — you cannot build a useful eval suite from traces you never captured.

Sources

  1. 01Tracing and observability Langfuse, 2026
  2. 02Phoenix documentation Arize AI, 2026
  3. 03Braintrust documentation Braintrust, 2026
  4. 04OpenInference instrumentation specification Arize AI, 2026
Tandem Machines
Notes on coordinated intelligence — one essay a month
Subscribe
PREVIOUS

Choosing the agent data layer: pgvector vs Chroma vs Pinecone