Open-source (Apache 2.0, CNCF graduated) backend for distributed traces: it receives OTLP spans, stores them and shows the path of one request through all services. Jaeger v2 is built on the OpenTelemetry Collector.
dockerrun--rm--namejaeger\-p16686:16686-p4317:4317-p4318:4318\jaegertracing/jaeger:latest# pin a version in CI
# uv add opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpcfromopentelemetryimporttracefromopentelemetry.exporter.otlp.proto.grpc.trace_exporterimportOTLPSpanExporterfromopentelemetry.sdk.resourcesimportResourcefromopentelemetry.sdk.traceimportTracerProviderfromopentelemetry.sdk.trace.exportimportBatchSpanProcessorprovider=TracerProvider(resource=Resource.create({"service.name":"orders-api"}))provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint="http://localhost:4317",insecure=True)))trace.set_tracer_provider(provider)withtrace.get_tracer(__name__).start_as_current_span("checkout")asspan:span.set_attribute("order.id","ord-42")provider.shutdown()# flush before the script exits# Open http://localhost:16686 -> Service "orders-api" -> Find Traces
Debugging microservices and API tests locally and in CI
Evaluating and debugging LLM behaviour
Production tracing in a Grafana stack
Rule of thumb: Jaeger answers which service was slow or failed; Phoenix and Langfuse answer what the LLM saw and said. Both can receive the same OTLP stream through one Collector.