summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarie Ramlow <me@nycode.dev>2024-02-05 18:33:23 +0100
committerMarie Ramlow <me@nycode.dev>2024-03-23 16:32:25 +0100
commit88daab519596a3290f318ffe341aa77b7c8fe00a (patch)
tree1e14318dd6bbc8acd82f119f594dd0ebb050d006
parent818ba28b10bab89fede4cf4a4fcf14d4daae9880 (diff)
nixos/prometheus-fritz-exporter: init module
-rw-r--r--nixos/doc/manual/release-notes/rl-2405.section.md2
-rw-r--r--nixos/modules/services/monitoring/prometheus/exporters.nix1
-rw-r--r--nixos/modules/services/monitoring/prometheus/exporters/fritz.nix97
3 files changed, 100 insertions, 0 deletions
diff --git a/nixos/doc/manual/release-notes/rl-2405.section.md b/nixos/doc/manual/release-notes/rl-2405.section.md
index 6ed47c4ba969..19ff6f4485cd 100644
--- a/nixos/doc/manual/release-notes/rl-2405.section.md
+++ b/nixos/doc/manual/release-notes/rl-2405.section.md
@@ -109,6 +109,8 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m
- [Clevis](https://github.com/latchset/clevis), a pluggable framework for automated decryption, used to unlock encrypted devices in initrd. Available as [boot.initrd.clevis.enable](#opt-boot.initrd.clevis.enable).
+- [fritz-exporter](https://github.com/pdreker/fritz_exporter), a Prometheus exporter for extracting metrics from [FRITZ!](https://avm.de/produkte/) devices. Available as [services.prometheus.exporters.fritz](#opt-services.prometheus.exporters.fritz.enable).
+
- [armagetronad](https://wiki.armagetronad.org), a mid-2000s 3D lightcycle game widely played at iD Tech Camps. You can define multiple servers using `services.armagetronad.<server>.enable`.
- [TuxClocker](https://github.com/Lurkki14/tuxclocker), a hardware control and monitoring program. Available as [programs.tuxclocker](#opt-programs.tuxclocker.enable).
diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix
index b46b4596d563..8c5ec2992eda 100644
--- a/nixos/modules/services/monitoring/prometheus/exporters.nix
+++ b/nixos/modules/services/monitoring/prometheus/exporters.nix
@@ -35,6 +35,7 @@ let
"dovecot"
"fastly"
"flow"
+ "fritz"
"fritzbox"
"graphite"
"idrac"
diff --git a/nixos/modules/services/monitoring/prometheus/exporters/fritz.nix b/nixos/modules/services/monitoring/prometheus/exporters/fritz.nix
new file mode 100644
index 000000000000..c3a962b576a5
--- /dev/null
+++ b/nixos/modules/services/monitoring/prometheus/exporters/fritz.nix
@@ -0,0 +1,97 @@
+{ config, lib, pkgs, utils, ... }:
+let
+ inherit (lib) mkOption types mdDoc;
+ cfg = config.services.prometheus.exporters.fritz;
+ yaml = pkgs.formats.yaml { };
+ configFile = yaml.generate "fritz-exporter.yaml" cfg.settings;
+in
+{
+ port = 9787;
+
+ extraOpts = {
+ settings = mkOption {
+ description = mdDoc "Configuration settings for fritz-exporter.";
+ type = types.submodule {
+ freeformType = yaml.type;
+
+ options = {
+ # Pull existing port option into config file.
+ port = mkOption {
+ type = types.port;
+ default = cfg.port;
+ internal = true;
+ visible = false;
+ };
+ # Pull existing listen address option into config file.
+ listen_address = mkOption {
+ type = types.str;
+ default = cfg.listenAddress;
+ internal = true;
+ visible = false;
+ };
+ log_level = mkOption {
+ type = types.enum [ "DEBUG" "INFO" "WARNING" "ERROR" "CRITICAL" ];
+ default = "INFO";
+ description = mdDoc ''
+ Log level to use for the exporter.
+ '';
+ };
+ devices = mkOption {
+ default = [];
+ description = "Fritz!-devices to monitor using the exporter.";
+ type = with types; listOf (submodule {
+ freeformType = yaml.type;
+
+ options = {
+ name = mkOption {
+ type = types.str;
+ default = "";
+ description = mdDoc ''
+ Name to use for the device.
+ '';
+ };
+ hostname = mkOption {
+ type = types.str;
+ default = "fritz.box";
+ description = mdDoc ''
+ Hostname under which the target device is reachable.
+ '';
+ };
+ username = mkOption {
+ type = types.str;
+ description = mdDoc ''
+ Username to authenticate with the target device.
+ '';
+ };
+ password_file = mkOption {
+ type = types.path;
+ description = mdDoc ''
+ Path to a file which contains the password to authenticate with the target device.
+ Needs to be readable by the user the exporter runs under.
+ '';
+ };
+ host_info = mkOption {
+ type = types.bool;
+ description = mdDoc ''
+ Enable extended host info for this device. *Warning*: This will heavily increase scrape time.
+ '';
+ default = false;
+ };
+ };
+ });
+ };
+ };
+ };
+ };
+ };
+
+ serviceOpts = {
+ serviceConfig = {
+ ExecStart = utils.escapeSystemdExecArgs ([
+ (lib.getExe pkgs.fritz-exporter)
+ "--config" configFile
+ ] ++ cfg.extraFlags);
+ DynamicUser = false;
+ };
+ };
+}