diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2026-07-26 15:57:41 +0200 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2026-07-26 15:57:41 +0200 |
| commit | 8ba70c22bd912ed75253203222dc93437b9273d4 (patch) | |
| tree | 79bbe2c83057b184900ead39d89a07626c8a1aec | |
| parent | a4b683444e596fc2086b0363740e484d8eec0f33 (diff) | |
| download | nixos-8ba70c22bd912ed75253203222dc93437b9273d4.tar nixos-8ba70c22bd912ed75253203222dc93437b9273d4.tar.gz nixos-8ba70c22bd912ed75253203222dc93437b9273d4.tar.bz2 nixos-8ba70c22bd912ed75253203222dc93437b9273d4.tar.xz nixos-8ba70c22bd912ed75253203222dc93437b9273d4.zip | |
...flakes
| -rw-r--r-- | accounts/gkleen@sif/systemd.nix | 6 | ||||
| -rw-r--r-- | hosts/vidhar/prometheus/default.nix | 5 | ||||
| -rw-r--r-- | modules/prometheus.nix | 2048 | ||||
| -rw-r--r-- | overlays/etesync-dav.nix | 6 |
4 files changed, 2058 insertions, 7 deletions
diff --git a/accounts/gkleen@sif/systemd.nix b/accounts/gkleen@sif/systemd.nix index 7aee29c5..a2d6e4ff 100644 --- a/accounts/gkleen@sif/systemd.nix +++ b/accounts/gkleen@sif/systemd.nix | |||
| @@ -27,7 +27,7 @@ let | |||
| 27 | 27 | ||
| 28 | newpid="" | 28 | newpid="" |
| 29 | i=200 | 29 | i=200 |
| 30 | while ! newpid=$(${lib.getExe pkgs.lsof} -Pi @localhost:"''${port}" -sTCP:LISTEN -t); do | 30 | while ! { newpid=$(${lib.getExe' pkgs.iproute2 "ss"} -HO -pln "src localhost sport ''${port}" | ${lib.getExe pkgs.gnused} -r 's/^.*pid=([0-9]+).*$/\1/'); [[ -n $newpid ]] }; do |
| 31 | if ! kill -0 "''${pid}"; then | 31 | if ! kill -0 "''${pid}"; then |
| 32 | wait "''${pid}" | 32 | wait "''${pid}" |
| 33 | exit $? | 33 | exit $? |
| @@ -403,7 +403,7 @@ in { | |||
| 403 | PollLimitBurst = 6; | 403 | PollLimitBurst = 6; |
| 404 | }; | 404 | }; |
| 405 | Install = { | 405 | Install = { |
| 406 | WantedBy = ["default.target"]; | 406 | WantedBy = ["sockets.target"]; |
| 407 | }; | 407 | }; |
| 408 | }) [8118 8122 8124 8126]) // { | 408 | }) [8118 8122 8124 8126]) // { |
| 409 | "proxy-to-autossh-socks@8120" = { | 409 | "proxy-to-autossh-socks@8120" = { |
| @@ -414,7 +414,7 @@ in { | |||
| 414 | PollLimitBurst = 20; | 414 | PollLimitBurst = 20; |
| 415 | }; | 415 | }; |
| 416 | Install = { | 416 | Install = { |
| 417 | WantedBy = ["default.target"]; | 417 | WantedBy = ["sockets.target"]; |
| 418 | }; | 418 | }; |
| 419 | }; | 419 | }; |
| 420 | "yt-dlp" = { | 420 | "yt-dlp" = { |
diff --git a/hosts/vidhar/prometheus/default.nix b/hosts/vidhar/prometheus/default.nix index c0941688..a68172d2 100644 --- a/hosts/vidhar/prometheus/default.nix +++ b/hosts/vidhar/prometheus/default.nix | |||
| @@ -27,9 +27,12 @@ in { | |||
| 27 | 27 | ||
| 28 | extraFlags = [ | 28 | extraFlags = [ |
| 29 | "--web.enable-remote-write-receiver" | 29 | "--web.enable-remote-write-receiver" |
| 30 | "--storage.tsdb.retention.size=35GB" | ||
| 31 | ]; | 30 | ]; |
| 32 | 31 | ||
| 32 | extraConfig = { | ||
| 33 | storage.tsdb.retention.percentage = 80; | ||
| 34 | }; | ||
| 35 | |||
| 33 | exporters = { | 36 | exporters = { |
| 34 | node = { | 37 | node = { |
| 35 | enable = true; | 38 | enable = true; |
diff --git a/modules/prometheus.nix b/modules/prometheus.nix new file mode 100644 index 00000000..cda3a8cf --- /dev/null +++ b/modules/prometheus.nix | |||
| @@ -0,0 +1,2048 @@ | |||
| 1 | { | ||
| 2 | config, | ||
| 3 | pkgs, | ||
| 4 | lib, | ||
| 5 | ... | ||
| 6 | }: | ||
| 7 | |||
| 8 | with lib; | ||
| 9 | |||
| 10 | let | ||
| 11 | yaml = pkgs.formats.yaml { }; | ||
| 12 | cfg = config.services.prometheus; | ||
| 13 | checkConfigEnabled = | ||
| 14 | (lib.isBool cfg.checkConfig && cfg.checkConfig) || cfg.checkConfig == "syntax-only"; | ||
| 15 | |||
| 16 | workingDir = "/var/lib/" + cfg.stateDir; | ||
| 17 | |||
| 18 | triggerReload = pkgs.writeShellScriptBin "trigger-reload-prometheus" '' | ||
| 19 | PATH="${makeBinPath (with pkgs; [ systemd ])}" | ||
| 20 | if systemctl -q is-active prometheus.service; then | ||
| 21 | systemctl reload prometheus.service | ||
| 22 | fi | ||
| 23 | ''; | ||
| 24 | |||
| 25 | reload = pkgs.writeShellScriptBin "reload-prometheus" '' | ||
| 26 | PATH="${ | ||
| 27 | makeBinPath ( | ||
| 28 | with pkgs; | ||
| 29 | [ | ||
| 30 | systemd | ||
| 31 | coreutils | ||
| 32 | gnugrep | ||
| 33 | ] | ||
| 34 | ) | ||
| 35 | }" | ||
| 36 | cursor=$(journalctl --show-cursor -n0 | grep -oP "cursor: \K.*") | ||
| 37 | kill -HUP $MAINPID | ||
| 38 | journalctl -u prometheus.service --after-cursor="$cursor" -f \ | ||
| 39 | | grep -m 1 "Completed loading of configuration file" > /dev/null | ||
| 40 | ''; | ||
| 41 | |||
| 42 | # a wrapper that verifies that the configuration is valid | ||
| 43 | promtoolCheck = | ||
| 44 | what: name: file: | ||
| 45 | if checkConfigEnabled then | ||
| 46 | pkgs.runCommand "${name}-${replaceStrings [ " " ] [ "" ] what}-checked" | ||
| 47 | { | ||
| 48 | preferLocalBuild = true; | ||
| 49 | nativeBuildInputs = [ cfg.package.cli ]; | ||
| 50 | } | ||
| 51 | '' | ||
| 52 | ln -s ${file} $out | ||
| 53 | promtool ${what} $out | ||
| 54 | '' | ||
| 55 | else | ||
| 56 | file; | ||
| 57 | |||
| 58 | generatedPrometheusYml = yaml.generate "prometheus.yml" promConfig; | ||
| 59 | |||
| 60 | # This becomes the main config file for Prometheus | ||
| 61 | promConfig = lib.recursiveUpdate { | ||
| 62 | global = filterValidPrometheus cfg.globalConfig; | ||
| 63 | scrape_configs = filterValidPrometheus cfg.scrapeConfigs; | ||
| 64 | remote_write = filterValidPrometheus cfg.remoteWrite; | ||
| 65 | remote_read = filterValidPrometheus cfg.remoteRead; | ||
| 66 | rule_files = optionals (!(cfg.enableAgentMode)) ( | ||
| 67 | map (promtoolCheck "check rules" "rules") ( | ||
| 68 | cfg.ruleFiles | ||
| 69 | ++ optionals (builtins.length cfg.rules > 0) [ | ||
| 70 | (pkgs.writeText "prometheus.rules" (concatStringsSep "\n" cfg.rules)) | ||
| 71 | ] | ||
| 72 | ) | ||
| 73 | ); | ||
| 74 | alerting = { | ||
| 75 | inherit (cfg) alertmanagers; | ||
| 76 | }; | ||
| 77 | } cfg.extraConfig; | ||
| 78 | |||
| 79 | prometheusYml = | ||
| 80 | let | ||
| 81 | yml = | ||
| 82 | if cfg.configText != null then | ||
| 83 | pkgs.writeText "prometheus.yml" cfg.configText | ||
| 84 | else | ||
| 85 | generatedPrometheusYml; | ||
| 86 | in | ||
| 87 | promtoolCheck "check config ${ | ||
| 88 | lib.optionalString (cfg.checkConfig == "syntax-only") "--syntax-only" | ||
| 89 | }" "prometheus.yml" yml; | ||
| 90 | |||
| 91 | cmdlineArgs = | ||
| 92 | cfg.extraFlags | ||
| 93 | ++ [ | ||
| 94 | "--config.file=${if cfg.enableReload then "/etc/prometheus/prometheus.yaml" else prometheusYml}" | ||
| 95 | "--web.listen-address=${cfg.listenAddress}:${toString cfg.port}" | ||
| 96 | ] | ||
| 97 | ++ ( | ||
| 98 | if (cfg.enableAgentMode) then | ||
| 99 | [ | ||
| 100 | "--agent" | ||
| 101 | ] | ||
| 102 | else | ||
| 103 | [ | ||
| 104 | "--alertmanager.notification-queue-capacity=${toString cfg.alertmanagerNotificationQueueCapacity}" | ||
| 105 | "--storage.tsdb.path=${workingDir}/data/" | ||
| 106 | ] | ||
| 107 | ) | ||
| 108 | ++ optional (cfg.webExternalUrl != null) "--web.external-url=${cfg.webExternalUrl}" | ||
| 109 | ++ optional (cfg.retentionTime != null) "--storage.tsdb.retention.time=${cfg.retentionTime}" | ||
| 110 | ++ optional (cfg.webConfigFile != null) "--web.config.file=${cfg.webConfigFile}"; | ||
| 111 | |||
| 112 | filterValidPrometheus = filterAttrsListRecursive (n: v: !(n == "_module" || v == null)); | ||
| 113 | filterAttrsListRecursive = | ||
| 114 | pred: x: | ||
| 115 | if isAttrs x then | ||
| 116 | listToAttrs ( | ||
| 117 | concatMap ( | ||
| 118 | name: | ||
| 119 | let | ||
| 120 | v = x.${name}; | ||
| 121 | in | ||
| 122 | if pred name v then | ||
| 123 | [ | ||
| 124 | (nameValuePair name (filterAttrsListRecursive pred v)) | ||
| 125 | ] | ||
| 126 | else | ||
| 127 | [ ] | ||
| 128 | ) (attrNames x) | ||
| 129 | ) | ||
| 130 | else if isList x then | ||
| 131 | map (filterAttrsListRecursive pred) x | ||
| 132 | else | ||
| 133 | x; | ||
| 134 | |||
| 135 | # | ||
| 136 | # Config types: helper functions | ||
| 137 | # | ||
| 138 | |||
| 139 | mkDefOpt = | ||
| 140 | type: defaultStr: description: | ||
| 141 | mkOpt type ( | ||
| 142 | description | ||
| 143 | + '' | ||
| 144 | |||
| 145 | Defaults to ````${defaultStr}```` in prometheus | ||
| 146 | when set to `null`. | ||
| 147 | '' | ||
| 148 | ); | ||
| 149 | |||
| 150 | mkOpt = | ||
| 151 | type: description: | ||
| 152 | mkOption { | ||
| 153 | type = types.nullOr type; | ||
| 154 | default = null; | ||
| 155 | description = description; | ||
| 156 | }; | ||
| 157 | |||
| 158 | mkSdConfigModule = | ||
| 159 | extraOptions: | ||
| 160 | types.submodule { | ||
| 161 | options = { | ||
| 162 | basic_auth = mkOpt promTypes.basic_auth '' | ||
| 163 | Optional HTTP basic authentication information. | ||
| 164 | ''; | ||
| 165 | |||
| 166 | authorization = | ||
| 167 | mkOpt | ||
| 168 | (types.submodule { | ||
| 169 | options = { | ||
| 170 | type = mkDefOpt types.str "Bearer" '' | ||
| 171 | Sets the authentication type. | ||
| 172 | ''; | ||
| 173 | |||
| 174 | credentials = mkOpt types.str '' | ||
| 175 | Sets the credentials. It is mutually exclusive with `credentials_file`. | ||
| 176 | ''; | ||
| 177 | |||
| 178 | credentials_file = mkOpt types.str '' | ||
| 179 | Sets the credentials to the credentials read from the configured file. | ||
| 180 | It is mutually exclusive with `credentials`. | ||
| 181 | ''; | ||
| 182 | }; | ||
| 183 | }) | ||
| 184 | '' | ||
| 185 | Optional `Authorization` header configuration. | ||
| 186 | ''; | ||
| 187 | |||
| 188 | oauth2 = mkOpt promtypes.oauth2 '' | ||
| 189 | Optional OAuth 2.0 configuration. | ||
| 190 | Cannot be used at the same time as basic_auth or authorization. | ||
| 191 | ''; | ||
| 192 | |||
| 193 | proxy_url = mkOpt types.str '' | ||
| 194 | Optional proxy URL. | ||
| 195 | ''; | ||
| 196 | |||
| 197 | follow_redirects = mkDefOpt types.bool "true" '' | ||
| 198 | Configure whether HTTP requests follow HTTP 3xx redirects. | ||
| 199 | ''; | ||
| 200 | |||
| 201 | tls_config = mkOpt promTypes.tls_config '' | ||
| 202 | TLS configuration. | ||
| 203 | ''; | ||
| 204 | } | ||
| 205 | // extraOptions; | ||
| 206 | }; | ||
| 207 | |||
| 208 | # | ||
| 209 | # Config types: general | ||
| 210 | # | ||
| 211 | |||
| 212 | promTypes.globalConfig = types.submodule { | ||
| 213 | options = { | ||
| 214 | scrape_interval = mkDefOpt types.str "1m" '' | ||
| 215 | How frequently to scrape targets by default. | ||
| 216 | ''; | ||
| 217 | |||
| 218 | scrape_timeout = mkDefOpt types.str "10s" '' | ||
| 219 | How long until a scrape request times out. | ||
| 220 | ''; | ||
| 221 | |||
| 222 | evaluation_interval = mkDefOpt types.str "1m" '' | ||
| 223 | How frequently to evaluate rules by default. | ||
| 224 | ''; | ||
| 225 | |||
| 226 | external_labels = mkOpt (types.attrsOf types.str) '' | ||
| 227 | The labels to add to any time series or alerts when | ||
| 228 | communicating with external systems (federation, remote | ||
| 229 | storage, Alertmanager). | ||
| 230 | ''; | ||
| 231 | |||
| 232 | query_log_file = mkOpt types.str '' | ||
| 233 | Path to the file prometheus should write its query log to. | ||
| 234 | ''; | ||
| 235 | }; | ||
| 236 | }; | ||
| 237 | |||
| 238 | promTypes.basic_auth = types.submodule { | ||
| 239 | options = { | ||
| 240 | username = mkOption { | ||
| 241 | type = types.str; | ||
| 242 | description = '' | ||
| 243 | HTTP username | ||
| 244 | ''; | ||
| 245 | }; | ||
| 246 | password = mkOpt types.str "HTTP password"; | ||
| 247 | password_file = mkOpt types.str "HTTP password file"; | ||
| 248 | }; | ||
| 249 | }; | ||
| 250 | |||
| 251 | promTypes.sigv4 = types.submodule { | ||
| 252 | options = { | ||
| 253 | region = mkOpt types.str '' | ||
| 254 | The AWS region. | ||
| 255 | ''; | ||
| 256 | access_key = mkOpt types.str '' | ||
| 257 | The Access Key ID. | ||
| 258 | ''; | ||
| 259 | secret_key = mkOpt types.str '' | ||
| 260 | The Secret Access Key. | ||
| 261 | ''; | ||
| 262 | profile = mkOpt types.str '' | ||
| 263 | The named AWS profile used to authenticate. | ||
| 264 | ''; | ||
| 265 | role_arn = mkOpt types.str '' | ||
| 266 | The AWS role ARN. | ||
| 267 | ''; | ||
| 268 | }; | ||
| 269 | }; | ||
| 270 | |||
| 271 | promTypes.tls_config = types.submodule { | ||
| 272 | options = { | ||
| 273 | ca_file = mkOpt types.str '' | ||
| 274 | CA certificate to validate API server certificate with. | ||
| 275 | ''; | ||
| 276 | |||
| 277 | cert_file = mkOpt types.str '' | ||
| 278 | Certificate file for client cert authentication to the server. | ||
| 279 | ''; | ||
| 280 | |||
| 281 | key_file = mkOpt types.str '' | ||
| 282 | Key file for client cert authentication to the server. | ||
| 283 | ''; | ||
| 284 | |||
| 285 | server_name = mkOpt types.str '' | ||
| 286 | ServerName extension to indicate the name of the server. | ||
| 287 | http://tools.ietf.org/html/rfc4366#section-3.1 | ||
| 288 | ''; | ||
| 289 | |||
| 290 | insecure_skip_verify = mkOpt types.bool '' | ||
| 291 | Disable validation of the server certificate. | ||
| 292 | ''; | ||
| 293 | }; | ||
| 294 | }; | ||
| 295 | |||
| 296 | promtypes.oauth2 = types.submodule { | ||
| 297 | options = { | ||
| 298 | client_id = mkOpt types.str '' | ||
| 299 | OAuth client ID. | ||
| 300 | ''; | ||
| 301 | |||
| 302 | client_secret = mkOpt types.str '' | ||
| 303 | OAuth client secret. | ||
| 304 | ''; | ||
| 305 | |||
| 306 | client_secret_file = mkOpt types.str '' | ||
| 307 | Read the client secret from a file. It is mutually exclusive with `client_secret`. | ||
| 308 | ''; | ||
| 309 | |||
| 310 | scopes = mkOpt (types.listOf types.str) '' | ||
| 311 | Scopes for the token request. | ||
| 312 | ''; | ||
| 313 | |||
| 314 | token_url = mkOpt types.str '' | ||
| 315 | The URL to fetch the token from. | ||
| 316 | ''; | ||
| 317 | |||
| 318 | endpoint_params = mkOpt (types.attrsOf types.str) '' | ||
| 319 | Optional parameters to append to the token URL. | ||
| 320 | ''; | ||
| 321 | }; | ||
| 322 | }; | ||
| 323 | |||
| 324 | # https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config | ||
| 325 | promTypes.scrape_config = types.submodule { | ||
| 326 | options = { | ||
| 327 | authorization = mkOption { | ||
| 328 | type = types.nullOr types.attrs; | ||
| 329 | default = null; | ||
| 330 | description = '' | ||
| 331 | Sets the `Authorization` header on every scrape request with the configured credentials. | ||
| 332 | ''; | ||
| 333 | }; | ||
| 334 | job_name = mkOption { | ||
| 335 | type = types.str; | ||
| 336 | description = '' | ||
| 337 | The job name assigned to scraped metrics by default. | ||
| 338 | ''; | ||
| 339 | }; | ||
| 340 | scrape_interval = mkOpt types.str '' | ||
| 341 | How frequently to scrape targets from this job. Defaults to the | ||
| 342 | globally configured default. | ||
| 343 | ''; | ||
| 344 | |||
| 345 | scrape_timeout = mkOpt types.str '' | ||
| 346 | Per-target timeout when scraping this job. Defaults to the | ||
| 347 | globally configured default. | ||
| 348 | ''; | ||
| 349 | |||
| 350 | scrape_protocols = mkOpt (types.listOf types.str) '' | ||
| 351 | The protocols to negotiate during a scrape with the client. | ||
| 352 | ''; | ||
| 353 | |||
| 354 | fallback_scrape_protocol = mkOpt types.str '' | ||
| 355 | Fallback protocol to use if a scrape returns blank, unparseable, or otherwise | ||
| 356 | invalid Content-Type. | ||
| 357 | ''; | ||
| 358 | |||
| 359 | metrics_path = mkDefOpt types.str "/metrics" '' | ||
| 360 | The HTTP resource path on which to fetch metrics from targets. | ||
| 361 | ''; | ||
| 362 | |||
| 363 | honor_labels = mkDefOpt types.bool "false" '' | ||
| 364 | Controls how Prometheus handles conflicts between labels | ||
| 365 | that are already present in scraped data and labels that | ||
| 366 | Prometheus would attach server-side ("job" and "instance" | ||
| 367 | labels, manually configured target labels, and labels | ||
| 368 | generated by service discovery implementations). | ||
| 369 | |||
| 370 | If honor_labels is set to "true", label conflicts are | ||
| 371 | resolved by keeping label values from the scraped data and | ||
| 372 | ignoring the conflicting server-side labels. | ||
| 373 | |||
| 374 | If honor_labels is set to "false", label conflicts are | ||
| 375 | resolved by renaming conflicting labels in the scraped data | ||
| 376 | to "exported_\<original-label\>" (for example | ||
| 377 | "exported_instance", "exported_job") and then attaching | ||
| 378 | server-side labels. This is useful for use cases such as | ||
| 379 | federation, where all labels specified in the target should | ||
| 380 | be preserved. | ||
| 381 | ''; | ||
| 382 | |||
| 383 | honor_timestamps = mkDefOpt types.bool "true" '' | ||
| 384 | honor_timestamps controls whether Prometheus respects the timestamps present | ||
| 385 | in scraped data. | ||
| 386 | |||
| 387 | If honor_timestamps is set to `true`, the timestamps of the metrics exposed | ||
| 388 | by the target will be used. | ||
| 389 | |||
| 390 | If honor_timestamps is set to `false`, the timestamps of the metrics exposed | ||
| 391 | by the target will be ignored. | ||
| 392 | ''; | ||
| 393 | |||
| 394 | scheme = | ||
| 395 | mkDefOpt | ||
| 396 | (types.enum [ | ||
| 397 | "http" | ||
| 398 | "https" | ||
| 399 | ]) | ||
| 400 | "http" | ||
| 401 | '' | ||
| 402 | The URL scheme with which to fetch metrics from targets. | ||
| 403 | ''; | ||
| 404 | |||
| 405 | params = mkOpt (types.attrsOf (types.listOf types.str)) '' | ||
| 406 | Optional HTTP URL parameters. | ||
| 407 | ''; | ||
| 408 | |||
| 409 | basic_auth = mkOpt promTypes.basic_auth '' | ||
| 410 | Sets the `Authorization` header on every scrape request with the | ||
| 411 | configured username and password. | ||
| 412 | password and password_file are mutually exclusive. | ||
| 413 | ''; | ||
| 414 | |||
| 415 | bearer_token = mkOpt types.str '' | ||
| 416 | Sets the `Authorization` header on every scrape request with | ||
| 417 | the configured bearer token. It is mutually exclusive with | ||
| 418 | {option}`bearer_token_file`. | ||
| 419 | ''; | ||
| 420 | |||
| 421 | bearer_token_file = mkOpt types.str '' | ||
| 422 | Sets the `Authorization` header on every scrape request with | ||
| 423 | the bearer token read from the configured file. It is mutually | ||
| 424 | exclusive with {option}`bearer_token`. | ||
| 425 | ''; | ||
| 426 | |||
| 427 | tls_config = mkOpt promTypes.tls_config '' | ||
| 428 | Configures the scrape request's TLS settings. | ||
| 429 | ''; | ||
| 430 | |||
| 431 | proxy_url = mkOpt types.str '' | ||
| 432 | Optional proxy URL. | ||
| 433 | ''; | ||
| 434 | |||
| 435 | azure_sd_configs = mkOpt (types.listOf promTypes.azure_sd_config) '' | ||
| 436 | List of Azure service discovery configurations. | ||
| 437 | ''; | ||
| 438 | |||
| 439 | consul_sd_configs = mkOpt (types.listOf promTypes.consul_sd_config) '' | ||
| 440 | List of Consul service discovery configurations. | ||
| 441 | ''; | ||
| 442 | |||
| 443 | digitalocean_sd_configs = mkOpt (types.listOf promTypes.digitalocean_sd_config) '' | ||
| 444 | List of DigitalOcean service discovery configurations. | ||
| 445 | ''; | ||
| 446 | |||
| 447 | docker_sd_configs = mkOpt (types.listOf promTypes.docker_sd_config) '' | ||
| 448 | List of Docker service discovery configurations. | ||
| 449 | ''; | ||
| 450 | |||
| 451 | dockerswarm_sd_configs = mkOpt (types.listOf promTypes.dockerswarm_sd_config) '' | ||
| 452 | List of Docker Swarm service discovery configurations. | ||
| 453 | ''; | ||
| 454 | |||
| 455 | dns_sd_configs = mkOpt (types.listOf promTypes.dns_sd_config) '' | ||
| 456 | List of DNS service discovery configurations. | ||
| 457 | ''; | ||
| 458 | |||
| 459 | ec2_sd_configs = mkOpt (types.listOf promTypes.ec2_sd_config) '' | ||
| 460 | List of EC2 service discovery configurations. | ||
| 461 | ''; | ||
| 462 | |||
| 463 | eureka_sd_configs = mkOpt (types.listOf promTypes.eureka_sd_config) '' | ||
| 464 | List of Eureka service discovery configurations. | ||
| 465 | ''; | ||
| 466 | |||
| 467 | file_sd_configs = mkOpt (types.listOf promTypes.file_sd_config) '' | ||
| 468 | List of file service discovery configurations. | ||
| 469 | ''; | ||
| 470 | |||
| 471 | gce_sd_configs = mkOpt (types.listOf promTypes.gce_sd_config) '' | ||
| 472 | List of Google Compute Engine service discovery configurations. | ||
| 473 | |||
| 474 | See [the relevant Prometheus configuration docs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#gce_sd_config) | ||
| 475 | for more detail. | ||
| 476 | ''; | ||
| 477 | |||
| 478 | hetzner_sd_configs = mkOpt (types.listOf promTypes.hetzner_sd_config) '' | ||
| 479 | List of Hetzner service discovery configurations. | ||
| 480 | ''; | ||
| 481 | |||
| 482 | http_sd_configs = mkOpt (types.listOf promTypes.http_sd_config) '' | ||
| 483 | List of HTTP service discovery configurations. | ||
| 484 | ''; | ||
| 485 | |||
| 486 | kubernetes_sd_configs = mkOpt (types.listOf promTypes.kubernetes_sd_config) '' | ||
| 487 | List of Kubernetes service discovery configurations. | ||
| 488 | ''; | ||
| 489 | |||
| 490 | kuma_sd_configs = mkOpt (types.listOf promTypes.kuma_sd_config) '' | ||
| 491 | List of Kuma service discovery configurations. | ||
| 492 | ''; | ||
| 493 | |||
| 494 | lightsail_sd_configs = mkOpt (types.listOf promTypes.lightsail_sd_config) '' | ||
| 495 | List of Lightsail service discovery configurations. | ||
| 496 | ''; | ||
| 497 | |||
| 498 | linode_sd_configs = mkOpt (types.listOf promTypes.linode_sd_config) '' | ||
| 499 | List of Linode service discovery configurations. | ||
| 500 | ''; | ||
| 501 | |||
| 502 | marathon_sd_configs = mkOpt (types.listOf promTypes.marathon_sd_config) '' | ||
| 503 | List of Marathon service discovery configurations. | ||
| 504 | ''; | ||
| 505 | |||
| 506 | nerve_sd_configs = mkOpt (types.listOf promTypes.nerve_sd_config) '' | ||
| 507 | List of AirBnB's Nerve service discovery configurations. | ||
| 508 | ''; | ||
| 509 | |||
| 510 | openstack_sd_configs = mkOpt (types.listOf promTypes.openstack_sd_config) '' | ||
| 511 | List of OpenStack service discovery configurations. | ||
| 512 | ''; | ||
| 513 | |||
| 514 | puppetdb_sd_configs = mkOpt (types.listOf promTypes.puppetdb_sd_config) '' | ||
| 515 | List of PuppetDB service discovery configurations. | ||
| 516 | ''; | ||
| 517 | |||
| 518 | scaleway_sd_configs = mkOpt (types.listOf promTypes.scaleway_sd_config) '' | ||
| 519 | List of Scaleway service discovery configurations. | ||
| 520 | ''; | ||
| 521 | |||
| 522 | serverset_sd_configs = mkOpt (types.listOf promTypes.serverset_sd_config) '' | ||
| 523 | List of Zookeeper Serverset service discovery configurations. | ||
| 524 | ''; | ||
| 525 | |||
| 526 | triton_sd_configs = mkOpt (types.listOf promTypes.triton_sd_config) '' | ||
| 527 | List of Triton Serverset service discovery configurations. | ||
| 528 | ''; | ||
| 529 | |||
| 530 | uyuni_sd_configs = mkOpt (types.listOf promTypes.uyuni_sd_config) '' | ||
| 531 | List of Uyuni Serverset service discovery configurations. | ||
| 532 | ''; | ||
| 533 | |||
| 534 | static_configs = mkOpt (types.listOf promTypes.static_config) '' | ||
| 535 | List of labeled target groups for this job. | ||
| 536 | ''; | ||
| 537 | |||
| 538 | relabel_configs = mkOpt (types.listOf promTypes.relabel_config) '' | ||
| 539 | List of relabel configurations. | ||
| 540 | ''; | ||
| 541 | |||
| 542 | metric_relabel_configs = mkOpt (types.listOf promTypes.relabel_config) '' | ||
| 543 | List of metric relabel configurations. | ||
| 544 | ''; | ||
| 545 | |||
| 546 | body_size_limit = mkDefOpt types.str "0" '' | ||
| 547 | An uncompressed response body larger than this many bytes will cause the | ||
| 548 | scrape to fail. 0 means no limit. Example: 100MB. | ||
| 549 | This is an experimental feature, this behaviour could | ||
| 550 | change or be removed in the future. | ||
| 551 | ''; | ||
| 552 | |||
| 553 | sample_limit = mkDefOpt types.int "0" '' | ||
| 554 | Per-scrape limit on number of scraped samples that will be accepted. | ||
| 555 | If more than this number of samples are present after metric relabelling | ||
| 556 | the entire scrape will be treated as failed. 0 means no limit. | ||
| 557 | ''; | ||
| 558 | |||
| 559 | label_limit = mkDefOpt types.int "0" '' | ||
| 560 | Per-scrape limit on number of labels that will be accepted for a sample. If | ||
| 561 | more than this number of labels are present post metric-relabeling, the | ||
| 562 | entire scrape will be treated as failed. 0 means no limit. | ||
| 563 | ''; | ||
| 564 | |||
| 565 | label_name_length_limit = mkDefOpt types.int "0" '' | ||
| 566 | Per-scrape limit on length of labels name that will be accepted for a sample. | ||
| 567 | If a label name is longer than this number post metric-relabeling, the entire | ||
| 568 | scrape will be treated as failed. 0 means no limit. | ||
| 569 | ''; | ||
| 570 | |||
| 571 | label_value_length_limit = mkDefOpt types.int "0" '' | ||
| 572 | Per-scrape limit on length of labels value that will be accepted for a sample. | ||
| 573 | If a label value is longer than this number post metric-relabeling, the | ||
| 574 | entire scrape will be treated as failed. 0 means no limit. | ||
| 575 | ''; | ||
| 576 | |||
| 577 | target_limit = mkDefOpt types.int "0" '' | ||
| 578 | Per-scrape config limit on number of unique targets that will be | ||
| 579 | accepted. If more than this number of targets are present after target | ||
| 580 | relabeling, Prometheus will mark the targets as failed without scraping them. | ||
| 581 | 0 means no limit. This is an experimental feature, this behaviour could | ||
| 582 | change in the future. | ||
| 583 | ''; | ||
| 584 | }; | ||
| 585 | }; | ||
| 586 | |||
| 587 | # | ||
| 588 | # Config types: service discovery | ||
| 589 | # | ||
| 590 | |||
| 591 | # For this one, the docs actually define all types needed to use mkSdConfigModule, but a bunch | ||
| 592 | # of them are marked with 'currently not support by Azure' so we don't bother adding them in | ||
| 593 | # here. | ||
| 594 | promTypes.azure_sd_config = types.submodule { | ||
| 595 | options = { | ||
| 596 | environment = mkDefOpt types.str "AzurePublicCloud" '' | ||
| 597 | The Azure environment. | ||
| 598 | ''; | ||
| 599 | |||
| 600 | authentication_method = | ||
| 601 | mkDefOpt | ||
| 602 | (types.enum [ | ||
| 603 | "OAuth" | ||
| 604 | "ManagedIdentity" | ||
| 605 | ]) | ||
| 606 | "OAuth" | ||
| 607 | '' | ||
| 608 | The authentication method, either OAuth or ManagedIdentity. | ||
| 609 | See <https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview> | ||
| 610 | ''; | ||
| 611 | |||
| 612 | subscription_id = mkOption { | ||
| 613 | type = types.str; | ||
| 614 | description = '' | ||
| 615 | The subscription ID. | ||
| 616 | ''; | ||
| 617 | }; | ||
| 618 | |||
| 619 | tenant_id = mkOpt types.str '' | ||
| 620 | Optional tenant ID. Only required with authentication_method OAuth. | ||
| 621 | ''; | ||
| 622 | |||
| 623 | client_id = mkOpt types.str '' | ||
| 624 | Optional client ID. Only required with authentication_method OAuth. | ||
| 625 | ''; | ||
| 626 | |||
| 627 | client_secret = mkOpt types.str '' | ||
| 628 | Optional client secret. Only required with authentication_method OAuth. | ||
| 629 | ''; | ||
| 630 | |||
| 631 | refresh_interval = mkDefOpt types.str "300s" '' | ||
| 632 | Refresh interval to re-read the instance list. | ||
| 633 | ''; | ||
| 634 | |||
| 635 | port = mkDefOpt types.port "80" '' | ||
| 636 | The port to scrape metrics from. If using the public IP | ||
| 637 | address, this must instead be specified in the relabeling | ||
| 638 | rule. | ||
| 639 | ''; | ||
| 640 | |||
| 641 | proxy_url = mkOpt types.str '' | ||
| 642 | Optional proxy URL. | ||
| 643 | ''; | ||
| 644 | |||
| 645 | follow_redirects = mkDefOpt types.bool "true" '' | ||
| 646 | Configure whether HTTP requests follow HTTP 3xx redirects. | ||
| 647 | ''; | ||
| 648 | |||
| 649 | tls_config = mkOpt promTypes.tls_config '' | ||
| 650 | TLS configuration. | ||
| 651 | ''; | ||
| 652 | }; | ||
| 653 | }; | ||
| 654 | |||
| 655 | promTypes.consul_sd_config = mkSdConfigModule { | ||
| 656 | server = mkDefOpt types.str "localhost:8500" '' | ||
| 657 | Consul server to query. | ||
| 658 | ''; | ||
| 659 | |||
| 660 | token = mkOpt types.str "Consul token"; | ||
| 661 | |||
| 662 | datacenter = mkOpt types.str "Consul datacenter"; | ||
| 663 | |||
| 664 | scheme = mkDefOpt types.str "http" "Consul scheme"; | ||
| 665 | |||
| 666 | username = mkOpt types.str "Consul username"; | ||
| 667 | |||
| 668 | password = mkOpt types.str "Consul password"; | ||
| 669 | |||
| 670 | tls_config = mkOpt promTypes.tls_config '' | ||
| 671 | Configures the Consul request's TLS settings. | ||
| 672 | ''; | ||
| 673 | |||
| 674 | services = mkOpt (types.listOf types.str) '' | ||
| 675 | A list of services for which targets are retrieved. | ||
| 676 | ''; | ||
| 677 | |||
| 678 | tags = mkOpt (types.listOf types.str) '' | ||
| 679 | An optional list of tags used to filter nodes for a given | ||
| 680 | service. Services must contain all tags in the list. | ||
| 681 | ''; | ||
| 682 | |||
| 683 | node_meta = mkOpt (types.attrsOf types.str) '' | ||
| 684 | Node metadata used to filter nodes for a given service. | ||
| 685 | ''; | ||
| 686 | |||
| 687 | tag_separator = mkDefOpt types.str "," '' | ||
| 688 | The string by which Consul tags are joined into the tag label. | ||
| 689 | ''; | ||
| 690 | |||
| 691 | allow_stale = mkOpt types.bool '' | ||
| 692 | Allow stale Consul results | ||
| 693 | (see <https://www.consul.io/api/index.html#consistency-modes>). | ||
| 694 | |||
| 695 | Will reduce load on Consul. | ||
| 696 | ''; | ||
| 697 | |||
| 698 | refresh_interval = mkDefOpt types.str "30s" '' | ||
| 699 | The time after which the provided names are refreshed. | ||
| 700 | |||
| 701 | On large setup it might be a good idea to increase this value | ||
| 702 | because the catalog will change all the time. | ||
| 703 | ''; | ||
| 704 | }; | ||
| 705 | |||
| 706 | promTypes.digitalocean_sd_config = mkSdConfigModule { | ||
| 707 | port = mkDefOpt types.port "80" '' | ||
| 708 | The port to scrape metrics from. | ||
| 709 | ''; | ||
| 710 | |||
| 711 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 712 | The time after which the droplets are refreshed. | ||
| 713 | ''; | ||
| 714 | }; | ||
| 715 | |||
| 716 | mkDockerSdConfigModule = | ||
| 717 | extraOptions: | ||
| 718 | mkSdConfigModule ( | ||
| 719 | { | ||
| 720 | host = mkOption { | ||
| 721 | type = types.str; | ||
| 722 | description = '' | ||
| 723 | Address of the Docker daemon. | ||
| 724 | ''; | ||
| 725 | }; | ||
| 726 | |||
| 727 | port = mkDefOpt types.port "80" '' | ||
| 728 | The port to scrape metrics from, when `role` is nodes, and for discovered | ||
| 729 | tasks and services that don't have published ports. | ||
| 730 | ''; | ||
| 731 | |||
| 732 | filters = | ||
| 733 | mkOpt | ||
| 734 | (types.listOf ( | ||
| 735 | types.submodule { | ||
| 736 | options = { | ||
| 737 | name = mkOption { | ||
| 738 | type = types.str; | ||
| 739 | description = '' | ||
| 740 | Name of the filter. The available filters are listed in the upstream documentation: | ||
| 741 | Services: <https://docs.docker.com/engine/api/v1.40/#operation/ServiceList> | ||
| 742 | Tasks: <https://docs.docker.com/engine/api/v1.40/#operation/TaskList> | ||
| 743 | Nodes: <https://docs.docker.com/engine/api/v1.40/#operation/NodeList> | ||
| 744 | ''; | ||
| 745 | }; | ||
| 746 | values = mkOption { | ||
| 747 | type = types.str; | ||
| 748 | description = '' | ||
| 749 | Value for the filter. | ||
| 750 | ''; | ||
| 751 | }; | ||
| 752 | }; | ||
| 753 | } | ||
| 754 | )) | ||
| 755 | '' | ||
| 756 | Optional filters to limit the discovery process to a subset of available resources. | ||
| 757 | ''; | ||
| 758 | |||
| 759 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 760 | The time after which the containers are refreshed. | ||
| 761 | ''; | ||
| 762 | } | ||
| 763 | // extraOptions | ||
| 764 | ); | ||
| 765 | |||
| 766 | promTypes.docker_sd_config = mkDockerSdConfigModule { | ||
| 767 | host_networking_host = mkDefOpt types.str "localhost" '' | ||
| 768 | The host to use if the container is in host networking mode. | ||
| 769 | ''; | ||
| 770 | }; | ||
| 771 | |||
| 772 | promTypes.dockerswarm_sd_config = mkDockerSdConfigModule { | ||
| 773 | role = mkOption { | ||
| 774 | type = types.enum [ | ||
| 775 | "services" | ||
| 776 | "tasks" | ||
| 777 | "nodes" | ||
| 778 | ]; | ||
| 779 | description = '' | ||
| 780 | Role of the targets to retrieve. Must be `services`, `tasks`, or `nodes`. | ||
| 781 | ''; | ||
| 782 | }; | ||
| 783 | }; | ||
| 784 | |||
| 785 | promTypes.dns_sd_config = types.submodule { | ||
| 786 | options = { | ||
| 787 | names = mkOption { | ||
| 788 | type = types.listOf types.str; | ||
| 789 | description = '' | ||
| 790 | A list of DNS SRV record names to be queried. | ||
| 791 | ''; | ||
| 792 | }; | ||
| 793 | |||
| 794 | type = | ||
| 795 | mkDefOpt | ||
| 796 | (types.enum [ | ||
| 797 | "SRV" | ||
| 798 | "A" | ||
| 799 | "AAAA" | ||
| 800 | "MX" | ||
| 801 | "NS" | ||
| 802 | ]) | ||
| 803 | "SRV" | ||
| 804 | '' | ||
| 805 | The type of DNS query to perform. | ||
| 806 | ''; | ||
| 807 | |||
| 808 | port = mkOpt types.port '' | ||
| 809 | The port number used if the query type is not SRV. | ||
| 810 | ''; | ||
| 811 | |||
| 812 | refresh_interval = mkDefOpt types.str "30s" '' | ||
| 813 | The time after which the provided names are refreshed. | ||
| 814 | ''; | ||
| 815 | }; | ||
| 816 | }; | ||
| 817 | |||
| 818 | promTypes.ec2_sd_config = types.submodule { | ||
| 819 | options = { | ||
| 820 | region = mkOption { | ||
| 821 | type = types.str; | ||
| 822 | description = '' | ||
| 823 | The AWS Region. If blank, the region from the instance metadata is used. | ||
| 824 | ''; | ||
| 825 | }; | ||
| 826 | endpoint = mkOpt types.str '' | ||
| 827 | Custom endpoint to be used. | ||
| 828 | ''; | ||
| 829 | |||
| 830 | access_key = mkOpt types.str '' | ||
| 831 | The AWS API key id. If blank, the environment variable | ||
| 832 | `AWS_ACCESS_KEY_ID` is used. | ||
| 833 | ''; | ||
| 834 | |||
| 835 | secret_key = mkOpt types.str '' | ||
| 836 | The AWS API key secret. If blank, the environment variable | ||
| 837 | `AWS_SECRET_ACCESS_KEY` is used. | ||
| 838 | ''; | ||
| 839 | |||
| 840 | profile = mkOpt types.str '' | ||
| 841 | Named AWS profile used to connect to the API. | ||
| 842 | ''; | ||
| 843 | |||
| 844 | role_arn = mkOpt types.str '' | ||
| 845 | AWS Role ARN, an alternative to using AWS API keys. | ||
| 846 | ''; | ||
| 847 | |||
| 848 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 849 | Refresh interval to re-read the instance list. | ||
| 850 | ''; | ||
| 851 | |||
| 852 | port = mkDefOpt types.port "80" '' | ||
| 853 | The port to scrape metrics from. If using the public IP | ||
| 854 | address, this must instead be specified in the relabeling | ||
| 855 | rule. | ||
| 856 | ''; | ||
| 857 | |||
| 858 | filters = | ||
| 859 | mkOpt | ||
| 860 | (types.listOf ( | ||
| 861 | types.submodule { | ||
| 862 | options = { | ||
| 863 | name = mkOption { | ||
| 864 | type = types.str; | ||
| 865 | description = '' | ||
| 866 | See [this list](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html) | ||
| 867 | for the available filters. | ||
| 868 | ''; | ||
| 869 | }; | ||
| 870 | |||
| 871 | values = mkOption { | ||
| 872 | type = types.listOf types.str; | ||
| 873 | default = [ ]; | ||
| 874 | description = '' | ||
| 875 | Value of the filter. | ||
| 876 | ''; | ||
| 877 | }; | ||
| 878 | }; | ||
| 879 | } | ||
| 880 | )) | ||
| 881 | '' | ||
| 882 | Filters can be used optionally to filter the instance list by other criteria. | ||
| 883 | ''; | ||
| 884 | }; | ||
| 885 | }; | ||
| 886 | |||
| 887 | promTypes.eureka_sd_config = mkSdConfigModule { | ||
| 888 | server = mkOption { | ||
| 889 | type = types.str; | ||
| 890 | description = '' | ||
| 891 | The URL to connect to the Eureka server. | ||
| 892 | ''; | ||
| 893 | }; | ||
| 894 | }; | ||
| 895 | |||
| 896 | promTypes.file_sd_config = types.submodule { | ||
| 897 | options = { | ||
| 898 | files = mkOption { | ||
| 899 | type = types.listOf types.str; | ||
| 900 | description = '' | ||
| 901 | Patterns for files from which target groups are extracted. Refer | ||
| 902 | to the Prometheus documentation for permitted filename patterns | ||
| 903 | and formats. | ||
| 904 | ''; | ||
| 905 | }; | ||
| 906 | |||
| 907 | refresh_interval = mkDefOpt types.str "5m" '' | ||
| 908 | Refresh interval to re-read the files. | ||
| 909 | ''; | ||
| 910 | }; | ||
| 911 | }; | ||
| 912 | |||
| 913 | promTypes.gce_sd_config = types.submodule { | ||
| 914 | options = { | ||
| 915 | # Use `mkOption` instead of `mkOpt` for project and zone because they are | ||
| 916 | # required configuration values for `gce_sd_config`. | ||
| 917 | project = mkOption { | ||
| 918 | type = types.str; | ||
| 919 | description = '' | ||
| 920 | The GCP Project. | ||
| 921 | ''; | ||
| 922 | }; | ||
| 923 | |||
| 924 | zone = mkOption { | ||
| 925 | type = types.str; | ||
| 926 | description = '' | ||
| 927 | The zone of the scrape targets. If you need multiple zones use multiple | ||
| 928 | gce_sd_configs. | ||
| 929 | ''; | ||
| 930 | }; | ||
| 931 | |||
| 932 | filter = mkOpt types.str '' | ||
| 933 | Filter can be used optionally to filter the instance list by other | ||
| 934 | criteria Syntax of this filter string is described here in the filter | ||
| 935 | query parameter section: <https://cloud.google.com/compute/docs/reference/latest/instances/list>. | ||
| 936 | ''; | ||
| 937 | |||
| 938 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 939 | Refresh interval to re-read the cloud instance list. | ||
| 940 | ''; | ||
| 941 | |||
| 942 | port = mkDefOpt types.port "80" '' | ||
| 943 | The port to scrape metrics from. If using the public IP address, this | ||
| 944 | must instead be specified in the relabeling rule. | ||
| 945 | ''; | ||
| 946 | |||
| 947 | tag_separator = mkDefOpt types.str "," '' | ||
| 948 | The tag separator used to separate concatenated GCE instance network tags. | ||
| 949 | |||
| 950 | See the GCP documentation on network tags for more information: | ||
| 951 | <https://cloud.google.com/vpc/docs/add-remove-network-tags> | ||
| 952 | ''; | ||
| 953 | }; | ||
| 954 | }; | ||
| 955 | |||
| 956 | promTypes.hetzner_sd_config = mkSdConfigModule { | ||
| 957 | role = mkOption { | ||
| 958 | type = types.enum [ | ||
| 959 | "robot" | ||
| 960 | "hcloud" | ||
| 961 | ]; | ||
| 962 | description = '' | ||
| 963 | The Hetzner role of entities that should be discovered. | ||
| 964 | One of `robot` or `hcloud`. | ||
| 965 | ''; | ||
| 966 | }; | ||
| 967 | |||
| 968 | port = mkDefOpt types.port "80" '' | ||
| 969 | The port to scrape metrics from. | ||
| 970 | ''; | ||
| 971 | |||
| 972 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 973 | The time after which the servers are refreshed. | ||
| 974 | ''; | ||
| 975 | }; | ||
| 976 | |||
| 977 | promTypes.http_sd_config = types.submodule { | ||
| 978 | options = { | ||
| 979 | url = mkOption { | ||
| 980 | type = types.str; | ||
| 981 | description = '' | ||
| 982 | URL from which the targets are fetched. | ||
| 983 | ''; | ||
| 984 | }; | ||
| 985 | |||
| 986 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 987 | Refresh interval to re-query the endpoint. | ||
| 988 | ''; | ||
| 989 | |||
| 990 | basic_auth = mkOpt promTypes.basic_auth '' | ||
| 991 | Authentication information used to authenticate to the API server. | ||
| 992 | password and password_file are mutually exclusive. | ||
| 993 | ''; | ||
| 994 | |||
| 995 | proxy_url = mkOpt types.str '' | ||
| 996 | Optional proxy URL. | ||
| 997 | ''; | ||
| 998 | |||
| 999 | follow_redirects = mkDefOpt types.bool "true" '' | ||
| 1000 | Configure whether HTTP requests follow HTTP 3xx redirects. | ||
| 1001 | ''; | ||
| 1002 | |||
| 1003 | tls_config = mkOpt promTypes.tls_config '' | ||
| 1004 | Configures the scrape request's TLS settings. | ||
| 1005 | ''; | ||
| 1006 | }; | ||
| 1007 | }; | ||
| 1008 | |||
| 1009 | promTypes.kubernetes_sd_config = mkSdConfigModule { | ||
| 1010 | api_server = mkOpt types.str '' | ||
| 1011 | The API server addresses. If left empty, Prometheus is assumed to run inside | ||
| 1012 | of the cluster and will discover API servers automatically and use the pod's | ||
| 1013 | CA certificate and bearer token file at /var/run/secrets/kubernetes.io/serviceaccount/. | ||
| 1014 | ''; | ||
| 1015 | |||
| 1016 | role = mkOption { | ||
| 1017 | type = types.enum [ | ||
| 1018 | "endpoints" | ||
| 1019 | "service" | ||
| 1020 | "pod" | ||
| 1021 | "node" | ||
| 1022 | "ingress" | ||
| 1023 | ]; | ||
| 1024 | description = '' | ||
| 1025 | The Kubernetes role of entities that should be discovered. | ||
| 1026 | One of endpoints, service, pod, node, or ingress. | ||
| 1027 | ''; | ||
| 1028 | }; | ||
| 1029 | |||
| 1030 | kubeconfig_file = mkOpt types.str '' | ||
| 1031 | Optional path to a kubeconfig file. | ||
| 1032 | Note that api_server and kube_config are mutually exclusive. | ||
| 1033 | ''; | ||
| 1034 | |||
| 1035 | namespaces = | ||
| 1036 | mkOpt | ||
| 1037 | (types.submodule { | ||
| 1038 | options = { | ||
| 1039 | names = mkOpt (types.listOf types.str) '' | ||
| 1040 | Namespace name. | ||
| 1041 | ''; | ||
| 1042 | }; | ||
| 1043 | }) | ||
| 1044 | '' | ||
| 1045 | Optional namespace discovery. If omitted, all namespaces are used. | ||
| 1046 | ''; | ||
| 1047 | |||
| 1048 | selectors = | ||
| 1049 | mkOpt | ||
| 1050 | (types.listOf ( | ||
| 1051 | types.submodule { | ||
| 1052 | options = { | ||
| 1053 | role = mkOption { | ||
| 1054 | type = types.str; | ||
| 1055 | description = '' | ||
| 1056 | Selector role | ||
| 1057 | ''; | ||
| 1058 | }; | ||
| 1059 | |||
| 1060 | label = mkOpt types.str '' | ||
| 1061 | Selector label | ||
| 1062 | ''; | ||
| 1063 | |||
| 1064 | field = mkOpt types.str '' | ||
| 1065 | Selector field | ||
| 1066 | ''; | ||
| 1067 | }; | ||
| 1068 | } | ||
| 1069 | )) | ||
| 1070 | '' | ||
| 1071 | Optional label and field selectors to limit the discovery process to a subset of available resources. | ||
| 1072 | See <https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/> | ||
| 1073 | and <https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/> to learn more about the possible | ||
| 1074 | filters that can be used. Endpoints role supports pod, service and endpoints selectors, other roles | ||
| 1075 | only support selectors matching the role itself (e.g. node role can only contain node selectors). | ||
| 1076 | |||
| 1077 | Note: When making decision about using field/label selector make sure that this | ||
| 1078 | is the best approach - it will prevent Prometheus from reusing single list/watch | ||
| 1079 | for all scrape configs. This might result in a bigger load on the Kubernetes API, | ||
| 1080 | because per each selector combination there will be additional LIST/WATCH. On the other hand, | ||
| 1081 | if you just want to monitor small subset of pods in large cluster it's recommended to use selectors. | ||
| 1082 | Decision, if selectors should be used or not depends on the particular situation. | ||
| 1083 | ''; | ||
| 1084 | }; | ||
| 1085 | |||
| 1086 | promTypes.kuma_sd_config = mkSdConfigModule { | ||
| 1087 | server = mkOption { | ||
| 1088 | type = types.str; | ||
| 1089 | description = '' | ||
| 1090 | Address of the Kuma Control Plane's MADS xDS server. | ||
| 1091 | ''; | ||
| 1092 | }; | ||
| 1093 | |||
| 1094 | refresh_interval = mkDefOpt types.str "30s" '' | ||
| 1095 | The time to wait between polling update requests. | ||
| 1096 | ''; | ||
| 1097 | |||
| 1098 | fetch_timeout = mkDefOpt types.str "2m" '' | ||
| 1099 | The time after which the monitoring assignments are refreshed. | ||
| 1100 | ''; | ||
| 1101 | }; | ||
| 1102 | |||
| 1103 | promTypes.lightsail_sd_config = types.submodule { | ||
| 1104 | options = { | ||
| 1105 | region = mkOpt types.str '' | ||
| 1106 | The AWS region. If blank, the region from the instance metadata is used. | ||
| 1107 | ''; | ||
| 1108 | |||
| 1109 | endpoint = mkOpt types.str '' | ||
| 1110 | Custom endpoint to be used. | ||
| 1111 | ''; | ||
| 1112 | |||
| 1113 | access_key = mkOpt types.str '' | ||
| 1114 | The AWS API keys. If blank, the environment variable `AWS_ACCESS_KEY_ID` is used. | ||
| 1115 | ''; | ||
| 1116 | |||
| 1117 | secret_key = mkOpt types.str '' | ||
| 1118 | The AWS API keys. If blank, the environment variable `AWS_SECRET_ACCESS_KEY` is used. | ||
| 1119 | ''; | ||
| 1120 | |||
| 1121 | profile = mkOpt types.str '' | ||
| 1122 | Named AWS profile used to connect to the API. | ||
| 1123 | ''; | ||
| 1124 | |||
| 1125 | role_arn = mkOpt types.str '' | ||
| 1126 | AWS Role ARN, an alternative to using AWS API keys. | ||
| 1127 | ''; | ||
| 1128 | |||
| 1129 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1130 | Refresh interval to re-read the instance list. | ||
| 1131 | ''; | ||
| 1132 | |||
| 1133 | port = mkDefOpt types.port "80" '' | ||
| 1134 | The port to scrape metrics from. If using the public IP address, this must | ||
| 1135 | instead be specified in the relabeling rule. | ||
| 1136 | ''; | ||
| 1137 | }; | ||
| 1138 | }; | ||
| 1139 | |||
| 1140 | promTypes.linode_sd_config = mkSdConfigModule { | ||
| 1141 | port = mkDefOpt types.port "80" '' | ||
| 1142 | The port to scrape metrics from. | ||
| 1143 | ''; | ||
| 1144 | |||
| 1145 | tag_separator = mkDefOpt types.str "," '' | ||
| 1146 | The string by which Linode Instance tags are joined into the tag label. | ||
| 1147 | ''; | ||
| 1148 | |||
| 1149 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1150 | The time after which the linode instances are refreshed. | ||
| 1151 | ''; | ||
| 1152 | }; | ||
| 1153 | |||
| 1154 | promTypes.marathon_sd_config = mkSdConfigModule { | ||
| 1155 | servers = mkOption { | ||
| 1156 | type = types.listOf types.str; | ||
| 1157 | description = '' | ||
| 1158 | List of URLs to be used to contact Marathon servers. You need to provide at least one server URL. | ||
| 1159 | ''; | ||
| 1160 | }; | ||
| 1161 | |||
| 1162 | refresh_interval = mkDefOpt types.str "30s" '' | ||
| 1163 | Polling interval. | ||
| 1164 | ''; | ||
| 1165 | |||
| 1166 | auth_token = mkOpt types.str '' | ||
| 1167 | Optional authentication information for token-based authentication: | ||
| 1168 | <https://docs.mesosphere.com/1.11/security/ent/iam-api/#passing-an-authentication-token> | ||
| 1169 | It is mutually exclusive with `auth_token_file` and other authentication mechanisms. | ||
| 1170 | ''; | ||
| 1171 | |||
| 1172 | auth_token_file = mkOpt types.str '' | ||
| 1173 | Optional authentication information for token-based authentication: | ||
| 1174 | <https://docs.mesosphere.com/1.11/security/ent/iam-api/#passing-an-authentication-token> | ||
| 1175 | It is mutually exclusive with `auth_token` and other authentication mechanisms. | ||
| 1176 | ''; | ||
| 1177 | }; | ||
| 1178 | |||
| 1179 | promTypes.nerve_sd_config = types.submodule { | ||
| 1180 | options = { | ||
| 1181 | servers = mkOption { | ||
| 1182 | type = types.listOf types.str; | ||
| 1183 | description = '' | ||
| 1184 | The Zookeeper servers. | ||
| 1185 | ''; | ||
| 1186 | }; | ||
| 1187 | |||
| 1188 | paths = mkOption { | ||
| 1189 | type = types.listOf types.str; | ||
| 1190 | description = '' | ||
| 1191 | Paths can point to a single service, or the root of a tree of services. | ||
| 1192 | ''; | ||
| 1193 | }; | ||
| 1194 | |||
| 1195 | timeout = mkDefOpt types.str "10s" '' | ||
| 1196 | Timeout value. | ||
| 1197 | ''; | ||
| 1198 | }; | ||
| 1199 | }; | ||
| 1200 | |||
| 1201 | promTypes.openstack_sd_config = types.submodule { | ||
| 1202 | options = | ||
| 1203 | let | ||
| 1204 | userDescription = '' | ||
| 1205 | username is required if using Identity V2 API. Consult with your provider's | ||
| 1206 | control panel to discover your account's username. In Identity V3, either | ||
| 1207 | userid or a combination of username and domain_id or domain_name are needed. | ||
| 1208 | ''; | ||
| 1209 | |||
| 1210 | domainDescription = '' | ||
| 1211 | At most one of domain_id and domain_name must be provided if using username | ||
| 1212 | with Identity V3. Otherwise, either are optional. | ||
| 1213 | ''; | ||
| 1214 | |||
| 1215 | projectDescription = '' | ||
| 1216 | The project_id and project_name fields are optional for the Identity V2 API. | ||
| 1217 | Some providers allow you to specify a project_name instead of the project_id. | ||
| 1218 | Some require both. Your provider's authentication policies will determine | ||
| 1219 | how these fields influence authentication. | ||
| 1220 | ''; | ||
| 1221 | |||
| 1222 | applicationDescription = '' | ||
| 1223 | The application_credential_id or application_credential_name fields are | ||
| 1224 | required if using an application credential to authenticate. Some providers | ||
| 1225 | allow you to create an application credential to authenticate rather than a | ||
| 1226 | password. | ||
| 1227 | ''; | ||
| 1228 | in | ||
| 1229 | { | ||
| 1230 | role = mkOption { | ||
| 1231 | type = types.str; | ||
| 1232 | description = '' | ||
| 1233 | The OpenStack role of entities that should be discovered. | ||
| 1234 | ''; | ||
| 1235 | }; | ||
| 1236 | |||
| 1237 | region = mkOption { | ||
| 1238 | type = types.str; | ||
| 1239 | description = '' | ||
| 1240 | The OpenStack Region. | ||
| 1241 | ''; | ||
| 1242 | }; | ||
| 1243 | |||
| 1244 | identity_endpoint = mkOpt types.str '' | ||
| 1245 | identity_endpoint specifies the HTTP endpoint that is required to work with | ||
| 1246 | the Identity API of the appropriate version. While it's ultimately needed by | ||
| 1247 | all of the identity services, it will often be populated by a provider-level | ||
| 1248 | function. | ||
| 1249 | ''; | ||
| 1250 | |||
| 1251 | username = mkOpt types.str userDescription; | ||
| 1252 | userid = mkOpt types.str userDescription; | ||
| 1253 | |||
| 1254 | password = mkOpt types.str '' | ||
| 1255 | password for the Identity V2 and V3 APIs. Consult with your provider's | ||
| 1256 | control panel to discover your account's preferred method of authentication. | ||
| 1257 | ''; | ||
| 1258 | |||
| 1259 | domain_name = mkOpt types.str domainDescription; | ||
| 1260 | domain_id = mkOpt types.str domainDescription; | ||
| 1261 | |||
| 1262 | project_name = mkOpt types.str projectDescription; | ||
| 1263 | project_id = mkOpt types.str projectDescription; | ||
| 1264 | |||
| 1265 | application_credential_name = mkOpt types.str applicationDescription; | ||
| 1266 | application_credential_id = mkOpt types.str applicationDescription; | ||
| 1267 | |||
| 1268 | application_credential_secret = mkOpt types.str '' | ||
| 1269 | The application_credential_secret field is required if using an application | ||
| 1270 | credential to authenticate. | ||
| 1271 | ''; | ||
| 1272 | |||
| 1273 | all_tenants = mkDefOpt types.bool "false" '' | ||
| 1274 | Whether the service discovery should list all instances for all projects. | ||
| 1275 | It is only relevant for the 'instance' role and usually requires admin permissions. | ||
| 1276 | ''; | ||
| 1277 | |||
| 1278 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1279 | Refresh interval to re-read the instance list. | ||
| 1280 | ''; | ||
| 1281 | |||
| 1282 | port = mkDefOpt types.port "80" '' | ||
| 1283 | The port to scrape metrics from. If using the public IP address, this must | ||
| 1284 | instead be specified in the relabeling rule. | ||
| 1285 | ''; | ||
| 1286 | |||
| 1287 | availability = | ||
| 1288 | mkDefOpt | ||
| 1289 | (types.enum [ | ||
| 1290 | "public" | ||
| 1291 | "admin" | ||
| 1292 | "internal" | ||
| 1293 | ]) | ||
| 1294 | "public" | ||
| 1295 | '' | ||
| 1296 | The availability of the endpoint to connect to. Must be one of public, admin or internal. | ||
| 1297 | ''; | ||
| 1298 | |||
| 1299 | tls_config = mkOpt promTypes.tls_config '' | ||
| 1300 | TLS configuration. | ||
| 1301 | ''; | ||
| 1302 | }; | ||
| 1303 | }; | ||
| 1304 | |||
| 1305 | promTypes.puppetdb_sd_config = mkSdConfigModule { | ||
| 1306 | url = mkOption { | ||
| 1307 | type = types.str; | ||
| 1308 | description = '' | ||
| 1309 | The URL of the PuppetDB root query endpoint. | ||
| 1310 | ''; | ||
| 1311 | }; | ||
| 1312 | |||
| 1313 | query = mkOption { | ||
| 1314 | type = types.str; | ||
| 1315 | description = '' | ||
| 1316 | Puppet Query Language (PQL) query. Only resources are supported. | ||
| 1317 | <https://puppet.com/docs/puppetdb/latest/api/query/v4/pql.html> | ||
| 1318 | ''; | ||
| 1319 | }; | ||
| 1320 | |||
| 1321 | include_parameters = mkDefOpt types.bool "false" '' | ||
| 1322 | Whether to include the parameters as meta labels. | ||
| 1323 | Due to the differences between parameter types and Prometheus labels, | ||
| 1324 | some parameters might not be rendered. The format of the parameters might | ||
| 1325 | also change in future releases. | ||
| 1326 | |||
| 1327 | Note: Enabling this exposes parameters in the Prometheus UI and API. Make sure | ||
| 1328 | that you don't have secrets exposed as parameters if you enable this. | ||
| 1329 | ''; | ||
| 1330 | |||
| 1331 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1332 | Refresh interval to re-read the resources list. | ||
| 1333 | ''; | ||
| 1334 | |||
| 1335 | port = mkDefOpt types.port "80" '' | ||
| 1336 | The port to scrape metrics from. | ||
| 1337 | ''; | ||
| 1338 | }; | ||
| 1339 | |||
| 1340 | promTypes.scaleway_sd_config = types.submodule { | ||
| 1341 | options = { | ||
| 1342 | access_key = mkOption { | ||
| 1343 | type = types.str; | ||
| 1344 | description = '' | ||
| 1345 | Access key to use. <https://console.scaleway.com/project/credentials> | ||
| 1346 | ''; | ||
| 1347 | }; | ||
| 1348 | |||
| 1349 | secret_key = mkOpt types.str '' | ||
| 1350 | Secret key to use when listing targets. <https://console.scaleway.com/project/credentials> | ||
| 1351 | It is mutually exclusive with `secret_key_file`. | ||
| 1352 | ''; | ||
| 1353 | |||
| 1354 | secret_key_file = mkOpt types.str '' | ||
| 1355 | Sets the secret key with the credentials read from the configured file. | ||
| 1356 | It is mutually exclusive with `secret_key`. | ||
| 1357 | ''; | ||
| 1358 | |||
| 1359 | project_id = mkOption { | ||
| 1360 | type = types.str; | ||
| 1361 | description = '' | ||
| 1362 | Project ID of the targets. | ||
| 1363 | ''; | ||
| 1364 | }; | ||
| 1365 | |||
| 1366 | role = mkOption { | ||
| 1367 | type = types.enum [ | ||
| 1368 | "instance" | ||
| 1369 | "baremetal" | ||
| 1370 | ]; | ||
| 1371 | description = '' | ||
| 1372 | Role of the targets to retrieve. Must be `instance` or `baremetal`. | ||
| 1373 | ''; | ||
| 1374 | }; | ||
| 1375 | |||
| 1376 | port = mkDefOpt types.port "80" '' | ||
| 1377 | The port to scrape metrics from. | ||
| 1378 | ''; | ||
| 1379 | |||
| 1380 | api_url = mkDefOpt types.str "https://api.scaleway.com" '' | ||
| 1381 | API URL to use when doing the server listing requests. | ||
| 1382 | ''; | ||
| 1383 | |||
| 1384 | zone = mkDefOpt types.str "fr-par-1" '' | ||
| 1385 | Zone is the availability zone of your targets (e.g. fr-par-1). | ||
| 1386 | ''; | ||
| 1387 | |||
| 1388 | name_filter = mkOpt types.str '' | ||
| 1389 | Specify a name filter (works as a LIKE) to apply on the server listing request. | ||
| 1390 | ''; | ||
| 1391 | |||
| 1392 | tags_filter = mkOpt (types.listOf types.str) '' | ||
| 1393 | Specify a tag filter (a server needs to have all defined tags to be listed) to apply on the server listing request. | ||
| 1394 | ''; | ||
| 1395 | |||
| 1396 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1397 | Refresh interval to re-read the managed targets list. | ||
| 1398 | ''; | ||
| 1399 | |||
| 1400 | proxy_url = mkOpt types.str '' | ||
| 1401 | Optional proxy URL. | ||
| 1402 | ''; | ||
| 1403 | |||
| 1404 | follow_redirects = mkDefOpt types.bool "true" '' | ||
| 1405 | Configure whether HTTP requests follow HTTP 3xx redirects. | ||
| 1406 | ''; | ||
| 1407 | |||
| 1408 | tls_config = mkOpt promTypes.tls_config '' | ||
| 1409 | TLS configuration. | ||
| 1410 | ''; | ||
| 1411 | }; | ||
| 1412 | }; | ||
| 1413 | |||
| 1414 | # These are exactly the same. | ||
| 1415 | promTypes.serverset_sd_config = promTypes.nerve_sd_config; | ||
| 1416 | |||
| 1417 | promTypes.triton_sd_config = types.submodule { | ||
| 1418 | options = { | ||
| 1419 | account = mkOption { | ||
| 1420 | type = types.str; | ||
| 1421 | description = '' | ||
| 1422 | The account to use for discovering new targets. | ||
| 1423 | ''; | ||
| 1424 | }; | ||
| 1425 | |||
| 1426 | role = | ||
| 1427 | mkDefOpt | ||
| 1428 | (types.enum [ | ||
| 1429 | "container" | ||
| 1430 | "cn" | ||
| 1431 | ]) | ||
| 1432 | "container" | ||
| 1433 | '' | ||
| 1434 | The type of targets to discover, can be set to: | ||
| 1435 | - "container" to discover virtual machines (SmartOS zones, lx/KVM/bhyve branded zones) running on Triton | ||
| 1436 | - "cn" to discover compute nodes (servers/global zones) making up the Triton infrastructure | ||
| 1437 | ''; | ||
| 1438 | |||
| 1439 | dns_suffix = mkOption { | ||
| 1440 | type = types.str; | ||
| 1441 | description = '' | ||
| 1442 | The DNS suffix which should be applied to target. | ||
| 1443 | ''; | ||
| 1444 | }; | ||
| 1445 | |||
| 1446 | endpoint = mkOption { | ||
| 1447 | type = types.str; | ||
| 1448 | description = '' | ||
| 1449 | The Triton discovery endpoint (e.g. `cmon.us-east-3b.triton.zone`). This is | ||
| 1450 | often the same value as dns_suffix. | ||
| 1451 | ''; | ||
| 1452 | }; | ||
| 1453 | |||
| 1454 | groups = mkOpt (types.listOf types.str) '' | ||
| 1455 | A list of groups for which targets are retrieved, only supported when targeting the `container` role. | ||
| 1456 | If omitted all containers owned by the requesting account are scraped. | ||
| 1457 | ''; | ||
| 1458 | |||
| 1459 | port = mkDefOpt types.port "9163" '' | ||
| 1460 | The port to use for discovery and metric scraping. | ||
| 1461 | ''; | ||
| 1462 | |||
| 1463 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1464 | The interval which should be used for refreshing targets. | ||
| 1465 | ''; | ||
| 1466 | |||
| 1467 | version = mkDefOpt types.int "1" '' | ||
| 1468 | The Triton discovery API version. | ||
| 1469 | ''; | ||
| 1470 | |||
| 1471 | tls_config = mkOpt promTypes.tls_config '' | ||
| 1472 | TLS configuration. | ||
| 1473 | ''; | ||
| 1474 | }; | ||
| 1475 | }; | ||
| 1476 | |||
| 1477 | promTypes.uyuni_sd_config = mkSdConfigModule { | ||
| 1478 | server = mkOption { | ||
| 1479 | type = types.str; | ||
| 1480 | description = '' | ||
| 1481 | The URL to connect to the Uyuni server. | ||
| 1482 | ''; | ||
| 1483 | }; | ||
| 1484 | |||
| 1485 | username = mkOption { | ||
| 1486 | type = types.str; | ||
| 1487 | description = '' | ||
| 1488 | Credentials are used to authenticate the requests to Uyuni API. | ||
| 1489 | ''; | ||
| 1490 | }; | ||
| 1491 | |||
| 1492 | password = mkOption { | ||
| 1493 | type = types.str; | ||
| 1494 | description = '' | ||
| 1495 | Credentials are used to authenticate the requests to Uyuni API. | ||
| 1496 | ''; | ||
| 1497 | }; | ||
| 1498 | |||
| 1499 | entitlement = mkDefOpt types.str "monitoring_entitled" '' | ||
| 1500 | The entitlement string to filter eligible systems. | ||
| 1501 | ''; | ||
| 1502 | |||
| 1503 | separator = mkDefOpt types.str "," '' | ||
| 1504 | The string by which Uyuni group names are joined into the groups label | ||
| 1505 | ''; | ||
| 1506 | |||
| 1507 | refresh_interval = mkDefOpt types.str "60s" '' | ||
| 1508 | Refresh interval to re-read the managed targets list. | ||
| 1509 | ''; | ||
| 1510 | }; | ||
| 1511 | |||
| 1512 | promTypes.static_config = types.submodule { | ||
| 1513 | options = { | ||
| 1514 | targets = mkOption { | ||
| 1515 | type = types.listOf types.str; | ||
| 1516 | description = '' | ||
| 1517 | The targets specified by the target group. | ||
| 1518 | ''; | ||
| 1519 | }; | ||
| 1520 | labels = mkOption { | ||
| 1521 | type = types.attrsOf types.str; | ||
| 1522 | default = { }; | ||
| 1523 | description = '' | ||
| 1524 | Labels assigned to all metrics scraped from the targets. | ||
| 1525 | ''; | ||
| 1526 | }; | ||
| 1527 | }; | ||
| 1528 | }; | ||
| 1529 | |||
| 1530 | # | ||
| 1531 | # Config types: relabling | ||
| 1532 | # | ||
| 1533 | |||
| 1534 | promTypes.relabel_config = types.submodule { | ||
| 1535 | options = { | ||
| 1536 | source_labels = mkOpt (types.listOf types.str) '' | ||
| 1537 | The source labels select values from existing labels. Their content | ||
| 1538 | is concatenated using the configured separator and matched against | ||
| 1539 | the configured regular expression. | ||
| 1540 | ''; | ||
| 1541 | |||
| 1542 | separator = mkDefOpt types.str ";" '' | ||
| 1543 | Separator placed between concatenated source label values. | ||
| 1544 | ''; | ||
| 1545 | |||
| 1546 | target_label = mkOpt types.str '' | ||
| 1547 | Label to which the resulting value is written in a replace action. | ||
| 1548 | It is mandatory for replace actions. | ||
| 1549 | ''; | ||
| 1550 | |||
| 1551 | regex = mkDefOpt types.str "(.*)" '' | ||
| 1552 | Regular expression against which the extracted value is matched. | ||
| 1553 | ''; | ||
| 1554 | |||
| 1555 | modulus = mkOpt types.int '' | ||
| 1556 | Modulus to take of the hash of the source label values. | ||
| 1557 | ''; | ||
| 1558 | |||
| 1559 | replacement = mkDefOpt types.str "$1" '' | ||
| 1560 | Replacement value against which a regex replace is performed if the | ||
| 1561 | regular expression matches. | ||
| 1562 | ''; | ||
| 1563 | |||
| 1564 | action = | ||
| 1565 | mkDefOpt | ||
| 1566 | (types.enum [ | ||
| 1567 | "replace" | ||
| 1568 | "lowercase" | ||
| 1569 | "uppercase" | ||
| 1570 | "keep" | ||
| 1571 | "drop" | ||
| 1572 | "hashmod" | ||
| 1573 | "labelmap" | ||
| 1574 | "labeldrop" | ||
| 1575 | "labelkeep" | ||
| 1576 | ]) | ||
| 1577 | "replace" | ||
| 1578 | '' | ||
| 1579 | Action to perform based on regex matching. | ||
| 1580 | ''; | ||
| 1581 | }; | ||
| 1582 | }; | ||
| 1583 | |||
| 1584 | # | ||
| 1585 | # Config types : remote read / write | ||
| 1586 | # | ||
| 1587 | |||
| 1588 | promTypes.remote_write = types.submodule { | ||
| 1589 | options = { | ||
| 1590 | url = mkOption { | ||
| 1591 | type = types.str; | ||
| 1592 | description = '' | ||
| 1593 | ServerName extension to indicate the name of the server. | ||
| 1594 | http://tools.ietf.org/html/rfc4366#section-3.1 | ||
| 1595 | ''; | ||
| 1596 | }; | ||
| 1597 | remote_timeout = mkOpt types.str '' | ||
| 1598 | Timeout for requests to the remote write endpoint. | ||
| 1599 | ''; | ||
| 1600 | headers = mkOpt (types.attrsOf types.str) '' | ||
| 1601 | Custom HTTP headers to be sent along with each remote write request. | ||
| 1602 | Be aware that headers that are set by Prometheus itself can't be overwritten. | ||
| 1603 | ''; | ||
| 1604 | write_relabel_configs = mkOpt (types.listOf promTypes.relabel_config) '' | ||
| 1605 | List of remote write relabel configurations. | ||
| 1606 | ''; | ||
| 1607 | name = mkOpt types.str '' | ||
| 1608 | Name of the remote write config, which if specified must be unique among remote write configs. | ||
| 1609 | The name will be used in metrics and logging in place of a generated value to help users distinguish between | ||
| 1610 | remote write configs. | ||
| 1611 | ''; | ||
| 1612 | basic_auth = mkOpt promTypes.basic_auth '' | ||
| 1613 | Sets the `Authorization` header on every remote write request with the | ||
| 1614 | configured username and password. | ||
| 1615 | password and password_file are mutually exclusive. | ||
| 1616 | ''; | ||
| 1617 | bearer_token = mkOpt types.str '' | ||
| 1618 | Sets the `Authorization` header on every remote write request with | ||
| 1619 | the configured bearer token. It is mutually exclusive with `bearer_token_file`. | ||
| 1620 | ''; | ||
| 1621 | bearer_token_file = mkOpt types.str '' | ||
| 1622 | Sets the `Authorization` header on every remote write request with the bearer token | ||
| 1623 | read from the configured file. It is mutually exclusive with `bearer_token`. | ||
| 1624 | ''; | ||
| 1625 | sigv4 = mkOpt promTypes.sigv4 '' | ||
| 1626 | Configures AWS Signature Version 4 settings. | ||
| 1627 | ''; | ||
| 1628 | tls_config = mkOpt promTypes.tls_config '' | ||
| 1629 | Configures the remote write request's TLS settings. | ||
| 1630 | ''; | ||
| 1631 | proxy_url = mkOpt types.str "Optional Proxy URL."; | ||
| 1632 | queue_config = | ||
| 1633 | mkOpt | ||
| 1634 | (types.submodule { | ||
| 1635 | options = { | ||
| 1636 | capacity = mkOpt types.int '' | ||
| 1637 | Number of samples to buffer per shard before we block reading of more | ||
| 1638 | samples from the WAL. It is recommended to have enough capacity in each | ||
| 1639 | shard to buffer several requests to keep throughput up while processing | ||
| 1640 | occasional slow remote requests. | ||
| 1641 | ''; | ||
| 1642 | max_shards = mkOpt types.int '' | ||
| 1643 | Maximum number of shards, i.e. amount of concurrency. | ||
| 1644 | ''; | ||
| 1645 | min_shards = mkOpt types.int '' | ||
| 1646 | Minimum number of shards, i.e. amount of concurrency. | ||
| 1647 | ''; | ||
| 1648 | max_samples_per_send = mkOpt types.int '' | ||
| 1649 | Maximum number of samples per send. | ||
| 1650 | ''; | ||
| 1651 | batch_send_deadline = mkOpt types.str '' | ||
| 1652 | Maximum time a sample will wait in buffer. | ||
| 1653 | ''; | ||
| 1654 | min_backoff = mkOpt types.str '' | ||
| 1655 | Initial retry delay. Gets doubled for every retry. | ||
| 1656 | ''; | ||
| 1657 | max_backoff = mkOpt types.str '' | ||
| 1658 | Maximum retry delay. | ||
| 1659 | ''; | ||
| 1660 | }; | ||
| 1661 | }) | ||
| 1662 | '' | ||
| 1663 | Configures the queue used to write to remote storage. | ||
| 1664 | ''; | ||
| 1665 | metadata_config = | ||
| 1666 | mkOpt | ||
| 1667 | (types.submodule { | ||
| 1668 | options = { | ||
| 1669 | send = mkOpt types.bool '' | ||
| 1670 | Whether metric metadata is sent to remote storage or not. | ||
| 1671 | ''; | ||
| 1672 | send_interval = mkOpt types.str '' | ||
| 1673 | How frequently metric metadata is sent to remote storage. | ||
| 1674 | ''; | ||
| 1675 | }; | ||
| 1676 | }) | ||
| 1677 | '' | ||
| 1678 | Configures the sending of series metadata to remote storage. | ||
| 1679 | Metadata configuration is subject to change at any point | ||
| 1680 | or be removed in future releases. | ||
| 1681 | ''; | ||
| 1682 | }; | ||
| 1683 | }; | ||
| 1684 | |||
| 1685 | promTypes.remote_read = types.submodule { | ||
| 1686 | options = { | ||
| 1687 | url = mkOption { | ||
| 1688 | type = types.str; | ||
| 1689 | description = '' | ||
| 1690 | ServerName extension to indicate the name of the server. | ||
| 1691 | http://tools.ietf.org/html/rfc4366#section-3.1 | ||
| 1692 | ''; | ||
| 1693 | }; | ||
| 1694 | name = mkOpt types.str '' | ||
| 1695 | Name of the remote read config, which if specified must be unique among remote read configs. | ||
| 1696 | The name will be used in metrics and logging in place of a generated value to help users distinguish between | ||
| 1697 | remote read configs. | ||
| 1698 | ''; | ||
| 1699 | required_matchers = mkOpt (types.attrsOf types.str) '' | ||
| 1700 | An optional list of equality matchers which have to be | ||
| 1701 | present in a selector to query the remote read endpoint. | ||
| 1702 | ''; | ||
| 1703 | remote_timeout = mkOpt types.str '' | ||
| 1704 | Timeout for requests to the remote read endpoint. | ||
| 1705 | ''; | ||
| 1706 | headers = mkOpt (types.attrsOf types.str) '' | ||
| 1707 | Custom HTTP headers to be sent along with each remote read request. | ||
| 1708 | Be aware that headers that are set by Prometheus itself can't be overwritten. | ||
| 1709 | ''; | ||
| 1710 | read_recent = mkOpt types.bool '' | ||
| 1711 | Whether reads should be made for queries for time ranges that | ||
| 1712 | the local storage should have complete data for. | ||
| 1713 | ''; | ||
| 1714 | basic_auth = mkOpt promTypes.basic_auth '' | ||
| 1715 | Sets the `Authorization` header on every remote read request with the | ||
| 1716 | configured username and password. | ||
| 1717 | password and password_file are mutually exclusive. | ||
| 1718 | ''; | ||
| 1719 | bearer_token = mkOpt types.str '' | ||
| 1720 | Sets the `Authorization` header on every remote read request with | ||
| 1721 | the configured bearer token. It is mutually exclusive with `bearer_token_file`. | ||
| 1722 | ''; | ||
| 1723 | bearer_token_file = mkOpt types.str '' | ||
| 1724 | Sets the `Authorization` header on every remote read request with the bearer token | ||
| 1725 | read from the configured file. It is mutually exclusive with `bearer_token`. | ||
| 1726 | ''; | ||
| 1727 | tls_config = mkOpt promTypes.tls_config '' | ||
| 1728 | Configures the remote read request's TLS settings. | ||
| 1729 | ''; | ||
| 1730 | proxy_url = mkOpt types.str "Optional Proxy URL."; | ||
| 1731 | }; | ||
| 1732 | }; | ||
| 1733 | |||
| 1734 | in | ||
| 1735 | { | ||
| 1736 | disabledModules = ["services/monitoring/prometheus/default.nix"]; | ||
| 1737 | |||
| 1738 | imports = [ | ||
| 1739 | (mkRenamedOptionModule [ "services" "prometheus2" ] [ "services" "prometheus" ]) | ||
| 1740 | (mkRemovedOptionModule [ "services" "prometheus" "environmentFile" ] | ||
| 1741 | "It has been removed since it was causing issues (https://github.com/NixOS/nixpkgs/issues/126083) and Prometheus now has native support for secret files, i.e. `basic_auth.password_file` and `authorization.credentials_file`." | ||
| 1742 | ) | ||
| 1743 | (mkRemovedOptionModule [ | ||
| 1744 | "services" | ||
| 1745 | "prometheus" | ||
| 1746 | "alertmanagerTimeout" | ||
| 1747 | ] "Deprecated upstream and no longer had any effect") | ||
| 1748 | ]; | ||
| 1749 | |||
| 1750 | options.services.prometheus = { | ||
| 1751 | |||
| 1752 | enable = mkEnableOption "Prometheus monitoring daemon"; | ||
| 1753 | |||
| 1754 | package = mkPackageOption pkgs "prometheus" { }; | ||
| 1755 | |||
| 1756 | port = mkOption { | ||
| 1757 | type = types.port; | ||
| 1758 | default = 9090; | ||
| 1759 | description = '' | ||
| 1760 | Port to listen on. | ||
| 1761 | ''; | ||
| 1762 | }; | ||
| 1763 | |||
| 1764 | listenAddress = mkOption { | ||
| 1765 | type = types.str; | ||
| 1766 | default = "0.0.0.0"; | ||
| 1767 | description = '' | ||
| 1768 | Address to listen on for the web interface, API, and telemetry. | ||
| 1769 | ''; | ||
| 1770 | }; | ||
| 1771 | |||
| 1772 | stateDir = mkOption { | ||
| 1773 | type = types.str; | ||
| 1774 | default = "prometheus2"; | ||
| 1775 | description = '' | ||
| 1776 | Directory below `/var/lib` to store Prometheus metrics data. | ||
| 1777 | This directory will be created automatically using systemd's StateDirectory mechanism. | ||
| 1778 | ''; | ||
| 1779 | }; | ||
| 1780 | |||
| 1781 | extraFlags = mkOption { | ||
| 1782 | type = types.listOf types.str; | ||
| 1783 | default = [ ]; | ||
| 1784 | description = '' | ||
| 1785 | Extra commandline options when launching Prometheus. | ||
| 1786 | ''; | ||
| 1787 | }; | ||
| 1788 | |||
| 1789 | enableReload = mkOption { | ||
| 1790 | default = false; | ||
| 1791 | type = types.bool; | ||
| 1792 | description = '' | ||
| 1793 | Reload prometheus when configuration file changes (instead of restart). | ||
| 1794 | |||
| 1795 | The following property holds: switching to a configuration | ||
| 1796 | (`switch-to-configuration`) that changes the prometheus | ||
| 1797 | configuration only finishes successfully when prometheus has finished | ||
| 1798 | loading the new configuration. | ||
| 1799 | ''; | ||
| 1800 | }; | ||
| 1801 | |||
| 1802 | enableAgentMode = mkEnableOption "agent mode"; | ||
| 1803 | |||
| 1804 | configText = mkOption { | ||
| 1805 | type = types.nullOr types.lines; | ||
| 1806 | default = null; | ||
| 1807 | description = '' | ||
| 1808 | If non-null, this option defines the text that is written to | ||
| 1809 | prometheus.yml. If null, the contents of prometheus.yml is generated | ||
| 1810 | from the structured config options. | ||
| 1811 | ''; | ||
| 1812 | }; | ||
| 1813 | |||
| 1814 | globalConfig = mkOption { | ||
| 1815 | type = promTypes.globalConfig; | ||
| 1816 | default = { }; | ||
| 1817 | description = '' | ||
| 1818 | Parameters that are valid in all configuration contexts. They | ||
| 1819 | also serve as defaults for other configuration sections | ||
| 1820 | ''; | ||
| 1821 | }; | ||
| 1822 | |||
| 1823 | remoteRead = mkOption { | ||
| 1824 | type = types.listOf promTypes.remote_read; | ||
| 1825 | default = [ ]; | ||
| 1826 | description = '' | ||
| 1827 | Parameters of the endpoints to query from. | ||
| 1828 | See [the official documentation](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read) for more information. | ||
| 1829 | ''; | ||
| 1830 | }; | ||
| 1831 | |||
| 1832 | remoteWrite = mkOption { | ||
| 1833 | type = types.listOf promTypes.remote_write; | ||
| 1834 | default = [ ]; | ||
| 1835 | description = '' | ||
| 1836 | Parameters of the endpoints to send samples to. | ||
| 1837 | See [the official documentation](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write) for more information. | ||
| 1838 | ''; | ||
| 1839 | }; | ||
| 1840 | |||
| 1841 | rules = mkOption { | ||
| 1842 | type = types.listOf types.str; | ||
| 1843 | default = [ ]; | ||
| 1844 | description = '' | ||
| 1845 | Alerting and/or Recording rules to evaluate at runtime. | ||
| 1846 | ''; | ||
| 1847 | }; | ||
| 1848 | |||
| 1849 | ruleFiles = mkOption { | ||
| 1850 | type = types.listOf types.path; | ||
| 1851 | default = [ ]; | ||
| 1852 | description = '' | ||
| 1853 | Any additional rules files to include in this configuration. | ||
| 1854 | ''; | ||
| 1855 | }; | ||
| 1856 | |||
| 1857 | scrapeConfigs = mkOption { | ||
| 1858 | type = types.listOf promTypes.scrape_config; | ||
| 1859 | default = [ ]; | ||
| 1860 | description = '' | ||
| 1861 | A list of scrape configurations. | ||
| 1862 | ''; | ||
| 1863 | }; | ||
| 1864 | |||
| 1865 | alertmanagers = mkOption { | ||
| 1866 | type = types.listOf types.attrs; | ||
| 1867 | example = literalExpression '' | ||
| 1868 | [ { | ||
| 1869 | scheme = "https"; | ||
| 1870 | path_prefix = "/alertmanager"; | ||
| 1871 | static_configs = [ { | ||
| 1872 | targets = [ | ||
| 1873 | "prometheus.domain.tld" | ||
| 1874 | ]; | ||
| 1875 | } ]; | ||
| 1876 | } ] | ||
| 1877 | ''; | ||
| 1878 | default = [ ]; | ||
| 1879 | description = '' | ||
| 1880 | A list of alertmanagers to send alerts to. | ||
| 1881 | See [the official documentation](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alertmanager_config) for more information. | ||
| 1882 | ''; | ||
| 1883 | }; | ||
| 1884 | |||
| 1885 | alertmanagerNotificationQueueCapacity = mkOption { | ||
| 1886 | type = types.int; | ||
| 1887 | default = 10000; | ||
| 1888 | description = '' | ||
| 1889 | The capacity of the queue for pending alert manager notifications. | ||
| 1890 | ''; | ||
| 1891 | }; | ||
| 1892 | |||
| 1893 | webExternalUrl = mkOption { | ||
| 1894 | type = types.nullOr types.str; | ||
| 1895 | default = null; | ||
| 1896 | example = "https://example.com/"; | ||
| 1897 | description = '' | ||
| 1898 | The URL under which Prometheus is externally reachable (for example, | ||
| 1899 | if Prometheus is served via a reverse proxy). | ||
| 1900 | ''; | ||
| 1901 | }; | ||
| 1902 | |||
| 1903 | webConfigFile = mkOption { | ||
| 1904 | type = types.nullOr types.path; | ||
| 1905 | default = null; | ||
| 1906 | description = '' | ||
| 1907 | Specifies which file should be used as web.config.file and be passed on startup. | ||
| 1908 | See <https://prometheus.io/docs/prometheus/latest/configuration/https/> for valid options. | ||
| 1909 | ''; | ||
| 1910 | }; | ||
| 1911 | |||
| 1912 | checkConfig = mkOption { | ||
| 1913 | type = with types; either bool (enum [ "syntax-only" ]); | ||
| 1914 | default = true; | ||
| 1915 | example = "syntax-only"; | ||
| 1916 | description = '' | ||
| 1917 | Check configuration with `promtool check`. The call to `promtool` is | ||
| 1918 | subject to sandboxing by Nix. | ||
| 1919 | |||
| 1920 | If you use credentials stored in external files | ||
| 1921 | (`password_file`, `bearer_token_file`, etc), | ||
| 1922 | they will not be visible to `promtool` | ||
| 1923 | and it will report errors, despite a correct configuration. | ||
| 1924 | To resolve this, you may set this option to `"syntax-only"` | ||
| 1925 | in order to only syntax check the Prometheus configuration. | ||
| 1926 | ''; | ||
| 1927 | }; | ||
| 1928 | |||
| 1929 | retentionTime = mkOption { | ||
| 1930 | type = types.nullOr types.str; | ||
| 1931 | default = null; | ||
| 1932 | example = "15d"; | ||
| 1933 | description = '' | ||
| 1934 | How long to retain samples in storage. | ||
| 1935 | ''; | ||
| 1936 | }; | ||
| 1937 | |||
| 1938 | extraConfig = mkOption { | ||
| 1939 | type = yaml.type; | ||
| 1940 | default = {}; | ||
| 1941 | }; | ||
| 1942 | }; | ||
| 1943 | |||
| 1944 | config = mkIf cfg.enable { | ||
| 1945 | assertions = [ | ||
| 1946 | ( | ||
| 1947 | let | ||
| 1948 | # Match something with dots (an IPv4 address) or something ending in | ||
| 1949 | # a square bracket (an IPv6 addresses) followed by a port number. | ||
| 1950 | legacy = builtins.match "(.*\\..*|.*]):([[:digit:]]+)" cfg.listenAddress; | ||
| 1951 | in | ||
| 1952 | { | ||
| 1953 | assertion = legacy == null; | ||
| 1954 | message = '' | ||
| 1955 | Do not specify the port for Prometheus to listen on in the | ||
| 1956 | listenAddress option; use the port option instead: | ||
| 1957 | services.prometheus.listenAddress = ${builtins.elemAt legacy 0}; | ||
| 1958 | services.prometheus.port = ${builtins.elemAt legacy 1}; | ||
| 1959 | ''; | ||
| 1960 | } | ||
| 1961 | ) | ||
| 1962 | ]; | ||
| 1963 | |||
| 1964 | users.groups.prometheus.gid = config.ids.gids.prometheus; | ||
| 1965 | users.users.prometheus = { | ||
| 1966 | description = "Prometheus daemon user"; | ||
| 1967 | uid = config.ids.uids.prometheus; | ||
| 1968 | group = "prometheus"; | ||
| 1969 | }; | ||
| 1970 | environment.etc."prometheus/prometheus.yaml" = mkIf cfg.enableReload { | ||
| 1971 | source = prometheusYml; | ||
| 1972 | }; | ||
| 1973 | systemd.services.prometheus = { | ||
| 1974 | wantedBy = [ "multi-user.target" ]; | ||
| 1975 | after = [ "network.target" ]; | ||
| 1976 | serviceConfig = { | ||
| 1977 | ExecStart = | ||
| 1978 | "${lib.getExe cfg.package}" | ||
| 1979 | + optionalString (length cmdlineArgs != 0) (" \\\n " + concatStringsSep " \\\n " cmdlineArgs); | ||
| 1980 | ExecReload = mkIf cfg.enableReload "+${reload}/bin/reload-prometheus"; | ||
| 1981 | User = "prometheus"; | ||
| 1982 | Restart = "always"; | ||
| 1983 | RuntimeDirectory = "prometheus"; | ||
| 1984 | RuntimeDirectoryMode = "0700"; | ||
| 1985 | WorkingDirectory = workingDir; | ||
| 1986 | StateDirectory = cfg.stateDir; | ||
| 1987 | StateDirectoryMode = "0700"; | ||
| 1988 | # Hardening | ||
| 1989 | CapabilityBoundingSet = [ "" ]; | ||
| 1990 | DeviceAllow = [ "/dev/null rw" ]; | ||
| 1991 | DevicePolicy = "strict"; | ||
| 1992 | LockPersonality = true; | ||
| 1993 | MemoryDenyWriteExecute = true; | ||
| 1994 | NoNewPrivileges = true; | ||
| 1995 | PrivateDevices = true; | ||
| 1996 | PrivateTmp = true; | ||
| 1997 | PrivateUsers = true; | ||
| 1998 | ProtectClock = true; | ||
| 1999 | ProtectControlGroups = true; | ||
| 2000 | ProtectHome = true; | ||
| 2001 | ProtectHostname = true; | ||
| 2002 | ProtectKernelLogs = true; | ||
| 2003 | ProtectKernelModules = true; | ||
| 2004 | ProtectKernelTunables = true; | ||
| 2005 | ProtectProc = "invisible"; | ||
| 2006 | ProtectSystem = "full"; | ||
| 2007 | RemoveIPC = true; | ||
| 2008 | RestrictAddressFamilies = [ | ||
| 2009 | "AF_INET" | ||
| 2010 | "AF_INET6" | ||
| 2011 | "AF_UNIX" | ||
| 2012 | ]; | ||
| 2013 | RestrictNamespaces = true; | ||
| 2014 | RestrictRealtime = true; | ||
| 2015 | RestrictSUIDSGID = true; | ||
| 2016 | SystemCallArchitectures = "native"; | ||
| 2017 | SystemCallFilter = [ | ||
| 2018 | "@system-service" | ||
| 2019 | "~@privileged" | ||
| 2020 | ]; | ||
| 2021 | }; | ||
| 2022 | }; | ||
| 2023 | # prometheus-config-reload will activate after prometheus. However, what we | ||
| 2024 | # don't want is that on startup it immediately reloads prometheus because | ||
| 2025 | # prometheus itself might have just started. | ||
| 2026 | # | ||
| 2027 | # Instead we only want to reload prometheus when the config file has | ||
| 2028 | # changed. So on startup prometheus-config-reload will just output a | ||
| 2029 | # harmless message and then stay active (RemainAfterExit). | ||
| 2030 | # | ||
| 2031 | # Then, when the config file has changed, switch-to-configuration notices | ||
| 2032 | # that this service has changed (restartTriggers) and needs to be reloaded | ||
| 2033 | # (reloadIfChanged). The reload command then reloads prometheus. | ||
| 2034 | systemd.services.prometheus-config-reload = mkIf cfg.enableReload { | ||
| 2035 | wantedBy = [ "prometheus.service" ]; | ||
| 2036 | after = [ "prometheus.service" ]; | ||
| 2037 | reloadIfChanged = true; | ||
| 2038 | restartTriggers = [ prometheusYml ]; | ||
| 2039 | serviceConfig = { | ||
| 2040 | Type = "oneshot"; | ||
| 2041 | RemainAfterExit = true; | ||
| 2042 | TimeoutSec = 60; | ||
| 2043 | ExecStart = "${pkgs.logger}/bin/logger 'prometheus-config-reload will only reload prometheus when reloaded itself.'"; | ||
| 2044 | ExecReload = [ "${triggerReload}/bin/trigger-reload-prometheus" ]; | ||
| 2045 | }; | ||
| 2046 | }; | ||
| 2047 | }; | ||
| 2048 | } | ||
diff --git a/overlays/etesync-dav.nix b/overlays/etesync-dav.nix index 08a70c62..dbb7c7b6 100644 --- a/overlays/etesync-dav.nix +++ b/overlays/etesync-dav.nix | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | { final, prev, ... }: { | 1 | { final, prev, ... }: { |
| 2 | etesync-dav = final.python310Packages.buildPythonApplication rec { | 2 | etesync-dav = final.python312Packages.buildPythonApplication rec { |
| 3 | pname = "etesync-dav"; | 3 | pname = "etesync-dav"; |
| 4 | version = "0.35.1"; | 4 | version = "0.35.1"; |
| 5 | pyproject = true; | 5 | pyproject = true; |
| @@ -11,9 +11,9 @@ | |||
| 11 | hash = "sha256-y4BhU2kSn+RWqc5+pJQFhbwfat9cMWD0ED0EXJp25cY="; | 11 | hash = "sha256-y4BhU2kSn+RWqc5+pJQFhbwfat9cMWD0ED0EXJp25cY="; |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | build-system = with final.python310Packages; [ setuptools ]; | 14 | build-system = with final.python312Packages; [ setuptools ]; |
| 15 | 15 | ||
| 16 | dependencies = with final.python310Packages; [ | 16 | dependencies = with final.python312Packages; [ |
| 17 | appdirs | 17 | appdirs |
| 18 | etebase | 18 | etebase |
| 19 | etesync | 19 | etesync |
