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 }