The Observability Fragmentation Problem
Most DevOps teams run three to five observability tools. Datadog for APM. Prometheus for metrics. ELK for logs. Jaeger for traces. PagerDuty for alerting. Each tool has its own instrumentation SDK, its own data format, and its own agent competing for resources on your nodes.
The result: fragmented telemetry that can’t be correlated across tools, vendor lock-in that makes switching painful, and instrumentation code scattered through your application that’s tightly coupled to whatever vendor you chose three years ago.
OpenTelemetry solves this by providing a single, vendor-neutral standard for generating, collecting, and exporting telemetry data — traces, metrics, and logs — in a format that any backend can consume.
In 2026, OpenTelemetry isn’t a nice-to-have. It’s the default. Over 85% of observability vendors now support OTLP (OpenTelemetry Protocol) natively, and the specification covers all three telemetry signals with stable APIs. If you’re still instrumenting with vendor-specific SDKs, you’re building technical debt.
What OpenTelemetry Actually Is
OpenTelemetry is three things:
A specification that defines how telemetry data (traces, metrics, logs) is structured and transmitted. This is the contract — any tool that speaks OTLP can consume your telemetry.
SDKs and auto-instrumentation libraries for every major language (Go, Java, Python, Node.js, .NET, Ruby, Rust, and more). These generate telemetry from your application code with minimal manual instrumentation.
The OpenTelemetry Collector — a vendor-agnostic proxy that receives telemetry from your applications, processes it (filtering, sampling, enriching), and exports it to one or more backends. The Collector is the operational heart of any OTel deployment.
The key insight: you instrument once with OpenTelemetry, and send telemetry to any backend — or multiple backends simultaneously. Switch from Datadog to Grafana Cloud? Change the Collector exporter config. Your application code doesn’t change.
Why DevOps Teams Should Care
Vendor Independence
Observability contracts are expensive. The average mid-size engineering team spends $15,000–$50,000/month on observability tooling. With vendor-specific instrumentation, switching costs are enormous — you’d need to re-instrument every service.
OpenTelemetry makes your backend a configuration choice, not an architectural commitment. Run a bake-off between three vendors by sending the same telemetry to all three simultaneously through the Collector. Make your decision based on features and cost, not switching pain.
Unified Correlation
When traces, metrics, and logs all share the same context propagation (trace ID, span ID, resource attributes), you can jump from a latency spike in a trace to the exact log lines from that request to the infrastructure metrics of the node it ran on. This is the “single pane of glass” that observability vendors promise — but it only works when all telemetry shares a common schema.
OpenTelemetry’s semantic conventions define standard attribute names for HTTP requests, database calls, messaging systems, and more. When everyone uses the same attribute names, correlation is automatic.
Reduced Instrumentation Overhead
Auto-instrumentation libraries for most languages can capture HTTP calls, database queries, gRPC calls, and message queue operations without any code changes. Install the OTel agent, set an environment variable, and telemetry starts flowing.
For Kubernetes workloads, the OpenTelemetry Operator can inject auto-instrumentation into pods via annotation — zero application code changes required.
See the IAN team run on your cloud. We connect to your AWS account via a scoped read-only role, run the Observe-tier agents, and leave you with a concrete audit report — cost waste, security exposure, compliance gaps, and a labor-offset estimate. You keep the findings regardless of next steps. Get a free infrastructure audit →
Adopting OpenTelemetry: The Practical Playbook
Step 1: Deploy the OpenTelemetry Collector
Start with the Collector, not the SDKs. The Collector gives you a telemetry pipeline that’s independent of your applications:
# otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 5s
send_batch_size: 1024
memory_limiter:
check_interval: 1s
limit_mib: 512
exporters:
otlphttp:
endpoint: https://your-backend.example.com
debug:
verbosity: basic
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp]
logs:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlphttp]
On Kubernetes, deploy the Collector as a DaemonSet (one per node for high-volume telemetry) or as a Deployment (centralized, easier to manage). For most teams starting out, a Deployment with 2-3 replicas behind a service is the right call.
Step 2: Enable Auto-Instrumentation
For each language, auto-instrumentation captures the most common telemetry without code changes:
Java: Add the -javaagent flag pointing to the OTel Java agent JAR. It auto-instruments Spring, gRPC, JDBC, Kafka, and 100+ libraries.
Python: pip install opentelemetry-distro opentelemetry-exporter-otlp and run with opentelemetry-instrument python app.py.
Node.js: npm install @opentelemetry/auto-instrumentations-node and register the SDK at startup.
Go: Use go.opentelemetry.io/contrib/instrumentation packages for HTTP, gRPC, and database libraries. Go requires more explicit instrumentation than JVM-based languages.
Set the OTEL_EXPORTER_OTLP_ENDPOINT environment variable to your Collector’s address, and telemetry flows automatically.
Step 3: Add Custom Instrumentation Where It Matters
Auto-instrumentation covers infrastructure calls (HTTP, DB, messaging). But the most valuable telemetry is business-specific:
- How long does order processing take?
- How many payment retries happen per transaction?
- What’s the cache hit rate for the product catalog?
Add custom spans and metrics for these. The OTel SDK makes this straightforward:
from opentelemetry import trace, metrics
tracer = trace.get_tracer("order-service")
meter = metrics.get_meter("order-service")
order_counter = meter.create_counter(
"orders.processed",
description="Number of orders processed"
)
def process_order(order):
with tracer.start_as_current_span("process_order") as span:
span.set_attribute("order.id", order.id)
span.set_attribute("order.total", order.total)
# ... processing logic
order_counter.add(1, {"status": "success", "region": order.region})
Step 4: Implement Tail-Based Sampling
At scale, you can’t afford to store 100% of traces. But head-based sampling (deciding at the start of a request) means you’ll miss errors and outliers. Tail-based sampling in the Collector lets you keep all error traces and high-latency traces while sampling routine successful requests:
processors:
tail_sampling:
decision_wait: 10s
policies:
- name: errors-policy
type: status_code
status_code: {status_codes: [ERROR]}
- name: latency-policy
type: latency
latency: {threshold_ms: 1000}
- name: probabilistic-policy
type: probabilistic
probabilistic: {sampling_percentage: 10}
This keeps 100% of errors and slow requests, and 10% of everything else — dramatically reducing storage costs while preserving the telemetry that matters.
Common OpenTelemetry Pitfalls
| Pitfall | Symptom | Fix |
|---|---|---|
| No memory limiter on Collector | Collector OOMs during traffic spikes | Always configure memory_limiter processor |
| Head-based sampling only | Missing error traces | Switch to tail-based sampling in Collector |
| No resource attributes | Can’t tell which service or environment telemetry came from | Set OTEL_RESOURCE_ATTRIBUTES with service.name, deployment.environment |
| Collector as single point of failure | Telemetry loss during Collector restarts | Run Collector as HA deployment with load balancing |
| Ignoring semantic conventions | Inconsistent attribute names across services | Adopt OTel semantic conventions org-wide from day one |
How IAN Uses OpenTelemetry
IAN’s infrastructure monitoring integrates with OpenTelemetry-instrumented environments to provide deeper context for audit findings:
- Deployment correlation — when IAN detects a cost anomaly or security drift, it correlates with deployment traces to identify which change caused it
- Service dependency mapping — OTel trace data reveals actual service communication patterns, which IAN uses to assess blast radius for security findings
- Performance-aware cost recommendations — rightsizing recommendations factor in actual latency data from traces, not just CPU utilization
- Anomaly detection — metric data from OTel feeds into IAN’s cost and security anomaly detection, catching issues faster than polling-based approaches
Start Instrumenting
OpenTelemetry adoption doesn’t require a big bang migration. Start with the Collector, enable auto-instrumentation on one service, and validate the data in your existing backend. Expand from there.
Next step: talk to the team
30 minutes. We'll look at your cloud together and scope what we'd take off your plate — see pricing.