aboutsummaryrefslogtreecommitdiff
path: root/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters
diff options
context:
space:
mode:
authorMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
committerMx Kookie <kookie@spacekookie.de>2020-10-31 19:35:09 +0100
commitc4625b175f8200f643fd6e11010932ea44c78433 (patch)
treebce3f89888c8ac3991fa5569a878a9eab6801ccc /infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters
parent49f735974dd103039ddc4cb576bb76555164a9e7 (diff)
parentd661aa56a8843e991261510c1bb28fdc2f6975ae (diff)
Add 'infra/libkookie/' from commit 'd661aa56a8843e991261510c1bb28fdc2f6975ae'
git-subtree-dir: infra/libkookie git-subtree-mainline: 49f735974dd103039ddc4cb576bb76555164a9e7 git-subtree-split: d661aa56a8843e991261510c1bb28fdc2f6975ae
Diffstat (limited to 'infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters')
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/apcupsd.nix38
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/bind.nix54
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/blackbox.nix70
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/collectd.nix77
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dnsmasq.nix38
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dovecot.nix73
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/fritzbox.nix38
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/json.nix35
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/keylight.nix19
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/lnd.nix46
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mail.nix158
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix66
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/minio.nix64
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/modemmanager.nix33
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nextcloud.nix58
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nginx.nix65
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/node.nix40
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/openvpn.nix39
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postfix.nix95
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postgres.nix47
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/redis.nix19
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rspamd.nix92
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/snmp.nix70
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/surfboard.nix31
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/tor.nix44
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi-poller.nix34
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi.nix66
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/varnish.nix88
-rw-r--r--infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix66
29 files changed, 1663 insertions, 0 deletions
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/apcupsd.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/apcupsd.nix
new file mode 100644
index 000000000000..57c35a742c5f
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/apcupsd.nix
@@ -0,0 +1,38 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.apcupsd;
+in
+{
+ port = 9162;
+ extraOpts = {
+ apcupsdAddress = mkOption {
+ type = types.str;
+ default = ":3551";
+ description = ''
+ Address of the apcupsd Network Information Server (NIS).
+ '';
+ };
+
+ apcupsdNetwork = mkOption {
+ type = types.enum ["tcp" "tcp4" "tcp6"];
+ default = "tcp";
+ description = ''
+ Network of the apcupsd Network Information Server (NIS): one of "tcp", "tcp4", or "tcp6".
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-apcupsd-exporter}/bin/apcupsd_exporter \
+ -telemetry.addr ${cfg.listenAddress}:${toString cfg.port} \
+ -apcupsd.addr ${cfg.apcupsdAddress} \
+ -apcupsd.network ${cfg.apcupsdNetwork} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/bind.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/bind.nix
new file mode 100644
index 000000000000..972632b5a24a
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/bind.nix
@@ -0,0 +1,54 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.bind;
+in
+{
+ port = 9119;
+ extraOpts = {
+ bindURI = mkOption {
+ type = types.str;
+ default = "http://localhost:8053/";
+ description = ''
+ HTTP XML API address of an Bind server.
+ '';
+ };
+ bindTimeout = mkOption {
+ type = types.str;
+ default = "10s";
+ description = ''
+ Timeout for trying to get stats from Bind.
+ '';
+ };
+ bindVersion = mkOption {
+ type = types.enum [ "xml.v2" "xml.v3" "auto" ];
+ default = "auto";
+ description = ''
+ BIND statistics version. Can be detected automatically.
+ '';
+ };
+ bindGroups = mkOption {
+ type = types.listOf (types.enum [ "server" "view" "tasks" ]);
+ default = [ "server" "view" ];
+ description = ''
+ List of statistics to collect. Available: [server, view, tasks]
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-bind-exporter}/bin/bind_exporter \
+ -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ -bind.pid-file /var/run/named/named.pid \
+ -bind.timeout ${toString cfg.bindTimeout} \
+ -bind.stats-url ${cfg.bindURI} \
+ -bind.stats-version ${cfg.bindVersion} \
+ -bind.stats-groups ${concatStringsSep "," cfg.bindGroups} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/blackbox.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/blackbox.nix
new file mode 100644
index 000000000000..fe8d905da3fe
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/blackbox.nix
@@ -0,0 +1,70 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ logPrefix = "services.prometheus.exporter.blackbox";
+ cfg = config.services.prometheus.exporters.blackbox;
+
+ # This ensures that we can deal with string paths, path types and
+ # store-path strings with context.
+ coerceConfigFile = file:
+ if (builtins.isPath file) || (lib.isStorePath file) then
+ file
+ else
+ (lib.warn ''
+ ${logPrefix}: configuration file "${file}" is being copied to the nix-store.
+ If you would like to avoid that, please set enableConfigCheck to false.
+ '' /. + file);
+ checkConfigLocation = file:
+ if lib.hasPrefix "/tmp/" file then
+ throw
+ "${logPrefix}: configuration file must not reside within /tmp - it won't be visible to the systemd service."
+ else
+ true;
+ checkConfig = file:
+ pkgs.runCommand "checked-blackbox-exporter.conf" {
+ preferLocalBuild = true;
+ buildInputs = [ pkgs.buildPackages.prometheus-blackbox-exporter ];
+ } ''
+ ln -s ${coerceConfigFile file} $out
+ blackbox_exporter --config.check --config.file $out
+ '';
+in {
+ port = 9115;
+ extraOpts = {
+ configFile = mkOption {
+ type = types.path;
+ description = ''
+ Path to configuration file.
+ '';
+ };
+ enableConfigCheck = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to run a correctness check for the configuration file. This depends
+ on the configuration file residing in the nix-store. Paths passed as string will
+ be copied to the store.
+ '';
+ };
+ };
+
+ serviceOpts = let
+ adjustedConfigFile = if cfg.enableConfigCheck then
+ checkConfig cfg.configFile
+ else
+ checkConfigLocation cfg.configFile;
+ in {
+ serviceConfig = {
+ AmbientCapabilities = [ "CAP_NET_RAW" ]; # for ping probes
+ ExecStart = ''
+ ${pkgs.prometheus-blackbox-exporter}/bin/blackbox_exporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --config.file ${escapeShellArg adjustedConfigFile} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/collectd.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/collectd.nix
new file mode 100644
index 000000000000..972104630275
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/collectd.nix
@@ -0,0 +1,77 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.collectd;
+in
+{
+ port = 9103;
+ extraOpts = {
+ collectdBinary = {
+ enable = mkEnableOption "collectd binary protocol receiver";
+
+ authFile = mkOption {
+ default = null;
+ type = types.nullOr types.path;
+ description = "File mapping user names to pre-shared keys (passwords).";
+ };
+
+ port = mkOption {
+ type = types.int;
+ default = 25826;
+ description = ''Network address on which to accept collectd binary network packets.'';
+ };
+
+ listenAddress = mkOption {
+ type = types.str;
+ default = "0.0.0.0";
+ description = ''
+ Address to listen on for binary network packets.
+ '';
+ };
+
+ securityLevel = mkOption {
+ type = types.enum ["None" "Sign" "Encrypt"];
+ default = "None";
+ description = ''
+ Minimum required security level for accepted packets.
+ '';
+ };
+ };
+
+ logFormat = mkOption {
+ type = types.str;
+ default = "logger:stderr";
+ example = "logger:syslog?appname=bob&local=7 or logger:stdout?json=true";
+ description = ''
+ Set the log target and format.
+ '';
+ };
+
+ logLevel = mkOption {
+ type = types.enum ["debug" "info" "warn" "error" "fatal"];
+ default = "info";
+ description = ''
+ Only log messages with the given severity or above.
+ '';
+ };
+ };
+ serviceOpts = let
+ collectSettingsArgs = if (cfg.collectdBinary.enable) then ''
+ -collectd.listen-address ${cfg.collectdBinary.listenAddress}:${toString cfg.collectdBinary.port} \
+ -collectd.security-level ${cfg.collectdBinary.securityLevel} \
+ '' else "";
+ in {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-collectd-exporter}/bin/collectd_exporter \
+ -log.format ${escapeShellArg cfg.logFormat} \
+ -log.level ${cfg.logLevel} \
+ -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ ${collectSettingsArgs} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dnsmasq.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dnsmasq.nix
new file mode 100644
index 000000000000..68afba21d64a
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dnsmasq.nix
@@ -0,0 +1,38 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.dnsmasq;
+in
+{
+ port = 9153;
+ extraOpts = {
+ dnsmasqListenAddress = mkOption {
+ type = types.str;
+ default = "localhost:53";
+ description = ''
+ Address on which dnsmasq listens.
+ '';
+ };
+ leasesPath = mkOption {
+ type = types.path;
+ default = "/var/lib/misc/dnsmasq.leases";
+ example = "/var/lib/dnsmasq/dnsmasq.leases";
+ description = ''
+ Path to the <literal>dnsmasq.leases</literal> file.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-dnsmasq-exporter}/bin/dnsmasq_exporter \
+ --listen ${cfg.listenAddress}:${toString cfg.port} \
+ --dnsmasq ${cfg.dnsmasqListenAddress} \
+ --leases_path ${escapeShellArg cfg.leasesPath} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dovecot.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dovecot.nix
new file mode 100644
index 000000000000..aba3533e4395
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/dovecot.nix
@@ -0,0 +1,73 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.dovecot;
+in
+{
+ port = 9166;
+ extraOpts = {
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ socketPath = mkOption {
+ type = types.path;
+ default = "/var/run/dovecot/stats";
+ example = "/var/run/dovecot2/old-stats";
+ description = ''
+ Path under which the stats socket is placed.
+ The user/group under which the exporter runs,
+ should be able to access the socket in order
+ to scrape the metrics successfully.
+
+ Please keep in mind that the stats module has changed in
+ <link xlink:href="https://wiki2.dovecot.org/Upgrading/2.3">Dovecot 2.3+</link> which
+ is not <link xlink:href="https://github.com/kumina/dovecot_exporter/issues/8">compatible with this exporter</link>.
+
+ The following extra config has to be passed to Dovecot to ensure that recent versions
+ work with this exporter:
+ <programlisting>
+ {
+ <xref linkend="opt-services.prometheus.exporters.dovecot.enable" /> = true;
+ <xref linkend="opt-services.prometheus.exporters.dovecot.socketPath" /> = "/var/run/dovecot2/old-stats";
+ <xref linkend="opt-services.dovecot2.extraConfig" /> = '''
+ mail_plugins = $mail_plugins old_stats
+ service old-stats {
+ unix_listener old-stats {
+ user = dovecot-exporter
+ group = dovecot-exporter
+ }
+ }
+ ''';
+ }
+ </programlisting>
+ '';
+ };
+ scopes = mkOption {
+ type = types.listOf types.str;
+ default = [ "user" ];
+ example = [ "user" "global" ];
+ description = ''
+ Stats scopes to query.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ DynamicUser = false;
+ ExecStart = ''
+ ${pkgs.prometheus-dovecot-exporter}/bin/dovecot_exporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --web.telemetry-path ${cfg.telemetryPath} \
+ --dovecot.socket-path ${escapeShellArg cfg.socketPath} \
+ --dovecot.scopes ${concatStringsSep "," cfg.scopes} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/fritzbox.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/fritzbox.nix
new file mode 100644
index 000000000000..9526597b8c96
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/fritzbox.nix
@@ -0,0 +1,38 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.fritzbox;
+in
+{
+ port = 9133;
+ extraOpts = {
+ gatewayAddress = mkOption {
+ type = types.str;
+ default = "fritz.box";
+ description = ''
+ The hostname or IP of the FRITZ!Box.
+ '';
+ };
+
+ gatewayPort = mkOption {
+ type = types.int;
+ default = 49000;
+ description = ''
+ The port of the FRITZ!Box UPnP service.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-fritzbox-exporter}/bin/exporter \
+ -listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ -gateway-address ${cfg.gatewayAddress} \
+ -gateway-port ${toString cfg.gatewayPort} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/json.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/json.nix
new file mode 100644
index 000000000000..bd0026b55f72
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/json.nix
@@ -0,0 +1,35 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.json;
+in
+{
+ port = 7979;
+ extraOpts = {
+ url = mkOption {
+ type = types.str;
+ description = ''
+ URL to scrape JSON from.
+ '';
+ };
+ configFile = mkOption {
+ type = types.path;
+ description = ''
+ Path to configuration file.
+ '';
+ };
+ listenAddress = {}; # not used
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-json-exporter}/bin/prometheus-json-exporter \
+ --port ${toString cfg.port} \
+ ${cfg.url} ${escapeShellArg cfg.configFile} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/keylight.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/keylight.nix
new file mode 100644
index 000000000000..dfa56343b871
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/keylight.nix
@@ -0,0 +1,19 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.keylight;
+in
+{
+ port = 9288;
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-keylight-exporter}/bin/keylight_exporter \
+ -metrics.addr ${cfg.listenAddress}:${toString cfg.port} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/lnd.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/lnd.nix
new file mode 100644
index 000000000000..35f972020574
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/lnd.nix
@@ -0,0 +1,46 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.lnd;
+in
+{
+ port = 9092;
+ extraOpts = {
+ lndHost = mkOption {
+ type = types.str;
+ default = "localhost:10009";
+ description = ''
+ lnd instance gRPC address:port.
+ '';
+ };
+
+ lndTlsPath = mkOption {
+ type = types.path;
+ description = ''
+ Path to lnd TLS certificate.
+ '';
+ };
+
+ lndMacaroonDir = mkOption {
+ type = types.path;
+ description = ''
+ Path to lnd macaroons.
+ '';
+ };
+ };
+ serviceOpts.serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-lnd-exporter}/bin/lndmon \
+ --prometheus.listenaddr=${cfg.listenAddress}:${toString cfg.port} \
+ --prometheus.logdir=/var/log/prometheus-lnd-exporter \
+ --lnd.host=${cfg.lndHost} \
+ --lnd.tlspath=${cfg.lndTlsPath} \
+ --lnd.macaroondir=${cfg.lndMacaroonDir} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ LogsDirectory = "prometheus-lnd-exporter";
+ ReadOnlyPaths = [ cfg.lndTlsPath cfg.lndMacaroonDir ];
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mail.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mail.nix
new file mode 100644
index 000000000000..18c5c4dd1623
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mail.nix
@@ -0,0 +1,158 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.mail;
+
+ configurationFile = pkgs.writeText "prometheus-mail-exporter.conf" (builtins.toJSON (
+ # removes the _module attribute, null values and converts attrNames to lowercase
+ mapAttrs' (name: value:
+ if name == "servers"
+ then nameValuePair (toLower name)
+ ((map (srv: (mapAttrs' (n: v: nameValuePair (toLower n) v)
+ (filterAttrs (n: v: !(n == "_module" || v == null)) srv)
+ ))) value)
+ else nameValuePair (toLower name) value
+ ) (filterAttrs (n: _: !(n == "_module")) cfg.configuration)
+ ));
+
+ serverOptions.options = {
+ name = mkOption {
+ type = types.str;
+ description = ''
+ Value for label 'configname' which will be added to all metrics.
+ '';
+ };
+ server = mkOption {
+ type = types.str;
+ description = ''
+ Hostname of the server that should be probed.
+ '';
+ };
+ port = mkOption {
+ type = types.int;
+ example = 587;
+ description = ''
+ Port to use for SMTP.
+ '';
+ };
+ from = mkOption {
+ type = types.str;
+ example = "exporteruser@domain.tld";
+ description = ''
+ Content of 'From' Header for probing mails.
+ '';
+ };
+ to = mkOption {
+ type = types.str;
+ example = "exporteruser@domain.tld";
+ description = ''
+ Content of 'To' Header for probing mails.
+ '';
+ };
+ detectionDir = mkOption {
+ type = types.path;
+ example = "/var/spool/mail/exporteruser/new";
+ description = ''
+ Directory in which new mails for the exporter user are placed.
+ Note that this needs to exist when the exporter starts.
+ '';
+ };
+ login = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ example = "exporteruser@domain.tld";
+ description = ''
+ Username to use for SMTP authentication.
+ '';
+ };
+ passphrase = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ Password to use for SMTP authentication.
+ '';
+ };
+ };
+
+ exporterOptions.options = {
+ monitoringInterval = mkOption {
+ type = types.str;
+ example = "10s";
+ description = ''
+ Time interval between two probe attempts.
+ '';
+ };
+ mailCheckTimeout = mkOption {
+ type = types.str;
+ description = ''
+ Timeout until mails are considered "didn't make it".
+ '';
+ };
+ disableFileDeletion = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Disables the exporter's function to delete probing mails.
+ '';
+ };
+ servers = mkOption {
+ type = types.listOf (types.submodule serverOptions);
+ default = [];
+ example = literalExample ''
+ [ {
+ name = "testserver";
+ server = "smtp.domain.tld";
+ port = 587;
+ from = "exporteruser@domain.tld";
+ to = "exporteruser@domain.tld";
+ detectionDir = "/path/to/Maildir/new";
+ } ]
+ '';
+ description = ''
+ List of servers that should be probed.
+ '';
+ };
+ };
+in
+{
+ port = 9225;
+ extraOpts = {
+ configFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = ''
+ Specify the mailexporter configuration file to use.
+ '';
+ };
+ configuration = mkOption {
+ type = types.nullOr (types.submodule exporterOptions);
+ default = null;
+ description = ''
+ Specify the mailexporter configuration file to use.
+ '';
+ };
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ DynamicUser = false;
+ ExecStart = ''
+ ${pkgs.prometheus-mail-exporter}/bin/mailexporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --web.telemetry-path ${cfg.telemetryPath} \
+ --config.file ${
+ if cfg.configuration != null then configurationFile else (escapeShellArg cfg.configFile)
+ } \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix
new file mode 100644
index 000000000000..62c2cc568476
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix
@@ -0,0 +1,66 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.mikrotik;
+in
+{
+ port = 9436;
+ extraOpts = {
+ configFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = ''
+ Path to a mikrotik exporter configuration file. Mutually exclusive with
+ <option>configuration</option> option.
+ '';
+ example = literalExample "./mikrotik.yml";
+ };
+
+ configuration = mkOption {
+ type = types.nullOr types.attrs;
+ default = null;
+ description = ''
+ Mikrotik exporter configuration as nix attribute set. Mutually exclusive with
+ <option>configFile</option> option.
+
+ See <link xlink:href="https://github.com/nshttpd/mikrotik-exporter/blob/master/README.md"/>
+ for the description of the configuration file format.
+ '';
+ example = literalExample ''
+ {
+ devices = [
+ {
+ name = "my_router";
+ address = "10.10.0.1";
+ user = "prometheus";
+ password = "changeme";
+ }
+ ];
+ features = {
+ bgp = true;
+ dhcp = true;
+ routes = true;
+ optics = true;
+ };
+ }
+ '';
+ };
+ };
+ serviceOpts = let
+ configFile = if cfg.configFile != null
+ then cfg.configFile
+ else "${pkgs.writeText "mikrotik-exporter.yml" (builtins.toJSON cfg.configuration)}";
+ in {
+ serviceConfig = {
+ # -port is misleading name, it actually accepts address too
+ ExecStart = ''
+ ${pkgs.prometheus-mikrotik-exporter}/bin/mikrotik-exporter \
+ -config-file=${escapeShellArg configFile} \
+ -port=${cfg.listenAddress}:${toString cfg.port} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/minio.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/minio.nix
new file mode 100644
index 000000000000..d6dd62f871bd
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/minio.nix
@@ -0,0 +1,64 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.minio;
+in
+{
+ port = 9290;
+ extraOpts = {
+ minioAddress = mkOption {
+ type = types.str;
+ example = "https://10.0.0.1:9000";
+ description = ''
+ The URL of the minio server.
+ Use HTTPS if Minio accepts secure connections only.
+ By default this connects to the local minio server if enabled.
+ '';
+ };
+
+ minioAccessKey = mkOption {
+ type = types.str;
+ example = "yourMinioAccessKey";
+ description = ''
+ The value of the Minio access key.
+ It is required in order to connect to the server.
+ By default this uses the one from the local minio server if enabled
+ and <literal>config.services.minio.accessKey</literal>.
+ '';
+ };
+
+ minioAccessSecret = mkOption {
+ type = types.str;
+ description = ''
+ The value of the Minio access secret.
+ It is required in order to connect to the server.
+ By default this uses the one from the local minio server if enabled
+ and <literal>config.services.minio.secretKey</literal>.
+ '';
+ };
+
+ minioBucketStats = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Collect statistics about the buckets and files in buckets.
+ It requires more computation, use it carefully in case of large buckets..
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-minio-exporter}/bin/minio-exporter \
+ -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ -minio.server ${cfg.minioAddress} \
+ -minio.access-key ${escapeShellArg cfg.minioAccessKey} \
+ -minio.access-secret ${escapeShellArg cfg.minioAccessSecret} \
+ ${optionalString cfg.minioBucketStats "-minio.bucket-stats"} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/modemmanager.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/modemmanager.nix
new file mode 100644
index 000000000000..86ea98b94e4c
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/modemmanager.nix
@@ -0,0 +1,33 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.modemmanager;
+in
+{
+ port = 9539;
+ extraOpts = {
+ refreshRate = mkOption {
+ type = types.str;
+ default = "5s";
+ description = ''
+ How frequently ModemManager will refresh the extended signal quality
+ information for each modem. The duration should be specified in seconds
+ ("5s"), minutes ("1m"), or hours ("1h").
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ # Required in order to authenticate with ModemManager via D-Bus.
+ SupplementaryGroups = "networkmanager";
+ ExecStart = ''
+ ${pkgs.prometheus-modemmanager-exporter}/bin/modemmanager_exporter \
+ -addr ${cfg.listenAddress}:${toString cfg.port} \
+ -rate ${cfg.refreshRate} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nextcloud.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nextcloud.nix
new file mode 100644
index 000000000000..aee6bd5e66ce
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nextcloud.nix
@@ -0,0 +1,58 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.nextcloud;
+in
+{
+ port = 9205;
+ extraOpts = {
+ url = mkOption {
+ type = types.str;
+ example = "https://domain.tld";
+ description = ''
+ URL to the Nextcloud serverinfo page.
+ Adding the path to the serverinfo API is optional, it defaults
+ to <literal>/ocs/v2.php/apps/serverinfo/api/v1/info</literal>.
+ '';
+ };
+ username = mkOption {
+ type = types.str;
+ default = "nextcloud-exporter";
+ description = ''
+ Username for connecting to Nextcloud.
+ Note that this account needs to have admin privileges in Nextcloud.
+ '';
+ };
+ passwordFile = mkOption {
+ type = types.path;
+ example = "/path/to/password-file";
+ description = ''
+ File containing the password for connecting to Nextcloud.
+ Make sure that this file is readable by the exporter user.
+ '';
+ };
+ timeout = mkOption {
+ type = types.str;
+ default = "5s";
+ description = ''
+ Timeout for getting server info document.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ DynamicUser = false;
+ ExecStart = ''
+ ${pkgs.prometheus-nextcloud-exporter}/bin/nextcloud-exporter \
+ -a ${cfg.listenAddress}:${toString cfg.port} \
+ -u ${cfg.username} \
+ -t ${cfg.timeout} \
+ -l ${cfg.url} \
+ -p ${escapeShellArg "@${cfg.passwordFile}"} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nginx.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nginx.nix
new file mode 100644
index 000000000000..56cddfc55b71
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/nginx.nix
@@ -0,0 +1,65 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.nginx;
+in
+{
+ port = 9113;
+ extraOpts = {
+ scrapeUri = mkOption {
+ type = types.str;
+ default = "http://localhost/nginx_status";
+ description = ''
+ Address to access the nginx status page.
+ Can be enabled with services.nginx.statusPage = true.
+ '';
+ };
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ sslVerify = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to perform certificate verification for https.
+ '';
+ };
+ constLabels = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ example = [
+ "label1=value1"
+ "label2=value2"
+ ];
+ description = ''
+ A list of constant labels that will be used in every metric.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-nginx-exporter}/bin/nginx-prometheus-exporter \
+ --nginx.scrape-uri '${cfg.scrapeUri}' \
+ --nginx.ssl-verify ${toString cfg.sslVerify} \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --web.telemetry-path ${cfg.telemetryPath} \
+ --prometheus.const-labels ${concatStringsSep "," cfg.constLabels} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+ imports = [
+ (mkRenamedOptionModule [ "telemetryEndpoint" ] [ "telemetryPath" ])
+ (mkRemovedOptionModule [ "insecure" ] ''
+ This option was replaced by 'prometheus.exporters.nginx.sslVerify'.
+ '')
+ ({ options.warnings = options.warnings; options.assertions = options.assertions; })
+ ];
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/node.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/node.nix
new file mode 100644
index 000000000000..adc2abe0b91c
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/node.nix
@@ -0,0 +1,40 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.node;
+in
+{
+ port = 9100;
+ extraOpts = {
+ enabledCollectors = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ example = ''[ "systemd" ]'';
+ description = ''
+ Collectors to enable. The collectors listed here are enabled in addition to the default ones.
+ '';
+ };
+ disabledCollectors = mkOption {
+ type = types.listOf types.str;
+ default = [];
+ example = ''[ "timex" ]'';
+ description = ''
+ Collectors to disable which are enabled by default.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ DynamicUser = false;
+ RuntimeDirectory = "prometheus-node-exporter";
+ ExecStart = ''
+ ${pkgs.prometheus-node-exporter}/bin/node_exporter \
+ ${concatMapStringsSep " " (x: "--collector." + x) cfg.enabledCollectors} \
+ ${concatMapStringsSep " " (x: "--no-collector." + x) cfg.disabledCollectors} \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} ${concatStringsSep " " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/openvpn.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/openvpn.nix
new file mode 100644
index 000000000000..a97a753ebc37
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/openvpn.nix
@@ -0,0 +1,39 @@
+{ config, pkgs, lib, ... }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.openvpn;
+in {
+ port = 9176;
+ extraOpts = {
+ statusPaths = mkOption {
+ type = types.listOf types.str;
+ description = ''
+ Paths to OpenVPN status files. Please configure the OpenVPN option
+ <literal>status</literal> accordingly.
+ '';
+ };
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ };
+
+ serviceOpts = {
+ serviceConfig = {
+ PrivateDevices = true;
+ ProtectKernelModules = true;
+ NoNewPrivileges = true;
+ ExecStart = ''
+ ${pkgs.prometheus-openvpn-exporter}/bin/openvpn_exporter \
+ -openvpn.status_paths "${concatStringsSep "," cfg.statusPaths}" \
+ -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ -web.telemetry-path ${cfg.telemetryPath}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postfix.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postfix.nix
new file mode 100644
index 000000000000..f57589a59c7b
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postfix.nix
@@ -0,0 +1,95 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.postfix;
+in
+{
+ port = 9154;
+ extraOpts = {
+ group = mkOption {
+ type = types.str;
+ description = ''
+ Group under which the postfix exporter shall be run.
+ It should match the group that is allowed to access the
+ <literal>showq</literal> socket in the <literal>queue/public/</literal> directory.
+ Defaults to <literal>services.postfix.setgidGroup</literal> when postfix is enabled.
+ '';
+ };
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ logfilePath = mkOption {
+ type = types.path;
+ default = "/var/log/postfix_exporter_input.log";
+ example = "/var/log/mail.log";
+ description = ''
+ Path where Postfix writes log entries.
+ This file will be truncated by this exporter!
+ '';
+ };
+ showqPath = mkOption {
+ type = types.path;
+ default = "/var/lib/postfix/queue/public/showq";
+ example = "/var/spool/postfix/public/showq";
+ description = ''
+ Path where Postfix places its showq socket.
+ '';
+ };
+ systemd = {
+ enable = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to enable reading metrics from the systemd journal instead of from a logfile
+ '';
+ };
+ unit = mkOption {
+ type = types.str;
+ default = "postfix.service";
+ description = ''
+ Name of the postfix systemd unit.
+ '';
+ };
+ slice = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ Name of the postfix systemd slice.
+ This overrides the <option>systemd.unit</option>.
+ '';
+ };
+ journalPath = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = ''
+ Path to the systemd journal.
+ '';
+ };
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ DynamicUser = false;
+ ExecStart = ''
+ ${pkgs.prometheus-postfix-exporter}/bin/postfix_exporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --web.telemetry-path ${cfg.telemetryPath} \
+ --postfix.showq_path ${escapeShellArg cfg.showqPath} \
+ ${concatStringsSep " \\\n " (cfg.extraFlags
+ ++ optional cfg.systemd.enable "--systemd.enable"
+ ++ optional cfg.systemd.enable (if cfg.systemd.slice != null
+ then "--systemd.slice ${cfg.systemd.slice}"
+ else "--systemd.unit ${cfg.systemd.unit}")
+ ++ optional (cfg.systemd.enable && (cfg.systemd.journalPath != null))
+ "--systemd.journal_path ${escapeShellArg cfg.systemd.journalPath}"
+ ++ optional (!cfg.systemd.enable) "--postfix.logfile_path ${escapeShellArg cfg.logfilePath}")}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postgres.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postgres.nix
new file mode 100644
index 000000000000..1ece73a1159a
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/postgres.nix
@@ -0,0 +1,47 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.postgres;
+in
+{
+ port = 9187;
+ extraOpts = {
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ dataSourceName = mkOption {
+ type = types.str;
+ default = "user=postgres database=postgres host=/run/postgresql sslmode=disable";
+ example = "postgresql://username:password@localhost:5432/postgres?sslmode=disable";
+ description = ''
+ Accepts PostgreSQL URI form and key=value form arguments.
+ '';
+ };
+ runAsLocalSuperUser = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to run the exporter as the local 'postgres' super user.
+ '';
+ };
+ };
+ serviceOpts = {
+ environment.DATA_SOURCE_NAME = cfg.dataSourceName;
+ serviceConfig = {
+ DynamicUser = false;
+ User = mkIf cfg.runAsLocalSuperUser (mkForce "postgres");
+ ExecStart = ''
+ ${pkgs.prometheus-postgres-exporter}/bin/postgres_exporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --web.telemetry-path ${cfg.telemetryPath} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/redis.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/redis.nix
new file mode 100644
index 000000000000..befbcb21f766
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/redis.nix
@@ -0,0 +1,19 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.redis;
+in
+{
+ port = 9121;
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-redis-exporter}/bin/redis_exporter \
+ -web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rspamd.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rspamd.nix
new file mode 100644
index 000000000000..1f02ae207249
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/rspamd.nix
@@ -0,0 +1,92 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.rspamd;
+
+ prettyJSON = conf:
+ pkgs.runCommand "rspamd-exporter-config.yml" { } ''
+ echo '${builtins.toJSON conf}' | ${pkgs.buildPackages.jq}/bin/jq '.' > $out
+ '';
+
+ generateConfig = extraLabels: (map (path: {
+ name = "rspamd_${replaceStrings [ "." " " ] [ "_" "_" ] path}";
+ path = "$.${path}";
+ labels = extraLabels;
+ }) [
+ "actions.'add header'"
+ "actions.'no action'"
+ "actions.'rewrite subject'"
+ "actions.'soft reject'"
+ "actions.greylist"
+ "actions.reject"
+ "bytes_allocated"
+ "chunks_allocated"
+ "chunks_freed"
+ "chunks_oversized"
+ "connections"
+ "control_connections"
+ "ham_count"
+ "learned"
+ "pools_allocated"
+ "pools_freed"
+ "read_only"
+ "scanned"
+ "shared_chunks_allocated"
+ "spam_count"
+ "total_learns"
+ ]) ++ [{
+ name = "rspamd_statfiles";
+ type = "object";
+ path = "$.statfiles[*]";
+ labels = recursiveUpdate {
+ symbol = "$.symbol";
+ type = "$.type";
+ } extraLabels;
+ values = {
+ revision = "$.revision";
+ size = "$.size";
+ total = "$.total";
+ used = "$.used";
+ languages = "$.languages";
+ users = "$.users";
+ };
+ }];
+in
+{
+ port = 7980;
+ extraOpts = {
+ listenAddress = {}; # not used
+
+ url = mkOption {
+ type = types.str;
+ description = ''
+ URL to the rspamd metrics endpoint.
+ Defaults to http://localhost:11334/stat when
+ <option>services.rspamd.enable</option> is true.
+ '';
+ };
+
+ extraLabels = mkOption {
+ type = types.attrsOf types.str;
+ default = {
+ host = config.networking.hostName;
+ };
+ defaultText = "{ host = config.networking.hostName; }";
+ example = literalExample ''
+ {
+ host = config.networking.hostName;
+ custom_label = "some_value";
+ }
+ '';
+ description = "Set of labels added to each metric.";
+ };
+ };
+ serviceOpts.serviceConfig.ExecStart = ''
+ ${pkgs.prometheus-json-exporter}/bin/prometheus-json-exporter \
+ --port ${toString cfg.port} \
+ ${cfg.url} ${prettyJSON (generateConfig cfg.extraLabels)} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/snmp.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/snmp.nix
new file mode 100644
index 000000000000..01276366e97b
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/snmp.nix
@@ -0,0 +1,70 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.snmp;
+in
+{
+ port = 9116;
+ extraOpts = {
+ configurationPath = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ description = ''
+ Path to a snmp exporter configuration file. Mutually exclusive with 'configuration' option.
+ '';
+ example = "./snmp.yml";
+ };
+
+ configuration = mkOption {
+ type = types.nullOr types.attrs;
+ default = null;
+ description = ''
+ Snmp exporter configuration as nix attribute set. Mutually exclusive with 'configurationPath' option.
+ '';
+ example = ''
+ {
+ "default" = {
+ "version" = 2;
+ "auth" = {
+ "community" = "public";
+ };
+ };
+ };
+ '';
+ };
+
+ logFormat = mkOption {
+ type = types.enum ["logfmt" "json"];
+ default = "logfmt";
+ description = ''
+ Output format of log messages.
+ '';
+ };
+
+ logLevel = mkOption {
+ type = types.enum ["debug" "info" "warn" "error"];
+ default = "info";
+ description = ''
+ Only log messages with the given severity or above.
+ '';
+ };
+ };
+ serviceOpts = let
+ configFile = if cfg.configurationPath != null
+ then cfg.configurationPath
+ else "${pkgs.writeText "snmp-exporter-conf.yml" (builtins.toJSON cfg.configuration)}";
+ in {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-snmp-exporter}/bin/snmp_exporter \
+ --config.file=${escapeShellArg configFile} \
+ --log.format=${escapeShellArg cfg.logFormat} \
+ --log.level=${cfg.logLevel} \
+ --web.listen-address=${cfg.listenAddress}:${toString cfg.port} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/surfboard.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/surfboard.nix
new file mode 100644
index 000000000000..81c5c70ed93f
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/surfboard.nix
@@ -0,0 +1,31 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.surfboard;
+in
+{
+ port = 9239;
+ extraOpts = {
+ modemAddress = mkOption {
+ type = types.str;
+ default = "192.168.100.1";
+ description = ''
+ The hostname or IP of the cable modem.
+ '';
+ };
+ };
+ serviceOpts = {
+ description = "Prometheus exporter for surfboard cable modem";
+ unitConfig.Documentation = "https://github.com/ipstatic/surfboard_exporter";
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-surfboard-exporter}/bin/surfboard_exporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --modem-address ${cfg.modemAddress} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/tor.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/tor.nix
new file mode 100644
index 000000000000..36c473677efa
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/tor.nix
@@ -0,0 +1,44 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.tor;
+in
+{
+ port = 9130;
+ extraOpts = {
+ torControlAddress = mkOption {
+ type = types.str;
+ default = "127.0.0.1";
+ description = ''
+ Tor control IP address or hostname.
+ '';
+ };
+
+ torControlPort = mkOption {
+ type = types.int;
+ default = 9051;
+ description = ''
+ Tor control port.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-tor-exporter}/bin/prometheus-tor-exporter \
+ -b ${cfg.listenAddress} \
+ -p ${toString cfg.port} \
+ -a ${cfg.torControlAddress} \
+ -c ${toString cfg.torControlPort} \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+
+ # CPython requires a process to either have $HOME defined or run as a UID
+ # defined in /etc/passwd. The latter is false with DynamicUser, so define a
+ # dummy $HOME. https://bugs.python.org/issue10496
+ environment = { HOME = "/var/empty"; };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi-poller.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi-poller.nix
new file mode 100644
index 000000000000..394e6e201f03
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi-poller.nix
@@ -0,0 +1,34 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.unifi-poller;
+
+ configFile = pkgs.writeText "prometheus-unifi-poller-exporter.json" (generators.toJSON {} {
+ poller = { inherit (cfg.log) debug quiet; };
+ unifi = { inherit (cfg) controllers; };
+ influxdb.disable = true;
+ prometheus = {
+ http_listen = "${cfg.listenAddress}:${toString cfg.port}";
+ report_errors = cfg.log.prometheusErrors;
+ };
+ });
+
+in {
+ port = 9130;
+
+ extraOpts = {
+ inherit (options.services.unifi-poller.unifi) controllers;
+ log = {
+ debug = mkEnableOption "debug logging including line numbers, high resolution timestamps, per-device logs.";
+ quiet = mkEnableOption "startup and error logs only.";
+ prometheusErrors = mkEnableOption "emitting errors to prometheus.";
+ };
+ };
+
+ serviceOpts.serviceConfig = {
+ ExecStart = "${pkgs.unifi-poller}/bin/unifi-poller --config ${configFile}";
+ DynamicUser = false;
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi.nix
new file mode 100644
index 000000000000..8d0e8764001c
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/unifi.nix
@@ -0,0 +1,66 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.unifi;
+in
+{
+ port = 9130;
+ extraOpts = {
+ unifiAddress = mkOption {
+ type = types.str;
+ example = "https://10.0.0.1:8443";
+ description = ''
+ URL of the UniFi Controller API.
+ '';
+ };
+
+ unifiInsecure = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If enabled skip the verification of the TLS certificate of the UniFi Controller API.
+ Use with caution.
+ '';
+ };
+
+ unifiUsername = mkOption {
+ type = types.str;
+ example = "ReadOnlyUser";
+ description = ''
+ username for authentication against UniFi Controller API.
+ '';
+ };
+
+ unifiPassword = mkOption {
+ type = types.str;
+ description = ''
+ Password for authentication against UniFi Controller API.
+ '';
+ };
+
+ unifiTimeout = mkOption {
+ type = types.str;
+ default = "5s";
+ example = "2m";
+ description = ''
+ Timeout including unit for UniFi Controller API requests.
+ '';
+ };
+ };
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = ''
+ ${pkgs.prometheus-unifi-exporter}/bin/unifi_exporter \
+ -telemetry.addr ${cfg.listenAddress}:${toString cfg.port} \
+ -unifi.addr ${cfg.unifiAddress} \
+ -unifi.username ${escapeShellArg cfg.unifiUsername} \
+ -unifi.password ${escapeShellArg cfg.unifiPassword} \
+ -unifi.timeout ${cfg.unifiTimeout} \
+ ${optionalString cfg.unifiInsecure "-unifi.insecure" } \
+ ${concatStringsSep " \\\n " cfg.extraFlags}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/varnish.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/varnish.nix
new file mode 100644
index 000000000000..5b5a6e18fcd6
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/varnish.nix
@@ -0,0 +1,88 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.varnish;
+in
+{
+ port = 9131;
+ extraOpts = {
+ noExit = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Do not exit server on Varnish scrape errors.
+ '';
+ };
+ withGoMetrics = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Export go runtime and http handler metrics.
+ '';
+ };
+ verbose = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable verbose logging.
+ '';
+ };
+ raw = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Enable raw stdout logging without timestamps.
+ '';
+ };
+ varnishStatPath = mkOption {
+ type = types.str;
+ default = "varnishstat";
+ description = ''
+ Path to varnishstat.
+ '';
+ };
+ instance = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ varnishstat -n value.
+ '';
+ };
+ healthPath = mkOption {
+ type = types.nullOr types.str;
+ default = null;
+ description = ''
+ Path under which to expose healthcheck. Disabled unless configured.
+ '';
+ };
+ telemetryPath = mkOption {
+ type = types.str;
+ default = "/metrics";
+ description = ''
+ Path under which to expose metrics.
+ '';
+ };
+ };
+ serviceOpts = {
+ path = [ pkgs.varnish ];
+ serviceConfig = {
+ RestartSec = mkDefault 1;
+ DynamicUser = false;
+ ExecStart = ''
+ ${pkgs.prometheus-varnish-exporter}/bin/prometheus_varnish_exporter \
+ --web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+ --web.telemetry-path ${cfg.telemetryPath} \
+ --varnishstat-path ${escapeShellArg cfg.varnishStatPath} \
+ ${concatStringsSep " \\\n " (cfg.extraFlags
+ ++ optional (cfg.healthPath != null) "--web.health-path ${cfg.healthPath}"
+ ++ optional (cfg.instance != null) "-n ${escapeShellArg cfg.instance}"
+ ++ optional cfg.noExit "--no-exit"
+ ++ optional cfg.withGoMetrics "--with-go-metrics"
+ ++ optional cfg.verbose "--verbose"
+ ++ optional cfg.raw "--raw")}
+ '';
+ };
+ };
+}
diff --git a/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix
new file mode 100644
index 000000000000..04421fc2d25a
--- /dev/null
+++ b/infra/libkookie/nixpkgs/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix
@@ -0,0 +1,66 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.wireguard;
+in {
+ port = 9586;
+ imports = [
+ (mkRenamedOptionModule [ "addr" ] [ "listenAddress" ])
+ ({ options.warnings = options.warnings; options.assertions = options.assertions; })
+ ];
+ extraOpts = {
+ verbose = mkEnableOption "Verbose logging mode for prometheus-wireguard-exporter";
+
+ wireguardConfig = mkOption {
+ type = with types; nullOr (either path str);
+ default = null;
+
+ description = ''
+ Path to the Wireguard Config to
+ <link xlink:href="https://github.com/MindFlavor/prometheus_wireguard_exporter/tree/2.0.0#usage">add the peer's name to the stats of a peer</link>.
+
+ Please note that <literal>networking.wg-quick</literal> is required for this feature
+ as <literal>networking.wireguard</literal> uses
+ <citerefentry><refentrytitle>wg</refentrytitle><manvolnum>8</manvolnum></citerefentry>
+ to set the peers up.
+ '';
+ };
+
+ singleSubnetPerField = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ By default, all allowed IPs and subnets are comma-separated in the
+ <literal>allowed_ips</literal> field. With this option enabled,
+ a single IP and subnet will be listed in fields like <literal>allowed_ip_0</literal>,
+ <literal>allowed_ip_1</literal> and so on.
+ '';
+ };
+
+ withRemoteIp = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether or not the remote IP of a WireGuard peer should be exposed via prometheus.
+ '';
+ };
+ };
+ serviceOpts = {
+ path = [ pkgs.wireguard-tools ];
+
+ serviceConfig = {
+ AmbientCapabilities = [ "CAP_NET_ADMIN" ];
+ ExecStart = ''
+ ${pkgs.prometheus-wireguard-exporter}/bin/prometheus_wireguard_exporter \
+ -p ${toString cfg.port} \
+ -l ${cfg.listenAddress} \
+ ${optionalString cfg.verbose "-v"} \
+ ${optionalString cfg.singleSubnetPerField "-s"} \
+ ${optionalString cfg.withRemoteIp "-r"} \
+ ${optionalString (cfg.wireguardConfig != null) "-n ${escapeShellArg cfg.wireguardConfig}"}
+ '';
+ };
+ };
+}