From 5e6f26f20900b665a155e51edb2667889ff4a17b Mon Sep 17 00:00:00 2001 From: atlas Date: Tue, 18 Aug 2026 22:16:41 +0200 Subject: [PATCH] fix(#3471): keep Metrics Drilldown, which declarativePlugins had silently removed Setting declarativePlugins to any list -- the empty one included -- also sets upstream's plugins.preinstall_disabled, which nixpkgs defaults to declarativePlugins != null. Preinstall is what fetches the Drilldown apps on first start, so claiming the plugin directory removed them without touching anything a person had installed. The comment above that line reasoned about the plugin path and the update check and never about preinstall, and its closing claim -- nothing is taken over on a hive with no plugins -- was true only of plugins a PERSON installs. Upstream installs some itself, and those are the ones that went missing. Listing it as a package is better than the preinstall it replaces: store pinned, no runtime fetch from grafana.com, survives a state reset. Its Logs/Traces/Profiles siblings stay off -- they front Loki, Tempo and Pyroscope, none of which this swarm runs. --- nix/host-modules/swarm-grafana.nix | 33 +++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/nix/host-modules/swarm-grafana.nix b/nix/host-modules/swarm-grafana.nix index 79a99907..cb1a1e38 100644 --- a/nix/host-modules/swarm-grafana.nix +++ b/nix/host-modules/swarm-grafana.nix @@ -177,7 +177,8 @@ in plugins = lib.mkOption { type = lib.types.listOf lib.types.package; - default = [ ]; + default = [ pkgs.grafanaPlugins.grafana-metricsdrilldown-app ]; + defaultText = lib.literalExpression "[ pkgs.grafanaPlugins.grafana-metricsdrilldown-app ]"; example = lib.literalExpression "[ pkgs.grafanaPlugins.grafana-piechart-panel ]"; description = '' Grafana plugins to install, as packages. Declarative rather than @@ -193,9 +194,18 @@ in and in git, so they survive a container rebuild and a state reset, and the container needs no runtime egress to grafana.com. - Empty by default, which leaves grafana's own plugin handling - untouched. Setting it takes over the plugin directory entirely — - anything installed by other means stops being visible. + ⚠️ This list is the ONLY way a plugin reaches this Grafana. + Setting it at all disables upstream's `preinstall` mechanism (see + the `declarativePlugins` comment below), which is what normally + fetches the Drilldown apps on first start — so a plugin left off + this list is absent, not merely un-pinned. + + Metrics Drilldown is on by default because this swarm's Grafana + exists to read VictoriaMetrics, and the queryless metrics browser + is the part of that people actually reach for. Its Logs / Traces / + Profiles siblings are deliberately NOT here: they front Loki, + Tempo and Pyroscope, none of which this swarm runs, so they would + install a UI for a backend that does not answer. ''; }; }; @@ -475,9 +485,18 @@ in # property this option exists for — it should not arrive only # once a plugin happens to be listed. # - # Nothing is taken over by claiming the directory on a hive with no - # plugins: manual installation is already impossible here (see the - # option's description), so there is nothing in it to lose. + # - 🩸 and the one this comment used to miss: it also sets + # upstream's `plugins.preinstall_disabled` (nixpkgs' + # grafana.nix defaults it to `declarativePlugins != null`, + # saying preinstall "causes issues with declarativePlugins"). + # Preinstall is what fetches the Drilldown apps on first + # start, so claiming this directory silently removes them. + # That is why the option's default is not empty. + # + # The claim that used to sit here — "nothing is taken over on a + # hive with no plugins, manual installation is impossible anyway" + # — reasoned only about plugins a PERSON installs. Upstream + # installs some itself, and those are the ones that went missing. declarativePlugins = cfg.plugins; settings = {