The CheckOps Engineer
OpenTelemetry
OpenTelemetry is the open standard and toolkit for traces, metrics, and logs. It is free; you still need a backend to store the data.
Latest public signals
Not refreshed yet. Refresh reads the public site and, when the entry has a GitHub repository, the latest release.
Introduction
OpenTelemetry (OTel) is a CNCF project that defines how applications describe traces, metrics, and logs, and ships the libraries and agents that emit them. The specification is open-telemetry/opentelemetry-specification (Apache-2.0). Language APIs and SDKs, semantic conventions, and the OpenTelemetry Collector live in sibling repositories. The point of the project is to instrument once and choose a backend later: Jaeger, Prometheus, Grafana, Honeycomb, Datadog, and others can receive OTLP.
OpenTelemetry is not a dashboard and not a test runner. A test can emit spans, and CI can export them, but something else must store and query the data. There is no OpenTelemetry company plan. Vendors charge for the backend.
Features
- Traces, metrics, and logs: One project covers all three signals, with a shared context model so a log line can carry a trace id.
- APIs and SDKs: Stable APIs exist for the major languages (Java, Python, JavaScript, Go, .NET, and others). The API is what libraries depend on. The SDK is what you configure at process start.
- OTLP: The OpenTelemetry Protocol is the wire format between an SDK, a collector, and a backend. gRPC and HTTP are both specified.
- Collector:
opentelemetry-collectoris a binary you run to receive, process, and export telemetry. Processors handle batching, filtering, and attribute changes so each service does not hard-code a vendor. - Auto-instrumentation: Java, JavaScript, Python, and .NET agents can wrap common frameworks without manual spans. Coverage and quality vary by framework.
- Semantic conventions: Attribute names for HTTP, databases, messaging, and, increasingly, CI and tests. Following them is what makes a Grafana board and a vendor board agree.
- Context propagation: W3C Trace Context is the default way a trace crosses HTTP services. Baggage carries extra attributes. Both have to be enabled on the way in and the way out.
- Test and CI conventions: Semantic conventions for CI and test spans exist so a JUnit or Playwright run can be exported as telemetry. The runner still executes the test.
Pros
- Vendor-neutral instrumentation: You can change exporters without rewriting every span in application code, if you actually routed through the collector.
- Wide language coverage: Polyglot systems can share trace context instead of one vendor SDK per service.
- The collector is a policy point: Sampling, redaction of attributes, and fan-out to two backends belong there, not in every repo.
- CNCF and Apache-2.0: The spec and the main implementations are free to run. No OpenTelemetry license server.
- Libraries can instrument safely: A database client depends on the API, not on your vendor, so your app decides whether tracing is on.
Cons
- No UI: After you export, you still need Prometheus, Jaeger, Tempo, or a commercial backend. “We adopted OpenTelemetry” is not an observability product.
- Version skew: Spec, semantic conventions, and SDKs do not release as one number. An attribute renamed in a convention update breaks a dashboard.
- Auto-instrumentation is partial: The agent covers common frameworks and misses your business logic. Manual spans are still required for the operations you care about.
- Collector config is a product: Receivers, processors, and exporters are a YAML surface area with its own failure modes (queue full, exporter auth, memory limit).
- Sampling drops the error you wanted: Head sampling decided before the request failed will throw away the trace you need. Tail sampling belongs in the collector and costs memory.
Usage and Links (Example)
A minimal Node setup using the SDK and an OTLP HTTP exporter:
npm install @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-http
const { NodeSDK } = require("@opentelemetry/sdk-node");
const { getNodeAutoInstrumentations } = require("@opentelemetry/auto-instrumentations-node");
const { OTLPTraceExporter } = require("@opentelemetry/exporter-trace-otlp-http");
const sdk = new NodeSDK({
traceExporter: new OTLPTraceExporter({
url: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
Point OTEL_EXPORTER_OTLP_ENDPOINT at a collector you run (otelcol listening on 4318) or at a vendor’s OTLP intake. Start the SDK before the rest of the app imports HTTP frameworks, or auto-instrumentation will miss them. The collector config is a separate file; the OpenTelemetry docs’ collector getting-started page is the one to follow for the current image tag.
Resources:
Pricing
- Free: The specification, SDKs, instrumentation, and collector are open source, Apache-2.0 for the spec and the collector. There is no OpenTelemetry bill.
- Backends are not free: Grafana Cloud, Datadog, Honeycomb, and similar products charge for the OTLP data you send them. Self-hosted Jaeger or Prometheus costs machines instead.
- Commercial distributions: Vendors ship their own collector builds and support. You are paying the vendor, not the CNCF project.
Recommended for?
- Services that may change observability vendors, or that already send data to more than one place.
- Polyglot systems that need one propagation standard across Java, Go, and JavaScript.
- Platform teams who can run a collector and own its config.
- Test pipelines that should emit CI and test spans into the same backend as production. Pick a backend that understands those conventions.
Conclusion
OpenTelemetry is the instrumentation standard to adopt so application code stops importing a vendor SDK directly. It becomes useful when a collector and a backend are actually running. Budget that backend, pin SDK and convention versions, and treat sampling as a design choice. The project will not display a dashboard and it will not run your tests.