From f463644f1b3d2488a6ddecb0b5cb2936777f7ef8 Mon Sep 17 00:00:00 2001 From: Romain Paquet Date: Mon, 25 Aug 2025 07:21:21 +0200 Subject: [PATCH] create prometheus clan service --- clanServices/flake-module.nix | 5 ++ clanServices/prometheus/default.nix | 110 +++++++++++++++++++++++ clanServices/prometheus/flake-module.nix | 4 + flake.nix | 1 + 4 files changed, 120 insertions(+) create mode 100644 clanServices/flake-module.nix create mode 100644 clanServices/prometheus/default.nix create mode 100644 clanServices/prometheus/flake-module.nix diff --git a/clanServices/flake-module.nix b/clanServices/flake-module.nix new file mode 100644 index 0000000..64844d9 --- /dev/null +++ b/clanServices/flake-module.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./prometheus/flake-module.nix + ]; +} diff --git a/clanServices/prometheus/default.nix b/clanServices/prometheus/default.nix new file mode 100644 index 0000000..cdb929e --- /dev/null +++ b/clanServices/prometheus/default.nix @@ -0,0 +1,110 @@ +{ self, ... }: +{ lib, ... }: +{ + _class = "clan.service"; + manifest.name = "prometheus"; + + # Only works with zerotier (until a unified network module is ready) + + roles.scraper = { + interface = { + options.extraScrapeConfigs = lib.mkOption { + type = lib.types.listOf lib.types.attrs; + description = "A list of additional scrape configurations."; + }; + }; + + perInstance = + { + settings, + roles, + ... + }: + { + nixosModule = + { config, lib, ... }: + { + services.prometheus.enable = true; + services.prometheus.scrapeConfigs = + let + allExporters = lib.unique ( + lib.concatLists ( + lib.map (machine: lib.attrNames machine.settings.exporters) (lib.attrValues roles.target.machines) + ) + ); + hasExporter = + exporter: machine: lib.hasAttr exporter roles.target.machines.${machine}.settings.exporters; + mkScrapeConfig = ( + exporter: + let + machinesWithExporter = lib.filter (hasExporter exporter) (lib.attrNames roles.target.machines); + in + { + job_name = exporter; + static_configs = lib.map (machineName: { + targets = + let + targetConfig = self.nixosConfigurations.${machineName}.config; + targetHost = targetConfig.clan.core.vars.generators.zerotier.files.zerotier-ip.value; + in + [ + "${targetHost}:${toString targetConfig.services.prometheus.exporters.${exporter}.port}" + ]; + labels.instance = machineName; + }) machinesWithExporter; + } + ); + in + (lib.map mkScrapeConfig allExporters) ++ settings.extraScrapeConfigs; + + clan.core.state.prometheus.folders = [ config.services.prometheus.stateDir ]; + }; + }; + }; + + roles.target = { + interface = + { lib, ... }: + { + options = { + exporters = lib.mkOption { + type = lib.types.attrs; + default = { }; + example = { + node = { + enabledCollectors = [ "systemd" ]; + port = 9002; + }; + }; + description = "Attribute set of exporters to enable"; + }; + }; + }; + + perInstance = + { + instanceName, + settings, + machine, + roles, + ... + }: + { + nixosModule = + { config, lib, ... }: + { + services.prometheus.exporters = builtins.mapAttrs ( + name: exporterSettings: + exporterSettings + // { + enable = true; + } + ) settings.exporters; + + networking.firewall.interfaces."zts7mq7onf".allowedTCPPorts = lib.map ( + exporterName: config.services.prometheus.exporters.${exporterName}.port + ) (lib.attrNames settings.exporters); + }; + }; + }; +} diff --git a/clanServices/prometheus/flake-module.nix b/clanServices/prometheus/flake-module.nix new file mode 100644 index 0000000..0c56386 --- /dev/null +++ b/clanServices/prometheus/flake-module.nix @@ -0,0 +1,4 @@ +{ self, lib, ... }: +{ + clan.modules."@rpqt/prometheus" = lib.modules.importApply ./default.nix { inherit self; }; +} diff --git a/flake.nix b/flake.nix index 742d435..40a62d2 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,7 @@ inputs.clan-core.flakeModules.default inputs.nix-topology.flakeModule + ./clanServices/flake-module.nix ./devShells/flake-module.nix ./machines/flake-module.nix ./modules/flake-module.nix