Loading nixos/modules/services/monitoring/thanos.nix +95 −50 Original line number Diff line number Diff line { config, lib, pkgs, ... }: with lib; let inherit (lib) collect concatLists concatStringsSep flip getAttrFromPath hasPrefix isList length literalExpression literalMD mapAttrsRecursiveCond mapAttrsToList mdDoc mkEnableOption mkIf mkMerge mkOption mkPackageOptionMD optional optionalAttrs optionalString types ; cfg = config.services.thanos; nullOpt = type: description: mkOption { type = types.nullOr type; default = null; description = lib.mdDoc description; description = mdDoc description; }; optionToArgs = opt: v : optional (v != null) ''--${opt}="${toString v}"''; Loading @@ -32,7 +55,7 @@ let option = mkOption { type = types.bool; default = false; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -41,7 +64,7 @@ let option = mkOption { type = types.listOf types.str; default = []; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -50,7 +73,7 @@ let option = mkOption { type = types.attrsOf types.str; default = {}; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -59,7 +82,7 @@ let option = mkOption { type = types.str; inherit default; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -86,7 +109,7 @@ let defaultText = literalMD '' calculated from `config.services.thanos.${cmd}` ''; description = lib.mdDoc '' description = mdDoc '' Arguments to the `thanos ${cmd}` command. Defaults to a list of arguments formed by converting the structured Loading Loading @@ -127,10 +150,10 @@ let if config.services.thanos.<cmd>.tracing.config == null then null else toString (toYAML "tracing.yaml" config.services.thanos.<cmd>.tracing.config); ''; description = lib.mdDoc '' description = mdDoc '' Path to YAML file that contains tracing configuration. See format details: <https://thanos.io/tracing.md/#configuration> See format details: <https://thanos.io/tip/thanos/tracing.md/#configuration> ''; }; }; Loading @@ -147,7 +170,7 @@ let If {option}`tracing.config-file` is set this option has no effect. See format details: <https://thanos.io/tracing.md/#configuration> See format details: <https://thanos.io/tip/thanos/tracing.md/#configuration> ''; }; }; Loading Loading @@ -192,10 +215,10 @@ let if config.services.thanos.<cmd>.objstore.config == null then null else toString (toYAML "objstore.yaml" config.services.thanos.<cmd>.objstore.config); ''; description = lib.mdDoc '' description = mdDoc '' Path to YAML file that contains object store configuration. See format details: <https://thanos.io/storage.md/#configuration> See format details: <https://thanos.io/tip/thanos/storage.md/#configuring-access-to-object-storage> ''; }; }; Loading @@ -212,7 +235,7 @@ let If {option}`objstore.config-file` is set this option has no effect. See format details: <https://thanos.io/storage.md/#configuration> See format details: <https://thanos.io/tip/thanos/storage.md/#configuring-access-to-object-storage> ''; }; }; Loading @@ -231,7 +254,7 @@ let type = types.str; default = "/var/lib/${config.services.prometheus.stateDir}/data"; defaultText = literalExpression ''"/var/lib/''${config.services.prometheus.stateDir}/data"''; description = lib.mdDoc '' description = mdDoc '' Data directory of TSDB. ''; }; Loading Loading @@ -266,14 +289,14 @@ let Maximum size of concurrently allocatable bytes for chunks. ''; store.grpc.series-sample-limit = mkParamDef types.int 0 '' Maximum amount of samples returned via a single Series call. store.limits.request-samples = mkParamDef types.int 0 '' The maximum samples allowed for a single Series request. The Series call fails if this limit is exceeded. `0` means no limit. NOTE: for efficiency we take 120 as the number of samples in chunk (it cannot be bigger than that), so the actual number of samples might be lower, even though the maximum could be hit. NOTE: For efficiency the limit is internally implemented as 'chunks limit' considering each chunk contains a maximum of 120 samples. ''; store.grpc.series-max-concurrency = mkParamDef types.int 20 '' Loading Loading @@ -371,24 +394,25 @@ let Maximum number of queries processed concurrently by query node. ''; query.replica-label = mkParam types.str '' Label to treat as a replica indicator along which data is query.replica-labels = mkAttrsParam "query.replica-label" '' Labels to treat as a replica indicator along which data is deduplicated. Still you will be able to query without deduplication using `dedup=false` parameter. 'dedup=false' parameter. Data includes time series, recording rules, and alerting rules. ''; selector-labels = mkAttrsParam "selector-label" '' Query selector labels that will be exposed in info endpoint. ''; store.addresses = mkListParam "store" '' Addresses of statically configured store API servers. endpoints = mkListParam "endpoint" '' Addresses of statically configured Thanos API servers (repeatable). The scheme may be prefixed with `dns+` or `dnssrv+` to detect store API servers through respective DNS lookups. The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect Thanos API servers through respective DNS lookups. ''; store.sd-files = mkListParam "store.sd-files" '' Loading Loading @@ -430,6 +454,12 @@ let ''; }; query-frontend = params.common cfg.query-frontend // { query-frontend.downstream-url = mkParamDef types.str "http://localhost:9090" '' URL of downstream Prometheus Query compatible API. ''; }; rule = params.common cfg.rule // params.objstore cfg.rule // { labels = mkAttrsParam "label" '' Loading @@ -447,7 +477,7 @@ let Rule files that should be used by rule manager. Can be in glob format. ''; eval-interval = mkParamDef types.str "30s" '' eval-interval = mkParamDef types.str "1m" '' The default evaluation interval to use. ''; Loading Loading @@ -597,10 +627,6 @@ let to render all samples for a human eye anyway ''; block-sync-concurrency = mkParamDef types.int 20 '' Number of goroutines to use when syncing block metadata from object storage. ''; compact.concurrency = mkParamDef types.int 1 '' Number of goroutines to use when compacting groups. ''; Loading @@ -625,7 +651,7 @@ let Data directory relative to `/var/lib` of TSDB. ''; labels = mkAttrsParam "labels" '' labels = mkAttrsParam "label" '' External labels to announce. This flag will be removed in the future when handling multiple tsdb Loading Loading @@ -656,57 +682,56 @@ in { options.services.thanos = { package = mkOption { type = types.package; default = pkgs.thanos; defaultText = literalExpression "pkgs.thanos"; description = lib.mdDoc '' The thanos package that should be used. ''; }; package = mkPackageOptionMD pkgs "thanos" {}; sidecar = paramsToOptions params.sidecar // { enable = mkEnableOption (lib.mdDoc "the Thanos sidecar for Prometheus server"); (mdDoc "the Thanos sidecar for Prometheus server"); arguments = mkArgumentsOption "sidecar"; }; store = paramsToOptions params.store // { enable = mkEnableOption (lib.mdDoc "the Thanos store node giving access to blocks in a bucket provider."); (mdDoc "the Thanos store node giving access to blocks in a bucket provider."); arguments = mkArgumentsOption "store"; }; query = paramsToOptions params.query // { enable = mkEnableOption (lib.mdDoc ("the Thanos query node exposing PromQL enabled Query API " + (mdDoc ("the Thanos query node exposing PromQL enabled Query API " + "with data retrieved from multiple store nodes")); arguments = mkArgumentsOption "query"; }; query-frontend = paramsToOptions params.query-frontend // { enable = mkEnableOption (mdDoc ("the Thanos query frontend implements a service deployed in front of queriers to improve query parallelization and caching.")); arguments = mkArgumentsOption "query-frontend"; }; rule = paramsToOptions params.rule // { enable = mkEnableOption (lib.mdDoc ("the Thanos ruler service which evaluates Prometheus rules against" + (mdDoc ("the Thanos ruler service which evaluates Prometheus rules against" + " given Query nodes, exposing Store API and storing old blocks in bucket")); arguments = mkArgumentsOption "rule"; }; compact = paramsToOptions params.compact // { enable = mkEnableOption (lib.mdDoc "the Thanos compactor which continuously compacts blocks in an object store bucket"); (mdDoc "the Thanos compactor which continuously compacts blocks in an object store bucket"); arguments = mkArgumentsOption "compact"; }; downsample = paramsToOptions params.downsample // { enable = mkEnableOption (lib.mdDoc "the Thanos downsampler which continuously downsamples blocks in an object store bucket"); (mdDoc "the Thanos downsampler which continuously downsamples blocks in an object store bucket"); arguments = mkArgumentsOption "downsample"; }; receive = paramsToOptions params.receive // { enable = mkEnableOption (lib.mdDoc ("the Thanos receiver which accept Prometheus remote write API requests " + "and write to local tsdb (EXPERIMENTAL, this may change drastically without notice)")); (mdDoc ("the Thanos receiver which accept Prometheus remote write API requests and write to local tsdb")); arguments = mkArgumentsOption "receive"; }; }; Loading Loading @@ -736,6 +761,7 @@ in { User = "prometheus"; Restart = "always"; ExecStart = thanos "sidecar"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; }) Loading @@ -751,6 +777,7 @@ in { StateDirectory = cfg.store.stateDir; Restart = "always"; ExecStart = thanos "store"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading @@ -764,6 +791,20 @@ in { DynamicUser = true; Restart = "always"; ExecStart = thanos "query"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; }) (mkIf cfg.query-frontend.enable { systemd.services.thanos-query-frontend = { wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { DynamicUser = true; Restart = "always"; ExecStart = thanos "query-frontend"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; }) Loading @@ -779,6 +820,7 @@ in { StateDirectory = cfg.rule.stateDir; Restart = "always"; ExecStart = thanos "rule"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading @@ -797,6 +839,7 @@ in { DynamicUser = true; StateDirectory = cfg.compact.stateDir; ExecStart = thanos "compact"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; } // optionalAttrs (!wait) { inherit (cfg.compact) startAt; }; } Loading @@ -813,6 +856,7 @@ in { StateDirectory = cfg.downsample.stateDir; Restart = "always"; ExecStart = thanos "downsample"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading @@ -829,6 +873,7 @@ in { StateDirectory = cfg.receive.stateDir; Restart = "always"; ExecStart = thanos "receive"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading nixos/tests/prometheus.nix +12 −2 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ let queryPort = 9090; minioPort = 9000; pushgwPort = 9091; frontPort = 9092; s3 = { accessKey = "BKIKJAA5BMMU2RHO6IBB"; Loading Loading @@ -152,10 +153,15 @@ in import ./make-test-python.nix { services.thanos.query = { enable = true; http-address = "0.0.0.0:${toString queryPort}"; store.addresses = [ endpoints = [ "prometheus:${toString grpcPort}" ]; }; services.thanos.query-frontend = { enable = true; http-address = "0.0.0.0:${toString frontPort}"; query-frontend.downstream-url = "http://127.0.0.1:${toString queryPort}"; }; }; store = { pkgs, ... }: { Loading @@ -178,7 +184,7 @@ in import ./make-test-python.nix { services.thanos.query = { enable = true; http-address = "0.0.0.0:${toString queryPort}"; store.addresses = [ endpoints = [ "localhost:${toString grpcPort}" ]; }; Loading Loading @@ -262,6 +268,10 @@ in import ./make-test-python.nix { query.wait_for_unit("thanos-query.service") wait_for_metric(query) # Test Thanos query frontend service query.wait_for_unit("thanos-query-frontend.service") query.succeed("curl -sS http://localhost:${toString frontPort}/-/healthy") # Test if the Thanos sidecar has correctly uploaded its TSDB to S3, if the # Thanos storage service has correctly downloaded it from S3 and if the Thanos # query service running on $store can correctly retrieve the metric: Loading pkgs/servers/monitoring/thanos/default.nix +29 −14 Original line number Diff line number Diff line { lib, buildGoModule, fetchFromGitHub, fetchpatch }: { lib , buildGoModule , fetchFromGitHub , go , nix-update-script , nixosTests , testers , thanos }: buildGoModule rec { pname = "thanos"; version = "0.31.0"; version = "0.32.5"; src = fetchFromGitHub { rev = "v${version}"; owner = "thanos-io"; repo = "thanos"; sha256 = "sha256-EJZGc4thu0WhVSSRolIRYg39S81Cgm+JHwpW5eE7mDc="; rev = "refs/tags/v${version}"; hash = "sha256-A4bDCyvctHmDBYzvWpeEO4u6KhoICN7BbRQK4aZCbIA="; }; patches = [ # https://github.com/thanos-io/thanos/pull/6126 (fetchpatch { url = "https://github.com/thanos-io/thanos/commit/a4c218bd690259fc0c78fe67e0739bd33d38541e.patch"; hash = "sha256-Hxc1s5IXAyw01/o4JvOXuyYuOFy0+cBUv3OkRv4DCXs="; }) ]; vendorHash = "sha256-8+MUMux6v/O2syVyTx758yUBfJkertzibz6yFB05nWk="; vendorHash = "sha256-ZjkMvbWq96Rte9WoxAWzeouVA/6mBqanvY9yHr9F5MM="; doCheck = true; Loading @@ -30,12 +31,26 @@ buildGoModule rec { "-X ${t}.Branch=unknown" "-X ${t}.BuildUser=nix@nixpkgs" "-X ${t}.BuildDate=unknown" "-X ${t}.GoVersion=${lib.getVersion go}" ]; passthru = { updateScript = nix-update-script { }; tests = { inherit (nixosTests) prometheus; version = testers.testVersion { command = "thanos --version"; package = thanos; }; }; }; meta = with lib; { description = "Highly available Prometheus setup with long term storage capabilities"; homepage = "https://github.com/thanos-io/thanos"; changelog = "https://github.com/thanos-io/thanos/releases/tag/v${version}"; license = licenses.asl20; maintainers = with maintainers; [ basvandijk ]; mainProgram = "thanos"; maintainers = with maintainers; [ basvandijk anthonyroussel ]; }; } Loading
nixos/modules/services/monitoring/thanos.nix +95 −50 Original line number Diff line number Diff line { config, lib, pkgs, ... }: with lib; let inherit (lib) collect concatLists concatStringsSep flip getAttrFromPath hasPrefix isList length literalExpression literalMD mapAttrsRecursiveCond mapAttrsToList mdDoc mkEnableOption mkIf mkMerge mkOption mkPackageOptionMD optional optionalAttrs optionalString types ; cfg = config.services.thanos; nullOpt = type: description: mkOption { type = types.nullOr type; default = null; description = lib.mdDoc description; description = mdDoc description; }; optionToArgs = opt: v : optional (v != null) ''--${opt}="${toString v}"''; Loading @@ -32,7 +55,7 @@ let option = mkOption { type = types.bool; default = false; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -41,7 +64,7 @@ let option = mkOption { type = types.listOf types.str; default = []; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -50,7 +73,7 @@ let option = mkOption { type = types.attrsOf types.str; default = {}; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -59,7 +82,7 @@ let option = mkOption { type = types.str; inherit default; description = lib.mdDoc description; description = mdDoc description; }; }; Loading @@ -86,7 +109,7 @@ let defaultText = literalMD '' calculated from `config.services.thanos.${cmd}` ''; description = lib.mdDoc '' description = mdDoc '' Arguments to the `thanos ${cmd}` command. Defaults to a list of arguments formed by converting the structured Loading Loading @@ -127,10 +150,10 @@ let if config.services.thanos.<cmd>.tracing.config == null then null else toString (toYAML "tracing.yaml" config.services.thanos.<cmd>.tracing.config); ''; description = lib.mdDoc '' description = mdDoc '' Path to YAML file that contains tracing configuration. See format details: <https://thanos.io/tracing.md/#configuration> See format details: <https://thanos.io/tip/thanos/tracing.md/#configuration> ''; }; }; Loading @@ -147,7 +170,7 @@ let If {option}`tracing.config-file` is set this option has no effect. See format details: <https://thanos.io/tracing.md/#configuration> See format details: <https://thanos.io/tip/thanos/tracing.md/#configuration> ''; }; }; Loading Loading @@ -192,10 +215,10 @@ let if config.services.thanos.<cmd>.objstore.config == null then null else toString (toYAML "objstore.yaml" config.services.thanos.<cmd>.objstore.config); ''; description = lib.mdDoc '' description = mdDoc '' Path to YAML file that contains object store configuration. See format details: <https://thanos.io/storage.md/#configuration> See format details: <https://thanos.io/tip/thanos/storage.md/#configuring-access-to-object-storage> ''; }; }; Loading @@ -212,7 +235,7 @@ let If {option}`objstore.config-file` is set this option has no effect. See format details: <https://thanos.io/storage.md/#configuration> See format details: <https://thanos.io/tip/thanos/storage.md/#configuring-access-to-object-storage> ''; }; }; Loading @@ -231,7 +254,7 @@ let type = types.str; default = "/var/lib/${config.services.prometheus.stateDir}/data"; defaultText = literalExpression ''"/var/lib/''${config.services.prometheus.stateDir}/data"''; description = lib.mdDoc '' description = mdDoc '' Data directory of TSDB. ''; }; Loading Loading @@ -266,14 +289,14 @@ let Maximum size of concurrently allocatable bytes for chunks. ''; store.grpc.series-sample-limit = mkParamDef types.int 0 '' Maximum amount of samples returned via a single Series call. store.limits.request-samples = mkParamDef types.int 0 '' The maximum samples allowed for a single Series request. The Series call fails if this limit is exceeded. `0` means no limit. NOTE: for efficiency we take 120 as the number of samples in chunk (it cannot be bigger than that), so the actual number of samples might be lower, even though the maximum could be hit. NOTE: For efficiency the limit is internally implemented as 'chunks limit' considering each chunk contains a maximum of 120 samples. ''; store.grpc.series-max-concurrency = mkParamDef types.int 20 '' Loading Loading @@ -371,24 +394,25 @@ let Maximum number of queries processed concurrently by query node. ''; query.replica-label = mkParam types.str '' Label to treat as a replica indicator along which data is query.replica-labels = mkAttrsParam "query.replica-label" '' Labels to treat as a replica indicator along which data is deduplicated. Still you will be able to query without deduplication using `dedup=false` parameter. 'dedup=false' parameter. Data includes time series, recording rules, and alerting rules. ''; selector-labels = mkAttrsParam "selector-label" '' Query selector labels that will be exposed in info endpoint. ''; store.addresses = mkListParam "store" '' Addresses of statically configured store API servers. endpoints = mkListParam "endpoint" '' Addresses of statically configured Thanos API servers (repeatable). The scheme may be prefixed with `dns+` or `dnssrv+` to detect store API servers through respective DNS lookups. The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect Thanos API servers through respective DNS lookups. ''; store.sd-files = mkListParam "store.sd-files" '' Loading Loading @@ -430,6 +454,12 @@ let ''; }; query-frontend = params.common cfg.query-frontend // { query-frontend.downstream-url = mkParamDef types.str "http://localhost:9090" '' URL of downstream Prometheus Query compatible API. ''; }; rule = params.common cfg.rule // params.objstore cfg.rule // { labels = mkAttrsParam "label" '' Loading @@ -447,7 +477,7 @@ let Rule files that should be used by rule manager. Can be in glob format. ''; eval-interval = mkParamDef types.str "30s" '' eval-interval = mkParamDef types.str "1m" '' The default evaluation interval to use. ''; Loading Loading @@ -597,10 +627,6 @@ let to render all samples for a human eye anyway ''; block-sync-concurrency = mkParamDef types.int 20 '' Number of goroutines to use when syncing block metadata from object storage. ''; compact.concurrency = mkParamDef types.int 1 '' Number of goroutines to use when compacting groups. ''; Loading @@ -625,7 +651,7 @@ let Data directory relative to `/var/lib` of TSDB. ''; labels = mkAttrsParam "labels" '' labels = mkAttrsParam "label" '' External labels to announce. This flag will be removed in the future when handling multiple tsdb Loading Loading @@ -656,57 +682,56 @@ in { options.services.thanos = { package = mkOption { type = types.package; default = pkgs.thanos; defaultText = literalExpression "pkgs.thanos"; description = lib.mdDoc '' The thanos package that should be used. ''; }; package = mkPackageOptionMD pkgs "thanos" {}; sidecar = paramsToOptions params.sidecar // { enable = mkEnableOption (lib.mdDoc "the Thanos sidecar for Prometheus server"); (mdDoc "the Thanos sidecar for Prometheus server"); arguments = mkArgumentsOption "sidecar"; }; store = paramsToOptions params.store // { enable = mkEnableOption (lib.mdDoc "the Thanos store node giving access to blocks in a bucket provider."); (mdDoc "the Thanos store node giving access to blocks in a bucket provider."); arguments = mkArgumentsOption "store"; }; query = paramsToOptions params.query // { enable = mkEnableOption (lib.mdDoc ("the Thanos query node exposing PromQL enabled Query API " + (mdDoc ("the Thanos query node exposing PromQL enabled Query API " + "with data retrieved from multiple store nodes")); arguments = mkArgumentsOption "query"; }; query-frontend = paramsToOptions params.query-frontend // { enable = mkEnableOption (mdDoc ("the Thanos query frontend implements a service deployed in front of queriers to improve query parallelization and caching.")); arguments = mkArgumentsOption "query-frontend"; }; rule = paramsToOptions params.rule // { enable = mkEnableOption (lib.mdDoc ("the Thanos ruler service which evaluates Prometheus rules against" + (mdDoc ("the Thanos ruler service which evaluates Prometheus rules against" + " given Query nodes, exposing Store API and storing old blocks in bucket")); arguments = mkArgumentsOption "rule"; }; compact = paramsToOptions params.compact // { enable = mkEnableOption (lib.mdDoc "the Thanos compactor which continuously compacts blocks in an object store bucket"); (mdDoc "the Thanos compactor which continuously compacts blocks in an object store bucket"); arguments = mkArgumentsOption "compact"; }; downsample = paramsToOptions params.downsample // { enable = mkEnableOption (lib.mdDoc "the Thanos downsampler which continuously downsamples blocks in an object store bucket"); (mdDoc "the Thanos downsampler which continuously downsamples blocks in an object store bucket"); arguments = mkArgumentsOption "downsample"; }; receive = paramsToOptions params.receive // { enable = mkEnableOption (lib.mdDoc ("the Thanos receiver which accept Prometheus remote write API requests " + "and write to local tsdb (EXPERIMENTAL, this may change drastically without notice)")); (mdDoc ("the Thanos receiver which accept Prometheus remote write API requests and write to local tsdb")); arguments = mkArgumentsOption "receive"; }; }; Loading Loading @@ -736,6 +761,7 @@ in { User = "prometheus"; Restart = "always"; ExecStart = thanos "sidecar"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; }) Loading @@ -751,6 +777,7 @@ in { StateDirectory = cfg.store.stateDir; Restart = "always"; ExecStart = thanos "store"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading @@ -764,6 +791,20 @@ in { DynamicUser = true; Restart = "always"; ExecStart = thanos "query"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; }) (mkIf cfg.query-frontend.enable { systemd.services.thanos-query-frontend = { wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { DynamicUser = true; Restart = "always"; ExecStart = thanos "query-frontend"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; }) Loading @@ -779,6 +820,7 @@ in { StateDirectory = cfg.rule.stateDir; Restart = "always"; ExecStart = thanos "rule"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading @@ -797,6 +839,7 @@ in { DynamicUser = true; StateDirectory = cfg.compact.stateDir; ExecStart = thanos "compact"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; } // optionalAttrs (!wait) { inherit (cfg.compact) startAt; }; } Loading @@ -813,6 +856,7 @@ in { StateDirectory = cfg.downsample.stateDir; Restart = "always"; ExecStart = thanos "downsample"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading @@ -829,6 +873,7 @@ in { StateDirectory = cfg.receive.stateDir; Restart = "always"; ExecStart = thanos "receive"; ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID"; }; }; } Loading
nixos/tests/prometheus.nix +12 −2 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ let queryPort = 9090; minioPort = 9000; pushgwPort = 9091; frontPort = 9092; s3 = { accessKey = "BKIKJAA5BMMU2RHO6IBB"; Loading Loading @@ -152,10 +153,15 @@ in import ./make-test-python.nix { services.thanos.query = { enable = true; http-address = "0.0.0.0:${toString queryPort}"; store.addresses = [ endpoints = [ "prometheus:${toString grpcPort}" ]; }; services.thanos.query-frontend = { enable = true; http-address = "0.0.0.0:${toString frontPort}"; query-frontend.downstream-url = "http://127.0.0.1:${toString queryPort}"; }; }; store = { pkgs, ... }: { Loading @@ -178,7 +184,7 @@ in import ./make-test-python.nix { services.thanos.query = { enable = true; http-address = "0.0.0.0:${toString queryPort}"; store.addresses = [ endpoints = [ "localhost:${toString grpcPort}" ]; }; Loading Loading @@ -262,6 +268,10 @@ in import ./make-test-python.nix { query.wait_for_unit("thanos-query.service") wait_for_metric(query) # Test Thanos query frontend service query.wait_for_unit("thanos-query-frontend.service") query.succeed("curl -sS http://localhost:${toString frontPort}/-/healthy") # Test if the Thanos sidecar has correctly uploaded its TSDB to S3, if the # Thanos storage service has correctly downloaded it from S3 and if the Thanos # query service running on $store can correctly retrieve the metric: Loading
pkgs/servers/monitoring/thanos/default.nix +29 −14 Original line number Diff line number Diff line { lib, buildGoModule, fetchFromGitHub, fetchpatch }: { lib , buildGoModule , fetchFromGitHub , go , nix-update-script , nixosTests , testers , thanos }: buildGoModule rec { pname = "thanos"; version = "0.31.0"; version = "0.32.5"; src = fetchFromGitHub { rev = "v${version}"; owner = "thanos-io"; repo = "thanos"; sha256 = "sha256-EJZGc4thu0WhVSSRolIRYg39S81Cgm+JHwpW5eE7mDc="; rev = "refs/tags/v${version}"; hash = "sha256-A4bDCyvctHmDBYzvWpeEO4u6KhoICN7BbRQK4aZCbIA="; }; patches = [ # https://github.com/thanos-io/thanos/pull/6126 (fetchpatch { url = "https://github.com/thanos-io/thanos/commit/a4c218bd690259fc0c78fe67e0739bd33d38541e.patch"; hash = "sha256-Hxc1s5IXAyw01/o4JvOXuyYuOFy0+cBUv3OkRv4DCXs="; }) ]; vendorHash = "sha256-8+MUMux6v/O2syVyTx758yUBfJkertzibz6yFB05nWk="; vendorHash = "sha256-ZjkMvbWq96Rte9WoxAWzeouVA/6mBqanvY9yHr9F5MM="; doCheck = true; Loading @@ -30,12 +31,26 @@ buildGoModule rec { "-X ${t}.Branch=unknown" "-X ${t}.BuildUser=nix@nixpkgs" "-X ${t}.BuildDate=unknown" "-X ${t}.GoVersion=${lib.getVersion go}" ]; passthru = { updateScript = nix-update-script { }; tests = { inherit (nixosTests) prometheus; version = testers.testVersion { command = "thanos --version"; package = thanos; }; }; }; meta = with lib; { description = "Highly available Prometheus setup with long term storage capabilities"; homepage = "https://github.com/thanos-io/thanos"; changelog = "https://github.com/thanos-io/thanos/releases/tag/v${version}"; license = licenses.asl20; maintainers = with maintainers; [ basvandijk ]; mainProgram = "thanos"; maintainers = with maintainers; [ basvandijk anthonyroussel ]; }; }