diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix
index fa53107ef24b..20e7eba43412 100644
--- a/nixos/modules/services/monitoring/prometheus/exporters.nix
+++ b/nixos/modules/services/monitoring/prometheus/exporters.nix
@@ -34,6 +34,7 @@ let
unifi = import ./exporters/unifi.nix { inherit config lib pkgs; };
varnish = import ./exporters/varnish.nix { inherit config lib pkgs; };
bind = import ./exporters/bind.nix { inherit config lib pkgs; };
+ wireguard = import ./exporters/wireguard.nix { inherit config lib pkgs; };
};
mkExporterOpts = ({ name, port }: {
diff --git a/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix b/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix
new file mode 100644
index 000000000000..c5b84e574b8d
--- /dev/null
+++ b/nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix
@@ -0,0 +1,42 @@
+{ config, lib, pkgs }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.wireguard;
+in {
+ port = 9586;
+ 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
+ add the peer's name to the stats of a peer.
+
+ Please note that networking.wg-quick is required for this feature
+ as networking.wireguard uses
+ wg8
+ to set the peers up.
+ '';
+ };
+ };
+ serviceOpts = {
+ script = ''
+ ${pkgs.prometheus-wireguard-exporter}/bin/prometheus_wireguard_exporter \
+ -p ${toString cfg.port} \
+ ${optionalString cfg.verbose "-v"} \
+ ${optionalString (cfg.wireguardConfig != null) "-n ${cfg.wireguardConfig}"}
+ '';
+
+ path = [ pkgs.wireguard-tools ];
+
+ serviceConfig = {
+ DynamicUser = true;
+ AmbientCapabilities = [ "CAP_NET_ADMIN" ];
+ };
+ };
+}
diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix
index ac50ca934896..90c7c9701f60 100644
--- a/nixos/tests/prometheus-exporters.nix
+++ b/nixos/tests/prometheus-exporters.nix
@@ -315,6 +315,29 @@ let
succeed("curl -sSf http://localhost:9131/metrics | grep -q 'varnish_up 1'");
'';
};
+
+ wireguard = let snakeoil = import ./wireguard/snakeoil-keys.nix; in {
+ exporterConfig.enable = true;
+ metricProvider = {
+ networking.wireguard.interfaces.wg0 = {
+ ips = [ "10.23.42.1/32" "fc00::1/128" ];
+ listenPort = 23542;
+
+ inherit (snakeoil.peer0) privateKey;
+
+ peers = singleton {
+ allowedIPs = [ "10.23.42.2/32" "fc00::2/128" ];
+
+ inherit (snakeoil.peer1) publicKey;
+ };
+ };
+ };
+ exporterTest = ''
+ waitForUnit("prometheus-wireguard-exporter.service");
+ waitForOpenPort(9586);
+ succeed("curl -sSf http://localhost:9586/metrics | grep '${snakeoil.peer1.publicKey}'");
+ '';
+ };
};
in
mapAttrs (exporter: testConfig: (makeTest {
diff --git a/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix b/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix
new file mode 100644
index 000000000000..77bc187e3575
--- /dev/null
+++ b/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix
@@ -0,0 +1,26 @@
+{ stdenv, rustPlatform, fetchFromGitHub, lib, Security }:
+
+rustPlatform.buildRustPackage rec {
+ pname = "wireguard-exporter";
+ version = "2.0.1";
+
+ src = fetchFromGitHub {
+ owner = "MindFlavor";
+ repo = "prometheus_wireguard_exporter";
+ rev = version;
+ sha256 = "11yrry8fzalcigqsx1wx371w543gdcsx48fd7dacbrsfl2dk2azp";
+ };
+
+ cargoSha256 = "1wnk39p144zjsdhnyjk6y41xs448bxnbbxkqk53r6i2f2wzrsk2m";
+
+ buildInputs = lib.optional stdenv.isDarwin Security;
+
+ doCheck = false;
+
+ meta = with lib; {
+ description = "A Prometheus exporter for WireGuard, written in Rust.";
+ license = licenses.mit;
+ homepage = https://github.com/MindFlavor/prometheus_wireguard_exporter;
+ maintainers = with maintainers; [ ma27 ];
+ };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 48fbae1ebbc9..35e3a7b73824 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -14625,6 +14625,9 @@ in
prometheus-unifi-exporter = callPackage ../servers/monitoring/prometheus/unifi-exporter { };
prometheus-varnish-exporter = callPackage ../servers/monitoring/prometheus/varnish-exporter.nix { };
prometheus-jmx-httpserver = callPackage ../servers/monitoring/prometheus/jmx-httpserver.nix { };
+ prometheus-wireguard-exporter = callPackage ../servers/monitoring/prometheus/wireguard-exporter.nix {
+ inherit (darwin.apple_sdk.frameworks) Security;
+ };
prometheus-cpp = callPackage ../development/libraries/prometheus-cpp { };