ERS uses OpenTelemetry for distributed tracing. Tracing is disabled by default and must be explicitly enabled via environment variables.
Jaeger runs as an optional service in the dev-tools Docker Compose profile.
1. Start services with Jaeger:
make up-with-dev-tools # start all services + Jaeger
make down-with-dev-tools # stop all services + Jaeger2. Enable tracing in src/infra/.env:
TRACING_ENABLED=true
OTEL_SERVICE_NAME=entity-resolution-service
OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_ENDPOINTmust be the base URL only — the SDK appends/v1/tracesautomatically. Do not include the path.
3. Open the Jaeger UI: http://localhost:16686
Send at least one request to the ERS or Curation API first so spans are available.
- Search — open http://localhost:16686 and go to the Search tab (top nav).
- Select a service — pick
entity-resolution-service(or the service name set inOTEL_SERVICE_NAME) from the Service dropdown. - Narrow the results — optionally pick an Operation, set a Lookback window (e.g. Last 1 Hour), and click Find Traces.
- Inspect a trace — click any result row to open the waterfall view. Each bar is a span; its width is proportional to duration. Spans are nested to show parent-child relationships across service calls.
- Expand a span — click a span bar to see its tags (HTTP method, status code, DB query, etc.) and any recorded exceptions.
Full UI reference: https://www.jaegertracing.io/docs/latest/frontend-ui/
| Variable | Default | Description |
|---|---|---|
TRACING_ENABLED |
false |
Set to true to enable span export |
OTEL_SERVICE_NAME |
entity-resolution-service |
Service name shown in the trace backend |
OTEL_EXPORTER_OTLP_ENDPOINT |
— | Base URL of the OTLP receiver (no path suffix) |
OTEL_EXPORTER_OTLP_PROTOCOL |
— | Transport protocol; use http/protobuf |
OTEL_EXPORTER_OTLP_HEADERS |
— | Auth headers for remote backends |
OTEL_RESOURCE_ATTRIBUTES |
— | Extra resource tags (namespace, environment, etc.) |