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}