vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / nixos / modules / services / monitoring / prometheus / pushgateway.nix
blobd4f9c4a29f386a6714624bc7550c40f0d1058b92
1 { config, pkgs, lib, ... }:
3 with lib;
5 let
6   cfg = config.services.prometheus.pushgateway;
8   cmdlineArgs =
9        opt "web.listen-address" cfg.web.listen-address
10     ++ opt "web.telemetry-path" cfg.web.telemetry-path
11     ++ opt "web.external-url" cfg.web.external-url
12     ++ opt "web.route-prefix" cfg.web.route-prefix
13     ++ optional cfg.persistMetrics ''--persistence.file="/var/lib/${cfg.stateDir}/metrics"''
14     ++ opt "persistence.interval" cfg.persistence.interval
15     ++ opt "log.level" cfg.log.level
16     ++ opt "log.format" cfg.log.format
17     ++ cfg.extraFlags;
19   opt = k : v : optional (v != null) ''--${k}="${v}"'';
21 in {
22   options = {
23     services.prometheus.pushgateway = {
24       enable = mkEnableOption "Prometheus Pushgateway";
26       package = mkPackageOption pkgs "prometheus-pushgateway" { };
28       web.listen-address = mkOption {
29         type = types.nullOr types.str;
30         default = null;
31         description = ''
32           Address to listen on for the web interface, API and telemetry.
34           `null` will default to `:9091`.
35         '';
36       };
38       web.telemetry-path = mkOption {
39         type = types.nullOr types.str;
40         default = null;
41         description = ''
42           Path under which to expose metrics.
44           `null` will default to `/metrics`.
45         '';
46       };
48       web.external-url = mkOption {
49         type = types.nullOr types.str;
50         default = null;
51         description = ''
52           The URL under which Pushgateway is externally reachable.
53         '';
54       };
56       web.route-prefix = mkOption {
57         type = types.nullOr types.str;
58         default = null;
59         description = ''
60           Prefix for the internal routes of web endpoints.
62           Defaults to the path of
63           {option}`services.prometheus.pushgateway.web.external-url`.
64         '';
65       };
67       persistence.interval = mkOption {
68         type = types.nullOr types.str;
69         default = null;
70         example = "10m";
71         description = ''
72           The minimum interval at which to write out the persistence file.
74           `null` will default to `5m`.
75         '';
76       };
78       log.level = mkOption {
79         type = types.nullOr (types.enum ["debug" "info" "warn" "error" "fatal"]);
80         default = null;
81         description = ''
82           Only log messages with the given severity or above.
84           `null` will default to `info`.
85         '';
86       };
88       log.format = mkOption {
89         type = types.nullOr types.str;
90         default = null;
91         example = "logger:syslog?appname=bob&local=7";
92         description = ''
93           Set the log target and format.
95           `null` will default to `logger:stderr`.
96         '';
97       };
99       extraFlags = mkOption {
100         type = types.listOf types.str;
101         default = [];
102         description = ''
103           Extra commandline options when launching the Pushgateway.
104         '';
105       };
107       persistMetrics = mkOption {
108         type = types.bool;
109         default = false;
110         description = ''
111           Whether to persist metrics to a file.
113           When enabled metrics will be saved to a file called
114           `metrics` in the directory
115           `/var/lib/pushgateway`. The directory below
116           `/var/lib` can be set using
117           {option}`services.prometheus.pushgateway.stateDir`.
118         '';
119       };
121       stateDir = mkOption {
122         type = types.str;
123         default = "pushgateway";
124         description = ''
125           Directory below `/var/lib` to store metrics.
127           This directory will be created automatically using systemd's
128           StateDirectory mechanism when
129           {option}`services.prometheus.pushgateway.persistMetrics`
130           is enabled.
131         '';
132       };
133     };
134   };
136   config = mkIf cfg.enable {
137     assertions = [
138       {
139         assertion = !hasPrefix "/" cfg.stateDir;
140         message =
141           "The option services.prometheus.pushgateway.stateDir" +
142           " shouldn't be an absolute directory." +
143           " It should be a directory relative to /var/lib.";
144       }
145     ];
146     systemd.services.pushgateway = {
147       wantedBy = [ "multi-user.target" ];
148       after    = [ "network.target" ];
149       serviceConfig = {
150         ExecStart = "${cfg.package}/bin/pushgateway" +
151           optionalString (length cmdlineArgs != 0) (" \\\n  " +
152             concatStringsSep " \\\n  " cmdlineArgs);
154         CapabilityBoundingSet = [ "" ];
155         DeviceAllow = [ "" ];
156         DynamicUser = true;
157         NoNewPrivileges = true;
159         MemoryDenyWriteExecute = true;
161         LockPersonality = true;
163         ProtectProc = "invisible";
164         ProtectSystem = "strict";
165         ProtectHome = "tmpfs";
167         PrivateTmp = true;
168         PrivateDevices = true;
169         PrivateIPC = true;
171         ProcSubset = "pid";
173         ProtectHostname = true;
174         ProtectClock = true;
175         ProtectKernelTunables = true;
176         ProtectKernelModules = true;
177         ProtectKernelLogs = true;
178         ProtectControlGroups = true;
180         Restart  = "always";
182         RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
183         RestrictNamespaces = true;
184         RestrictRealtime = true;
185         RestrictSUIDSGID = true;
187         StateDirectory = if cfg.persistMetrics then cfg.stateDir else null;
188         SystemCallFilter = [
189           "@system-service"
190           "~@cpu-emulation"
191           "~@privileged"
192           "~@reboot"
193           "~@setuid"
194           "~@swap"
195         ];
196       };
197     };
198   };