summaryrefslogtreecommitdiff
path: root/modules/prometheus.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/prometheus.nix')
-rw-r--r--modules/prometheus.nix185
1 files changed, 116 insertions, 69 deletions
diff --git a/modules/prometheus.nix b/modules/prometheus.nix
index 63b761f..83eda86 100644
--- a/modules/prometheus.nix
+++ b/modules/prometheus.nix
@@ -1,11 +1,18 @@
-{ lib, config, ... }:
+{
+ lib,
+ config,
+ inventory,
+ self_name,
+ options,
+ ...
+}:
let
cfg = config.wilkuu.services.prometheus;
+ mon = inventory.${self_name}.monitoring;
inherit (lib)
mkEnableOption
mkIf
mkMerge
- mkDefault
;
in
{
@@ -15,16 +22,45 @@ in
};
config = mkMerge [
- (mkIf cfg.enableExporters {
- services.prometheus.exporters = {
- wireguard.enable = mkDefault config.networking.wireguard.enable;
- fail2ban.enable = mkDefault config.services.fail2ban.enable;
- node = {
+ (mkIf cfg.enableExporters (
+ let
+ data = lib.mapAttrs (
+ _name: mn:
+ let
+ default = (builtins.filter (a: builtins.isString a) mn);
+ custom = (builtins.filter (a: builtins.isAttrs a) mn);
+ in
+ {
+ ports =
+ builtins.map (n: options.services.prometheus.exporters.value.${n}.port) default
+ ++ (builtins.map (a: a.port) custom);
+ custom_port_mappings = builtins.listToAttrs (
+ map ({ name, port, ... }: {
+ inherit name;
+ value = port;
+ }) custom
+ );
+ exporter_services =
+ default
+ ++ (builtins.map (a: a.name) (builtins.filter ((a: !(a.skipExporterConfig or false))) custom));
+ }
+ ) mon;
+ data_all = (lib.foldl lib.recursiveUpdate { } (lib.attrValues data));
+ in
+ {
+ # Enable all the exporters outlined in the inventory
+ services.prometheus.exporters = lib.genAttrs data_all.exporter_services (name: {
enable = true;
- };
- };
+ port = lib.mkIf (data_all.custom_port_mappings ? name) data_all.custom_port_mappings.${name};
+
+ });
+ # Let all the exporters export on all layers
+ wilkuu.firewall.layers = lib.mapAttrs (_n: a: {
+ allowedTCPPorts = a.ports;
+ }) data;
+ }
+ ))
- })
(mkIf cfg.enableScraper {
sops.secrets = {
"prometheus/stalwart-pass" = {
@@ -52,76 +88,87 @@ in
services.prometheus =
let
- omega-relay-ip = "192.168.80.100";
+ nets_in_layer = inv: layer: lib.filterAttrs (_n: ifi: (ifi.layer or "") == layer) inv.interfaces;
+ dests_in_layer =
+ inv: layer: port:
+ (map (net: "${net.ip}:${toString port}") (lib.attrValues (nets_in_layer inv layer)));
+
+ job_destinations = (
+ builtins.foldl'
+ (
+ acc: perHost:
+ (builtins.foldl' (
+ acc2: hostMonitorName:
+ let
+ current = acc2.${hostMonitorName} or [ ];
+ new = perHost.${hostMonitorName};
+ in
+ acc2 // { ${hostMonitorName} = current ++ new; }
+ ) acc (lib.attrNames perHost))
+ )
+ { }
+ (
+ lib.mapAttrsToList (
+ _host: inv:
+ (lib.foldl' (a: b: a // b) { } (
+ lib.mapAttrsToList (
+
+ layer: lst:
+ (lib.listToAttrs (
+ builtins.map (
+ a:
+ let
+ ifSimple =
+ a: t: f:
+ if builtins.isString a then t else f;
+ name = ifSimple a a a.name;
+ port = ifSimple a options.services.prometheus.exporters.value.${a}.port (
+ a.port or options.services.prometheus.exporters.${a.name}.port.default
+ );
+ in
+ {
+ inherit name;
+ value = (dests_in_layer inv layer port);
+ }
+ ) lst
+ ))
+ ) inv.monitoring
+ ))
+ ) inventory
+ )
+ );
+
in
{
enable = true;
globalConfig = {
scrape_interval = "10s";
};
- scrapeConfigs = [
- {
- job_name = "node";
- static_configs =
- let
- port = toString config.services.prometheus.exporters.node.port;
- in
- [
- {
- targets = [
- "localhost:${port}"
- "${omega-relay-ip}:${port}"
- ];
- }
- ];
- }
- {
- job_name = "wireguard";
- static_configs =
- let
- port = toString config.services.prometheus.exporters.wireguard.port;
- in
- [
- { targets = [ "${omega-relay-ip}:${port}" ]; }
- ];
- }
- {
- job_name = "fail2ban";
- static_configs =
- let
- port = toString config.services.prometheus.exporters.fail2ban.port;
- in
- [
- { targets = [ "${omega-relay-ip}:${port}" ]; }
- ];
-
- }
- {
- job_name = "stalwart";
- metrics_path = "/metrics/prometheus";
- scheme = "https";
- basic_auth = {
- username = "prometheus_wilkuu";
- password_file = config.sops.secrets."prometheus/stalwart-pass".path;
- };
+ scrapeConfigs =
+ (lib.mapAttrsToList (name: dests: {
+ job_name = name;
static_configs = [
{
- targets = [ "mail.wilkuu.xyz:443" ];
+ targets = dests;
}
];
- }
- {
- job_name = "mikrotik";
- static_configs =
- let
- port = toString config.services.prometheus.exporters.mikrotik.port;
- in
- [
- { targets = [ "localhost:${port}" ]; }
+ }) job_destinations)
+ ++ [
+ {
+ job_name = "stalwart";
+ metrics_path = "/metrics/prometheus";
+ scheme = "https";
+ basic_auth = {
+ username = "prometheus_wilkuu";
+ password_file = config.sops.secrets."prometheus/stalwart-pass".path;
+ };
+ static_configs = [
+ {
+ targets = [ "mail.wilkuu.xyz:443" ];
+ }
];
-
- }
- ];
+ }
+ ];
};
})
];