grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / monitoring / vmagent.nix
blob4838e0709d09e3c8604014e4258b5d667ff871d8
1 { config, pkgs, lib, ... }:
3 let
4   cfg = config.services.vmagent;
5   settingsFormat = pkgs.formats.json { };
6 in {
7   imports = [
8     (lib.mkRemovedOptionModule [ "services" "vmagent" "dataDir" ] "dataDir has been deprecated in favor of systemd provided CacheDirectory")
9     (lib.mkRemovedOptionModule [ "services" "vmagent" "user" ] "user has been deprecated in favor of systemd DynamicUser")
10     (lib.mkRemovedOptionModule [ "services" "vmagent" "group" ] "group has been deprecated in favor of systemd DynamicUser")
11     (lib.mkRenamedOptionModule [ "services" "vmagent" "remoteWriteUrl" ] [ "services" "vmagent" "remoteWrite" "url" ])
12   ];
14   options.services.vmagent = {
15     enable = lib.mkEnableOption "vmagent";
17     package = lib.mkPackageOption pkgs "vmagent" { };
19     remoteWrite = {
20       url = lib.mkOption {
21         default = null;
22         type = lib.types.nullOr lib.types.str;
23         description = ''
24           Endpoint for prometheus compatible remote_write
25         '';
26       };
27       basicAuthUsername = lib.mkOption {
28         default = null;
29         type = lib.types.nullOr lib.types.str;
30         description = ''
31           Basic Auth username used to connect to remote_write endpoint
32         '';
33       };
34       basicAuthPasswordFile = lib.mkOption {
35         default = null;
36         type = lib.types.nullOr lib.types.str;
37         description = ''
38           File that contains the Basic Auth password used to connect to remote_write endpoint
39         '';
40       };
41     };
43     prometheusConfig = lib.mkOption {
44       type = lib.types.submodule { freeformType = settingsFormat.type; };
45       description = ''
46         Config for prometheus style metrics
47       '';
48     };
50     openFirewall = lib.mkOption {
51       type = lib.types.bool;
52       default = false;
53       description = ''
54         Whether to open the firewall for the default ports.
55       '';
56     };
58     extraArgs = lib.mkOption {
59       type = lib.types.listOf lib.types.str;
60       default = [];
61       description = ''
62         Extra args to pass to `vmagent`. See the docs:
63         <https://docs.victoriametrics.com/vmagent.html#advanced-usage>
64         or {command}`vmagent -help` for more information.
65       '';
66     };
67   };
69   config = lib.mkIf cfg.enable {
70     networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [ 8429 ];
72     systemd.services.vmagent = let
73       prometheusConfig = settingsFormat.generate "prometheusConfig.yaml" cfg.prometheusConfig;
74       startCommandLine = lib.concatStringsSep " " ([
75         "${cfg.package}/bin/vmagent"
76         "-promscrape.config=${prometheusConfig}"
77       ] ++ cfg.extraArgs
78         ++ lib.optionals (cfg.remoteWrite.url != null) [
79         "-remoteWrite.url=${cfg.remoteWrite.url}"
80         "-remoteWrite.tmpDataPath=%C/vmagent/remote_write_tmp"
81       ] ++ lib.optional (cfg.remoteWrite.basicAuthUsername != null) "-remoteWrite.basicAuth.username=${cfg.remoteWrite.basicAuthUsername}"
82         ++ lib.optional (cfg.remoteWrite.basicAuthPasswordFile != null) "-remoteWrite.basicAuth.passwordFile=\${CREDENTIALS_DIRECTORY}/remote_write_basic_auth_password");
83     in {
84       wantedBy = [ "multi-user.target" ];
85       after = [ "network.target" ];
86       description = "vmagent system service";
87       serviceConfig = {
88         DynamicUser = true;
89         User = "vmagent";
90         Group = "vmagent";
91         Type = "simple";
92         Restart = "on-failure";
93         CacheDirectory = "vmagent";
94         ExecStart = startCommandLine;
95         LoadCredential = lib.optional (cfg.remoteWrite.basicAuthPasswordFile != null) [
96           "remote_write_basic_auth_password:${cfg.remoteWrite.basicAuthPasswordFile}"
97         ];
98       };
99     };
100   };