
- Metrics: tell you what happened (e.g., p99 latency = 1.3s).
- Logs: give context for individual failures (e.g., payment timeout after 1,200 ms).
- Traces: show the full path, with timing at each hop, to reveal where the delay occurred.



A typical Kubernetes Deployment
env snippet (illustrative):
gRPC OTLP typically listens on port
4317. If you choose HTTP/protobuf, use port 4318 and set OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf. Ensure the collector you target supports the selected transport.- OTEL SDK (instrumentation inside your app) exports via OTLP to the Jaeger Collector.
- The Collector writes to a storage backend (e.g., Elasticsearch, Cassandra, or a local storage).
- The Jaeger Query service / UI provides search, timelines, and dependency graphs for analysis.

- Search traces by service name, operation, minimum duration, and tags.
- Waterfall/timeline view where each span is a horizontal bar — the longest bar often indicates the bottleneck.
- Click any span to inspect attributes, events (logs), and process information.
- A service dependency graph derived from real trace data.
- Compare traces to spot regressions or differences between successful and failed requests.

- Search by service name, operation, and minimum duration (e.g., >1s).
- Open the trace timeline — locate the widest span(s) across the full trace.
- Inspect the long span’s attributes and events to determine the cause (network, DB query, third-party API).
- Check sibling spans and parent spans to see whether the delay is upstream or downstream.
- Use the dependency graph to identify systemic hotspots across many traces.
- Service A receives an incoming request and creates a root span (and a new trace ID).
- When A calls Service B, OTEL instrumentation injects a
traceparent(and related context) header into the outgoing HTTP request. - Service B extracts the header, creates a child span with the same
trace_idbut a newspan_id, and continues propagation. - Service C receives the propagated header and repeats the process.

traceparent header follows the W3C Trace Context spec and contains four dash-separated fields:
- Version (currently “00”)
- Trace ID (32 hex chars)
- Span ID (16 hex chars)
- Trace flags (e.g., “01” indicates the trace is sampled)
Do not manually forge or mutate
traceparent headers in production traffic. Incorrect IDs or misuse can corrupt traces, cause sampling inconsistencies, or leak correlation data between tenants. Rely on OTEL libraries and the collector for correct context propagation.- Tracing reveals the end-to-end path and the specific hop responsible for latency or failures.
- Traces consist of spans connected by a shared
trace_idthat is carried across services via context propagation headers. - Use OpenTelemetry for vendor-neutral instrumentation and OTLP to send trace data to a collector.
- Visualize and analyze traces with Jaeger (or another backend) to quickly find bottlenecks.
- Instrument services, verify OTEL environment variables, ensure the collector endpoint and protocol match, and inspect traces in the Jaeger UI.
- OpenTelemetry: https://opentelemetry.io
- OTLP specification: https://opentelemetry.io/docs/reference/specification/protocol/otlp/
- Jaeger: https://www.jaegertracing.io/
- W3C Trace Context: https://www.w3.org/TR/trace-context/