Pin otel-lgtm and rebase the Tempo config onto 3.0 - #37
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What broke
Tempo is dead in the deployed stack. Grafana can't reach it on
:3200from inside its own container, which rules out the network, the mounts, dockge and the app:The otel container log is the proof. Every component reports ready except Tempo, which starts and never does:
Why
observability/tempo-config.yamlis a verbatim copy of the image's own config, butdocker-compose.yamltrackedgrafana/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: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
ingesterblock the image no longer has, and was missing the image'smemberlistblock. That is exactly the un-configure hazard the file's own header comment warns about.The fix
grafana/otel-lgtm:0.29.0. This is the root cause, not the overrides key. The copies underobservability/and the tag are one unit;:latestguarantees a recurrence on some future pull. The README now spells out the re-copy step for the next upgrade.tempo-config.yamlon 0.29.0's, re-applying the 72h retention delta and thelocal-blocksprocessor (TraceQL metrics, which Traces Drilldown issues on open) in the scoped format. Top-level keys are now exactly upstream's plus our intendedcompactor.loki-config.yamlis 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 nootlp.translation_strategy, so the Prometheus 3.x default produces exactly the underscored names the dashboards query. Next check on the host: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=trueto the otel service —logging=falsein the log above is otel-lgtm suppressing each component's own output.🤖 Generated with Claude Code