Observability

  • Changed

    • Upgrade upstream loki helm chart from v13 (13.7.2) to v18 (18.10.1). Loki app version goes from 3.7.2 to 3.7.6.
    • Breaking: loki.networkPolicy.flavor is gone. Upstream dropped Cilium network policy support, so this chart renders the CiliumNetworkPolicy resources itself, switched by the new top-level ciliumNetworkPolicy.enabled (default true). Set it to false where you used flavor: kubernetes. The standard NetworkPolicy resources now render alongside them.
    • The ServiceMonitor is no longer gated on the prometheus-operator CRD being present: set loki.monitoring.serviceMonitor.enabled: false on clusters without it.
    • The built-in MinIO subchart is deprecated upstream: loki.minio.enabled now also needs loki.ignoreMinioDeprecation: true, and goes away on 2026-10-31.
  • Added

    • Add startsAt, endsAt, and duration fields to the v1alpha2 Silence CRD for explicit silence scheduling. duration accepts weeks (w), days (d), hours (h), minutes (m), and seconds (s), each at most once and ordered largest to smallest: "7d", "2w", "1d12h". endsAt and duration are mutually exclusive. When neither is set, the valid-until annotation is used as a fallback.

    Changed

    • Regenerate .github/workflows/zz_generated.*.yaml via devctl to use the centralized reusable workflow, removing the Node-20 mindsers/changelog-reader-action dependency.
    • Update Go dependencies, which resolves CVE-2026-63209 (github.com/klauspost/compress) and CVE-2026-56852 (golang.org/x/text) and removes their .nancy-ignore entries.

    Fixed

    • Quote the = scalars in the generated matchType CRD schema so the rendered chart parses under PyYAML (unblocks the HelmTemplateValidator step added in app-build-suite 2.2.0).
    • Fix various CVEs by updating dependencies:
    • Skip failing CI jobs using private secrets for external contributions from fork
    • Replace deprecated controller-runtime scheme.Builder with apimachinery runtime.NewSchemeBuilder
    • Fix gosec, goconst and errcheck linter errors in tests
  • Changed

    • Upgrade upstream loki helm chart from v13.5.0 to v13.7.2. Loki app version goes from 3.7.1 to 3.7.2 (CVE fixes, ruler panic fix, S3 SDK bump).
    • k8s-sidecar bumped 2.7.1 → 2.7.3.
  • Added

    • Support for Azure Workload Identity

    Changed

    • Move the AWS and Azure deployment instructions out of the README into docs/deploying-on-aws.md and docs/deploying-on-azure.md.

    Fixed

    • Add a kubernetes-flavor NetworkPolicy granting the backend pods egress to the kube-apiserver (TCP 443/6443) to fix standalone platforms and CI tests.
    • Fix ABS config to not override AppVersion in Chart.yaml
  • Changed

    • Fix ABS config to not override AppVersion in Chart.yaml
    • Upgrade grafana chart: 12.3.0 => 12.10.3
    • Upgrade grafana (appVersion): 13.0.1 => 13.1.2
    • Upgrade postgresql-cnpg: 18.3 => 18.4 — the rolling DB upgrade can cause ~5min of Grafana downtime.

    Removed

    • The upstream chart no longer creates a Role/RoleBinding when grafana.rbac.namespaced is false (our default). Those objects were empty, sidecar permissions come from the ClusterRole.
  • Changed

    • Values: Generate schema for Alloy PodLogs CRDs.
    • Values: Add Cilium as dependency for Alloy apps & Kube Prometheus Stack.
    • Values: Update Alloy apps to v0.21.2.

    Removed

    • Values: Remove unused catalog.
  • Added

    • Add a nav bar between the four Envoy Gateway dashboards, like the Cilium ones have.

    Changed

    • Give Envoy Gateway | Clusters a readable uid. Links to its old random uid stop resolving.
    • Rename the cluster variable on Cilium Agent logs to cluster_id, matching the other Cilium dashboards so the selection carries across links.
    • Rename workload_cluster to cluster_id on the Envoy Gateway dashboards, so the selection carries when moving between them. On Clusters its label is K8s Cluster, to tell it apart from the Envoy cluster selector.
    • Hide the datasource selector on the Cilium and Envoy Gateway dashboards and point it at the default datasource, instead of the exported uids that only resolved in the Grafana a board came from.

    Removed

    • Drop the Cluster selector from Envoy Gateway | Clusters. Every panel also matched on the namespace, resource and rule selectors, which compose the same Envoy cluster name.

    Fixed

    • Give Cilium | Agent its own uid instead of reusing the retired Cilium metrics dashboard’s, which kept it from being created.
    • Give Envoy Gateway | Control Plane its own uid instead of reusing the retired Global dashboard’s, which kept it from being created.
  • Changed

    • Chart: Install Vertical Pod Autoscaler independent of API availability.
  • Fixed

    • Setting alloy.enabled: false now disables the whole chart on its own and renders nothing. Previously it only dropped the upstream Alloy chart, and the Giant Swarm templates (NetworkPolicy, Kyverno PolicyException, VerticalPodAutoscaler, PodLogs, extra env Secret) failed to render with no template "alloy.chart" associated with template "gotpl" unless networkPolicy.flavor and kyvernoPolicyExceptions.enabled were also overridden.

    Added

    • Add a make test-chart target and a test-chart workflow that render the chart with every ci/*-values.yaml file and assert it renders nothing when disabled and all of its objects when enabled. Unlike ct lint, these use a current Helm, which is required to catch template rendering errors.
  • Added

    • Add the Envoy Gateway | Overview dashboard: a lean single-pane health view (traffic, latency, error rate, saturation) that avoids duplicating the detail boards.
    • Add a downstream request-latency heatmap to Envoy Gateway | Clusters.
    • Add an Envoy Gateway controller logs panel to the Control Plane dashboard.
    • Publish the Flux Logs dashboard to Shared Org / GitOps. It covers the Flux controllers on the management cluster; workload-cluster Flux logs are not ingested yet, because the flux-system namespace there has no tenant assignment and Alloy drops untenanted pod logs.
    • Add scripts/update-flux-dashboards.sh (make update-flux-dashboards), which syncs the Flux dashboards from fluxcd/flux2-monitoring-example and re-applies our patches. It runs in the monthly dashboard-update workflow and fails loudly if a patch stops applying.
    • Add Organization and Cluster selectors to both Flux dashboards. They are deployed to the management cluster’s Grafana, whose Mimir holds metrics for every workload cluster, so until now every panel aggregated across a customer’s whole fleet.
    • Replace the Cilium dashboards with a set of four: Cilium | Overview for triage, Cilium | Agent, Cilium | Datapath & Policy and Cilium | Operator. Rows load collapsed and the per-agent panels use topk, so the entry point is no longer a 355 kB dashboard that fires 75 queries at once.
    • Add Cilium | Operator. The cilium-operator PodMonitor has always been enabled, but none of its metrics were graphed: identity garbage collection, workqueues, unmanaged pods and LB-IPAM.

    Changed

    • Consolidate the Envoy / Gateway API dashboards down to four: Overview, Clusters, Access Logs and Control Plane. The Control Plane board (formerly Global) absorbs the config push status panels, and Logs is renamed to Access Logs.
    • Synced Flux dashboards from fluxcd/flux2-monitoring-example@7ab65dc.
    • Anchor the etcd-health dashboard cluster selector to etcd_server_id instead of up, so clusters with a managed control plane (aks, eks) no longer appear as empty options.

    Removed

    • Remove the redundant Envoy Gateway | Proxy Global and Envoy Gateway | Configuration dashboards, folded into the boards above.

    Fixed

    • Fix the Flux Cluster Stats dashboard, which showed no data at all: every panel queried gotk_reconcile_condition, a metric the Flux controllers no longer expose. It now uses gotk_resource_info, the same metric our Flux alerting rules use, and gains upstream’s Suspended Objects panel.
    • De-duplicate gotk_resource_info on the Flux Cluster Stats dashboard. On management clusters both flux-ksm and kube-state-metrics export identical series, so the resource counts read exactly double.
    • Scope the Flux Control Plane dashboard to the Flux namespace. Its controller_runtime_* panels matched any operator exposing the same controller label values (for example controller="helmrelease" is also emitted by dex-operator and team-stamper).
    • Widen the Flux Control Plane range windows from [1m] to [$__rate_interval]. With our 60s scrape interval a one-minute window cannot hold two samples, so the reconciliation and API-request panels were empty. The ops/min panels use rate(...) * 60 so they stay per-minute rather than reporting the count over the whole (range-dependent) window.
    • Point the Flux Cluster Stats targets at the $datasource variable. Seven of them were pinned to a prometheus datasource uid that does not exist here, and the target-level datasource overrides the panel.
    • Restrict the Flux namespace selector on Flux Control Plane to the Flux controller pods. It was derived from a generic controller-runtime metric, so on a management cluster it also offered external-secrets, giantswarm and kube-system, and the dashboard could open on another operator’s data.
    • Fix the worker count expression on the Nodes Overview dashboard.
    • Fix the monthly dashboard-update workflow, which called a make update-mixin target that no longer exists (it was renamed to update-all-mixin), so the automation failed instead of opening a PR.

    Removed

    • Remove the Cilium Metrics and Cilium performance dashboards, replaced by the set above. 16 of their panels queried metrics Cilium no longer exposes (the kvstore and BPF syscall sections, the L7 proxy counters and the policy trigger panels), and Cilium performance duplicated the Overview.