Skip to content

feat: follow the loki and tempo charts to their new home, and notice next time - #190

Merged
stxkxs merged 1 commit into
mainfrom
feat/chart-provenance
Aug 8, 2026
Merged

feat: follow the loki and tempo charts to their new home, and notice next time#190
stxkxs merged 1 commit into
mainfrom
feat/chart-provenance

Conversation

@stxkxs

@stxkxs stxkxs commented Aug 8, 2026

Copy link
Copy Markdown
Member

Two charts moved. Only one of them said so.

tempo — flagged, easy to find

grafana/tempo is deprecated: true, and its README names where it went:

This chart is being migrated to grafana-community/helm-charts. After January 30th, 2026, updates and support for this chart will be provided in the new repository.

The community repo carries the full chart history rather than restarting — same chart, same single-binary topology, renumbered at the fork. 1.24.42.2.3, app 2.9.02.10.7.

tempo-distributed is not the successor. It was deprecated in the same move and lives in the community repo too.

loki — the one nothing would have caught

The OSS chart moved to the same place, forked at 6.55.0. What stayed behind at grafana/helm-charts is now maintained for Grafana Enterprise Logs only:

As of March 16, 2026, the Grafana Loki Helm chart for OSS users has moved to grafana-community/helm-charts (forked at chart version 6.55.0). The chart in this repository is now maintained for Grafana Enterprise Logs (GEL) users only.

Its description literally reads Helm chart for Grafana Enterprise Logs.... It carries no deprecation flag. The pin resolved, the chart installed, every gate stayed green, and Renovate kept offering 7.x patches. This catalog was tracking a different product, and the only field that had changed was the description.

7.2.018.7.5 (the OSS lineage, continuous from the fork point).

Verification

Rendered both charts against the committed values, every environment, and compared:

old new
loki retention_enabled True True
loki working_directory /var/loki/compactor /var/loki/compactor
loki delete_request_store filesystem filesystem
loki schema v13 / filesystem v13 / filesystem
loki workloads loki, canary, chunks-cache, gateway, results-cache identical
tempo receivers jaeger, otlp, zipkin jaeger, otlp, zipkin
tempo storage local /var/tempo/traces local /var/tempo/traces

tempo's whole manifest diff is the image bump, one newly-explicit default (stream_over_http_enabled: false), and upstream dropping the OpenCensus receiver port that nothing here enabled.

task validate passes — 109 addon×env combinations rendered, 0 failed.

kx needs one real change, in that repo. The new loki chart mounts its own emptyDir at /var/loki when persistence is off — precisely the gap kx's workaround existed to fill — so keeping the workaround gives the main container two mounts on one path, which the API server rejects. helm template exits 0 on it; only a per-container mountPath comparison sees it. eks-gitops is unaffected because it uses a PVC.

The check

scripts/check-chart-deprecation.py, split by what is and isn't a function of this commit:

  • offline, in the appsets job, blocking — every pinned chart has a provenance record and every record names a chart still pinned.
  • --live, weekly schedule — fetches all 30 pinned charts, fails on deprecated: true or a description that no longer matches its record.

That split is deliberate. Whether upstream deprecated something overnight is not something a PR caused, and gating merges on it reddens changes that aren't at fault — the same reasoning that keeps mirror-check freshness off the blocking path. It's also why the live half is its own workflow: the merge gate refuses a workflow containing a job it doesn't watch, and counts a skipped dependency as failure, so a schedule-only job can't live in ci.yml.

Proof it catches the real thing

Run against the pre-migration pins:

FAIL  2 problem(s) across 30 pinned chart(s):
        loki changed what it says it is.
            recorded: Helm chart for Grafana Loki supporting monolithic, simple scalable, and microservices modes.
            upstream: Helm chart for Grafana Enterprise Logs supporting monolithic, simple scalable, and microservices modes.
        tempo 1.24.4 is marked deprecated by upstream (https://grafana.github.io/helm-charts).

Both actual failures, including the one with no flag. --self-test breaks the offline gate five ways and fails unless each is rejected, with the shipped catalog as a control.

The record lives in scripts/ rather than beside the pins because kubeconform scans applicationsets/ and reads every file there as a manifest — it failed exactly that way on the first attempt. Exempting it would have meant weakening a schema gate to make room for a new file.

…next time

Both observability charts moved out of grafana/helm-charts. One said so; the
other did not, and that is the more interesting half.

─── tempo ───

The chart is flagged `deprecated: true` and its README names the destination:
grafana-community/helm-charts, which carries the full history rather than
restarting. Same chart, same single-binary topology, renumbered at the fork, so
1.24.4 becomes 2.2.3 and the app moves 2.9.0 -> 2.10.7.

tempo-distributed is not the successor. It was deprecated in the same move.

─── loki ───

The OSS chart moved to the same place, forked at 6.55.0. What stayed behind at
grafana/helm-charts is now maintained for Grafana Enterprise Logs only — its
description says "Grafana Enterprise Logs" and its 7.x line is the GEL line.

It carries no deprecation flag. The pin resolved, the chart installed, every
gate stayed green, and Renovate went on offering 7.x patches. The catalog was
tracking a different product and the only field that had changed was the
description.

─── What the migration actually required ───

Rendering both charts against the committed values, per environment, shows the
configuration carries over intact: receivers, storage backend, schema v13,
retention, the compactor block and its retention_enabled pair, and the same
five loki workloads. tempo's manifest diff is an image bump, one newly-explicit
default, and upstream dropping the OpenCensus receiver port nothing here
enabled.

kx needs one real change, which is in that repo: the new loki chart mounts its
own emptyDir at /var/loki when persistence is off, so the workaround kx carried
for exactly that gap now produces two mounts on one path. `helm template` exits
0 on it. Only a per-container mountPath comparison sees it.

─── The check ───

scripts/check-chart-deprecation.py, split by what is and is not a function of
this commit:

  offline, in the appsets job, BLOCKING — every pinned chart has a provenance
      record and every record names a chart still pinned. Cannot change without
      a commit, so it belongs in the merge path.

  --live, on a weekly schedule — fetches all 30 pinned charts and fails on a
      `deprecated: true` or a description that no longer matches its record.

The split matters. Whether upstream deprecated something overnight is not
something a pull request caused, and gating merges on it reddens changes that
are not at fault — the same reasoning that keeps mirror-check's freshness
question off the blocking path. It is also why the live half is its own
workflow: the merge gate refuses a workflow containing a job it does not watch
and counts a skipped dependency as failure, so a schedule-only job cannot live
in ci.yml.

Recording the description is what catches the loki class. Against the
pre-migration pins the live check reports both failures: tempo as deprecated,
and loki as having changed what it says it is. --self-test breaks the offline
gate five ways and fails unless each is rejected, with the shipped catalog as
the control.

The record sits in scripts/ rather than beside the pins because kubeconform
scans applicationsets/ and reads every file there as a manifest. Exempting it
would have meant weakening a schema gate to make room for a new file.
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown

CI Results

Check Status
Zero-placeholder gate ✅ success
YAML Lint ✅ success
Dashboard gate (live grafana.com ids + AMG-saveable) ✅ success
Kyverno policy tests (+ verify-images contract) ✅ success
Fork-safety gate (no hardcoded org, blocking) ✅ success
Helm-render (every addon × every env) ✅ success
Policy-admission (Enforce-tier Kyverno vs the fleet) ✅ success
ApplicationSet schema + sync waves ✅ success
Appset render (Karpenter subnet selector) ✅ success
Secret scan (gitleaks) ✅ success
Render + assert + schema + misconfig (all environments) ✅ success

All checks passed.

@stxkxs
stxkxs merged commit 614560a into main Aug 8, 2026
21 checks passed
@stxkxs
stxkxs deleted the feat/chart-provenance branch August 8, 2026 08:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant