OpenTelemetry vs Prometheus: how to choose
These are not alternatives, and treating them as such is the most common mistake in this area. Prometheus is a metrics database with a scraper and a query language. OpenTelemetry is a vendor-neutral standard and set of SDKs for producing telemetry — traces, metrics and logs — and shipping it somewhere. OpenTelemetry does not store anything.
The pairing most teams end up with is OpenTelemetry for instrumentation and Prometheus for metrics storage. Instrument once with OTel SDKs, export metrics in Prometheus format or via the collector's remote write, and keep PromQL, Grafana and Alertmanager exactly as they are.
Where a genuine choice exists is instrumentation: Prometheus client libraries versus OpenTelemetry SDKs. Prometheus clients are simpler and battle-tested for metrics alone. OTel SDKs cover traces and metrics together with shared context propagation, so a trace and its metrics carry the same identifiers — which is the entire reason to care.
What each one is responsible for
| Concern | Prometheus | OpenTelemetry |
|---|---|---|
| Category | Metrics database and scraper | Instrumentation standard, SDKs and collector |
| Stores data | Yes | No — it forwards to a backend |
| Signals | Metrics | Traces, metrics and logs |
| Query language | PromQL | None — the backend provides it |
| Collection model | Pull by default | Push via the collector, with pull supported |
| Vendor neutrality | Open source, its own ecosystem | Explicitly designed to avoid backend lock-in |
The collector is the part worth adopting first
Even if you never change instrumentation, the OpenTelemetry Collector earns its place. It sits between applications and backends and lets you filter, batch, enrich and re-route telemetry without redeploying anything that produces it. Dropping a high-cardinality metric or adding a resource attribute becomes a collector configuration change instead of a code change across dozens of services.
It is also the cheapest way to make a backend migration survivable. With applications exporting OTLP to a collector, changing where data lands is a routing change. Without it, the destination is compiled into every service, and moving means touching all of them.
Frequently asked questions
Should I replace Prometheus with OpenTelemetry?
You cannot — OpenTelemetry does not store or query metrics, so there is nothing to replace it with. What you can replace is the instrumentation: swap Prometheus client libraries for OTel SDKs while keeping Prometheus as the backend. Nothing about your queries, dashboards or alerts needs to change.
Does OpenTelemetry add overhead?
Some, and it is usually modest relative to what it replaces. The cost is mostly in trace sampling and export rather than metrics. Sampling strategy is the lever that matters — head sampling is cheap and can miss the interesting requests, tail sampling catches errors and slow traces at the cost of buffering. Decide that deliberately rather than accepting a default.
Can I use OTel metrics with existing PromQL dashboards?
Mostly, with care. Naming conventions differ — OTel uses dots where Prometheus uses underscores — and the collector's Prometheus exporter applies a translation. Expect some metric names to change and to update dashboards accordingly. Plan for a period where both naming schemes exist rather than a clean cutover.
Is it worth adopting if we only need metrics?
Less compelling, and still defensible. If metrics are genuinely all you will ever need, Prometheus client libraries are simpler and have fewer moving parts. Adopt OTel when you want traces alongside metrics with shared context, or when backend portability is a real concern — those are the problems it solves that Prometheus clients do not.
Need this managed for you, not just automated?
We're also a hands-on DevOps consultancy — Kubernetes, CI/CD, and cloud infrastructure.