Jaeger Knowledge Patch
Use this skill when migrating, configuring, extending, or operating Jaeger v2. Start with the breaking-change checklist, then open the reference matching the work at hand. Treat the project's manifests, configuration, generated APIs, tests, and observed runtime behavior as authoritative.
Reference index
| Reference | Topics | | --- | --- | | runtime-configuration-and-migration.md | Unified runtime roles, Collector YAML, server configuration, named storage, base paths, source builds | | storage-backends-and-contracts.md | Storage v2 and remote-storage contracts, memory, Badger, Cassandra, ClickHouse | | elasticsearch-and-opensearch.md | Backend compatibility, mappings, aliases, rotation, lifecycle, authentication, summaries | | query-sampling-metrics-and-telemetry.md | Sampling, query APIs, normalization, Prometheus, SPM, internal telemetry | | operations-deployment-and-development.md | Pipelines, endpoints, Compose and Kubernetes assets, dashboards, platforms | | ui-and-integrations.md | Search, trace visualization, Monitor, themes, MCP, AI-assisted integrations |
Breaking-change checklist
Distribution and configuration
- Deploy the unified
jaegerbinary or image. Do not expect a separately publishedjaeger-agent, v1 service image, orv1image tag. - Express runtime roles as Collector-style YAML. V1 environment variables are not automatically translated into v2 settings.
- Review query HTTP/TLS settings and assign separate listen ports to the HTTP and gRPC query servers.
- Select exactly one backend type in each trace- or metric-storage configuration.
- Replace Kafka receiver
traces.topicwith list-valuedtraces.topics. - Use Go 1.25.7 for source builds and pnpm for UI or embedded-UI builds.
Removed contracts and compatibility paths
- Remove the
grpc-pluginstorage type and migrate offstorage/v1/grpc. - Replace archive-specific storage interfaces with the unified storage factories.
- Update remote-storage implementations for streaming
GetTraces, direct OTLP stream elements, current request/response fields, andFindTraceIDsRequest. - Remove the metric-query gRPC service and the metric-store minimum-step API from custom integrations.
- Remove
sampling.strategies.bugfix-5270; its corrected behavior is stable. - Update remote-sampling clients that parse the removed legacy response.
- Do not script around
jaeger features; that command was reverted. - Replace imports that moved under Go
internalpackages.
Storage and backend upgrades
- Upgrade Cassandra 3.x and Elasticsearch 6 before upgrading Jaeger.
- Recheck Elasticsearch/OpenSearch TLS, mappings, aliases, authentication, rotation, trace-duration, and legacy trace-ID settings.
- Plan for materialized
span.kindandspan.status, populatedparentspanid, and mapped OTLP scope/link fields. - Treat API keys, bearer tokens, and SigV4 as mutually constrained authentication choices; let validation reject incompatible combinations.
- Update custom dependency writers to accept and propagate context.
Query and response behavior
- Expect trace adjusters to modify clock skew, duplicates, identifiers, and attribute/event ordering in API results.
- Treat invalid OTLP payloads as HTTP 400 request failures.
- Expect empty service queries to return an empty collection.
- Accept camel-case API v3 parameters while migrating away from deprecated
snake-case aliases and
query.num_traces. - Treat trace IDs as opaque strings; query endpoints may receive base64 identifiers.
- Update dashboards and alerts for the corrected counter suffix behavior and the newer SPM namespace.
Runtime quick reference
Override Collector YAML
Use environment interpolation for deploy-time values and --set for a dotted
path:
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
This also works for paths in the built-in all-in-one configuration. Remember that the OTLP receiver can listen on all interfaces; bind and filter it deliberately.
Wire named storage
Register backends once in jaeger_storage, select them for reads in
jaeger_query, and select the trace backend for writes in
jaeger_storage_exporter:
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 exporter queueing and retries when storage failures or bursts must be buffered.
Configure path-prefixed deployments
jaeger_query.base_path describes the path Jaeger receives:
extensions:
jaeger_query:
base_path: /jaeger
Leave it / if a reverse proxy strips the external prefix. Otherwise use the
forwarded prefix. The path must begin with / and must not contain .. or
duplicate slashes. The UI can discover its browser prefix automatically, and
API v3 requests honor the prefix.
Configure remote sampling
adaptive_sampling calculates service and endpoint probabilities.
remote_sampling serves a static file or adaptive store over HTTP or gRPC:
extensions:
remote_sampling:
adaptive:
sampling_store: sampling_store
initial_sampling_probability: 0.1
http:
grpc:
Review inherited per-operation defaults and use a reload interval when a strategy file must update without restart.
Storage quick reference
Remote storage
-
Use the v2 factory and streaming contracts for trace, service, operation, dependency, and trace-ID operations.
-
Forward tenant or authentication headers only when the backend expects them.
-
Set
max_recv_msg_size_mibwhen the default gRPC receive limit is too small:max_recv_msg_size_mib: 64 -
Keep the remote-storage server's write path on the normal OTLP receiver/exporter pipeline.
Elasticsearch and OpenSearch
-
Use the mapping generator embedded in
jaeger. Select OpenSearch output with:jaeger esmapping-generator --backend opensearch -
Rollover initialization is idempotent, but rotation configuration has moved toward the new schema; legacy rotation and cleaner flags are deprecated.
-
Use a disabled health check or bounded startup timeout only when the backend's startup behavior requires it.
-
Apply
custom_headersconsistently, including host overrides, and ensure signed writes have replayable bodies. -
Prefer native trace summaries where supported; query falls back to aggregating full traces otherwise.
Cassandra, memory, and ClickHouse
- Let Cassandra create its schema at session initialization, set replication as needed, and configure a non-default compaction window explicitly.
- Memory searches cover OTLP fields, link attributes, and string-form error filters.
- Treat ClickHouse support as experimental. Check the exact read, write, metadata, SPM, dependency, TTL, and TLS capabilities needed by the deployment.
Query and UI quick reference
- Use
GET /api/v3/trace-summariesfor lightweight searches andquery.attributesonGET /api/v3/tracesfor attribute filtering. - Use storage capabilities, not configuration guesses, to decide whether SPM and the Monitor tab are available.
- Account for input sanitization of invalid UTF-8, empty services, negative durations, and empty span names.
- Search results default to a sortable table. Monitor filters persist through URL parameters, and trace views include aggregate logs, service filtering, and a native flamegraph.
- AI-assisted features are opt-in with
ai.enabled: true. MCP tooling lives injaegerquery, is session-scoped, and may enforce tenancy and response limits.
Verification checklist
- Start each configured role and confirm component validation succeeds.
- Verify HTTP and gRPC query listeners use distinct, intended addresses.
- Ingest OTLP over every enabled protocol and confirm normalized spans are searchable.
- Exercise trace retrieval, summary search, services, operations, dependencies, and attribute filters against the selected backend.
- Test archive behavior through the unified factory rather than old archive interfaces.
- Validate proxy-prefix routing from browser URL through API v3.
- Check storage authentication, forwarded headers, TLS, health timeout, queueing, retries, and message-size limits.
- Reconcile dashboards, alerts, and scrape targets with current metric names, namespaces, ports, and storage capabilities.
- Confirm the UI's browser, package-manager, theme, search, and optional AI requirements match the deployment policy.