{ nodes, lib, config, ... }: with lib; let name = "prometheus"; cfg = config.services.skynet."${name}"; in { imports = []; options.services.skynet."${name}" = { server = { enable = mkEnableOption "Prometheus Server"; host = { ip = mkOption { type = types.str; }; name = mkOption { type = types.str; }; }; port = mkOption { type = types.port; default = 9001; }; other_nodes = mkOption { type = types.listOf types.str; description = '' To add other nodes outside of nix, specify ip and port that server should listen to here ''; }; }; port_collecter = mkOption { type = types.port; default = 9002; }; }; config = { services.prometheus.exporters.node = { enable = true; # most collectors are on by default see docs for more options enabledCollectors = ["systemd"]; port = cfg.port_collecter; }; } // mkIf cfg.server.enable { services.prometheus = { enable = true; port = cfg.server.port; scrapeConfigs = [ { job_name = "node_exporter"; static_configs = [ { targets = (map (hostname: "${hostname}:${cfg.port_collecter}") (lib.attrsets.mapAttrsToList (server: server.deployment.hostname)) nodes) ++ cfg.other_nodes; } ]; } ]; }; }; }