diff --git a/nixos/modules/services/monitoring/collectd.nix b/nixos/modules/services/monitoring/collectd.nix
index 8d81737a3ef0..1b9af5857560 100644
--- a/nixos/modules/services/monitoring/collectd.nix
+++ b/nixos/modules/services/monitoring/collectd.nix
@@ -5,36 +5,15 @@ with lib;
let
cfg = config.services.collectd;
- unvalidated_conf = pkgs.writeText "collectd-unvalidated.conf" ''
- BaseDir "${cfg.dataDir}"
- AutoLoadPlugin ${boolToString cfg.autoLoadPlugin}
- Hostname "${config.networking.hostName}"
-
- LoadPlugin syslog
-
- LogLevel "info"
- NotifyLevel "OKAY"
-
-
- ${concatStrings (mapAttrsToList (plugin: pluginConfig: ''
- LoadPlugin ${plugin}
-
- ${pluginConfig}
-
- '') cfg.plugins)}
-
- ${concatMapStrings (f: ''
- Include "${f}"
- '') cfg.include}
-
- ${cfg.extraConfig}
- '';
+ baseDirLine = ''BaseDir "${cfg.dataDir}"'';
+ unvalidated_conf = pkgs.writeText "collectd-unvalidated.conf" cfg.extraConfig;
conf = if cfg.validateConfig then
pkgs.runCommand "collectd.conf" {} ''
echo testing ${unvalidated_conf}
+ cp ${unvalidated_conf} collectd.conf
# collectd -t fails if BaseDir does not exist.
- sed '1s/^BaseDir.*$/BaseDir "."/' ${unvalidated_conf} > collectd.conf
+ substituteInPlace collectd.conf --replace ${lib.escapeShellArgs [ baseDirLine ]} 'BaseDir "."'
${package}/bin/collectd -t -C collectd.conf
cp ${unvalidated_conf} $out
'' else unvalidated_conf;
@@ -123,7 +102,8 @@ in {
extraConfig = mkOption {
default = "";
description = ''
- Extra configuration for collectd.
+ Extra configuration for collectd. Use mkBefore to add lines before the
+ default config, and mkAfter to add them below.
'';
type = lines;
};
@@ -131,6 +111,30 @@ in {
};
config = mkIf cfg.enable {
+ # 1200 is after the default (1000) but before mkAfter (1500).
+ services.collectd.extraConfig = lib.mkOrder 1200 ''
+ ${baseDirLine}
+ AutoLoadPlugin ${boolToString cfg.autoLoadPlugin}
+ Hostname "${config.networking.hostName}"
+
+ LoadPlugin syslog
+
+ LogLevel "info"
+ NotifyLevel "OKAY"
+
+
+ ${concatStrings (mapAttrsToList (plugin: pluginConfig: ''
+ LoadPlugin ${plugin}
+
+ ${pluginConfig}
+
+ '') cfg.plugins)}
+
+ ${concatMapStrings (f: ''
+ Include "${f}"
+ '') cfg.include}
+ '';
+
systemd.tmpfiles.rules = [
"d '${cfg.dataDir}' - ${cfg.user} - - -"
];
diff --git a/nixos/tests/collectd.nix b/nixos/tests/collectd.nix
index 8c9361087661..2480bdb5f917 100644
--- a/nixos/tests/collectd.nix
+++ b/nixos/tests/collectd.nix
@@ -3,11 +3,14 @@ import ./make-test-python.nix ({ pkgs, ... }: {
meta = { };
nodes.machine =
- { pkgs, ... }:
+ { pkgs, lib, ... }:
{
services.collectd = {
enable = true;
+ extraConfig = lib.mkBefore ''
+ Interval 30
+ '';
plugins = {
rrdtool = ''
DataDir "/var/lib/collectd/rrd"
@@ -26,6 +29,8 @@ import ./make-test-python.nix ({ pkgs, ... }: {
machine.succeed(f"rrdinfo {file} | logger")
# check that this file contains a shortterm metric
machine.succeed(f"rrdinfo {file} | grep -F 'ds[shortterm].min = '")
+ # check that interval was set before the plugins
+ machine.succeed(f"rrdinfo {file} | grep -F 'step = 30'")
# check that there are frequent updates
machine.succeed(f"cp {file} before")
machine.wait_until_fails(f"cmp before {file}")