nix

configuration files that power my machines
Log | Files | Refs | README | LICENSE

default.nix (6297B)


      1 {
      2   config,
      3   lib,
      4   haravara,
      5   ...
      6 }: let
      7   cfg = config.services.haravara.monitoring;
      8   authSnippet = haravara.mkAuthImport cfg.authLabel;
      9 in {
     10   imports = [
     11     ./alertmanager.nix
     12     ./exporters.nix
     13     ./grafana.nix
     14     ./loki.nix
     15     ./vmalert.nix
     16   ];
     17 
     18   options.services.haravara.monitoring = {
     19     enable = lib.mkEnableOption "Monitoring stack (VictoriaMetrics + Grafana)";
     20 
     21     grafanaDomain = lib.mkOption {
     22       type = lib.types.str;
     23       description = "Domain for the Grafana dashboard";
     24     };
     25     victoriaDomain = lib.mkOption {
     26       type = lib.types.str;
     27       description = "Domain for VictoriaMetrics";
     28     };
     29     authLabel = haravara.authLabelOption;
     30     grafanaSecretKeyFile = lib.mkOption {
     31       type = lib.types.path;
     32       description = "Path to Grafana secret key file";
     33     };
     34 
     35     victoriametrics = {
     36       enable = lib.mkEnableOption "VictoriaMetrics time-series database" // {default = true;};
     37       address = lib.mkOption {
     38         type = lib.types.str;
     39         default = "127.0.0.1:8428";
     40         description = "Address for VictoriaMetrics to listen on";
     41       };
     42       dataDir = lib.mkOption {
     43         type = lib.types.str;
     44         default = "/data/victoriametrics";
     45         description = "Directory for VictoriaMetrics data";
     46       };
     47       extraScrapeConfigs = lib.mkOption {
     48         type = lib.types.listOf lib.types.attrs;
     49         default = [];
     50         description = "Extra Prometheus scrape configs for VictoriaMetrics";
     51       };
     52     };
     53   };
     54 
     55   config = lib.mkIf cfg.enable {
     56     users = {
     57       groups.victoriametrics = lib.mkIf cfg.victoriametrics.enable {};
     58       users.victoriametrics = lib.mkIf cfg.victoriametrics.enable {
     59         isSystemUser = true;
     60         group = "victoriametrics";
     61       };
     62     };
     63 
     64     systemd = {
     65       tmpfiles.rules = lib.optionals cfg.victoriametrics.enable [
     66         "d ${cfg.victoriametrics.dataDir} - victoriametrics victoriametrics -"
     67       ];
     68 
     69       services.victoriametrics = lib.mkIf cfg.victoriametrics.enable {
     70         after = ["var-lib-victoriametrics.mount"];
     71         requires = ["var-lib-victoriametrics.mount"];
     72         serviceConfig = {
     73           User = "victoriametrics";
     74           Group = "victoriametrics";
     75           StateDirectory = lib.mkForce "";
     76           DynamicUser = lib.mkForce false;
     77           ReadWritePaths = ["/var/lib/victoriametrics"];
     78         };
     79       };
     80     };
     81 
     82     fileSystems = lib.optionalAttrs cfg.victoriametrics.enable {
     83       "/var/lib/victoriametrics" = {
     84         device = cfg.victoriametrics.dataDir;
     85         fsType = "none";
     86         options = ["bind" "nofail"];
     87       };
     88     };
     89 
     90     services.victoriametrics = lib.mkIf cfg.victoriametrics.enable {
     91       enable = true;
     92       listenAddress = cfg.victoriametrics.address;
     93       extraOptions =
     94         lib.optional cfg.vmalert.enable
     95         "-vmalert.proxyURL=http://127.0.0.1:${toString cfg.vmalert.port}";
     96       prometheusConfig = {
     97         global.scrape_interval = "30s";
     98         scrape_configs =
     99           (lib.optionals cfg.exporters.enable [
    100             {
    101               job_name = "node_exporter";
    102               static_configs =
    103                 [{targets = ["127.0.0.1:${toString config.services.prometheus.exporters.node.port}"];}]
    104                 ++ cfg.exporters.extraNodeStaticConfigs;
    105             }
    106             {
    107               job_name = "systemd_exporter";
    108               static_configs =
    109                 [{targets = ["127.0.0.1:${toString config.services.prometheus.exporters.systemd.port}"];}]
    110                 ++ cfg.exporters.extraSystemdStaticConfigs;
    111               metrics_path = "/metrics";
    112             }
    113           ])
    114           ++ lib.optional config.services.haravara.seaweedfs.enable {
    115             job_name = "seaweedfs";
    116             static_configs = [
    117               {
    118                 targets = [
    119                   "127.0.0.1:9324"
    120                   "127.0.0.1:9325"
    121                   "127.0.0.1:9326"
    122                   "127.0.0.1:9327"
    123                 ];
    124               }
    125             ];
    126           }
    127           ++ [
    128             {
    129               job_name = "caddy";
    130               static_configs = [{targets = ["127.0.0.1:2019"];}];
    131             }
    132           ]
    133           ++ lib.optional cfg.loki.enable {
    134             job_name = "loki";
    135             static_configs = [{targets = ["127.0.0.1:${toString cfg.loki.port}"];}];
    136           }
    137           ++ lib.optional config.services.haravara.corpus.enable {
    138             job_name = "corpus";
    139             static_configs = [{targets = ["127.0.0.1:${toString config.services.haravara.corpus.port}"];}];
    140             metrics_path = "/metrics";
    141           }
    142           ++ lib.optional cfg.vmalert.enable {
    143             job_name = "vmalert";
    144             static_configs = [{targets = ["127.0.0.1:${toString cfg.vmalert.port}"];}];
    145           }
    146           ++ lib.optional cfg.alertmanager.enable {
    147             job_name = "alertmanager";
    148             static_configs = [{targets = ["127.0.0.1:${toString cfg.alertmanager.port}"];}];
    149           }
    150           ++ lib.optional cfg.exporters.blackbox.enable {
    151             job_name = "blackbox_exporter";
    152             metrics_path = "/probe";
    153             static_configs =
    154               lib.optional (cfg.exporters.blackbox.http_targets != []) {
    155                 targets = cfg.exporters.blackbox.http_targets;
    156                 labels.__param_module = "http";
    157               }
    158               ++ lib.optional (cfg.exporters.blackbox.tcp_targets != []) {
    159                 targets = cfg.exporters.blackbox.tcp_targets;
    160                 labels.__param_module = "tcp_connect";
    161               };
    162             relabel_configs = [
    163               {
    164                 source_labels = ["__address__"];
    165                 target_label = "__param_target";
    166               }
    167               {
    168                 source_labels = ["__param_target"];
    169                 target_label = "instance";
    170               }
    171               {
    172                 target_label = "__address__";
    173                 replacement = "127.0.0.1:${toString cfg.exporters.blackbox.port}";
    174               }
    175             ];
    176           }
    177           ++ cfg.victoriametrics.extraScrapeConfigs;
    178       };
    179     };
    180 
    181     services.caddy.virtualHosts = lib.optionalAttrs cfg.victoriametrics.enable {
    182       "${cfg.victoriaDomain}".extraConfig = ''
    183         ${authSnippet}
    184         reverse_proxy ${cfg.victoriametrics.address}
    185       '';
    186     };
    187   };
    188 }