Observability Pipeline as a Platform in OpenTelemetry
Learn how the OpenTelemetry Collector, OTLP and a product mindset combine into one shared, governed, scalable service that moves traces, metrics and logs from every application to every backend your organization needs.
Picture a large city with no postal service. Every household that wants to send a letter must walk to the recipient’s door, learn that person’s address format, and carry the envelope by hand. Some people would stop sending letters. Others would invent their own rules. Within a year nobody could say which letters were delivered, which were lost, and how much the whole mess cost. Now picture the same city with a real postal service: standard envelopes, sorting centres, routes, tracking numbers and a single team that keeps the whole thing running. The letters are the same, but the experience is completely different.
Modern software systems face exactly this problem with telemetry. Telemetry is the stream of signals that applications emit about themselves: records of requests, measurements of health, and lines of text describing events. When a company runs hundreds of services, those signals must travel somewhere useful. An observability pipeline as a platform is the postal service for that data, and OpenTelemetry supplies most of the standard parts needed to build it. This tutorial explains the idea from the ground up, then goes deep into how it works, how it scales, how it is governed and where it goes wrong.
1Why Observability Needs a Pipeline
Before any tool is chosen, it helps to see the pain that a pipeline is designed to remove.
What observability actually means
Observability is the ability to understand what is happening inside a running system by looking at the data it produces. If a customer says the checkout page is slow, observability lets an engineer find out which service, which database call and which deployment caused the slowdown, without guessing and without logging into individual machines. The data that makes this possible is called telemetry, and it is usually grouped into signals: traces, metrics and logs.
Observability exists because modern systems are made of many small services that call each other over a network. One user click may touch twenty components. No single person can hold the whole picture in their head, so the system itself must tell its story in a structured way.
Think of a hospital. A doctor does not open up a patient to see what is wrong. Instead the patient is connected to monitors that show heart rate, temperature and oxygen, and charts that record what happened over time. Telemetry is the set of monitors and charts for a software system, and the pipeline is the wiring that carries every monitor reading to the nurses’ station.
The world before shared pipelines
In the early days, each team wired its own telemetry. One team used a vendor agent for metrics. Another wrote logs to files and shipped them with a custom script. A third added a tracing library that only worked with one backend. Every application ended up talking directly to one or more backends, which are the systems that store and display telemetry.
This direct wiring seems simple at first, but it creates a tangle. If the company decides to change its metrics vendor, every application must be changed, rebuilt and redeployed. If a backend slows down, applications may block or drop data. If a developer accidentally logs a customer’s email address, it is already sitting in a third-party system before anyone notices. If one service suddenly emits ten times more data, the bill grows, and nobody knows whom to ask.
Vendor lock-in
Telemetry code is welded to one backend, so switching or adding a backend means touching every application.
Inconsistent data
Each team names things differently, so one service is called “payments”, “payment-svc” and “Payments-API” in three places.
Runaway cost
Nothing filters or samples data in the middle, so everything is stored, and the bill grows with traffic instead of with value.
Privacy leaks
Sensitive values travel straight from application to vendor with no central place to remove or mask them.
Fragile delivery
When a backend is slow or down, applications must cope alone, and data is lost or latency is added to user requests.
No ownership
Telemetry is everyone’s job and therefore nobody’s job, so quality and reliability slowly decay.
Many beginners think the hard part of observability is choosing a dashboard tool. In practice the hard part is the movement, shaping and governance of the data before it ever reaches a dashboard. That middle layer is the pipeline.
2OpenTelemetry Foundations You Need First
A short, plain tour of the building blocks that the platform will later organize.
What OpenTelemetry is
OpenTelemetry, often shortened to OTel, is an open-source, vendor-neutral standard for producing, collecting and exporting telemetry. It is hosted by the Cloud Native Computing Foundation, the same foundation that hosts Kubernetes. It provides specifications, language libraries, a wire protocol and a standalone data-handling program called the Collector. It deliberately does not provide a storage backend or a dashboard. Its job is to get good data out of applications and to the place you choose, in a format everyone agrees on.
OpenTelemetry is like the standard shipping container. Before containers, every port handled odd-shaped crates by hand. After containers, any ship, crane and truck could move any cargo. OTel does not own the ships or the warehouses; it standardizes the box so the whole logistics chain can cooperate.
The signals
Traces
The story of one request as it crosses services, made of timed steps called spans that are linked into a tree.
Metrics
Numbers measured over time, such as requests per second, memory used or queue depth, cheap to store and fast to query.
Logs
Timestamped text or structured records describing something that happened, which OTel can link to a trace.
Profiles
Continuous snapshots of where code spends CPU and memory. This signal is newer and still maturing, so check the current project status before depending on it.
The API, the SDK and instrumentation
Inside an application, OpenTelemetry has two layers. The API is a thin set of calls that code uses to say “a request started” or “record this number”. The SDK is the implementation that decides what to do with those calls: how to sample, how to batch, and where to send the result. Splitting them lets library authors add instrumentation using only the API, without forcing any particular behavior on the people who use their libraries.
Instrumentation is the act of adding those calls. It can be automatic, where an agent or library hooks into common frameworks without code changes, or manual, where developers add spans and measurements around business logic. Most real systems mix both.
Resources, attributes and semantic conventions
Every piece of telemetry carries attributes, which are key and value pairs such as the HTTP method or the database name. A special group called the resource describes who produced the data: the service name, the version, the cloud region, the Kubernetes pod. Semantic conventions are the shared naming rules that say which attribute names mean what. They are the reason that two different teams, using two different languages, still produce data that a platform can understand uniformly.
A platform can only enforce quality if the data has a common shape. Semantic conventions and resource attributes are the common shape. Without them, every routing rule and every cost report becomes a pile of special cases.
OTLP, the common language
OTLP, the OpenTelemetry Protocol, is the wire format used to move all signals between SDKs, Collectors and compatible backends. It can travel over gRPC or over HTTP. Because most observability products now accept OTLP directly, it has become the default handshake of the ecosystem, and it is the glue that makes a pipeline possible.
The Collector in one paragraph
The OpenTelemetry Collector is a standalone program that receives telemetry, optionally changes it, and sends it onward. It is written in Go, it runs as a single binary or container, and it is configured by a text file that declares what to receive, what to do and where to send. It is the engine room of everything that follows in this tutorial.
flowchart LR
A["Applications with OTel SDK"] -->|"OTLP"| B["Collector"]
B --> C["Metrics backend"]
B --> D["Trace backend"]
B --> E["Log backend"]
B --> F["Archive storage"]
3What “Pipeline as a Platform” Really Means
The phrase is an architectural idea, not a product name, so it is worth defining carefully.
Two ideas joined together
An observability pipeline is the path telemetry takes from where it is produced to where it is stored, including every step of receiving, enriching, filtering, sampling, routing and exporting along the way. A platform, in the engineering sense, is a shared internal service that many teams use through a simple, self-service interface, run by a dedicated team that treats the service like a product with users, documentation, reliability targets and a roadmap.
Put together, an observability pipeline as a platform means one centrally operated, OpenTelemetry-based data path that every application team plugs into with minimal effort, while a small platform team owns its quality, cost, security and uptime. It is important to be honest about vocabulary here: OpenTelemetry does not ship a thing called “the Observability Platform”. The project provides the standard parts, and organizations assemble them into a platform by adding operating practices around them.
Compare a pile of plumbing parts with a city water system. Pipes, valves and pumps are the Collector and its components. The water system is those parts plus a utility company: maps, maintenance crews, pressure rules, billing and a phone number to call when a tap runs dry. The platform is the utility, not the parts.
The four promises of a good platform
Easy to join
A new service needs only a service name and one endpoint address. Everything else, from enrichment to routing, is handled for it.
Safe by default
Sensitive data is masked, traffic is encrypted and tenants cannot see each other’s data without the platform team doing it on purpose.
Predictable cost and reliability
Volume is shaped by rules, back-pressure is handled gracefully, and the pipeline has its own targets and alerts.
Free to change
Backends can be added, replaced or run side by side without any application redeploy, because applications only know the pipeline.
Platform layers
It helps to see the platform as layers. At the bottom are the producers, which are applications and infrastructure carrying the SDK. Above them is the collection layer, made of agents close to the workloads. Above that is the processing layer, made of central gateways where heavier decisions happen. At the top are the destinations. Wrapped around all of these is the control layer: configuration management, access rules, cost reporting and self-monitoring.
flowchart TB
subgraph Producers
P1["Services with SDK"]
P2["Kubernetes and hosts"]
P3["Third-party systems"]
end
subgraph Collection
A1["Agent Collectors"]
end
subgraph Processing
G1["Gateway Collectors"]
end
subgraph Destinations
D1["Metrics store"]
D2["Trace store"]
D3["Log store"]
D4["Cold archive"]
end
subgraph Control
C1["Config as code"]
C2["Access and tenancy rules"]
C3["Cost and quality reports"]
C4["Pipeline self-monitoring"]
end
P1 --> A1
P2 --> A1
P3 --> G1
A1 --> G1
G1 --> D1
G1 --> D2
G1 --> D3
G1 --> D4
Control -.-> A1
Control -.-> G1
Platform versus plumbing, in one sentence
If a team can only use the pipeline by reading Collector internals and editing shared configuration by hand, you have plumbing. If a team can onboard in an afternoon, see its own data quality and cost, and trust someone else to keep the pipe healthy, you have a platform.
4Anatomy of the Collector Pipeline
The Collector is built from a small number of component types that snap together like building bricks.
The five component types
Receivers
The front door. A receiver accepts data from outside, whether pushed over OTLP or pulled by scraping, such as collecting host metrics or reading log files.
Processors
The workshop. Processors inspect and change data in transit: batching, limiting memory, adding attributes, filtering, transforming and sampling.
Exporters
The loading dock. An exporter sends data to a destination, such as another Collector, a vendor, a message queue or a metrics store.
Connectors
A bridge between two pipelines. A connector acts as an exporter at the end of one pipeline and a receiver at the start of another, so data can be counted, converted or routed.
Extensions
Helpers that are not on the data path: health checks, authentication, diagnostics and persistent storage for queues.
Imagine a package sorting hub. Trucks arrive at the receiving dock (receivers). Workers weigh, label, repack and inspect parcels on the conveyor (processors). Outbound trucks leave from the shipping dock (exporters). Sometimes a parcel is copied into a different conveyor for customs paperwork (connectors). The manager’s office, with its phone, cameras and keys, supports everything without touching parcels (extensions).
Pipelines are declared per signal
The configuration has a section where pipelines are defined. Each pipeline belongs to exactly one signal type, so there is a traces pipeline, a metrics pipeline and a logs pipeline, and a Collector may run several of each. A pipeline lists which receivers feed it, which processors run and in what order, and which exporters it sends to. A component can be defined once and reused across several pipelines.
Order matters. Processors run one after another in the order listed, so a memory protection step normally comes first, enrichment and filtering come in the middle, and batching comes last, right before data leaves.
The fan-in and fan-out behavior
If two receivers feed one pipeline, their data is merged into one stream. If one pipeline has two exporters, every item is copied to both. This simple rule is what makes dual-writing to two backends during a migration almost trivial, and it is also what makes careless configuration expensive, because every extra exporter multiplies the outgoing traffic.
flowchart LR
R1["OTLP receiver"] --> M["Memory limiter"]
R2["Host metrics receiver"] --> M
M --> E["Enrichment and redaction"]
E --> F["Filtering"]
F --> B["Batch"]
B --> X1["Exporter to primary backend"]
B --> X2["Exporter to archive"]
B --> CN["Connector to metrics pipeline"]
Useful processors, explained simply
| Processor idea | What it does | Everyday comparison |
|---|---|---|
| Memory limiter | Refuses new data when the Collector is close to its memory budget, protecting it from crashing | A bouncer who stops letting people in when the club is full |
| Batch | Groups many small items into fewer larger sends, improving efficiency | Waiting to fill a delivery van instead of sending one parcel per trip |
| Resource and attribute editing | Adds, renames, hashes or removes attributes | Stamping a standard address label on every parcel |
| Resource detection | Discovers facts about the host or cloud and attaches them | A scanner that reads the pallet’s origin and writes it on the label |
| Kubernetes attributes | Looks up pod, namespace and owner information and adds it | Looking up which department a parcel belongs to |
| Filter | Drops data that matches a rule | Throwing away junk mail before it enters the house |
| Transform | Rewrites data using a small expression language called OTTL | A clerk who corrects forms according to a rulebook |
| Sampling processors | Keep only a chosen fraction or a chosen kind of traces | A quality inspector checking one box in ten, plus every box that looks damaged |
The Collector comes in a core build with a small set of stable components and a contrib build with a very large community collection. Organizations can also assemble a custom build that contains only the components they use, using the project’s builder tool. Fewer components means a smaller attack surface and a smaller image, which platform teams often value.
5Internal Working and Data Lifecycle
Knowing what happens to a single item inside the Collector explains almost every tuning decision later.
The journey of one batch of data
Arrival and decoding
A receiver accepts bytes from the network or reads them from a source, and converts them into the Collector’s internal, protocol-independent representation. From this moment the data no longer cares which format it arrived in.
Hand-off to the pipeline
The receiver passes the data to the first processor. Within a single pipeline this is a direct, in-memory call, which is why the Collector can be fast.
Processing in order
Each processor transforms or inspects the data and passes it along. A processor may also drop the data entirely, or return an error that travels back toward the sender.
Queueing at the exporter
Before sending, exporters usually place data into a sending queue so that a slow destination does not stall the whole pipeline. Retries with waiting periods are applied when a send fails.
Delivery or drop
If the destination accepts the data, the item is done. If retries are exhausted or the queue is full, the data is dropped and an internal counter is incremented, which is a signal the platform team must watch.
Back-pressure, the pressure valve
Back-pressure is what happens when a downstream step cannot keep up and the slowness travels backward toward the source. In a well-configured Collector, the memory limiter notices high memory use and starts refusing data, and the refusal is returned to senders as a retryable error. Well-behaved SDKs and upstream Collectors then wait and try again rather than flooding the system.
Think of a kitchen pass in a busy restaurant. When the cooks fall behind, the head chef tells waiters to stop taking new orders for a few minutes. The line outside grows, but the kitchen does not collapse. A missing memory limiter is a kitchen with no head chef: orders keep arriving until the stove catches fire.
Queues: memory and disk
By default, the sending queue lives in memory, which is fast but is lost if the process dies. A persistent queue stores waiting data on disk through a storage extension, so that a restart does not lose what was in flight. The trade-off is slower throughput and the need for a reliable volume. Choosing between the two is a decision about how much loss the business can tolerate for a given signal.
sequenceDiagram
participant App as Application SDK
participant Agent as Agent Collector
participant GW as Gateway Collector
participant BE as Backend
App->>Agent: Send batch over OTLP
Agent->>Agent: Memory check, process, batch
Agent->>GW: Export batch
GW->>BE: Export batch
BE-->>GW: Slow or unavailable
GW->>GW: Hold in queue and retry
GW-->>Agent: Refuse when full, retryable
Agent->>Agent: Queue and retry
Agent-->>App: Refuse when full, retryable
BE-->>GW: Recovered
GW->>BE: Drain queue
Teams often make queues enormous to avoid ever dropping data. A giant queue only hides the problem and turns a short outage into a long delay and a very large memory or disk bill. Size queues to the outage length you can truly afford to ride out, and alert when they start filling.
Logs are a special case
Traces and metrics usually arrive pushed by an SDK. Logs often start as plain files written by an application or container runtime. The Collector can read those files, parse them into structured records, and attach the same resource attributes used by traces and metrics. This is one of the most valuable platform features, because it lets old applications participate in the common data model without being rewritten.
6Deployment Topologies
Where you place Collectors decides your reliability, your cost and how much each team must know.
The four common shapes
Shape 1 — No Collector, SDK sends straight to the backend
This is the simplest possible setup and fine for a demo or a tiny system. The cost is that every application owns retry logic, credentials and backend choice, which is exactly the tangle a platform tries to remove.
Shape 2 — Agent only
A Collector runs next to every workload, either as a sidecar inside the pod or as one instance per node. Applications send to the local agent over a fast local connection. Agents handle batching, local enrichment and host-level data, and then export directly to backends.
Shape 3 — Gateway only
A central, scalable pool of Collectors sits behind a load balancer. Applications send to it directly. This gives one place for policy, but it means every application must reach the gateway across the network, and no local host data is gathered.
Shape 4 — Agent plus gateway, the platform default
Agents run close to workloads for cheap, local jobs. They forward to gateways, which perform central jobs such as tail sampling, routing, tenant rules and fan-out to multiple backends. Most organizations that call their pipeline a platform end up here.
Agent plus gateway is like a neighborhood post box plus a regional sorting centre. The post box is close and easy, so people use it. The sorting centre has the heavy machinery and the full picture of where everything must go.
flowchart LR
subgraph Node1["Kubernetes node A"]
S1["Service 1"] --> AG1["Agent"]
S2["Service 2"] --> AG1
end
subgraph Node2["Kubernetes node B"]
S3["Service 3"] --> AG2["Agent"]
end
AG1 --> LB["Load balancer"]
AG2 --> LB
LB --> GW1["Gateway 1"]
LB --> GW2["Gateway 2"]
LB --> GW3["Gateway 3"]
GW1 --> V1["Vendor backend"]
GW2 --> V2["Open-source stores"]
GW3 --> V3["Archive"]
Agent flavors on Kubernetes
On Kubernetes, an agent can run as a sidecar, one extra container per pod, or as a node agent that runs once per machine. Sidecars give strong isolation and per-application tuning but multiply resource use. Node agents are cheaper and are the natural place to collect node metrics and container logs. Many platforms use node agents by default and allow sidecars for special workloads.
Comparing the shapes
| Shape | Strength | Weakness | Best fit |
|---|---|---|---|
| No Collector | Fewest moving parts | Every app owns delivery and credentials | Experiments and small systems |
| Agent only | Local buffering, host data, simple scaling | Policy is spread across many agents | Single-backend, single-team setups |
| Gateway only | Central policy | Network dependence, no host-level data | Serverless or edge workloads |
| Agent plus gateway | Best balance of locality and control | More components to operate | Shared platforms across many teams |
Tiers beyond two
Very large organizations add more tiers. A regional gateway may forward to a global one, or a message queue may sit between tiers to absorb bursts. Each tier adds resilience and control, but also adds latency and operational effort. A good rule is to add a tier only when a clear problem demands it and to be able to name that problem in one sentence.
Whatever shape you choose, keep applications unaware of it. Apps should send to one stable address. If you ever re-shape the tiers behind that address, no application should need to change.
7Core Platform Capabilities
A platform earns its name by doing useful jobs for every team, once, in the middle of the road.
Capability 1: Enrichment and normalization
Enrichment means adding missing context to data as it passes through. A trace span from a small service might only say “database call took 300 milliseconds”. After enrichment it also says which Kubernetes namespace, which cloud region, which team owns the service and which version was running. Normalization means making equivalent things look identical, for example turning three spellings of an environment name into one agreed value.
Doing this in the pipeline rather than in each application is powerful because the platform team can fix a naming problem in one place and every service benefits on the next config rollout, with no code change by anyone.
Enrichment is like a mailroom clerk who stamps every incoming envelope with the date, the floor and the department. The sender only had to write a name; the building adds everything else that helps the envelope find its way and be filed later.
Capability 2: Routing
Routing sends different data to different places. Production traces may go to a premium trace store, while development traces go to a cheaper one. Security-relevant logs may be copied to a compliance archive, while debug logs are kept for only a few days. A routing connector inspects an attribute, such as the tenant or environment, and picks the pipeline that should handle the item.
Routing also enables safe migrations. During a move from one vendor to another, the pipeline can send everything to both for a trial period, compare the results, and then switch off the old one. Applications never notice.
Capability 3: Filtering and volume shaping
Some telemetry is noise. Health-check requests, which orchestrators fire every few seconds, may account for a large fraction of all spans while telling nobody anything. Filtering drops such items according to simple rules. Volume shaping goes further and reduces detail, for example by aggregating a high-detail metric into fewer series, or dropping a verbose log level in production.
Capability 4: Redaction and privacy
Applications sometimes put sensitive information in telemetry by accident: an email address in a URL, a card fragment in a log line, a token in a header attribute. A redaction step in the pipeline can mask, hash or delete values that match patterns or that sit under known attribute names. This acts as a safety net, and it is much cheaper to maintain a single net than to audit every codebase.
Pipeline redaction is a safety net, not a licence to be careless. Pattern matching misses new formats, and data that is already stored in an application’s own logs or in memory is unaffected. Pair pipeline rules with developer guidance and with periodic sampling of real data to confirm the rules work.
Capability 5: Derived signals
Connectors can turn one kind of signal into another. A well-known example converts spans into metrics, producing request counts, error counts and latency distributions for every service and operation automatically. This is valuable because metrics are cheap to store for a long time, while detailed traces are expensive. A platform can therefore keep a complete statistical picture even when it only stores a small fraction of the individual traces.
Another common use is counting. A connector can count log lines or spans that match a rule and emit the count as a metric, which can then drive alerts without anyone storing every line.
Capability 6: Format bridging
Not every system speaks OTLP. Older applications may expose metrics in the Prometheus format, send logs through syslog, or emit traces in older open formats. Receivers for these formats let the pipeline accept them all and convert them into the common internal representation. On the way out, exporters can speak whatever the destination requires. The pipeline thus becomes a translator that protects the organization from format churn.
One fix, everywhere
A naming or privacy correction is made once in the pipeline instead of in hundreds of repositories.
Backend freedom
Routing and format bridging mean destinations can change without touching application code.
Cheaper history
Derived metrics keep long-term trends alive while expensive raw data is trimmed.
Safer data
Central masking catches mistakes before data lands in third-party systems.
flowchart LR
IN["Incoming traces"] --> ENR["Enrich and normalize"]
ENR --> RED["Redact sensitive values"]
RED --> RT{"Route by tenant and environment"}
RT -->|"Production"| P1["Premium trace store"]
RT -->|"Development"| P2["Low-cost store"]
RT -->|"Security tagged"| P3["Compliance archive"]
RED --> SM["Span to metrics connector"]
SM --> MET["Long-term metrics store"]
8Sampling Strategy: Keeping the Right Data
Traces are the most expensive signal, so deciding which ones to keep is one of the platform’s biggest levers.
Why sample at all
A busy system can generate millions of traces per minute. Storing all of them is usually unaffordable, and most of them are boring successful requests that look identical. Sampling is the practice of keeping only a subset while preserving the ability to answer important questions. The art is keeping the interesting traces, such as errors and slow requests, while discarding most of the ordinary ones.
A factory cannot inspect every screw, so it checks a few at random. But if a screw looks cracked, it is always pulled out and examined. Good sampling does both: a random sprinkle for baseline statistics and a guaranteed catch for anything unusual.
Head sampling
Head sampling makes the keep-or-drop decision at the very start of a trace, before anything is known about how the request will turn out. It is cheap and simple, because dropped traces are never generated or sent. Its weakness is that it is blind. It cannot know that the request that just started will later fail or take ten seconds, so it may throw away exactly the traces you wanted. Head sampling usually happens in the SDK, and the decision is passed along to downstream services so that a trace is kept or dropped as a whole.
Tail sampling
Tail sampling waits until a trace is finished, or nearly finished, and then decides using everything that happened. It can keep all traces with errors, all traces slower than a threshold, all traces touching a sensitive service, and a small random share of the rest. This is far more useful, but it has a cost: the Collector must hold every span of every in-progress trace in memory until the decision time, and all spans of one trace must arrive at the same Collector instance.
| Question | Head sampling | Tail sampling |
|---|---|---|
| When is the decision made? | At the start of the trace | After the trace is mostly complete |
| Can it keep all errors? | No, it cannot know yet | Yes |
| Resource cost | Very low | High memory and coordination |
| Where it usually runs | In the SDK or an agent | In a gateway tier |
| Main risk | Missing rare, important traces | Memory pressure and incomplete traces if routing is wrong |
The trace affinity problem
Imagine a trace whose spans are produced by five different services, which send their spans to five different agents, which forward them to a pool of three gateways. If the spans land on different gateways, no single gateway sees the whole trace, and any tail decision made on a partial view will be wrong. The solution is trace-aware load balancing: a first tier of Collectors uses an exporter that hashes the trace identifier and sends every span with that identifier to the same second-tier Collector. The second tier then runs the tail sampling policies with a complete view.
flowchart LR
A1["Agent 1"] --> LB1["Load-balancing tier"]
A2["Agent 2"] --> LB1
A3["Agent 3"] --> LB1
LB1 -->|"Trace IDs 0 to 33 percent"| T1["Tail sampler A"]
LB1 -->|"Trace IDs 34 to 66 percent"| T2["Tail sampler B"]
LB1 -->|"Trace IDs 67 to 100 percent"| T3["Tail sampler C"]
T1 --> S["Trace store"]
T2 --> S
T3 --> S
When the sampler pool grows or shrinks, the hash ranges shift, and traces that were in flight may be split across two samplers for a short time. Plan scaling events for quiet periods, keep the pool size stable where possible, and accept that a small number of traces will be incomplete during changes.
Layering policies
A mature platform combines policies instead of choosing one. A typical pattern keeps every trace that contains an error, keeps every trace slower than a set latency, always keeps traces from a short list of critical business flows, and keeps a small random percentage of everything else so that baselines remain statistically honest. Because sampling discards the raw evidence of the ordinary traces, the derived span metrics from Chapter 7 are what keep rates and percentiles accurate.
Why derived metrics should be computed before sampling
If you calculate request counts after dropping most traces, the counts will be wrong by the sampling factor. Compute span metrics early in the pipeline, on the full stream, and sample afterward. Then dashboards show true traffic while storage shows only a curated set of examples.
9Scaling and Reliability
A platform that falls over during an incident is worse than no platform, because that is exactly when people need it.
Stateless and stateful parts
Most Collector work is stateless: each item can be handled alone, so you can add more identical instances behind a load balancer and capacity grows roughly in line. Some work is stateful, which means an instance needs memory of earlier items. Tail sampling is stateful because it must remember spans until a trace is complete. Certain metric conversions are stateful too, because they need previous values to compute rates or to merge cumulative counters. Separate stateless from stateful work into different tiers so that scaling rules for each can differ.
A stateless tier is like checkout tills at a supermarket: open more tills and the queue shortens, and any customer can use any till. A stateful tier is like a doctor’s waiting list where each patient’s file lives in one particular office. You cannot simply send the patient to another room without moving the file.
Horizontal scaling signals
To scale well, watch the right numbers. The key ones are CPU use, memory use, the depth of sending queues, the count of refused or dropped items, and the delay between data arriving and data leaving. Queue depth rising while CPU stays low usually means a slow destination, not a lack of Collector capacity, so adding more Collectors will not help.
Buffering with a message queue
For high-value data or for very bursty traffic, many platforms put a durable message queue between the gateway tier and the final writers. Gateways publish to the queue, and a separate pool of consumers reads from it and writes to backends at their own pace. This decouples the speed of arrival from the speed of storage. If a backend is down for an hour, the queue holds the data, and when the backend recovers the consumers drain the backlog.
Advantages
- Absorbs bursts without dropping data
- Lets several consumers read the same stream for different purposes
- Survives backend outages of hours, not minutes
- Separates ingestion scaling from storage scaling
Disadvantages / Trade-offs
- Another system to run, secure and monitor
- Adds delay between event and visibility
- Storage and network cost for the buffered data
- Retention limits still mean data can be lost in very long outages
High availability
Run at least two instances of every tier, spread across failure zones. Use health checks so the load balancer removes unhealthy instances. Roll out configuration changes gradually, one slice at a time, so that a bad change affects a small part of the fleet first. For persistent queues, use storage that survives the loss of a single machine.
Protecting the applications
The strongest reliability rule of a telemetry platform is that it must never harm the systems it observes. SDKs should use bounded in-memory buffers and drop data rather than block user requests when the pipeline is slow. Agents should have strict resource limits. Gateways should refuse excess load early rather than accept it and collapse. A monitoring system that causes an outage is a failure in design, not in luck.
Decide in advance what to sacrifice first when overloaded. A common order is to drop debug logs first, then low-value traces, then high-volume metrics, and to protect error logs and critical service metrics last. Writing this down turns a panicked decision into a policy.
10Kubernetes, Fleet Management and Configuration as Code
When there are hundreds of Collectors, the question changes from “how do I configure one?” to “how do I keep all of them correct?”
The OpenTelemetry Operator
On Kubernetes, the OpenTelemetry Operator is a controller that manages Collectors and instrumentation for you. You describe the Collector you want as a Kubernetes resource, including whether it should run as a sidecar, a node-level agent, a standard deployment or a stateful set, and the Operator creates and maintains the underlying objects. A second resource type lets you describe automatic instrumentation for supported languages, so that pods can be instrumented by adding an annotation rather than rebuilding images.
The Operator is a building manager. You tell the manager “every floor needs a fire extinguisher of this kind”, and the manager buys, installs and replaces them. You never carry an extinguisher yourself.
Scraping at scale with the Target Allocator
Metrics in the Prometheus style are often pulled by scraping endpoints rather than pushed. If many Collectors each scraped everything, work would be duplicated. The Operator’s Target Allocator discovers scrape targets and divides them fairly among the Collector instances, so each target is scraped by exactly one instance, and it rebalances as pods come and go.
Fleet control with OpAMP
OpAMP, the Open Agent Management Protocol, is a standard that lets a central server talk to a fleet of agents. Through it, the server can see which agents are running, which configuration each one has, whether the last change was applied, and what their health is, and it can push new configuration or request updates. It is the foundation for a real control plane because it replaces ad hoc scripts with a common, observable conversation between the platform and its Collectors. Support in tools and distributions is growing but uneven, so verify what your chosen distribution implements.
Configuration as code
Treat pipeline configuration like application code. Keep it in version control, require review for every change, validate it automatically before rollout, and deploy it through the same automated delivery process as other infrastructure. Validation steps can check that the file loads, that required processors exist and are in the right order, that no forbidden exporter is used, and that sample data passes through producing the expected output.
Propose
A platform engineer changes a pipeline definition in a repository and opens a review.
Validate
Automated checks load the configuration, run policy rules and replay sample telemetry through a test Collector.
Canary
The change is applied to a small slice of the fleet while health and drop counters are watched.
Roll out
If the canary stays healthy, the change spreads gradually to every environment.
Roll back
If any signal degrades, the previous version is restored automatically, and the change is reopened for repair.
Layered configuration
A useful technique is to build each Collector’s configuration from layers: a base layer owned by the platform team that contains non-negotiable safety items, and optional layers that tenant teams may select or tune within limits. The Collector supports merging several configuration sources, which makes this layering practical. The base layer guarantees memory protection, redaction and self-monitoring; the optional layers add things like extra attribute rules for a particular team.
11Multi-Tenancy, Governance and Self-Service
This chapter is where a pipeline stops being infrastructure and becomes a product that people choose to use.
What a tenant is
A tenant is a group of users and workloads that the platform serves as a unit, such as a business unit, a product team or an environment. Multi-tenancy means many tenants share the same pipeline while being kept apart in the ways that matter: whose data is whose, who may see what, who pays for what, and who may be affected if another tenant misbehaves.
A shared office building has many companies. They share the lobby, the lifts and the power supply, but each has its own locked door, its own meter and its own rules about visitors. Tenancy in a pipeline is the lock, the meter and the rulebook.
Identifying tenants
The platform needs a reliable tenant marker on every item of data. Common choices are a resource attribute set by the agent, a header on the incoming connection that is tied to a credential, or a naming convention that is verified by the gateway. The key principle is that tenant identity should be established by the platform from trusted information, not claimed freely by the application, otherwise one tenant could pretend to be another.
Isolation and fairness
Data separation
Route each tenant’s data to its own storage area or partition so access control in the backend can mirror tenant boundaries.
Rate limits
Apply per-tenant limits on volume so one noisy tenant cannot starve the others of capacity.
Blast-radius control
Dedicated pipelines or gateway pools for critical tenants keep their data flowing when others misbehave.
Cost attribution
Count volume per tenant and report it, so spending is visible to the people who can change it.
Cardinality governance
Cardinality is the number of distinct combinations of attribute values for a metric. A metric labelled by user identifier can create millions of separate series, and each series costs storage and query time. High-cardinality mistakes are the most common reason for surprise bills. The platform can limit damage by removing or hashing risky attributes, by capping the number of series per tenant, and by publishing a list of the heaviest offenders so their owners can fix them at the source.
Data contracts and golden paths
A data contract is a written agreement between the platform and its users about what telemetry should look like: required resource attributes, naming rules, allowed attribute keys and size limits. A golden path is the easiest, best-supported way to do something, such as a starter template or a shared library that already has the SDK configured correctly. When the golden path is genuinely easier than the alternatives, most teams follow it voluntarily, and governance becomes a matter of convenience rather than of policing.
Treat internal teams as customers. Publish onboarding guides, a clear support channel, a changelog, a status page and a roadmap. Measure time to first useful trace for a new service. If that number is days instead of hours, the platform has a product problem, however good its engineering is.
Showback and chargeback
Showback reports how much each tenant used, without charging. Chargeback actually bills them. Even showback alone changes behavior, because teams that can see their own volume tend to clean it up. The pipeline is a natural place to count, since all data passes through it before storage.
12Security, Privacy and Compliance
Telemetry often contains more sensitive information than people realize, so the pipeline is a security boundary and should be designed as one.
Encrypt and authenticate every hop
Every connection between SDK, agent, gateway and backend should be encrypted in transit. Where possible use mutual authentication, in which both sides prove their identity with certificates, so that only legitimate senders can submit data and only legitimate receivers can obtain it. Authentication extensions in the Collector can validate bearer tokens, certificates or other credentials at the receiving edge. Rotate credentials on a schedule and store them in a secrets manager rather than in plain configuration files.
Imagine armoured vans between bank branches. Encryption is the locked van. Mutual authentication is the guard at each end checking the other’s badge before the doors open. Without both, you only have a courier carrying cash in a backpack.
Least privilege and a small attack surface
Run Collectors as unprivileged users, with the smallest set of permissions needed. A node agent that reads container logs needs read access to log paths, not full control of the host. Use custom builds that include only the components you need, because every extra component is more code that could contain a flaw. Expose diagnostic and health endpoints only on internal interfaces.
Privacy engineering
Treat telemetry as potentially personal data. Define which attributes may never leave the region where they were produced, and use routing rules to keep such data inside the right geographic boundary. Mask or hash identifiers where the raw value is not needed. Limit retention periods per data type. Provide a process for deleting data when a legal request requires it, which means knowing where each tenant’s data physically lives.
Data residency in practice
A company operating in several regions may need European telemetry stored only in European backends. A regional gateway can tag and route data by region, forwarding only anonymized aggregates, such as span-derived metrics without user attributes, to a global store for company-wide dashboards.
Auditability
Because the pipeline can change what data looks like, changes to it must be traceable. Keep a history of who changed which rule and when, record which version of configuration each Collector is running, and keep records of access to sensitive archives. When an auditor or an incident investigator asks “what happened to this data on its way here?”, the answer should be available from records, not memory.
Telemetry about security events can itself help an attacker if it leaks, since it describes system layout, internal names and error details. Apply access controls to observability data that match the sensitivity of the systems it describes.
13Observing the Pipeline Itself
The pipeline carries the evidence everyone relies on during an incident, so it needs its own instruments and its own promises.
The Collector reports on itself
The Collector exposes internal telemetry about its own behavior. This includes how many items each receiver accepted, how many each processor dropped, how many each exporter sent or failed to send, how full the sending queues are, and how much memory and CPU the process is using. These internal signals can be sent to a separate, simple, highly reliable path, deliberately different from the main one, so that you can still see problems with the pipeline when the pipeline itself is struggling.
A smoke alarm should not be powered by the same circuit as the thing it watches. If the main power fails, the alarm still needs to sound. The pipeline’s self-monitoring should use a separate route for the same reason.
The numbers worth watching
Service level objectives for a pipeline
A service level objective, or SLO, is a measurable promise about quality. For a pipeline, useful SLOs include the share of telemetry that is delivered rather than dropped, the delay between generation and availability for querying, and the availability of the ingestion endpoint. Publishing these numbers lets tenants plan around them and tells the platform team when to invest in reliability instead of features.
Canary data and end-to-end checks
Counters can look healthy while data is silently wrong. A strong technique is to inject synthetic telemetry with known content at the edge, then verify that exactly that content arrives at each destination within the expected time. This tests the whole path, including processors and routing, and catches subtle breakage that internal counters cannot see.
Detect
Alerts fire when refusal rates, drop counts or delays cross agreed thresholds, or when a synthetic probe fails to arrive.
Localize
The tier, the tenant and the component are identified from the labels on internal metrics.
Mitigate
The runbook is followed: shed low-priority data, scale a tier, or roll back the latest configuration.
Learn
The incident is reviewed, and the lesson becomes a validation rule, an alert or a limit so it cannot repeat silently.
Write down, for each common failure, what the symptom looks like on the internal metrics, what the first safe action is and who decides when to shed data. During an outage nobody should be inventing policy.
14Design Patterns and Anti-Patterns
Patterns are shortcuts to decisions other teams already paid to learn; anti-patterns are the bills they paid.
Patterns that work
Single front door
Applications know exactly one stable endpoint. Everything behind it can be reshaped without any application change.
Safety first, shape second
Memory protection leads every pipeline, and batching ends it. Business rules live in the middle.
Two-tier sampling
Cheap head decisions near the source, smarter tail decisions in a trace-aware gateway tier.
Metrics before sampling
Derive statistics from the full stream first, then discard detail, so rates remain truthful.
Layered configuration
A platform-owned base with non-negotiable safety rules, plus tenant-selectable optional layers.
Separate monitoring path
The pipeline’s own health data travels by a different, simpler route than the data it carries.
Dual-write migration
Send to old and new backends together for a trial period, compare, then retire the old one with no application change.
Anti-patterns to avoid
Problem
The team installs a single giant gateway that does everything: receives, enriches, samples, routes and exports, for all signals and all tenants, with no agents and no separation.
Why It’s Harmful
One mistake or one noisy tenant affects everyone. Stateful tail sampling competes for memory with stateless routing, and scaling for one starves the other. The gateway also becomes a single place where every change feels risky, so changes slow down.
Correct Approach
Split by responsibility and by blast radius. Use agents for local work, a stateless gateway pool for common policy, a separate stateful tier for tail sampling, and dedicated pools for critical tenants.
Problem
Pipelines are edited by hand on live machines whenever someone has an urgent need, and nobody records the changes.
Why It’s Harmful
Machines drift apart, nobody can say which rules are active where, and a bad edit can silently drop data for days. Recovery after an incident depends on one person’s memory.
Correct Approach
Keep every pipeline definition in version control, validate and canary each change, and make the repository the single source of truth.
Problem
Tail sampling is deployed behind a plain round-robin load balancer, so spans from one trace are scattered across several samplers.
Why It’s Harmful
Each sampler sees only fragments. Decisions about errors and latency are made on incomplete evidence, so valuable traces are dropped while broken partial traces are stored, and engineers lose trust in the data.
Correct Approach
Put a trace-aware load-balancing tier in front of the samplers so that all spans sharing a trace identifier reach the same instance.
Problem
The platform team becomes a ticket desk: every new service, every attribute rule and every dashboard request goes through a manual queue.
Why It’s Harmful
Teams wait, then give up and run their own shadow telemetry. The organization ends up with exactly the fragmentation the platform was built to prevent, plus an unused central system.
Correct Approach
Offer self-service onboarding through templates and automation, with guardrails that enforce safety automatically, and reserve human review for unusual requests.
Problem
The pipeline is treated as lossless and unmonitored, with no internal alerts, no limits and no known priorities for overload.
Why It’s Harmful
Data is dropped quietly, dashboards show gaps that look like application problems, and during a real incident the team discovers that the tool they rely on has been unhealthy for hours.
Correct Approach
Instrument the pipeline, publish service level objectives, define what is dropped first under pressure and test the failure behavior before it happens for real.
15Advantages, Disadvantages and Trade-offs
No architecture is free. A clear view of both sides helps decide whether, and how far, to go.
Advantages
- Vendor neutrality: change or add backends without changing application code
- Consistent data quality through shared naming and enrichment
- Central cost control through filtering, sampling and per-tenant limits
- Stronger privacy through one place to mask sensitive values
- Faster onboarding for new services through golden paths
- Resilience for applications, which hand data off and move on
Disadvantages / Trade-offs
- A new critical system to build, run, secure and keep reliable
- Added hops mean added delay and more places for things to break
- A dedicated team with specialized skills is required
- Central rules can frustrate teams who want freedom or special handling
- Central sampling and filtering can remove data someone later needs
- Component maturity varies, so upgrades need careful testing
Build, buy or blend
Some organizations assemble the platform entirely from open-source parts. Others buy a managed pipeline product, often built on or compatible with OpenTelemetry. Many choose a blend: open-source Collectors at the edge, a vendor or managed service for the hard central pieces. The right choice depends on team size, appetite for operating infrastructure, regulatory needs and how strongly the organization values independence from any one supplier.
| Approach | Control | Effort | Typical fit |
|---|---|---|---|
| Self-built from open source | Highest | Highest, ongoing | Large organizations with a platform team and strict requirements |
| Managed or vendor pipeline | Medium | Lower | Teams that want to focus on products rather than plumbing |
| Blended | Medium to high | Medium | Organizations that want an exit option and fast results |
If the platform team spends more time operating the pipeline than application teams spend benefiting from it, the design is too heavy for the organization. Start with the smallest topology that solves a named problem and add pieces only as problems appear.
16Real-World Scenarios
The following are composite scenarios, built from common patterns reported across the industry, to show how the ideas combine in practice.
Scenario 1 — Switching vendors without a freeze
A company wants to move from one commercial observability vendor to another. Because every service sends OTLP to the single front door, the platform team adds a second exporter in the gateway, runs both vendors in parallel for several weeks, lets teams compare dashboards and alerts, and then removes the old exporter. No application team files a ticket, and no release is delayed.
Scenario 2 — Taming a surprise bill
Monthly spend doubles. Per-tenant volume reports from the pipeline show that one service started emitting a metric labelled by user identifier. The platform team hashes and then removes the attribute at the gateway as an immediate measure, notifies the owning team with evidence, and adds a cardinality cap so the problem cannot recur unnoticed.
Scenario 3 — Keeping regulated data in its region
A financial services firm must keep customer-linked telemetry inside certain countries. Regional gateways tag and route detailed data to local stores, while only span-derived metrics without personal attributes flow to a global store. Auditors review the routing rules in version control and the access logs for each region.
Scenario 4 — Legacy applications join the platform
Dozens of older applications write plain text log files and cannot be changed quickly. Node agents read those files, parse them, add resource attributes and forward them as structured records beside modern services. The old estate becomes searchable with the same fields as the new one, and modernization can proceed at its own pace.
Scenario 5 — Surviving a backend outage
A trace store goes down for ninety minutes during a busy evening. Gateways queue data, refuse excess load back to agents, and agents drop the lowest-priority data according to the written order. When the store recovers, queues drain, and the platform’s own dashboards show exactly how much data was delayed and how much was dropped, so the incident report is based on numbers rather than guesses.
Scenario 6 — Seasonal traffic peaks
An online retailer expects ten times normal traffic during a sale. Weeks earlier the platform team load-tests the pipeline, raises limits for critical checkout services, tightens sampling for low-value browsing traffic, scales the gateway pool in advance and pre-agrees which data to shed first. The sale passes with complete error traces for checkout and acceptable gaps elsewhere.
17A Maturity Roadmap
Nobody builds the whole platform at once. A staged path keeps each step useful and affordable.
Stage 1 — Standardize emission
Agree on OpenTelemetry SDKs, OTLP and a minimal set of required resource attributes. Teams may still send directly to a backend, but the data now has a common shape.
Stage 2 — Introduce agents
Deploy node-level Collectors with memory protection, batching and basic enrichment. Applications begin to send to a local address, and host and log collection come online.
Stage 3 — Add the gateway
Place a gateway tier behind a stable address. Move routing, redaction and multi-backend export there. The first real benefit appears: backends become swappable.
Stage 4 — Shape and sample
Add derived metrics, filtering and tail sampling in a trace-aware tier. Costs become predictable, and the data starts to reflect what matters.
Stage 5 — Govern and automate
Introduce tenancy, limits, showback, configuration as code, canary rollouts and fleet management. The pipeline begins to operate like a product.
Stage 6 — Optimize and extend
Publish service level objectives, run synthetic probes, add buffering where justified and extend to new signals as they mature, always measuring benefit against operating cost.
flowchart LR
S1["Stage 1 Standard data"] --> S2["Stage 2 Agents"]
S2 --> S3["Stage 3 Gateway"]
S3 --> S4["Stage 4 Shape and sample"]
S4 --> S5["Stage 5 Govern and automate"]
S5 --> S6["Stage 6 Optimize and extend"]
Teams that jump to advanced sampling or multi-tenancy before they have stable agents, a gateway and basic monitoring usually spend months debugging problems that earlier stages would have prevented. Each stage creates the foundation the next one stands on.
18Best Practices and Common Mistakes
A short checklist of habits that separate calm platforms from chaotic ones.
Best Practices
- Make applications depend only on OTLP and one stable address
- Put memory protection first and batching last in every pipeline
- Require a minimum set of resource attributes on all data
- Compute derived metrics before sampling
- Test every configuration change with sample data before rollout
- Canary changes and keep one-step rollback available
- Publish per-tenant volume and cost reports
- Monitor the pipeline on a separate path with its own alerts
Common Mistakes
- Using very large queues instead of fixing slow destinations
- Adding exporters casually and multiplying outgoing traffic
- Letting applications claim their own tenant identity
- Allowing unbounded attribute values on metrics
- Sampling before counting, which makes metrics wrong
- Scaling stateful tiers during busy periods without preparation
- Upgrading Collector versions without reading release notes on component stability
- Never rehearsing what happens when the pipeline is overloaded
Upgrades and stability levels
OpenTelemetry components carry stability labels that range from experimental to stable. A platform should prefer stable components for the critical path and confine experimental ones to limited, well-watched areas. Because individual component names and settings sometimes change between releases, read the release notes before each upgrade, test in a staging environment that carries realistic traffic, and upgrade the fleet gradually. The pace of change in the project is a strength, but it requires discipline from anyone who depends on it.
Capacity planning in plain terms
Estimate how many items per second arrive at each tier at normal and peak times, how large each item is on average, how long you want to survive a destination outage, and how much headroom you want. From those four numbers you can size memory for queues, disk for persistent buffers and instance counts for each tier. Revisit the estimates after every large product launch, because traffic and telemetry volume rarely grow at the same rate.
Schedule regular game days in a staging environment. Cut a backend, flood a tenant, kill a gateway, apply a faulty configuration and watch whether the written priorities, alerts and rollbacks work as designed. A plan that has never been tried is a hope, not a plan.
19Frequently Asked Questions
Quick answers to the questions that usually come up first.
No. It is an architectural and organizational approach. OpenTelemetry provides the standard building blocks, such as the specification, OTLP, SDKs and the Collector. The platform is what an organization creates by combining those blocks with shared operations, governance and a dedicated team.
Not for small experiments, where an SDK can send straight to a backend. As soon as you need central policy, several backends, reliable buffering, privacy controls or cost control, a Collector becomes the natural place to provide them.
An agent runs close to workloads, on the same node or inside the same pod, and handles local jobs such as buffering and host data. A gateway is a central pool that receives from many agents and applies shared policy such as routing, sampling and multi-backend export.
Because all spans of one trace must reach the same sampler. A plain load balancer spreads spans across instances, so each sees only part of each trace. A trace-aware balancing tier hashes by trace identifier to keep traces together.
It should not. SDKs buffer in memory and send in the background, and agents on the same node add very little delay. The design rule is that if the pipeline is overloaded, data is delayed or dropped rather than user requests being blocked.
Use sending queues with sensible sizes, consider persistent queues on disk for important signals, and for demanding cases place a durable message queue between tiers. Also decide in advance which data may be dropped first, since no buffer is infinite.
It is an excellent safety net but not a complete defense. Combine pipeline redaction with developer guidance, code review, tests and periodic checks of real stored data to confirm that rules actually catch what they should.
It depends on the scale and ambition. A small team can run a modest agent-and-gateway design with strong automation. Large multi-tenant, multi-region platforms need more people for reliability, support and governance. Automation, templates and self-service are what let a small team serve many.
Often yes. The Collector has receivers for many older formats and exporters for many destinations, so it can translate between them. This lets you adopt the common pipeline first and migrate application instrumentation gradually.
Look at both sides. Technically, track delivery rate, drop counts, delay and availability against published objectives. For users, track how long a new service takes to get its first useful trace, how often teams bypass the platform and how satisfied they say they are.
Component stability levels, the status of newer signals such as profiles, support for fleet management and configuration features all evolve quickly. Treat the official OpenTelemetry documentation and release notes as the source of truth for current names, settings and maturity before you commit to a design.
20Summary and Key Takeaways
An observability pipeline as a platform turns telemetry from a private chore of each team into a shared, reliable service. OpenTelemetry supplies the common language and the Collector that moves and shapes data, and the platform adds the human side: a team that owns quality, cost, security and uptime, and an experience that makes the right thing the easy thing. Like the postal service in the opening picture, its value is not in any single letter but in the fact that every letter, from every household, can travel by the same trusted route, be tracked and arrive where it should.
The journey is incremental. Start by standardizing how data is produced, add agents for local safety and context, introduce a gateway for central policy and flexibility, then layer on sampling, governance and automation as real needs appear. At each step, measure the benefit and watch the operating cost, and always make sure the pipeline observes itself.
Key Takeaways
- It is an approach, not a product — OpenTelemetry provides the standard parts; the platform is those parts plus ownership, governance and self-service.
- Applications should know only OTLP and one stable address — everything behind it can then change without redeploying a single service.
- Agent plus gateway is the usual shape — agents handle local, cheap jobs; gateways handle central policy such as routing, redaction and sampling.
- Tail sampling needs trace affinity — hash by trace identifier so every span of a trace reaches the same sampler, and compute derived metrics before sampling.
- Reliability is designed, not hoped for — memory protection, sized queues, back-pressure, optional buffering and written drop priorities keep the pipeline from harming what it observes.
- Govern like a product — tenants, limits, data contracts, golden paths and showback reports keep quality and cost under control without a ticket queue.
- Watch the pipe itself — publish objectives, monitor on a separate path, run synthetic probes and rehearse failures regularly.