From 57e5b75f9cb3a1368fa1123ad426c72bc12f8e5d Mon Sep 17 00:00:00 2001 From: Bas van Dijk Date: Wed, 17 Apr 2019 14:08:16 +0200 Subject: [PATCH 1/4] nixos/prometheus: filter out the _module attr in a central place We previously filtered out the `_module` attribute in a NixOS configuration by filtering it using the option's `apply` function. This meant that every option that had a submodule type needed to have this apply function. Adding this function is easy to forget thus this mechanism is error prone. We now recursively filter out the `_module` attributes at the place we construct the Prometheus configuration file. Since we now do the filtering centrally we don't have to do it per option making it less prone to errors. --- .../monitoring/prometheus/default.nix | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/nixos/modules/services/monitoring/prometheus/default.nix b/nixos/modules/services/monitoring/prometheus/default.nix index e7ac12c07d33..ec410cb14eb2 100644 --- a/nixos/modules/services/monitoring/prometheus/default.nix +++ b/nixos/modules/services/monitoring/prometheus/default.nix @@ -22,9 +22,6 @@ let workingDir = stateDirBase + stateDir; workingDir2 = stateDirBase + cfg2.stateDir; - # Get a submodule without any embedded metadata: - _filter = x: filterAttrs (k: v: k != "_module") x; - # a wrapper that verifies that the configuration is valid promtoolCheck = what: name: file: pkgs.runCommand "${name}-${what}-checked" { buildInputs = [ cfg.package ]; } '' @@ -50,11 +47,11 @@ let # This becomes the main config file for Prometheus 1 promConfig = { - global = cfg.globalConfig; + global = filterValidPrometheus cfg.globalConfig; rule_files = map (promtoolCheck "check-rules" "rules") (cfg.ruleFiles ++ [ (pkgs.writeText "prometheus.rules" (concatStringsSep "\n" cfg.rules)) ]); - scrape_configs = filterEmpty cfg.scrapeConfigs; + scrape_configs = filterValidPrometheus cfg.scrapeConfigs; }; generatedPrometheusYml = writePrettyJSON "prometheus.yml" promConfig; @@ -77,11 +74,11 @@ let # This becomes the main config file for Prometheus 2 promConfig2 = { - global = cfg2.globalConfig; + global = filterValidPrometheus cfg2.globalConfig; rule_files = map (prom2toolCheck "check rules" "rules") (cfg2.ruleFiles ++ [ (pkgs.writeText "prometheus.rules" (concatStringsSep "\n" cfg2.rules)) ]); - scrape_configs = filterEmpty cfg2.scrapeConfigs; + scrape_configs = filterValidPrometheus cfg2.scrapeConfigs; alerting = optionalAttrs (cfg2.alertmanagerURL != []) { alertmanagers = [{ static_configs = [{ @@ -108,7 +105,7 @@ let ] ++ optional (cfg2.webExternalUrl != null) "--web.external-url=${cfg2.webExternalUrl}"; - filterEmpty = filterAttrsListRecursive (_n: v: !(v == null || v == [] || v == {})); + filterValidPrometheus = filterAttrsListRecursive (n: v: !(n == "_module" || v == null || v == [] || v == {})); filterAttrsListRecursive = pred: x: if isAttrs x then listToAttrs ( @@ -247,7 +244,6 @@ let }; }); default = null; - apply = x: mapNullable _filter x; description = '' Optional http login credentials for metrics scraping. ''; @@ -255,7 +251,6 @@ let tls_config = mkOption { type = types.nullOr promTypes.tls_config; default = null; - apply = x: mapNullable _filter x; description = '' Configures the scrape request's TLS settings. ''; @@ -263,7 +258,6 @@ let dns_sd_configs = mkOption { type = types.listOf promTypes.dns_sd_config; default = []; - apply = x: map _filter x; description = '' List of DNS service discovery configurations. ''; @@ -271,7 +265,6 @@ let consul_sd_configs = mkOption { type = types.listOf promTypes.consul_sd_config; default = []; - apply = x: map _filter x; description = '' List of Consul service discovery configurations. ''; @@ -279,7 +272,6 @@ let file_sd_configs = mkOption { type = types.listOf promTypes.file_sd_config; default = []; - apply = x: map _filter x; description = '' List of file service discovery configurations. ''; @@ -287,7 +279,6 @@ let static_configs = mkOption { type = types.listOf promTypes.static_config; default = []; - apply = x: map _filter x; description = '' List of labeled target groups for this job. ''; @@ -295,7 +286,6 @@ let ec2_sd_configs = mkOption { type = types.listOf promTypes.ec2_sd_config; default = []; - apply = x: map _filter x; description = '' List of EC2 service discovery configurations. ''; @@ -303,7 +293,6 @@ let relabel_configs = mkOption { type = types.listOf promTypes.relabel_config; default = []; - apply = x: map _filter x; description = '' List of relabel configurations. ''; @@ -662,7 +651,6 @@ in { globalConfig = mkOption { type = promTypes.globalConfig; default = {}; - apply = _filter; description = '' Parameters that are valid in all configuration contexts. They also serve as defaults for other configuration sections @@ -688,7 +676,6 @@ in { scrapeConfigs = mkOption { type = types.listOf promTypes.scrape_config; default = []; - apply = x: map _filter x; description = '' A list of scrape configurations. ''; @@ -786,7 +773,6 @@ in { globalConfig = mkOption { type = promTypes.globalConfig; default = {}; - apply = _filter; description = '' Parameters that are valid in all configuration contexts. They also serve as defaults for other configuration sections @@ -812,7 +798,6 @@ in { scrapeConfigs = mkOption { type = types.listOf promTypes.scrape_config; default = []; - apply = x: map _filter x; description = '' A list of scrape configurations. ''; From 55ef5d424636a122dc98f889d160d2d98571968b Mon Sep 17 00:00:00 2001 From: Bas van Dijk Date: Wed, 17 Apr 2019 14:49:09 +0200 Subject: [PATCH 2/4] nixos/prometheus: set optional attributes to type types.nullOr This makes sure that when a user hasn't set a Prometheus option it won't show up in the prometheus.yml configuration file. This results in smaller and easier to understand configuration files. --- .../monitoring/prometheus/default.nix | 99 ++++++++++--------- 1 file changed, 50 insertions(+), 49 deletions(-) diff --git a/nixos/modules/services/monitoring/prometheus/default.nix b/nixos/modules/services/monitoring/prometheus/default.nix index ec410cb14eb2..1679ff804523 100644 --- a/nixos/modules/services/monitoring/prometheus/default.nix +++ b/nixos/modules/services/monitoring/prometheus/default.nix @@ -105,7 +105,7 @@ let ] ++ optional (cfg2.webExternalUrl != null) "--web.external-url=${cfg2.webExternalUrl}"; - filterValidPrometheus = filterAttrsListRecursive (n: v: !(n == "_module" || v == null || v == [] || v == {})); + filterValidPrometheus = filterAttrsListRecursive (n: v: !(n == "_module" || v == null)); filterAttrsListRecursive = pred: x: if isAttrs x then listToAttrs ( @@ -123,37 +123,37 @@ let promTypes.globalConfig = types.submodule { options = { scrape_interval = mkOption { - type = types.str; - default = "1m"; + type = types.nullOr types.str; + default = null; description = '' How frequently to scrape targets by default. ''; }; scrape_timeout = mkOption { - type = types.str; - default = "10s"; + type = types.nullOr types.str; + default = null; description = '' How long until a scrape request times out. ''; }; evaluation_interval = mkOption { - type = types.str; - default = "1m"; + type = types.nullOr types.str; + default = null; description = '' How frequently to evaluate rules by default. ''; }; external_labels = mkOption { - type = types.attrsOf types.str; + type = types.nullOr (types.attrsOf types.str); description = '' The labels to add to any time series or alerts when communicating with external systems (federation, remote storage, Alertmanager). ''; - default = {}; + default = null; }; }; }; @@ -183,15 +183,15 @@ let ''; }; metrics_path = mkOption { - type = types.str; - default = "/metrics"; + type = types.nullOr types.str; + default = null; description = '' The HTTP resource path on which to fetch metrics from targets. ''; }; honor_labels = mkOption { - type = types.bool; - default = false; + type = types.nullOr types.bool; + default = null; description = '' Controls how Prometheus handles conflicts between labels that are already present in scraped data and labels that @@ -213,15 +213,15 @@ let ''; }; scheme = mkOption { - type = types.enum ["http" "https"]; - default = "http"; + type = types.nullOr (types.enum ["http" "https"]); + default = null; description = '' The URL scheme with which to fetch metrics from targets. ''; }; params = mkOption { - type = types.attrsOf (types.listOf types.str); - default = {}; + type = types.nullOr (types.attrsOf (types.listOf types.str)); + default = null; description = '' Optional HTTP URL parameters. ''; @@ -256,43 +256,43 @@ let ''; }; dns_sd_configs = mkOption { - type = types.listOf promTypes.dns_sd_config; - default = []; + type = types.nullOr (types.listOf promTypes.dns_sd_config); + default = null; description = '' List of DNS service discovery configurations. ''; }; consul_sd_configs = mkOption { - type = types.listOf promTypes.consul_sd_config; - default = []; + type = types.nullOr (types.listOf promTypes.consul_sd_config); + default = null; description = '' List of Consul service discovery configurations. ''; }; file_sd_configs = mkOption { - type = types.listOf promTypes.file_sd_config; - default = []; + type = types.nullOr (types.listOf promTypes.file_sd_config); + default = null; description = '' List of file service discovery configurations. ''; }; static_configs = mkOption { - type = types.listOf promTypes.static_config; - default = []; + type = types.nullOr (types.listOf promTypes.static_config); + default = null; description = '' List of labeled target groups for this job. ''; }; ec2_sd_configs = mkOption { - type = types.listOf promTypes.ec2_sd_config; - default = []; + type = types.nullOr (types.listOf promTypes.ec2_sd_config); + default = null; description = '' List of EC2 service discovery configurations. ''; }; relabel_configs = mkOption { - type = types.listOf promTypes.relabel_config; - default = []; + type = types.nullOr (types.listOf promTypes.relabel_config); + default = null; description = '' List of relabel configurations. ''; @@ -371,8 +371,8 @@ let ''; }; port = mkOption { - type = types.int; - default = 80; + type = types.nullOr types.int; + default = null; description = '' The port to scrape metrics from. If using the public IP address, this must instead be specified in the relabeling @@ -417,8 +417,8 @@ let ''; }; refresh_interval = mkOption { - type = types.str; - default = "30s"; + type = types.nullOr types.str; + default = null; description = '' The time after which the provided names are refreshed. ''; @@ -429,7 +429,8 @@ let promTypes.consul_sd_config = types.submodule { options = { server = mkOption { - type = types.str; + type = types.nullOr types.str; + default = null; description = "Consul server to query."; }; token = mkOption { @@ -454,14 +455,15 @@ let }; services = mkOption { - type = types.listOf types.str; + type = types.nullOr (types.listOf types.str); + default = null; description = '' A list of services for which targets are retrieved. ''; }; tag_separator = mkOption { - type = types.str; - default = ","; + type = types.nullOr types.str; + default = null; description = '' The string by which Consul tags are joined into the tag label. ''; @@ -477,12 +479,11 @@ let Patterns for files from which target groups are extracted. Refer to the Prometheus documentation for permitted filename patterns and formats. - ''; }; refresh_interval = mkOption { - type = types.str; - default = "30s"; + type = types.nullOr types.str; + default = null; description = '' Refresh interval to re-read the files. ''; @@ -493,7 +494,7 @@ let promTypes.relabel_config = types.submodule { options = { source_labels = mkOption { - type = with types; nullOr (listOf str); + type = types.nullOr (types.listOf str); default = null; description = '' The source labels select values from existing labels. Their content @@ -502,8 +503,8 @@ let ''; }; separator = mkOption { - type = types.str; - default = ";"; + type = types.nullOr types.str; + default = null; description = '' Separator placed between concatenated source label values. ''; @@ -517,23 +518,23 @@ let ''; }; regex = mkOption { - type = types.str; - default = "(.*)"; + type = types.nullOr types.str; + default = null; description = '' Regular expression against which the extracted value is matched. ''; }; replacement = mkOption { - type = types.str; - default = "$1"; + type = types.nullOr types.str; + default = null; description = '' Replacement value against which a regex replace is performed if the regular expression matches. ''; }; action = mkOption { - type = types.enum ["replace" "keep" "drop"]; - default = "replace"; + type = types.nullOr (types.enum ["replace" "keep" "drop"]); + default = null; description = '' Action to perform based on regex matching. ''; From 285fd3c05a98e6b6763972eb9c1fc6d15f8c4fea Mon Sep 17 00:00:00 2001 From: Bas van Dijk Date: Thu, 18 Apr 2019 11:39:38 +0200 Subject: [PATCH 3/4] nixos/prometheus: abstract over optional option creation --- .../monitoring/prometheus/default.nix | 576 +++++++----------- 1 file changed, 223 insertions(+), 353 deletions(-) diff --git a/nixos/modules/services/monitoring/prometheus/default.nix b/nixos/modules/services/monitoring/prometheus/default.nix index 1679ff804523..cb6932ef1026 100644 --- a/nixos/modules/services/monitoring/prometheus/default.nix +++ b/nixos/modules/services/monitoring/prometheus/default.nix @@ -120,41 +120,37 @@ let map (filterAttrsListRecursive pred) x else x; + mkDefOpt = type : defaultStr : description : mkOpt type (description + '' + + Defaults to ${defaultStr} in prometheus + when set to null. + ''); + + mkOpt = type : description : mkOption { + type = types.nullOr type; + default = null; + inherit description; + }; + promTypes.globalConfig = types.submodule { options = { - scrape_interval = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - How frequently to scrape targets by default. - ''; - }; + scrape_interval = mkDefOpt types.str "1m" '' + How frequently to scrape targets by default. + ''; - scrape_timeout = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - How long until a scrape request times out. - ''; - }; + scrape_timeout = mkDefOpt types.str "10s" '' + How long until a scrape request times out. + ''; - evaluation_interval = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - How frequently to evaluate rules by default. - ''; - }; + evaluation_interval = mkDefOpt types.str "1m" '' + How frequently to evaluate rules by default. + ''; - external_labels = mkOption { - type = types.nullOr (types.attrsOf types.str); - description = '' - The labels to add to any time series or alerts when - communicating with external systems (federation, remote - storage, Alertmanager). - ''; - default = null; - }; + external_labels = mkOpt (types.attrsOf types.str) '' + The labels to add to any time series or alerts when + communicating with external systems (federation, remote + storage, Alertmanager). + ''; }; }; @@ -166,137 +162,94 @@ let The job name assigned to scraped metrics by default. ''; }; - scrape_interval = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - How frequently to scrape targets from this job. Defaults to the - globally configured default. - ''; - }; - scrape_timeout = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Per-target timeout when scraping this job. Defaults to the - globally configured default. - ''; - }; - metrics_path = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - The HTTP resource path on which to fetch metrics from targets. - ''; - }; - honor_labels = mkOption { - type = types.nullOr types.bool; - default = null; - description = '' - Controls how Prometheus handles conflicts between labels - that are already present in scraped data and labels that - Prometheus would attach server-side ("job" and "instance" - labels, manually configured target labels, and labels - generated by service discovery implementations). + scrape_interval = mkOpt types.str '' + How frequently to scrape targets from this job. Defaults to the + globally configured default. + ''; - If honor_labels is set to "true", label conflicts are - resolved by keeping label values from the scraped data and - ignoring the conflicting server-side labels. + scrape_timeout = mkOpt types.str '' + Per-target timeout when scraping this job. Defaults to the + globally configured default. + ''; - If honor_labels is set to "false", label conflicts are - resolved by renaming conflicting labels in the scraped data - to "exported_<original-label>" (for example - "exported_instance", "exported_job") and then attaching - server-side labels. This is useful for use cases such as - federation, where all labels specified in the target should - be preserved. - ''; - }; - scheme = mkOption { - type = types.nullOr (types.enum ["http" "https"]); - default = null; - description = '' - The URL scheme with which to fetch metrics from targets. - ''; - }; - params = mkOption { - type = types.nullOr (types.attrsOf (types.listOf types.str)); - default = null; - description = '' - Optional HTTP URL parameters. - ''; - }; - basic_auth = mkOption { - type = types.nullOr (types.submodule { - options = { - username = mkOption { - type = types.str; - description = '' - HTTP username - ''; - }; - password = mkOption { - type = types.str; - description = '' - HTTP password - ''; - }; + metrics_path = mkDefOpt types.str "/metrics" '' + The HTTP resource path on which to fetch metrics from targets. + ''; + + honor_labels = mkDefOpt types.bool "false" '' + Controls how Prometheus handles conflicts between labels + that are already present in scraped data and labels that + Prometheus would attach server-side ("job" and "instance" + labels, manually configured target labels, and labels + generated by service discovery implementations). + + If honor_labels is set to "true", label conflicts are + resolved by keeping label values from the scraped data and + ignoring the conflicting server-side labels. + + If honor_labels is set to "false", label conflicts are + resolved by renaming conflicting labels in the scraped data + to "exported_<original-label>" (for example + "exported_instance", "exported_job") and then attaching + server-side labels. This is useful for use cases such as + federation, where all labels specified in the target should + be preserved. + ''; + + scheme = mkDefOpt (types.enum ["http" "https"]) "http" '' + The URL scheme with which to fetch metrics from targets. + ''; + + params = mkOpt (types.attrsOf (types.listOf types.str)) '' + Optional HTTP URL parameters. + ''; + + basic_auth = mkOpt (types.submodule { + options = { + username = mkOption { + type = types.str; + description = '' + HTTP username + ''; }; - }); - default = null; - description = '' - Optional http login credentials for metrics scraping. - ''; - }; - tls_config = mkOption { - type = types.nullOr promTypes.tls_config; - default = null; - description = '' - Configures the scrape request's TLS settings. - ''; - }; - dns_sd_configs = mkOption { - type = types.nullOr (types.listOf promTypes.dns_sd_config); - default = null; - description = '' - List of DNS service discovery configurations. - ''; - }; - consul_sd_configs = mkOption { - type = types.nullOr (types.listOf promTypes.consul_sd_config); - default = null; - description = '' - List of Consul service discovery configurations. - ''; - }; - file_sd_configs = mkOption { - type = types.nullOr (types.listOf promTypes.file_sd_config); - default = null; - description = '' - List of file service discovery configurations. - ''; - }; - static_configs = mkOption { - type = types.nullOr (types.listOf promTypes.static_config); - default = null; - description = '' - List of labeled target groups for this job. - ''; - }; - ec2_sd_configs = mkOption { - type = types.nullOr (types.listOf promTypes.ec2_sd_config); - default = null; - description = '' - List of EC2 service discovery configurations. - ''; - }; - relabel_configs = mkOption { - type = types.nullOr (types.listOf promTypes.relabel_config); - default = null; - description = '' - List of relabel configurations. - ''; - }; + password = mkOption { + type = types.str; + description = '' + HTTP password + ''; + }; + }; + }) '' + Optional http login credentials for metrics scraping. + ''; + + tls_config = mkOpt promTypes.tls_config '' + Configures the scrape request's TLS settings. + ''; + + dns_sd_configs = mkOpt (types.listOf promTypes.dns_sd_config) '' + List of DNS service discovery configurations. + ''; + + consul_sd_configs = mkOpt (types.listOf promTypes.consul_sd_config) '' + List of Consul service discovery configurations. + ''; + + file_sd_configs = mkOpt (types.listOf promTypes.file_sd_config) '' + List of file service discovery configurations. + ''; + + static_configs = mkOpt (types.listOf promTypes.static_config) '' + List of labeled target groups for this job. + ''; + + ec2_sd_configs = mkOpt (types.listOf promTypes.ec2_sd_config) '' + List of EC2 service discovery configurations. + ''; + + relabel_configs = mkOpt (types.listOf promTypes.relabel_config) '' + List of relabel configurations. + ''; }; }; @@ -326,66 +279,41 @@ let The AWS Region. ''; }; - endpoint = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Custom endpoint to be used. - ''; - }; - access_key = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - The AWS API key id. If blank, the environment variable - AWS_ACCESS_KEY_ID is used. - ''; - }; - secret_key = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - The AWS API key secret. If blank, the environment variable - AWS_SECRET_ACCESS_KEY is used. - ''; - }; - profile = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Named AWS profile used to connect to the API. - ''; - }; - role_arn = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - AWS Role ARN, an alternative to using AWS API keys. - ''; - }; - refresh_interval = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Refresh interval to re-read the instance list. - ''; - }; - port = mkOption { - type = types.nullOr types.int; - default = null; - description = '' - The port to scrape metrics from. If using the public IP - address, this must instead be specified in the relabeling - rule. - ''; - }; - filters = mkOption { - type = types.nullOr (types.listOf promTypes.filter); - default = null; - description = '' - Filters can be used optionally to filter the instance list by other criteria. - ''; - }; + endpoint = mkOpt types.str '' + Custom endpoint to be used. + ''; + + access_key = mkOpt types.str '' + The AWS API key id. If blank, the environment variable + AWS_ACCESS_KEY_ID is used. + ''; + + secret_key = mkOpt types.str '' + The AWS API key secret. If blank, the environment variable + AWS_SECRET_ACCESS_KEY is used. + ''; + + profile = mkOpt types.str '' + Named AWS profile used to connect to the API. + ''; + + role_arn = mkOpt types.str '' + AWS Role ARN, an alternative to using AWS API keys. + ''; + + refresh_interval = mkDefOpt types.str "60s" '' + Refresh interval to re-read the instance list. + ''; + + port = mkDefOpt types.int "80" '' + The port to scrape metrics from. If using the public IP + address, this must instead be specified in the relabeling + rule. + ''; + + filters = mkOpt (types.listOf promTypes.filter) '' + Filters can be used optionally to filter the instance list by other criteria. + ''; }; }; @@ -398,6 +326,7 @@ let for the available filters. ''; }; + value = mkOption { type = types.listOf types.str; default = []; @@ -416,58 +345,36 @@ let A list of DNS SRV record names to be queried. ''; }; - refresh_interval = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - The time after which the provided names are refreshed. - ''; - }; + + refresh_interval = mkDefOpt types.str "30s" '' + The time after which the provided names are refreshed. + ''; }; }; promTypes.consul_sd_config = types.submodule { options = { - server = mkOption { - type = types.nullOr types.str; - default = null; - description = "Consul server to query."; - }; - token = mkOption { - type = types.nullOr types.str; - description = "Consul token"; - }; - datacenter = mkOption { - type = types.nullOr types.str; - description = "Consul datacenter"; - }; - scheme = mkOption { - type = types.nullOr types.str; - description = "Consul scheme"; - }; - username = mkOption { - type = types.nullOr types.str; - description = "Consul username"; - }; - password = mkOption { - type = types.nullOr types.str; - description = "Consul password"; - }; + server = mkDefOpt types.str "localhost:8500" '' + Consul server to query. + ''; - services = mkOption { - type = types.nullOr (types.listOf types.str); - default = null; - description = '' - A list of services for which targets are retrieved. - ''; - }; - tag_separator = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - The string by which Consul tags are joined into the tag label. - ''; - }; + token = mkOpt types.str "Consul token"; + + datacenter = mkOpt types.str "Consul datacenter"; + + scheme = mkDefOpt types.str "http" "Consul scheme"; + + username = mkOpt types.str "Consul username"; + + password = mkOpt types.str "Consul password"; + + services = mkOpt (types.listOf types.str) '' + A list of services for which targets are retrieved. + ''; + + tag_separator = mkDefOpt types.str "," '' + The string by which Consul tags are joined into the tag label. + ''; }; }; @@ -481,105 +388,68 @@ let and formats. ''; }; - refresh_interval = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Refresh interval to re-read the files. - ''; - }; + + refresh_interval = mkDefOpt types.str "5m" '' + Refresh interval to re-read the files. + ''; }; }; promTypes.relabel_config = types.submodule { options = { - source_labels = mkOption { - type = types.nullOr (types.listOf str); - default = null; - description = '' - The source labels select values from existing labels. Their content - is concatenated using the configured separator and matched against - the configured regular expression. - ''; - }; - separator = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Separator placed between concatenated source label values. - ''; - }; - target_label = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Label to which the resulting value is written in a replace action. - It is mandatory for replace actions. - ''; - }; - regex = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Regular expression against which the extracted value is matched. - ''; - }; - replacement = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Replacement value against which a regex replace is performed if the - regular expression matches. - ''; - }; - action = mkOption { - type = types.nullOr (types.enum ["replace" "keep" "drop"]); - default = null; - description = '' - Action to perform based on regex matching. - ''; - }; + source_labels = mkOpt (types.listOf types.str) '' + The source labels select values from existing labels. Their content + is concatenated using the configured separator and matched against + the configured regular expression. + ''; + + separator = mkDefOpt types.str ";" '' + Separator placed between concatenated source label values. + ''; + + target_label = mkOpt types.str '' + Label to which the resulting value is written in a replace action. + It is mandatory for replace actions. + ''; + + regex = mkDefOpt types.str "(.*)" '' + Regular expression against which the extracted value is matched. + ''; + + replacement = mkDefOpt types.str "$1" '' + Replacement value against which a regex replace is performed if the + regular expression matches. + ''; + + action = mkDefOpt (types.enum ["replace" "keep" "drop"]) "replace" '' + Action to perform based on regex matching. + ''; + }; }; promTypes.tls_config = types.submodule { options = { - ca_file = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - CA certificate to validate API server certificate with. - ''; - }; - cert_file = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Certificate file for client cert authentication to the server. - ''; - }; - key_file = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - Key file for client cert authentication to the server. - ''; - }; - server_name = mkOption { - type = types.nullOr types.str; - default = null; - description = '' - ServerName extension to indicate the name of the server. - http://tools.ietf.org/html/rfc4366#section-3.1 - ''; - }; - insecure_skip_verify = mkOption { - type = types.bool; - default = false; - description = '' - Disable validation of the server certificate. - ''; - }; + ca_file = mkOpt types.str '' + CA certificate to validate API server certificate with. + ''; + + cert_file = mkOpt types.str '' + Certificate file for client cert authentication to the server. + ''; + + key_file = mkOpt types.str '' + Key file for client cert authentication to the server. + ''; + + server_name = mkOpt types.str '' + ServerName extension to indicate the name of the server. + http://tools.ietf.org/html/rfc4366#section-3.1 + ''; + + insecure_skip_verify = mkOpt types.bool '' + Disable validation of the server certificate. + ''; }; }; From cdd82681b31a73a5a0472ab0e631d32ce5a79be0 Mon Sep 17 00:00:00 2001 From: Bas van Dijk Date: Thu, 18 Apr 2019 12:53:13 +0200 Subject: [PATCH 4/4] nixos/prometheus: add more missing options --- .../monitoring/prometheus/default.nix | 72 +++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/nixos/modules/services/monitoring/prometheus/default.nix b/nixos/modules/services/monitoring/prometheus/default.nix index cb6932ef1026..d8384e0d35b3 100644 --- a/nixos/modules/services/monitoring/prometheus/default.nix +++ b/nixos/modules/services/monitoring/prometheus/default.nix @@ -196,6 +196,17 @@ let be preserved. ''; + honor_timestamps = mkDefOpt types.bool "true" '' + honor_timestamps controls whether Prometheus respects the timestamps present + in scraped data. + + If honor_timestamps is set to true, the timestamps of the metrics exposed + by the target will be used. + + If honor_timestamps is set to false, the timestamps of the metrics exposed + by the target will be ignored. + ''; + scheme = mkDefOpt (types.enum ["http" "https"]) "http" '' The URL scheme with which to fetch metrics from targets. ''; @@ -223,10 +234,30 @@ let Optional http login credentials for metrics scraping. ''; + bearer_token = mkOpt types.str '' + Sets the `Authorization` header on every scrape request with + the configured bearer token. It is mutually exclusive with + . + ''; + + bearer_token_file = mkOpt types.str '' + Sets the `Authorization` header on every scrape request with + the bearer token read from the configured file. It is mutually + exclusive with . + ''; + tls_config = mkOpt promTypes.tls_config '' Configures the scrape request's TLS settings. ''; + proxy_url = mkOpt types.str '' + Optional proxy URL. + ''; + + ec2_sd_configs = mkOpt (types.listOf promTypes.ec2_sd_config) '' + List of EC2 service discovery configurations. + ''; + dns_sd_configs = mkOpt (types.listOf promTypes.dns_sd_config) '' List of DNS service discovery configurations. ''; @@ -243,13 +274,15 @@ let List of labeled target groups for this job. ''; - ec2_sd_configs = mkOpt (types.listOf promTypes.ec2_sd_config) '' - List of EC2 service discovery configurations. - ''; - relabel_configs = mkOpt (types.listOf promTypes.relabel_config) '' List of relabel configurations. ''; + + sample_limit = mkDefOpt types.int "0" '' + Per-scrape limit on number of scraped samples that will be accepted. + If more than this number of samples are present after metric relabelling + the entire scrape will be treated as failed. 0 means no limit. + ''; }; }; @@ -368,13 +401,40 @@ let password = mkOpt types.str "Consul password"; + tls_config = mkOpt promTypes.tls_config '' + Configures the Consul request's TLS settings. + ''; + services = mkOpt (types.listOf types.str) '' A list of services for which targets are retrieved. ''; + tags = mkOpt (types.listOf types.str) '' + An optional list of tags used to filter nodes for a given + service. Services must contain all tags in the list. + ''; + + node_meta = mkOpt (types.attrsOf types.str) '' + Node metadata used to filter nodes for a given service. + ''; + tag_separator = mkDefOpt types.str "," '' The string by which Consul tags are joined into the tag label. ''; + + allow_stale = mkOpt types.bool '' + Allow stale Consul results + (see ). + + Will reduce load on Consul. + ''; + + refresh_interval = mkDefOpt types.str "30s" '' + The time after which the provided names are refreshed. + + On large setup it might be a good idea to increase this value + because the catalog will change all the time. + ''; }; }; @@ -416,6 +476,10 @@ let Regular expression against which the extracted value is matched. ''; + modulus = mkOpt types.int '' + Modulus to take of the hash of the source label values. + ''; + replacement = mkDefOpt types.str "$1" '' Replacement value against which a regex replace is performed if the regular expression matches.