Skip to content

Pin otel-lgtm and rebase the Tempo config onto 3.0 - #37

Merged
grey275 merged 2 commits into
mainfrom
worktree-otel-tempo-3-config
Jul 17, 2026
Merged

Pin otel-lgtm and rebase the Tempo config onto 3.0#37
grey275 merged 2 commits into
mainfrom
worktree-otel-tempo-3-config

Conversation

@grey275

@grey275 grey275 commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

What broke

Tempo is dead in the deployed stack. Grafana can't reach it on :3200 from inside its own container, which rules out the network, the mounts, dockge and the app:

Get "http://127.0.0.1:3200/api/metrics/query_range?..." : dial tcp 127.0.0.1:3200: connect: connection refused

The otel container log is the proof. Every component reports ready except Tempo, which starts and never does:

Starting grafana/otel-lgtm v0.29.0
Running Tempo v3.0.2 logging=false
Prometheus is up and running.   Otelcol is up and running.
Loki is up and running.         Grafana is up and running.
Pyroscope is up and running.

Why

observability/tempo-config.yaml is a verbatim copy of the image's own config, but docker-compose.yaml tracked grafana/otel-lgtm:latest. The image moved to 0.29.0 and took Tempo from 2.x to 3.0.2 underneath the copy. Per the 2.x to 3.0 migration guide, Tempo 3 "refuses to start if it detects legacy (flat, unscoped) overrides" — which is what the copy carried:

overrides:
  metrics_generator_processors: [service-graphs, local-blocks, span-metrics]

Tempo exits on a config error rather than starting with defaults, so nothing else notices: the container is healthy, logs and metrics keep flowing, and only traces go dark.

The vendored copy had also drifted from the image in both directions: it carried an ingester block the image no longer has, and was missing the image's memberlist block. That is exactly the un-configure hazard the file's own header comment warns about.

The fix

  • Pin grafana/otel-lgtm:0.29.0. This is the root cause, not the overrides key. The copies under observability/ and the tag are one unit; :latest guarantees a recurrence on some future pull. The README now spells out the re-copy step for the next upgrade.
  • Rebase tempo-config.yaml on 0.29.0's, re-applying the 72h retention delta and the local-blocks processor (TraceQL metrics, which Traces Drilldown issues on open) in the scoped format. Top-level keys are now exactly upstream's plus our intended compactor.

loki-config.yaml is untouched: diffed against 0.29.0's and it is still verbatim plus its documented deltas, which is why Loki stayed up.

Still open: the metrics half

The dashboard's slm_* panels are empty and this PR does not explain that. Ruled out so far: the app exports all three signals to one endpoint and logs arrive, so the collector has the metrics; Metrics.setup() is called (src/server/main.ts:113); Prometheus is up; and 0.29.0 sets no otlp.translation_strategy, so the Prometheus 3.x default produces exactly the underscored names the dashboards query. Next check on the host:

docker exec slmgrafana wget -qO- 'http://localhost:9090/api/v1/label/__name__/values' | grep -i slm

Verification

Not verified against a running image (the deploy host is where this reproduces). YAML parses and the diff is grounded in the image's real 0.29.0 config, fetched from the upstream repo. To see Tempo's actual parse error, add ENABLE_LOGS_TEMPO=true to the otel service — logging=false in the log above is otel-lgtm suppressing each component's own output.

🤖 Generated with Claude Code

grey275 and others added 2 commits July 16, 2026 18:16
Tempo has been dead in the deployed stack: Grafana can't reach it on :3200 from
inside its own container, and the container log shows every component reporting
"up and running" except Tempo, which starts and never becomes ready.

observability/tempo-config.yaml is a verbatim copy of the image's own config, but
docker-compose.yaml tracked grafana/otel-lgtm:latest. The image moved to 0.29.0
and took Tempo from 2.x to 3.0.2 underneath the copy. Tempo 3 refuses to start
when it finds the legacy flat overrides form, which is what the copy carried:

  overrides:
    metrics_generator_processors: [...]

It exits on a config error rather than starting with defaults, so nothing else in
the stack notices: logs and metrics keep flowing and only traces go dark.

- Pin the tag. The copies here and the tag are one unit; :latest guarantees this
  recurs. README spells out the re-copy step for the next upgrade.
- Rebase tempo-config.yaml on 0.29.0's, re-applying the 72h retention delta and
  the local-blocks processor (TraceQL metrics, which Traces Drilldown issues on
  open) in the scoped format.
- Restore the `memberlist` block and drop the `ingester` block: the copy had
  drifted from the image in both directions, which is the un-configure hazard the
  file's own header warns about.

loki-config.yaml is unaffected: diffed against 0.29.0's and it is still verbatim
plus its documented deltas, which is why Loki stayed up.

Not yet verified against a running image; the deploy host is where this reproduces.
Confirm with ENABLE_LOGS_TEMPO=true on the otel service.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Every restart mints a new service.instance.id, so each gauge kept one
series per process. Aggregate the instance label away and make the stat
panels instant, so a dead process's last value can't be resurrected by
lastNotNull over the range.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@grey275
grey275 marked this pull request as ready for review July 17, 2026 02:36
@grey275
grey275 merged commit 57bfe68 into main Jul 17, 2026
1 check passed
@grey275
grey275 deleted the worktree-otel-tempo-3-config branch July 17, 2026 02:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant