Port 16686 is the Jaeger distributed tracing UI port. Jaeger is an open-source distributed tracing system (CNCF project) compatible with OpenTelemetry. The web UI at port 16686 shows trace timelines, service dependency graphs, and span details. Jaeger collector receives traces on port 14268 (HTTP) or 4317 (OTLP/gRPC).
Port Number
16686
Protocol
TCP
Service
Jaeger Distributed Tracing UI
Range
IANA Registered (1024–49151)
List all traced services (shows your service topology)
curl -s http://localhost:16686/api/services | jq .dataFetch recent traces for a service and show span counts
curl -s 'http://localhost:16686/api/traces?service=my-svc&limit=5' | jq '.data[].spans | length'Service dependency graph (which services call which)
curl -s http://localhost:16686/api/dependencies?endTs=$(date +%s)000 | jq '.data'Secure access to Jaeger UI via kubectl port-forward
kubectl port-forward svc/jaeger-query 16686:16686 -n observabilitycurl http://localhost:16686/api/services
kubectl port-forward svc/jaeger-query 16686:16686Jaeger was created at Uber in 2015, inspired by Google's Dapper paper and Twitter's Zipkin. Open-sourced in 2017, it became a CNCF project and graduated in 2019. Port 16686 was chosen arbitrarily. Originally Jaeger used its own client libraries and Thrift protocol; since 2022, the project recommends OpenTelemetry SDKs instead. Jaeger v2 (2024) is built on the OpenTelemetry Collector framework.
Jaeger vs Tempo vs Zipkin?
Jaeger: mature, full-featured UI, supports Cassandra/Elasticsearch/Kafka backends, CNCF graduated. Tempo (Grafana): no index needed (object storage only), cheapest at scale, integrates with Grafana natively, uses TraceQL query language. Zipkin: simple, Java-based, good for small deployments, less active development. All three support OpenTelemetry OTLP ingestion.
How do I add authentication to Jaeger?
Jaeger has no built-in auth. The standard approach: (1) deploy oauth2-proxy as sidecar or ingress middleware, (2) configure it against your IdP (Okta, Keycloak, Google), (3) proxy 16686 through it. In Kubernetes: use an Ingress with nginx.ingress.kubernetes.io/auth-url annotation pointing to oauth2-proxy. The Jaeger Operator supports injecting auth sidecars via CR annotations.
What is the difference between ports 14268, 14250, and 4317?
14268: Jaeger Collector HTTP endpoint (legacy, accepts Thrift spans directly from SDKs). 14250: Jaeger Collector gRPC (Jaeger agents forward spans here). 4317: OTLP gRPC (the modern standard – OpenTelemetry SDKs send here). For new deployments, use 4317 (OTLP) exclusively. 14268/14250 exist for backward compatibility with Jaeger-native clients.