Pick a depth. Each prompt opens in your AI pre-loaded with the lesson. Click a row to preview the prompt.
The reason to write OpenTelemetry instead of a vendor SDK is not ideological, it is that instrumentation is the expensive, long-lived asset and backends are the cheap, short-lived one. Instrumenting a large codebase takes months of engineering spread across every team; switching a backend is a procurement decision that happens every few years and, with a vendor SDK, forces you to redo those months. OTLP is the seam that decouples them. Once your services speak OTLP to a Collector, the choice of backend — and the choice to send to two backends during an evaluation, or to split traces and metrics between them — becomes a YAML change in one place. That property is worth more than any individual feature difference between vendors.
The demo is deliberately anticlimactic: the application does not change at all. What changes is the Collector's exporter list. During a backend evaluation this is how you send production traffic to both candidates at once and compare them on your own data rather than on a sales demo.
# otel-collector.yaml — the application knows only this endpoint.
receivers:
otlp:
protocols:
grpc: { endpoint: 0.0.0.0:4317 }
http: { endpoint: 0.0.0.0:4318 }
processors:
batch:
timeout: 5s
send_batch_size: 512
exporters:
# Vendor A — the incumbent.
otlp/vendor-a:
endpoint: ingest.vendor-a.example:443
headers: { authorization: "${env:VENDOR_A_KEY}" }
# Vendor B — under evaluation. Same traffic, no app change.
otlp/vendor-b:
endpoint: otlp.vendor-b.example:443
headers: { "x-api-key": "${env:VENDOR_B_KEY}" }
# Self-hosted, for the data you do not want to pay to store twice.
otlphttp/tempo:
endpoint: http://tempo:4318
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp/vendor-a, otlp/vendor-b, otlphttp/tempo]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [otlp/vendor-a] # metrics stay with the incumbent
# The migration that used to be a quarter of engineering work is now:
# 1. add the new exporter
# 2. add it to the pipeline (fan-out is free)
# 3. compare on real traffic for two weeks
# 4. delete the old exporter
# Steps 1-4 touch zero application code.