{config, ...}: let inherit (config.services) prometheus; nodes = [ "alpine" "100.106.49.128" # laptop "100.65.29.110" # gaming pc ]; addPort = ip: "${ip}:${toString prometheus.exporters.node.port}"; in { services.prometheus = { enable = true; scrapeConfigs = [ { job_name = "nodes"; static_configs = [ { targets = builtins.map addPort nodes; } ]; } { job_name = "prometheus"; static_configs = [ { targets = ["localhost:${toString config.services.prometheus.exporters.postgres.port}"]; } ]; } ]; rules = [ (builtins.toJSON { groups = [{ name = "node"; rules = [ { alert = "io error"; expr = ''node_filesystem_device_error{device_error!="permission denied"} > 0''; } { alert = "disk full"; expr = ''node_filesystem_avail_bytes{fstype=~"ext4|btrfs"} < ${toString (50 * 1024 * 1024 * 1024)}''; } ]; }]; }) ]; alertmanagers = [ { static_configs = [ { targets = [ "localhost:9093" ]; } ]; } ]; exporters = { postgres = { enable = true; runAsLocalSuperUser = true; }; }; alertmanager = { enable = true; configuration = { receivers = [{ name = "ntfy"; webhook_configs = [{ url = "http://localhost${config.services.ntfy-sh.settings.listen-http}/alert/trigger"; }]; }]; route = { receiver = "ntfy"; # routes = [{ # matchers = [ # ''node_filesystem_device_error != 0'' # ]; # }]; }; }; }; # alertmanager-ntfy = { # enable = true; # settings = { # ntfy = { # baseurl = "https://up.tristans.cloud"; # notification = { # topic = "alert"; # }; # }; # }; # }; }; services.grafana.provision.datasources.settings.datasources = [{ name = "Prometheus"; type = "prometheus"; url = "http://localhost:${toString prometheus.port}"; }]; }