learn-ai-observability-with-phoebe / Leader session 6 of 6
Learn AI Observability with Phoebe · Leader track · Session 6 of 6

Buy, build, or stay OTel-native: lock-in is an attribute-dialect problem

The last session, and the one where the previous five turn into a purchase order. The tooling question is usually framed as buy versus build, which is the wrong axis: the market splits three ways, everybody emits the same wire format, and the thing that actually locks you in is the spelling of your attribute keys. Underneath the tooling decision sits a governance decision that the default settings will make for you if you do not make it first, which is whether your trace store becomes a copy of everything your users typed.

🟠 Leader track Heads of engineering · platform leads · SRE managers 45 min
0-3 · Welcome 3-17 · The market splits three ways 17-31 · Dialects, and the inverted default 31-42 · The portability ledger 42-45 · Close
Part 0

Why this is the last session and not the first

Most teams start here, with a vendor bake-off, and it is the wrong end of the problem. A platform can only show you what you chose to emit, so a tooling decision taken before a coverage decision buys you a beautiful view of the wrong half of your system. Five sessions of deciding what matters is what makes this session short.

Live - presented in session Self-study - read after class Official sources covered
★ What you walk out with today The three-way split of the market and which lane each candidate actually sits in, the licence facts stated honestly rather than as a badge, why interop happens at the backend and not at the producer, the inverted default privacy posture that decides what lands in your trace store on day one, a portability ledger that separates what ports from what you will rebuild, and an explicit list of what could not be verified so you ask the vendor rather than guess.
One sentence for this session Evals tell you whether it works. Observability tells you what actually happened. Whichever platform you pick will happily receive what you send it, so the durable asset is your instrumentation, spelled in conventional attribute names, and everything you build on top of it is rented.
Part 1 · the landscape

The market splits three ways, not two 14 min live

Buy versus build implies two options. In practice there are three lanes, and most bake-offs go wrong by comparing candidates from different lanes on the same criteria. Decide the lane first, then compare inside it.

OTLP-native, LLM-specific the specialist lane Langfuse · Phoenix · Braintrust Weave · LangSmith via receiver Reads gen_ai.* and OpenInference keys, then renders an agent run natively: the tree, the tool calls, the tokens, the cost per step. You trade a smaller vendor, and a product still moving fast underneath you. OTLP-native, general APM the generalist lane Grafana Cloud / Tempo Honeycomb Ingests anything OTLP, including every gen_ai.* attribute you send. No LLM-aware rendering unless you go and build the views. You trade the native agent view, for one home for all your telemetry. Proprietary SDK the richest-product lane Datadog LLM Observability Deepest product and the widest platform around it. No documented OTLP path for LLM Observability specifically. Billed per span. You trade portability. Your producer code becomes the vendor's SDK. Licence, stated honestly - neither popular self-hosted option is plain permissive OSS end to end Arize Phoenix is Elastic License 2.0. Langfuse is MIT except ee/, web/src/ee/ and worker/src/ee/. The W&B Weave repo is Apache-2.0. Read the licence covering the part you intend to run, not the README badge. Compare candidates inside a lane. Comparing across lanes is how a bake-off produces a bad answer.
🔍 Click to zoom - the three lanes, what each one asks you to give up, and the licence facts
LiveThe candidate table, with the ingest facts that actually decide things6 min▶

The columns worth arguing about are ingest and self-host, because those two are what determine whether a switch later is a configuration change or a project. Everything else is product taste, which changes faster than your instrumentation does.

PlatformIngestSelf-hostLicence
LangfuseOTLP-native. HTTP JSON and protobuf, no gRPC, Basic auth. Reads three dialectsYesMIT except ee/, web/src/ee/, worker/src/ee/
Arize PhoenixOTLP-native, OpenInference dialectYes, described as free to self-host with no feature limitationsElastic License 2.0, not plain OSS
LangSmithProprietary SDK plus an OTLP receiverEnterprise tierProprietary
BraintrustOTLP-native, needs a parent-project headerNot verified. AskProprietary
W&B WeaveOTLP-native, project name carried as an OTel resource attributeDedicated and self-managed offeringsRepo is Apache-2.0
Datadog LLM ObsProprietary SDK only. No documented OTLP path for LLM ObservabilityNoProprietary. Billing based on the volume of spans you send
Grafana Cloud / TempoOTLP-native, generic. AI dashboards exist over conventional keysTempo is open sourceLicence string not verified. Check the repo
HoneycombOTLP-native, genericNoProprietary. LLM feature set not verified

Two things to notice before the room starts arguing about features. First, seven of the eight take OTLP, which means the wire is not the differentiator and portability is not really at stake at the transport layer. Second, the one that does not is also the one with the richest product, which is not a coincidence and is exactly the trade being offered.

The question that separates the lanes in one minute Ask any candidate to show you a live trace of a twelve-step agent run with a failed tool call in the middle, using data you sent from your own code rather than their demo account. Lane one renders it as a tree without configuration. Lane two ingests every attribute perfectly and shows you a flat waterfall you will need to build views over. Lane three renders it beautifully and you write to their SDK to get it there. All three answers are acceptable. Not knowing which one you are buying is not.
Part 2 · dialects and defaults

Interop happens at the backend, and the default is inverted 14 min live

Lock-in feels like a transport problem and it is not, because everybody speaks the same transport. It is a vocabulary problem. Two libraries can send a token count over identical wire in two different spellings, and the platform on the far end is what reconciles them.

Interop happens at the backend, not at the producer OpenInference llm.token_count.prompt OTel GenAI gen_ai.usage.input_tokens MLflow tracing mlflow.spanInputs OTLP one wire The platform normalises whichever dialect arrives Langfuse documents reading OpenInference keys, OTel GenAI keys and MLflow keys. Three dialects, one backend. So what ports is your attribute NAMES. Emit conventional names and a backend swap is configuration. Emit your own names and it becomes a re-instrumentation project. The default privacy posture is inverted - a governance decision wearing a tooling costume OTel GenAI conventions Content capture is OPT-IN and OFF by default. The spec: instrumentations "SHOULD NOT capture them by default, but SHOULD provide an option for users to opt in." You choose to record. OpenInference Captures content BY DEFAULT. You hide it with the OPENINFERENCE_HIDE_* flags, and redaction writes the literal "__REDACTED__" in place of the value. Default state: prompts on disk. Same wire format, opposite defaults. The library you install decides what lands in your trace store.
🔍 Click to zoom - three dialects over one wire, and the two libraries whose defaults point in opposite directions
Read this paragraph twice, it is the whole session

Both dialects emit valid OTLP. Every OpenInference trace is a valid OTLP trace, so nothing about the transport constrains you. But OTel GenAI treats prompt and completion content as opt-in and ships it off, while OpenInference captures content by default and expects you to switch it off. Nobody presents this as a policy question. It arrives as a library choice made by an engineer in an afternoon, and it decides whether your trace store contains every prompt your users typed. That is a governance decision disguised as a tooling decision, and it is the one place in this session where the default will make the call for you.

Self-studyThe dialect differences that matter to a leader, not to a spec reader4 min read▶

You do not need to memorise the key names. You do need to know which capabilities exist in which vocabulary, because a missing concept is a gap you will end up filling with bespoke attributes, and bespoke attributes are the thing that does not port.

OTel GenAI conventionsOpenInference
Content defaultOpt-in, off. Metadata only until you decide otherwiseOn by default, hidden with explicit flags
CostNot in the spec. You compute it yourselfFirst-class cost fields, including cache read and cache write
User identityNo user id at all. The general namespace has a session idHas a user id field
Graph topologyNot modelledNode, name and parent fields for graph frameworks
StabilityDevelopment status, no tagged releases and nothing to pinVersioned and used in production

Two consequences for the buying decision. Cost and user attribution are the two things leaders ask for most, and in the conventional vocabulary neither exists, so somebody on your team will invent a spelling for them. Decide that spelling once, deliberately, at the application boundary, and write it down. That single act is the difference between a portable instrumentation layer and one that turns a platform migration into a rewrite.

Second, and worth saying plainly to anyone quoting a blog post: the conventional vocabulary is still moving. Every span, metric and attribute in it carries development status, the repository has no tags and no releases, and the key that most 2024 material uses for the provider name has already been deprecated. Teach it as a moving target and check the source rather than the documentation, which lags.

Part 3 · the decision

What ports, what you rebuild, and what you store 11 min live

Frame the buy-versus-build question as a ledger rather than a preference, and it stops being an argument about taste. Two columns, and one decision underneath them that costs more than either.

The buy-versus-build question, answered as a portability ledger Ports with you if the names are conventional Your instrumentation, provided the attribute keys are conventional ones rather than yours. The exporter config. One endpoint, one header. The traces already in flight, unchanged. Price of portability: naming discipline. Does not port budget to rebuild all of it Your dashboards. Your saved queries. Your alert rules and every threshold in them. Runbook links, and the team's muscle memory. Anything built on a vendor-specific field. Price of a switch: rebuilding all of it. The decision inside the tooling decision: do you store the prompts? Metadata-rich, content-poor Model names, token counts, durations, status, retrieved doc IDs and scores. 100% of traffic. Cheap and defensible. Cannot always explain WHY. Content, sampled Full prompts and outputs on a small, consented, short-TTL sample, in a separate store with tighter access and an audit log. The debug lever. Content, all of it, forever The default nobody chose. The trace store becomes a copy of every prompt your users typed, in third-party SaaS, with broad internal read access. A vendor's own two published positions are exactly this split, and both are true at once They monitor "agent decision patterns and interaction structures ... all without monitoring the contents of individual conversations." And their own postmortem admits privacy controls "prevent engineers from examining the problematic interactions needed to identify or reproduce bugs." Not a contradiction. A cost. The resolution is not a compromise, it is a split: metadata at 100%, content on a brief sample.
🔍 Click to zoom - the portability ledger, three content postures, and the honest cost of the safe one
LiveRetention cost, and why the invoice arrives before the value does5 min▶

Retention is the line item that surprises people, because content capture does not raise your bill by a percentage. It raises it by a multiple, and it does so silently, since nobody reviews a telemetry volume the way they review a model bill.

The builder track puts a modelled number on this: on the course's constructed incident, turning on full content capture takes retention from roughly 4.6 GB to 48.1 GB for the same traffic, a factor of about ten, and the diagnosis score does not improve at all because the message content was never the problem. That arithmetic is modelled rather than measured, and it is labelled as modelled on screen, so substitute your own storage price before quoting it. The shape of the finding is the durable part: content is most of the bytes and rarely the answer.

Question to answer before you signWhy it decides the contract
What is the billing unit, and is it spans, events, ingested bytes or retained bytes?Datadog LLM Observability states billing is based on the volume of spans you send. Dollar pricing for the other platforms could not be verified and has to come from the vendor in writing
Does content capture change the unit, or only the volume?If you are billed on spans, a tenfold content increase may cost nothing extra to ingest and everything to retain. Those are two different lines
What is the default retention, and what does a longer tier cost?An unbounded retention default is a compliance problem by construction, not merely a cost problem
Can you delete one individual's spans on request?If you cannot, you cannot service an erasure request, and the trace store becomes the reason a data subject request fails
Who inside your company can read a prompt today?Trace stores usually have broad internal read access. They deserve the controls you give a production database, and most do not have them
Where does the data physically go?Content reaching a vendor endpoint is a transfer and a processor relationship. Scrub before ingestion, because after ingestion deletion is a request rather than a fact
The default to set on day one Metadata-rich and content-poor, with content capture as a deliberate, scoped, time-boxed exception on a small sample. State the cost of that default out loud rather than pretending it is free: with content off you can localise a failure to a step but you often cannot explain why the model did what it did. Most diagnostic power survives redaction because most diagnostic power is metadata, and the part that does not survive is the part you sample for.
Decision 1 of 2

Pick your lane before you look at a single demo ◐ 12 min · whole group

Run this in the room with nobody's laptop open. Every question here is answerable from what your organisation already is, and answering them first turns a three-month bake-off into a two-week one.

Who reads the traces? If the answer is AI engineers debugging agent behaviour, lane one earns its keep because the native agent view is the product. If the answer is an existing SRE rota that already lives in one pane of glass, lane two is worth serious consideration even though you will build the views yourself.

Do you already have an APM contract? Say the renewal number out loud. A second observability vendor is a second procurement cycle, a second access review and a second place to look during an incident, and that overhead is real even when the licence is cheap.

Does anything about your data force self-hosting? If yes, the shortlist collapses to the self-hostable options, and you must read the actual licence: Phoenix is Elastic License 2.0 and Langfuse is MIT except its enterprise directories. Neither is plain permissive open source across the whole repository, and "it is open source" is not a statement your legal team can act on.

Is anyone proposing lane three? That is a legitimate choice, and the honest way to make it is to say out loud that your producer code becomes the vendor's SDK, since there is no documented OTLP path for their LLM Observability product specifically. Absence of a documented path is not proof that none exists, so ask them directly and get the answer in writing.

Now decide the attribute names, in the room. Cost and user identity do not exist in the conventional vocabulary, so somebody will invent a spelling for them. Pick it here, apply it at the application boundary, and write it into whatever document your team actually reads. This is the cheapest lock-in insurance available to you and it costs one meeting.

★ The output that makes this real

A single page: the chosen lane and the reason, the two or three candidates inside it, the self-host requirement stated as yes or no, and the agreed spelling of your non-conventional attributes. Then the list of questions you are sending the vendor in writing, which should include every item on this page's unverified list. A shortlist without that list attached is a shortlist built partly on guesses.

Decision 2 of 2

Make the content decision explicitly, before a library makes it ◐ 10 min · in pairs

This is the decision that gets made by a default if you do not make it on purpose. It is also the only decision in this session with a regulator on the other side of it, so it deserves a name, an owner and a date.

Find out what you are capturing right now. Not what the policy says. Open a real trace from a real user in whatever tool you already run and see whether the prompt text is in it. Half the rooms that do this exercise discover the answer is yes, because they installed a library whose default is on.

Write the default down as a sentence. "Metadata on 100% of traffic. Content on a consented sample of X%, in a separate store, retained for Y days, readable by this named group, with access logged." A default that is not written is not a default, it is whatever the library shipped.

Check the fields people forget. Redacting the prompt is not enough. Tool call arguments and tool results are flagged as sensitive for good reason, and the tool arguments are frequently where the account number is. Retrieved document text is the other one.

Allow-list rather than deny-list. Pattern-matching for personal data fails on the case nobody imagined, which for free text is most cases. Name the fields you keep, and drop everything else. Then scrub before ingestion, because once content reaches a vendor endpoint you have made a transfer.

Name the person who can authorise a content capture window. During a real incident somebody will ask for prompts, and they will be right to ask. Decide now who can say yes, for how long, and what gets deleted afterwards. That is the difference between a scoped exception and a permanent policy change made at 2am.

Two honesty notes for this exercise First, minimisation and storage limitation are the obligations that bite here, which means sampling and redaction are your compliance mechanism and not merely a cost control. Second, if somebody in the room cites Singapore's AI advisory guidelines as authority for prompt-trace retention, be careful: those guidelines are not legally binding and multiple independent legal summaries state they do not cover generative AI at all, which makes that a secondary claim rather than a rule. The operative obligations are the ones the underlying act already imposes on consent, purpose, notification, protection and retention.
Homework

Try it yourself - this week ◐ 45-60 min total

Source material

Official sources covered

Every platform fact on this page was read from vendor documentation and repositories rather than from summaries, and the things that could not be read are listed as unverified rather than filled in. This page covers:

✓The three-way market split: OTLP-native LLM-specific, OTLP-native general APM, and proprietary-SDKPart 1 · primary [P] · ingest mechanism read per platform
✓Langfuse ingest: OTLP-native, HTTP JSON and protobuf, no gRPC, Basic auth, and it documents reading three attribute dialectsPart 1 and Part 2 · primary [P]
✓Licence facts: Phoenix is Elastic License 2.0, Langfuse is MIT except its enterprise directories, the W&B Weave repo is Apache-2.0Part 1 · primary [P] · neither self-hosted option is plain permissive OSS end to end
✓Datadog LLM Observability is proprietary-SDK with no documented OTLP path for that product, and billing is based on the volume of spans you sendPart 1 · primary [P] · absence of a documented path is not proof none exists
✓Interop happens at the backend: every OpenInference trace is a valid OTLP trace, and the platform normalises the dialect that arrivesPart 2 · primary [P] · this is why attribute names are the portable asset
✓The inverted default: OTel GenAI content capture is opt-in and off, quoted verbatim, while OpenInference captures content by default and hides it with explicit flagsPart 2 · primary [P] · redaction writes a literal placeholder value
✓Vocabulary gaps: the conventional GenAI namespace has no cost fields and no user id, while OpenInference has bothPart 2 · primary [P] · which is where teams invent non-portable names
✓The two published vendor positions on content: monitoring decision patterns without conversation contents, and privacy controls preventing engineers from examining the interactions needed to reproduce bugsPart 3 · primary [P] · both quoted, both true, the split is the resolution
◐Sensitive-field list including tool call arguments and results, and the allow-list-over-deny-list guidanceNamed here · the redaction mechanics are builder session b10
◐Retention arithmetic of roughly ten times on full content captureModelled, not measured · labelled as modelled in b5 and b10. Substitute your own storage price
◐Singapore's AI advisory guidelines as authority for prompt-trace retentionSecondary [S] and explicitly not relied on · the guidelines are not legally binding and independent legal summaries state they do not cover generative AI
◐Feature-by-feature product comparison and vendor rankingsNot covered by design · product surfaces move faster than this page can. The lane, the licence and the ingest path are the durable facts
Stated explicitly: what could NOT be verified

Nothing below was filled in from memory, and none of it should be quoted in your business case without a written answer from the vendor.

  • Dollar pricing for every platform except Datadog's basis, which is documented as the volume of spans you send. No price per span, per seat or per gigabyte could be verified for any candidate on this page.
  • Braintrust self-hosting. Whether a self-hosted deployment is offered, and on what terms, could not be confirmed.
  • Honeycomb's LLM feature set and its pricing. It ingests OTLP generically, which is why it sits in lane two, but LLM-specific capability could not be confirmed either way.
  • Grafana Tempo's licence string. Tempo is open source; the exact licence was not read from the repository, so read it yourself before your legal review.
  • Whether an OTLP ingestion path exists for Datadog LLM Observability specifically. None is documented. That is a documentation absence, not a proven technical absence, and it is a question for their sales engineer.
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · Seven of the eight platforms in Part 1 ingest OTLP. So where does lock-in actually live?

Everybody speaks the same transport, so the transport is not the differentiator. Interop is resolved at the backend, where the platform normalises whichever dialect arrives, which is why one vendor documents reading three separate vocabularies. What that leaves you is a clean split: the instrumentation is portable if the keys are conventional, and the dashboards, alerts, saved queries and team habits are not portable at all. Budget for rebuilding the second column and spend your discipline on the first.

2 · An engineer picks an instrumentation library on a Friday afternoon. What decision have they just made on the company's behalf?

This is the governance decision disguised as a tooling decision. The conventional GenAI spec says instrumentations should not capture message content by default and should offer an opt-in. OpenInference does the reverse: content is captured unless you set the hide flags. Same valid OTLP on the wire, opposite consequences for what sits in your trace store on day one, and nobody in the approval chain was ever shown a choice. Which is why the answer to "are we capturing prompts" has to come from opening a real trace, not from reading the policy.

3 · A vendor publishes both that they monitor agent decision patterns without monitoring conversation contents, and that their privacy controls prevent engineers examining the interactions needed to reproduce bugs. How should you read that pair?

Both statements are true and they point in opposite directions, which is exactly what a real trade-off looks like when somebody is being straight about it. Poor coverage hides failures; rich content capture creates legal and security exposure. Splitting the difference by capturing a bit of content everywhere gets you the exposure without the diagnostic power. Splitting the decision instead - full metadata always, content rarely and briefly and under access control - is the only arrangement where both halves of that published pair can be honoured.

Leader session 6 cheat sheet · pin this

Three lanes, not twoOTLP-native LLM-specific. OTLP-native general APM. Proprietary SDK. Compare candidates inside a lane, never across lanes.
Lock-in is a dialect problemEverybody takes OTLP. Conventional attribute names port. Names you invented do not.
Interop is at the backendThe platform normalises whichever dialect arrives. One vendor documents reading three vocabularies at once.
The licence, honestlyPhoenix is Elastic License 2.0. Langfuse is MIT except its enterprise directories. Neither is plain permissive OSS end to end.
The inverted defaultConventional GenAI content capture is opt-in and off. OpenInference is on by default. A library choice, not a policy choice, until you make it one.
Portable versus rentedPortable: instrumentation and exporter config. Rented: dashboards, saved queries, alert rules, muscle memory.
The content postureMetadata at 100%, content on a small consented short-TTL sample in a separate store. Scrub before ingestion, never after.
Ask, do not assumeUnverified: dollar pricing beyond Datadog's per-span basis, Braintrust self-hosting, Honeycomb's LLM features, Tempo's licence string.
Closing the leader track

Six sessions, and the one sentence underneath all of them

You started with a green dashboard that held through a real incident, and you finish with a purchase decision. The thread connecting those two things is simple enough to say in a corridor: a system can only report what somebody decided it should report, and every session in this track was a version of that decision.

SessionThe decision it asked you to make
a1 · The trace is the receiptAccept that "it works in evals" and "it worked at 09:14" are different claims, and that only one of them has a receipt
a2 · What to instrumentChoose coverage before you know what you are looking for, because the 62% you cannot see is where incidents live
a3 · Dashboards that answerBuild views around the three questions rather than around available metrics, and stop expecting an aggregate to reveal an intermittent fault
a4 · What AI actually costs youChange the denominator to cost per successful task, and accept that reliability work is cost work
a5 · On-call for AIWrite the alerting configuration policy, page on three burn-rate rules, and add the two alerts that see silent failure
a6 · Buy, build, or stay OTel-nativePick the lane, spell the attributes conventionally, and make the content decision before a library default makes it for you
★ If you only carry one thing out of the track Your instrumentation is the asset and everything else is rented. The platform will change, the vendor list will change, the attribute registry is still moving and has no release to pin. What survives all of that is a team that decided, deliberately and in writing, what its systems report about themselves. That decision is not a technical artefact, which is why it was yours to make rather than an engineer's.
Where to go next, and who should go The builder track is the same material with your hands on it: ten sessions that start from the six words this whole course runs on and end with privacy and retention proved out on a real trace. Send the engineers who will own the instrumentation, and read b1 yourself even if you read nothing else, because it is forty-five minutes and it is the vocabulary every conversation in this area assumes you already have. If your team is only going to do one thing this quarter, make it session b5, where a badly instrumented incident gets solved lever by lever and the coverage argument stops being abstract.