mastodon: 4.3.1 -> 4.3.2 (#361487)
[NixPkgs.git] / nixos / modules / services / monitoring / collectd.nix
blob1bd7da52fef82296d8522a08804c8542983bee0e
1 { config, pkgs, lib, ... }:
2 let
3   cfg = config.services.collectd;
5   baseDirLine = ''BaseDir "${cfg.dataDir}"'';
6   unvalidated_conf = pkgs.writeText "collectd-unvalidated.conf" cfg.extraConfig;
8   conf = if cfg.validateConfig then
9     pkgs.runCommand "collectd.conf" {} ''
10       echo testing ${unvalidated_conf}
11       cp ${unvalidated_conf} collectd.conf
12       # collectd -t fails if BaseDir does not exist.
13       substituteInPlace collectd.conf --replace ${lib.escapeShellArgs [ baseDirLine ]} 'BaseDir "."'
14       ${package}/bin/collectd -t -C collectd.conf
15       cp ${unvalidated_conf} $out
16     '' else unvalidated_conf;
18   package =
19     if cfg.buildMinimalPackage
20     then minimalPackage
21     else cfg.package;
23   minimalPackage = cfg.package.override {
24     enabledPlugins = [ "syslog" ] ++ builtins.attrNames cfg.plugins;
25   };
27 in {
28   options.services.collectd = with lib.types; {
29     enable = lib.mkEnableOption "collectd agent";
31     validateConfig = lib.mkOption {
32       default = true;
33       description = ''
34         Validate the syntax of collectd configuration file at build time.
35         Disable this if you use the Include directive on files unavailable in
36         the build sandbox, or when cross-compiling.
37       '';
38       type = types.bool;
39     };
41     package = lib.mkPackageOption pkgs "collectd" { };
43     buildMinimalPackage = lib.mkOption {
44       default = false;
45       description = ''
46         Build a minimal collectd package with only the configured `services.collectd.plugins`
47       '';
48       type = bool;
49     };
51     user = lib.mkOption {
52       default = "collectd";
53       description = ''
54         User under which to run collectd.
55       '';
56       type = nullOr str;
57     };
59     dataDir = lib.mkOption {
60       default = "/var/lib/collectd";
61       description = ''
62         Data directory for collectd agent.
63       '';
64       type = path;
65     };
67     autoLoadPlugin = lib.mkOption {
68       default = false;
69       description = ''
70         Enable plugin autoloading.
71       '';
72       type = bool;
73     };
75     include = lib.mkOption {
76       default = [];
77       description = ''
78         Additional paths to load config from.
79       '';
80       type = listOf str;
81     };
83     plugins = lib.mkOption {
84       default = {};
85       example = { cpu = ""; memory = ""; network = "Server 192.168.1.1 25826"; };
86       description = ''
87         Attribute set of plugin names to plugin config segments
88       '';
89       type = attrsOf lines;
90     };
92     extraConfig = lib.mkOption {
93       default = "";
94       description = ''
95         Extra configuration for collectd. Use mkBefore to add lines before the
96         default config, and mkAfter to add them below.
97       '';
98       type = lines;
99     };
101   };
103   config = lib.mkIf cfg.enable {
104     # 1200 is after the default (1000) but before mkAfter (1500).
105     services.collectd.extraConfig = lib.mkOrder 1200 ''
106       ${baseDirLine}
107       AutoLoadPlugin ${lib.boolToString cfg.autoLoadPlugin}
108       Hostname "${config.networking.hostName}"
110       LoadPlugin syslog
111       <Plugin "syslog">
112         LogLevel "info"
113         NotifyLevel "OKAY"
114       </Plugin>
116       ${lib.concatStrings (lib.mapAttrsToList (plugin: pluginConfig: ''
117         LoadPlugin ${plugin}
118         <Plugin "${plugin}">
119         ${pluginConfig}
120         </Plugin>
121       '') cfg.plugins)}
123       ${lib.concatMapStrings (f: ''
124         Include "${f}"
125       '') cfg.include}
126     '';
128     systemd.tmpfiles.rules = [
129       "d '${cfg.dataDir}' - ${cfg.user} - - -"
130     ];
132     systemd.services.collectd = {
133       description = "Collectd Monitoring Agent";
134       after = [ "network.target" ];
135       wantedBy = [ "multi-user.target" ];
137       serviceConfig = {
138         ExecStart = "${package}/sbin/collectd -C ${conf} -f";
139         User = cfg.user;
140         Restart = "on-failure";
141         RestartSec = 3;
142       };
143     };
145     users.users = lib.optionalAttrs (cfg.user == "collectd") {
146       collectd = {
147         isSystemUser = true;
148         group = "collectd";
149       };
150     };
152     users.groups = lib.optionalAttrs (cfg.user == "collectd") {
153       collectd = {};
154     };
155   };