main
 1{
 2  den,
 3  lib,
 4  ...
 5}: {
 6  den.aspects.services.victoriametrics = {
 7    settings.host = {
 8      address = lib.mkOption {
 9        type = lib.types.str;
10        default = "127.0.0.1";
11      };
12      port = lib.mkOption {
13        type = lib.types.port;
14        default = 8428;
15      };
16    };
17
18    persist = {
19      directories = [
20        {
21          directory = "/var/lib/private/victoriametrics";
22          user = "nobody";
23          group = "nogroup";
24          mode = "0700";
25        }
26      ];
27    };
28
29    nixos = {
30      host,
31      lib,
32      ...
33    }: let
34      cfg = host.settings.services.victoriametrics;
35
36      nodeExporterTargets =
37        lib.mapAttrsToList (
38          name: nodeExporterHost: let
39            exporter = nodeExporterHost.settings.services.node-exporter;
40          in {
41            targets = ["${exporter.address}:${toString exporter.port}"];
42            labels.instance = name;
43          }
44        ) (lib.filterAttrs
45          (_: {hasAspect, ...}: hasAspect den.aspects.services.node-exporter)
46          (lib.mergeAttrsList (lib.attrValues den.hosts)));
47    in {
48      services.victoriametrics = {
49        enable = true;
50        listenAddress = "${cfg.address}:${toString cfg.port}";
51        checkConfig = false; # Disable it because env `CREDENTIALS_DIRECTORY` not loaded in check
52        extraOptions = [
53          "-memory.allowedPercent=30"
54        ];
55        prometheusConfig = {
56          global = {
57            scrape_interval = "30s";
58            scrape_timeout = "10s";
59          };
60          scrape_configs = [
61            {
62              job_name = "node-exporter";
63              static_configs = nodeExporterTargets;
64            }
65          ];
66        };
67      };
68    };
69  };
70}