Jaeger Knowledge Patch
Use this skill when designing, migrating, configuring, extending, or operating
Jaeger. It focuses on the unified v2 runtime, storage API evolution, query and
sampling behavior, operational components, and current UI and AI integrations.
Reference index
| Reference |
Topics |
| runtime-configuration.md |
Unified binary and roles, Collector-style YAML, overrides, server ports, image and build changes |
| storage-backends.md |
Storage contracts, named wiring, Elasticsearch/OpenSearch, Cassandra, memory, gRPC, ClickHouse, Badger |
| query-sampling-metrics.md |
Query APIs, trace adjustment, sampling, SPM, Prometheus, trace summaries |
| ingestion-operations.md |
OTLP and Kafka ingestion, extensions, telemetry, sanitization, deployment and monitoring assets |
| ui.md |
Base paths, search, trace views, DAGs, themes, links, logs, Monitor filters, build tooling |
| mcp-ai.md |
MCP consolidation, tools and limits, AG-UI, AI feature gates, GenAI views and tracing |
Start with the breaking migrations
Move deployments to the unified runtime
- Run the
jaeger binary or image. Do not plan around separately published v1
collector, query, ingester, all-in-one, or agent artifacts.
- Express each role as a Collector-style YAML configuration. Existing v1
environment variables are not automatically translated into v2 settings.
- Treat Jaeger as an OpenTelemetry Collector distribution. Add an upstream
Collector only where a sidecar, host agent, or preprocessing tier is useful.
- Remove the retired
grpc-plugin storage type and legacy
storage/v1/grpc integration.
- Give query HTTP and gRPC servers distinct listen ports.
See runtime-configuration.md for role
composition, configuration overrides, image tags, and source-build changes.
Revalidate storage wiring
V2 storage is name-based:
extensions:
jaeger_storage:
backends:
trace_store:
memory:
max_traces: 100000
jaeger_query:
storage:
traces: trace_store
exporters:
jaeger_storage_exporter:
trace_storage: trace_store
- Configure exactly one backend type per trace- or metric-storage entry.
- Use the same registered backend name from readers and writers.
- Replace archive-specific interfaces with the unified storage contract.
- Update experimental or custom v2 storage implementations for streaming trace
reads, direct OTLP stream elements, current request messages, and
context-aware dependency writes.
- Review Elasticsearch index mappings, aliases, rotation, authentication, and
trace-duration settings before an upgrade.
- Remove Elasticsearch 6 and Cassandra 3 from supported deployment plans.
The backend-specific migration details are in
storage-backends.md.
Update API clients and extensions
- The metrics-query gRPC service and
metricsquery.proto are gone.
- Trace request time fields and several storage-v2 request and response shapes
changed; regenerate clients from the matching IDL.
- API v2 and v3 query handlers apply trace adjusters. Do not assume returned
span ordering or timestamps are raw storage values.
- API v3 service-list success responses use empty collections instead of
null.
- Prefer trace-summary search for lightweight result sets.
- Treat snake_case gateway parameters and
query.num_traces as compatibility
aliases; use camelCase and query.search_depth.
- Treat HTTP trace identifiers as opaque because base64 identifiers are valid.
See query-sampling-metrics.md.
Remove stale feature and configuration switches
- Remove
sampling.strategies.bugfix-5270; the corrected behavior is stable.
- Do not script
jaeger features; the briefly introduced command was removed.
- Replace Kafka receiver
traces.topic with the list-valued traces.topics.
- Remove the Cassandra
namespace option and the unused Badger namespace
field.
- Migrate legacy Elasticsearch rotation flags to the newer rotation schema.
- Do not instantiate the former standalone
jaegermcp extension; configure
MCP through jaegerquery.
Configure the unified runtime
Use environment interpolation for deploy-time values and --set for targeted
path overrides:
receivers:
otlp:
protocols:
grpc:
endpoint: "${env:JAEGER_LISTEN_HOST:-localhost}:4317"
jaeger --config config.yaml \
--set=receivers.otlp.protocols.grpc.endpoint=0.0.0.0:4317
For a reverse proxy, set jaeger_query.base_path to the prefix Jaeger itself
receives. Leave it / when the proxy strips the external browser prefix.
Build a storage pipeline
- Register named trace and metric backends under
jaeger_storage.
- Point
jaeger_storage_exporter at the trace backend used for writes.
- Point
jaeger_query at the corresponding read backend and optional metrics
backend.
- Configure exporter queueing and retry behavior for transient failures.
- Validate backend authentication and forwarded headers independently for
read, write, and administration paths.
- Exercise trace, service, operation, dependency, and summary reads required
by the chosen backend.
Backend maturity is not uniform. In particular, ClickHouse, data-stream
rotation, and several SPM paths are explicitly experimental; inspect
storage-backends.md before depending on them.
Sampling and trace processing
- The distribution includes tail-based sampling and the filter processor.
- Use
adaptive_sampling to calculate per-service and per-endpoint
probabilities from observed traffic.
- Configure
remote_sampling with a static strategy file or an adaptive store,
then enable its HTTP or gRPC server.
- File strategies can reload periodically.
- Default per-operation strategies are inherited; review combinations of
defaults and service-specific rules.
- The legacy remote-sampling response representation is unsupported.
extensions:
remote_sampling:
adaptive:
sampling_store: sampling_store
initial_sampling_probability: 0.1
http:
grpc:
Query, SPM, and metrics
- Supply optional time windows for trace lookup where supported.
- Use custom Prometheus query parameters, TLS, or SigV4 when the metrics
backend requires them.
- Let storage capabilities determine whether the UI exposes SPM.
- Expect corrected OpenTelemetry metric names without a duplicated
_total
suffix.
- Use
/quality-metrics and /deep-dependencies for their dedicated data.
- Keep dashboards and alerts aligned with the metrics-exporter and SPM assets.
Operate ingestion safely
- The OTLP receiver may listen on all interfaces; bind it deliberately and
align firewall or network-policy rules.
- Account for enabled UDP ports in all-in-one deployments.
- Invalid OTLP payloads return a client error, while malformed names, timing,
UTF-8, and some tag forms are normalized or accepted.
- Use the health-check extension for health endpoints and
pprof only with
deliberate access controls.
- Configure Kafka TLS/authentication combinations, topic lists, and the
ingester metrics port explicitly.
- Validate storage exporter queue and retry settings under failure.
See ingestion-operations.md.
Serve the UI behind a proxy
- Distinguish the prefix received by Jaeger from the prefix visible before a
stripping proxy.
- The frontend can discover its URL prefix and its API v3 client honors the
configured base path.
- Keep trace IDs opaque in UI integrations.
- Test current browsers only; legacy-browser support has ended.
- Use pnpm for UI and embedded-UI build workflows.
The UI reference also covers trace summaries, search tables, DAG and trace
layouts, flamegraphs, themes, trace-wide logs, and shareable Monitor filters.
Enable MCP and AI deliberately
- Set
ai.enabled explicitly when AI-assisted UI behavior is desired; its
default is disabled.
- Configure the MCP endpoint in
jaegerquery, with tenancy, CORS, handler
limits, response limits, and session scope appropriate to the deployment.
- Expect tool results to report truncation and total counts where applicable.
- Trace the UI, gateway, and sidecar path with OTLP and propagated trace
context when diagnosing AI-assisted behavior.
See mcp-ai.md for tool evolution and experimental
surface details.
Upgrade verification
Before promoting a changed deployment:
- Validate the Collector configuration and component factories.
- Confirm query HTTP and gRPC listeners use separate ports.
- Exercise ingestion over every enabled OTLP, UDP, or Kafka path.
- Write and retrieve a trace, then search services, operations, attributes,
dependencies, and summaries as required.
- Verify storage authentication, TLS, forwarded headers, health-check timeout,
queueing, retry, and receive-size limits.
- Compare dashboard and alert queries with emitted metric names.
- Test UI routing through the real reverse proxy and browser prefix.
- Gate experimental storage, MCP, AI, and trace-layout features separately
from core collection and query readiness.
1---2name: jaeger-knowledge-patch-23description: Jaeger4license: MIT5---678# Jaeger Knowledge Patch910Use this skill when designing, migrating, configuring, extending, or operating11Jaeger. It focuses on the unified v2 runtime, storage API evolution, query and12sampling behavior, operational components, and current UI and AI integrations.1314## Reference index1516| Reference | Topics |17| --- | --- |18| [runtime-configuration.md](references/runtime-configuration.md) | Unified binary and roles, Collector-style YAML, overrides, server ports, image and build changes |19| [storage-backends.md](references/storage-backends.md) | Storage contracts, named wiring, Elasticsearch/OpenSearch, Cassandra, memory, gRPC, ClickHouse, Badger |20| [query-sampling-metrics.md](references/query-sampling-metrics.md) | Query APIs, trace adjustment, sampling, SPM, Prometheus, trace summaries |21| [ingestion-operations.md](references/ingestion-operations.md) | OTLP and Kafka ingestion, extensions, telemetry, sanitization, deployment and monitoring assets |22| [ui.md](references/ui.md) | Base paths, search, trace views, DAGs, themes, links, logs, Monitor filters, build tooling |23| [mcp-ai.md](references/mcp-ai.md) | MCP consolidation, tools and limits, AG-UI, AI feature gates, GenAI views and tracing |2425## Start with the breaking migrations2627### Move deployments to the unified runtime2829- Run the `jaeger` binary or image. Do not plan around separately published v130 collector, query, ingester, all-in-one, or agent artifacts.31- Express each role as a Collector-style YAML configuration. Existing v132 environment variables are not automatically translated into v2 settings.33- Treat Jaeger as an OpenTelemetry Collector distribution. Add an upstream34 Collector only where a sidecar, host agent, or preprocessing tier is useful.35- Remove the retired `grpc-plugin` storage type and legacy36 `storage/v1/grpc` integration.37- Give query HTTP and gRPC servers distinct listen ports.3839See [runtime-configuration.md](references/runtime-configuration.md) for role40composition, configuration overrides, image tags, and source-build changes.4142### Revalidate storage wiring4344V2 storage is name-based:4546```yaml47extensions:48 jaeger_storage:49 backends:50 trace_store:51 memory:52 max_traces: 10000053 jaeger_query:54 storage:55 traces: trace_store5657exporters:58 jaeger_storage_exporter:59 trace_storage: trace_store60```6162- Configure exactly one backend type per trace- or metric-storage entry.63- Use the same registered backend name from readers and writers.64- Replace archive-specific interfaces with the unified storage contract.65- Update experimental or custom v2 storage implementations for streaming trace66 reads, direct OTLP stream elements, current request messages, and67 context-aware dependency writes.68- Review Elasticsearch index mappings, aliases, rotation, authentication, and69 trace-duration settings before an upgrade.70- Remove Elasticsearch 6 and Cassandra 3 from supported deployment plans.7172The backend-specific migration details are in73[storage-backends.md](references/storage-backends.md).7475### Update API clients and extensions7677- The metrics-query gRPC service and `metricsquery.proto` are gone.78- Trace request time fields and several storage-v2 request and response shapes79 changed; regenerate clients from the matching IDL.80- API v2 and v3 query handlers apply trace adjusters. Do not assume returned81 span ordering or timestamps are raw storage values.82- API v3 service-list success responses use empty collections instead of83 `null`.84- Prefer trace-summary search for lightweight result sets.85- Treat snake_case gateway parameters and `query.num_traces` as compatibility86 aliases; use camelCase and `query.search_depth`.87- Treat HTTP trace identifiers as opaque because base64 identifiers are valid.8889See [query-sampling-metrics.md](references/query-sampling-metrics.md).9091### Remove stale feature and configuration switches9293- Remove `sampling.strategies.bugfix-5270`; the corrected behavior is stable.94- Do not script `jaeger features`; the briefly introduced command was removed.95- Replace Kafka receiver `traces.topic` with the list-valued `traces.topics`.96- Remove the Cassandra `namespace` option and the unused Badger namespace97 field.98- Migrate legacy Elasticsearch rotation flags to the newer rotation schema.99- Do not instantiate the former standalone `jaegermcp` extension; configure100 MCP through `jaegerquery`.101102## Configure the unified runtime103104Use environment interpolation for deploy-time values and `--set` for targeted105path overrides:106107```yaml108receivers:109 otlp:110 protocols:111 grpc:112 endpoint: "${env:JAEGER_LISTEN_HOST:-localhost}:4317"113```114115```sh116jaeger --config config.yaml \117 --set=receivers.otlp.protocols.grpc.endpoint=0.0.0.0:4317118```119120For a reverse proxy, set `jaeger_query.base_path` to the prefix Jaeger itself121receives. Leave it `/` when the proxy strips the external browser prefix.122123## Build a storage pipeline1241251. Register named trace and metric backends under `jaeger_storage`.1262. Point `jaeger_storage_exporter` at the trace backend used for writes.1273. Point `jaeger_query` at the corresponding read backend and optional metrics128 backend.1294. Configure exporter queueing and retry behavior for transient failures.1305. Validate backend authentication and forwarded headers independently for131 read, write, and administration paths.1326. Exercise trace, service, operation, dependency, and summary reads required133 by the chosen backend.134135Backend maturity is not uniform. In particular, ClickHouse, data-stream136rotation, and several SPM paths are explicitly experimental; inspect137[storage-backends.md](references/storage-backends.md) before depending on them.138139## Sampling and trace processing140141- The distribution includes tail-based sampling and the filter processor.142- Use `adaptive_sampling` to calculate per-service and per-endpoint143 probabilities from observed traffic.144- Configure `remote_sampling` with a static strategy file or an adaptive store,145 then enable its HTTP or gRPC server.146- File strategies can reload periodically.147- Default per-operation strategies are inherited; review combinations of148 defaults and service-specific rules.149- The legacy remote-sampling response representation is unsupported.150151```yaml152extensions:153 remote_sampling:154 adaptive:155 sampling_store: sampling_store156 initial_sampling_probability: 0.1157 http:158 grpc:159```160161## Query, SPM, and metrics162163- Supply optional time windows for trace lookup where supported.164- Use custom Prometheus query parameters, TLS, or SigV4 when the metrics165 backend requires them.166- Let storage capabilities determine whether the UI exposes SPM.167- Expect corrected OpenTelemetry metric names without a duplicated `_total`168 suffix.169- Use `/quality-metrics` and `/deep-dependencies` for their dedicated data.170- Keep dashboards and alerts aligned with the metrics-exporter and SPM assets.171172## Operate ingestion safely173174- The OTLP receiver may listen on all interfaces; bind it deliberately and175 align firewall or network-policy rules.176- Account for enabled UDP ports in all-in-one deployments.177- Invalid OTLP payloads return a client error, while malformed names, timing,178 UTF-8, and some tag forms are normalized or accepted.179- Use the health-check extension for health endpoints and `pprof` only with180 deliberate access controls.181- Configure Kafka TLS/authentication combinations, topic lists, and the182 ingester metrics port explicitly.183- Validate storage exporter queue and retry settings under failure.184185See [ingestion-operations.md](references/ingestion-operations.md).186187## Serve the UI behind a proxy188189- Distinguish the prefix received by Jaeger from the prefix visible before a190 stripping proxy.191- The frontend can discover its URL prefix and its API v3 client honors the192 configured base path.193- Keep trace IDs opaque in UI integrations.194- Test current browsers only; legacy-browser support has ended.195- Use pnpm for UI and embedded-UI build workflows.196197The UI reference also covers trace summaries, search tables, DAG and trace198layouts, flamegraphs, themes, trace-wide logs, and shareable Monitor filters.199200## Enable MCP and AI deliberately201202- Set `ai.enabled` explicitly when AI-assisted UI behavior is desired; its203 default is disabled.204- Configure the MCP endpoint in `jaegerquery`, with tenancy, CORS, handler205 limits, response limits, and session scope appropriate to the deployment.206- Expect tool results to report truncation and total counts where applicable.207- Trace the UI, gateway, and sidecar path with OTLP and propagated trace208 context when diagnosing AI-assisted behavior.209210See [mcp-ai.md](references/mcp-ai.md) for tool evolution and experimental211surface details.212213## Upgrade verification214215Before promoting a changed deployment:2162171. Validate the Collector configuration and component factories.2182. Confirm query HTTP and gRPC listeners use separate ports.2193. Exercise ingestion over every enabled OTLP, UDP, or Kafka path.2204. Write and retrieve a trace, then search services, operations, attributes,221 dependencies, and summaries as required.2225. Verify storage authentication, TLS, forwarded headers, health-check timeout,223 queueing, retry, and receive-size limits.2246. Compare dashboard and alert queries with emitted metric names.2257. Test UI routing through the real reverse proxy and browser prefix.2268. Gate experimental storage, MCP, AI, and trace-layout features separately227 from core collection and query readiness.