aboutsummaryrefslogtreecommitdiff
path: root/infra/libkookie/nixpkgs/nixos/modules/services/monitoring
diff options
context:
space:
mode:
Diffstat (limited to 'infra/libkookie/nixpkgs/nixos/modules/services/monitoring')
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/loki.nix4
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/mackerel-agent.nix111
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/netdata.nix2
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/default.nix48
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters.nix12
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rtl_433.nix78
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/sql.nix104
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/smartd.nix2
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/teamviewer.nix4
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/telegraf.nix58
10 files changed, 396 insertions, 27 deletions
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/loki.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/loki.nix
index f4eec7e0d284..51cabaa274a3 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/loki.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/loki.nix
@@ -39,7 +39,7 @@ in {
};
configuration = mkOption {
- type = types.attrs;
+ type = (pkgs.formats.json {}).type;
default = {};
description = ''
Specify the configuration for Loki in Nix.
@@ -78,6 +78,8 @@ in {
'';
}];
+ environment.systemPackages = [ pkgs.grafana-loki ]; # logcli
+
users.groups.${cfg.group} = { };
users.users.${cfg.user} = {
description = "Loki Service User";
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/mackerel-agent.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/mackerel-agent.nix
new file mode 100644
index 000000000000..7046de9d403c
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/mackerel-agent.nix
@@ -0,0 +1,111 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.mackerel-agent;
+ settingsFmt = pkgs.formats.toml {};
+in {
+ options.services.mackerel-agent = {
+ enable = mkEnableOption "mackerel.io agent";
+
+ # the upstream package runs as root, but doesn't seem to be strictly
+ # necessary for basic functionality
+ runAsRoot = mkEnableOption "Whether to run as root.";
+
+ autoRetirement = mkEnableOption ''
+ Whether to automatically retire the host upon OS shutdown.
+ '';
+
+ apiKeyFile = mkOption {
+ type = types.path;
+ default = "";
+ example = "/run/keys/mackerel-api-key";
+ description = ''
+ Path to file containing the Mackerel API key. The file should contain a
+ single line of the following form:
+
+ <literallayout>apikey = "EXAMPLE_API_KEY"</literallayout>
+ '';
+ };
+
+ settings = mkOption {
+ description = ''
+ Options for mackerel-agent.conf.
+
+ Documentation:
+ <link xlink:href="https://mackerel.io/docs/entry/spec/agent"/>
+ '';
+
+ default = {};
+ example = {
+ verbose = false;
+ silent = false;
+ };
+
+ type = types.submodule {
+ freeformType = settingsFmt.type;
+
+ options.host_status = {
+ on_start = mkOption {
+ type = types.enum [ "working" "standby" "maintenance" "poweroff" ];
+ description = "Host status after agent startup.";
+ default = "working";
+ };
+ on_stop = mkOption {
+ type = types.enum [ "working" "standby" "maintenance" "poweroff" ];
+ description = "Host status after agent shutdown.";
+ default = "poweroff";
+ };
+ };
+
+ options.diagnostic =
+ mkEnableOption "Collect memory usage for the agent itself";
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [ mackerel-agent ];
+
+ environment.etc = {
+ "mackerel-agent/mackerel-agent.conf".source =
+ settingsFmt.generate "mackerel-agent.conf" cfg.settings;
+ "mackerel-agent/conf.d/api-key.conf".source = cfg.apiKeyFile;
+ };
+
+ services.mackerel-agent.settings = {
+ root = mkDefault "/var/lib/mackerel-agent";
+ pidfile = mkDefault "/run/mackerel-agent/mackerel-agent.pid";
+
+ # conf.d stores the symlink to cfg.apiKeyFile
+ include = mkDefault "/etc/mackerel-agent/conf.d/*.conf";
+ };
+
+ # upstream service file in https://git.io/JUt4Q
+ systemd.services.mackerel-agent = {
+ description = "mackerel.io agent";
+ after = [ "network-online.target" "nss-lookup.target" ];
+ wantedBy = [ "multi-user.target" ];
+ environment = {
+ MACKEREL_PLUGIN_WORKDIR = mkDefault "%C/mackerel-agent";
+ };
+ serviceConfig = {
+ DynamicUser = !cfg.runAsRoot;
+ PrivateTmp = mkDefault true;
+ CacheDirectory = "mackerel-agent";
+ ConfigurationDirectory = "mackerel-agent";
+ RuntimeDirectory = "mackerel-agent";
+ StateDirectory = "mackerel-agent";
+ ExecStart = "${pkgs.mackerel-agent}/bin/mackerel-agent supervise";
+ ExecStopPost = mkIf cfg.autoRetirement "${pkg.mackerel-agent}/bin/mackerel-agent retire -force";
+ ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+ LimitNOFILE = mkDefault 65536;
+ LimitNPROC = mkDefault 65536;
+ };
+ restartTriggers = [
+ config.environment.etc."mackerel-agent/mackerel-agent.conf".source
+ ];
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/netdata.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/netdata.nix
index 2e73e15d3a86..db51fdbd2c61 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/netdata.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/netdata.nix
@@ -142,7 +142,7 @@ in {
serviceConfig = {
Environment="PYTHONPATH=${cfg.package}/libexec/netdata/python.d/python_modules";
ExecStart = "${cfg.package}/bin/netdata -P /run/netdata/netdata.pid -D -c ${configFile}";
- ExecReload = "${pkgs.utillinux}/bin/kill -s HUP -s USR1 -s USR2 $MAINPID";
+ ExecReload = "${pkgs.util-linux}/bin/kill -s HUP -s USR1 -s USR2 $MAINPID";
TimeoutStopSec = 60;
Restart = "on-failure";
# User and group
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/default.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/default.nix
index 98aaa9c0f030..72428957109c 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/default.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/default.nix
@@ -45,7 +45,7 @@ let
cmdlineArgs = cfg.extraFlags ++ [
"--storage.tsdb.path=${workingDir}/data/"
- "--config.file=${prometheusYml}"
+ "--config.file=/run/prometheus/prometheus-substituted.yaml"
"--web.listen-address=${cfg.listenAddress}:${builtins.toString cfg.port}"
"--alertmanager.notification-queue-capacity=${toString cfg.alertmanagerNotificationQueueCapacity}"
"--alertmanager.timeout=${toString cfg.alertmanagerTimeout}s"
@@ -522,6 +522,45 @@ in {
'';
};
+ environmentFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ example = "/root/prometheus.env";
+ description = ''
+ Environment file as defined in <citerefentry>
+ <refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum>
+ </citerefentry>.
+
+ Secrets may be passed to the service without adding them to the
+ world-readable Nix store, by specifying placeholder variables as
+ the option value in Nix and setting these variables accordingly in the
+ environment file.
+
+ Environment variables from this file will be interpolated into the
+ config file using envsubst with this syntax:
+ <literal>$ENVIRONMENT ''${VARIABLE}</literal>
+
+ <programlisting>
+ # Example scrape config entry handling an OAuth bearer token
+ {
+ job_name = "home_assistant";
+ metrics_path = "/api/prometheus";
+ scheme = "https";
+ bearer_token = "\''${HOME_ASSISTANT_BEARER_TOKEN}";
+ [...]
+ }
+ </programlisting>
+
+ <programlisting>
+ # Content of the environment file
+ HOME_ASSISTANT_BEARER_TOKEN=someoauthbearertoken
+ </programlisting>
+
+ Note that this file needs to be available on the host on which
+ <literal>Prometheus</literal> is running.
+ '';
+ };
+
configText = mkOption {
type = types.nullOr types.lines;
default = null;
@@ -662,12 +701,19 @@ in {
systemd.services.prometheus = {
wantedBy = [ "multi-user.target" ];
after = [ "network.target" ];
+ preStart = ''
+ ${lib.getBin pkgs.envsubst}/bin/envsubst -o "/run/prometheus/prometheus-substituted.yaml" \
+ -i "${prometheusYml}"
+ '';
serviceConfig = {
ExecStart = "${cfg.package}/bin/prometheus" +
optionalString (length cmdlineArgs != 0) (" \\\n " +
concatStringsSep " \\\n " cmdlineArgs);
User = "prometheus";
Restart = "always";
+ EnvironmentFile = mkIf (cfg.environmentFile != null) [ cfg.environmentFile ];
+ RuntimeDirectory = "prometheus";
+ RuntimeDirectoryMode = "0700";
WorkingDirectory = workingDir;
StateDirectory = cfg.stateDir;
};
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters.nix
index 1233e5cdd1a9..995afca96ff8 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters.nix
@@ -43,7 +43,9 @@ let
"postgres"
"redis"
"rspamd"
+ "rtl_433"
"snmp"
+ "sql"
"surfboard"
"tor"
"unifi"
@@ -217,6 +219,14 @@ in
Please specify either 'services.prometheus.exporters.mail.configuration'
or 'services.prometheus.exporters.mail.configFile'.
'';
+ } {
+ assertion = cfg.sql.enable -> (
+ (cfg.sql.configFile == null) != (cfg.sql.configuration == null)
+ );
+ message = ''
+ Please specify either 'services.prometheus.exporters.sql.configuration' or
+ 'services.prometheus.exporters.sql.configFile'
+ '';
} ];
}] ++ [(mkIf config.services.minio.enable {
services.prometheus.exporters.minio.minioAddress = mkDefault "http://localhost:9000";
@@ -224,6 +234,8 @@ in
services.prometheus.exporters.minio.minioAccessSecret = mkDefault config.services.minio.secretKey;
})] ++ [(mkIf config.services.rspamd.enable {
services.prometheus.exporters.rspamd.url = mkDefault "http://localhost:11334/stat";
+ })] ++ [(mkIf config.services.prometheus.exporters.rtl_433.enable {
+ hardware.rtl-sdr.enable = mkDefault true;
})] ++ [(mkIf config.services.nginx.enable {
systemd.services.prometheus-nginx-exporter.after = [ "nginx.service" ];
systemd.services.prometheus-nginx-exporter.requires = [ "nginx.service" ];
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rtl_433.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rtl_433.nix
new file mode 100644
index 000000000000..01e420db3897
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rtl_433.nix
@@ -0,0 +1,78 @@
+{ config, lib, pkgs, options }:
+
+let
+ cfg = config.services.prometheus.exporters.rtl_433;
+in
+{
+ port = 9550;
+
+ extraOpts = let
+ mkMatcherOptionType = field: description: with lib.types;
+ listOf (submodule {
+ options = {
+ name = lib.mkOption {
+ type = str;
+ description = "Name to match.";
+ };
+ "${field}" = lib.mkOption {
+ type = int;
+ inherit description;
+ };
+ location = lib.mkOption {
+ type = str;
+ description = "Location to match.";
+ };
+ };
+ });
+ in
+ {
+ rtl433Flags = lib.mkOption {
+ type = lib.types.str;
+ default = "-C si";
+ example = "-C si -R 19";
+ description = ''
+ Flags passed verbatim to rtl_433 binary.
+ Having <literal>-C si</literal> (the default) is recommended since only Celsius temperatures are parsed.
+ '';
+ };
+ channels = lib.mkOption {
+ type = mkMatcherOptionType "channel" "Channel to match.";
+ default = [];
+ example = [
+ { name = "Acurite"; channel = 6543; location = "Kitchen"; }
+ ];
+ description = ''
+ List of channel matchers to export.
+ '';
+ };
+ ids = lib.mkOption {
+ type = mkMatcherOptionType "id" "ID to match.";
+ default = [];
+ example = [
+ { name = "Nexus"; id = 1; location = "Bedroom"; }
+ ];
+ description = ''
+ List of ID matchers to export.
+ '';
+ };
+ };
+
+ serviceOpts = {
+ serviceConfig = {
+ # rtl-sdr udev rules make supported USB devices +rw by plugdev.
+ SupplementaryGroups = "plugdev";
+ ExecStart = let
+ matchers = (map (m:
+ "--channel_matcher '${m.name},${toString m.channel},${m.location}'"
+ ) cfg.channels) ++ (map (m:
+ "--id_matcher '${m.name},${toString m.id},${m.location}'"
+ ) cfg.ids); in ''
+ ${pkgs.prometheus-rtl_433-exporter}/bin/rtl_433_prometheus \
+ -listen ${cfg.listenAddress}:${toString cfg.port} \
+ -subprocess "${pkgs.rtl_433}/bin/rtl_433 -F json ${cfg.rtl433Flags}" \
+ ${lib.concatStringsSep " \\\n " matchers} \
+ ${lib.concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/sql.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/sql.nix
new file mode 100644
index 000000000000..d9be724ebc03
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/sql.nix
@@ -0,0 +1,104 @@
+{ config, lib, pkgs, options }:
+with lib;
+let
+ cfg = config.services.prometheus.exporters.sql;
+ cfgOptions = {
+ options = with types; {
+ jobs = mkOption {
+ type = attrsOf (submodule jobOptions);
+ default = { };
+ description = "An attrset of metrics scraping jobs to run.";
+ };
+ };
+ };
+ jobOptions = {
+ options = with types; {
+ interval = mkOption {
+ type = str;
+ description = ''
+ How often to run this job, specified in
+ <link xlink:href="https://golang.org/pkg/time/#ParseDuration">Go duration</link> format.
+ '';
+ };
+ connections = mkOption {
+ type = listOf str;
+ description = "A list of connection strings of the SQL servers to scrape metrics from";
+ };
+ startupSql = mkOption {
+ type = listOf str;
+ default = [];
+ description = "A list of SQL statements to execute once after making a connection.";
+ };
+ queries = mkOption {
+ type = attrsOf (submodule queryOptions);
+ description = "SQL queries to run.";
+ };
+ };
+ };
+ queryOptions = {
+ options = with types; {
+ help = mkOption {
+ type = nullOr str;
+ default = null;
+ description = "A human-readable description of this metric.";
+ };
+ labels = mkOption {
+ type = listOf str;
+ default = [ ];
+ description = "A set of columns that will be used as Prometheus labels.";
+ };
+ query = mkOption {
+ type = str;
+ description = "The SQL query to run.";
+ };
+ values = mkOption {
+ type = listOf str;
+ description = "A set of columns that will be used as values of this metric.";
+ };
+ };
+ };
+
+ configFile =
+ if cfg.configFile != null
+ then cfg.configFile
+ else
+ let
+ nameInline = mapAttrsToList (k: v: v // { name = k; });
+ renameStartupSql = j: removeAttrs (j // { startup_sql = j.startupSql; }) [ "startupSql" ];
+ configuration = {
+ jobs = map renameStartupSql
+ (nameInline (mapAttrs (k: v: (v // { queries = nameInline v.queries; })) cfg.configuration.jobs));
+ };
+ in
+ builtins.toFile "config.yaml" (builtins.toJSON configuration);
+in
+{
+ extraOpts = {
+ configFile = mkOption {
+ type = with types; nullOr path;
+ default = null;
+ description = ''
+ Path to configuration file.
+ '';
+ };
+ configuration = mkOption {
+ type = with types; nullOr (submodule cfgOptions);
+ default = null;
+ description = ''
+ Exporter configuration as nix attribute set. Mutually exclusive with 'configFile' option.
+ '';
+ };
+ };
+
+ port = 9237;
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-sql-exporter}/bin/sql_exporter \
+ -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ -config.file ${configFile} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/smartd.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/smartd.nix
index c72b4abfcdce..3ea254371142 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/smartd.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/smartd.nix
@@ -36,7 +36,7 @@ let
$SMARTD_MESSAGE
EOF
- } | ${pkgs.utillinux}/bin/wall 2>/dev/null
+ } | ${pkgs.util-linux}/bin/wall 2>/dev/null
''}
${optionalString nx.enable ''
export DISPLAY=${nx.display}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/teamviewer.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/teamviewer.nix
index 8d781d82d086..ce9e57a187cd 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/teamviewer.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/teamviewer.nix
@@ -31,14 +31,14 @@ in
after = [ "NetworkManager-wait-online.service" "network.target" ];
preStart = "mkdir -pv /var/lib/teamviewer /var/log/teamviewer";
+ startLimitIntervalSec = 60;
+ startLimitBurst = 10;
serviceConfig = {
Type = "forking";
ExecStart = "${pkgs.teamviewer}/bin/teamviewerd -d";
PIDFile = "/run/teamviewerd.pid";
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
Restart = "on-abort";
- StartLimitInterval = "60";
- StartLimitBurst = "10";
};
};
};
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/telegraf.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/telegraf.nix
index 5d131557e8be..b341a9005c2a 100644
--- a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/telegraf.nix
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/telegraf.nix
@@ -5,14 +5,8 @@ with lib;
let
cfg = config.services.telegraf;
- configFile = pkgs.runCommand "config.toml" {
- buildInputs = [ pkgs.remarshal ];
- preferLocalBuild = true;
- } ''
- remarshal -if json -of toml \
- < ${pkgs.writeText "config.json" (builtins.toJSON cfg.extraConfig)} \
- > $out
- '';
+ settingsFormat = pkgs.formats.toml {};
+ configFile = settingsFormat.generate "config.toml" cfg.extraConfig;
in {
###### interface
options = {
@@ -26,22 +20,31 @@ in {
type = types.package;
};
+ environmentFiles = mkOption {
+ type = types.listOf types.path;
+ default = [];
+ example = "/run/keys/telegraf.env";
+ description = ''
+ File to load as environment file. Environment variables
+ from this file will be interpolated into the config file
+ using envsubst with this syntax:
+ <literal>$ENVIRONMENT ''${VARIABLE}</literal>
+ This is useful to avoid putting secrets into the nix store.
+ '';
+ };
+
extraConfig = mkOption {
default = {};
description = "Extra configuration options for telegraf";
- type = types.attrs;
+ type = settingsFormat.type;
example = {
- outputs = {
- influxdb = {
- urls = ["http://localhost:8086"];
- database = "telegraf";
- };
+ outputs.influxdb = {
+ urls = ["http://localhost:8086"];
+ database = "telegraf";
};
- inputs = {
- statsd = {
- service_address = ":8125";
- delete_timings = true;
- };
+ inputs.statsd = {
+ service_address = ":8125";
+ delete_timings = true;
};
};
};
@@ -51,15 +54,28 @@ in {
###### implementation
config = mkIf config.services.telegraf.enable {
- systemd.services.telegraf = {
+ systemd.services.telegraf = let
+ finalConfigFile = if config.services.telegraf.environmentFiles == []
+ then configFile
+ else "/var/run/telegraf/config.toml";
+ in {
description = "Telegraf Agent";
wantedBy = [ "multi-user.target" ];
after = [ "network-online.target" ];
serviceConfig = {
- ExecStart=''${cfg.package}/bin/telegraf -config "${configFile}"'';
+ EnvironmentFile = config.services.telegraf.environmentFiles;
+ ExecStartPre = lib.optional (config.services.telegraf.environmentFiles != [])
+ (pkgs.writeShellScript "pre-start" ''
+ umask 077
+ ${pkgs.envsubst}/bin/envsubst -i "${configFile}" > /var/run/telegraf/config.toml
+ '');
+ ExecStart=''${cfg.package}/bin/telegraf -config ${finalConfigFile}'';
ExecReload="${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+ RuntimeDirectory = "telegraf";
User = "telegraf";
Restart = "on-failure";
+ # for ping probes
+ AmbientCapabilities = [ "CAP_NET_RAW" ];
};
};