From d64f297d61b6544ce1e08326372939dc14168652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Reyrol?= Date: Sun, 25 Jun 2023 18:41:35 +0200 Subject: [PATCH] services/prometheus/exporters: add scaphandre --- .../manual/release-notes/rl-2311.section.md | 2 ++ .../monitoring/prometheus/exporters.nix | 16 ++++++++++ .../prometheus/exporters/scaphandre.nix | 31 +++++++++++++++++++ nixos/tests/prometheus-exporters.nix | 16 ++++++++++ pkgs/servers/scaphandre/default.nix | 2 +- 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 nixos/modules/services/monitoring/prometheus/exporters/scaphandre.nix diff --git a/nixos/doc/manual/release-notes/rl-2311.section.md b/nixos/doc/manual/release-notes/rl-2311.section.md index 66bed591d48e5c3..c58985132be0e00 100644 --- a/nixos/doc/manual/release-notes/rl-2311.section.md +++ b/nixos/doc/manual/release-notes/rl-2311.section.md @@ -76,6 +76,8 @@ - `services.nginx` gained a `defaultListen` option at server-level with support for PROXY protocol listeners, also `proxyProtocol` is now exposed in `services.nginx.virtualHosts..listen` option. It is now possible to run PROXY listeners and non-PROXY listeners at a server-level, see [#213510](https://github.com/NixOS/nixpkgs/pull/213510/) for more details. +- `services.prometheus.exporters` has a new exporter to monitor electrical power consumption based on PowercapRAPL sensor called [Scaphandre](https://github.com/hubblo-org/scaphandre), see [#239803](https://github.com/NixOS/nixpkgs/pull/239803) for more details. + ## Nixpkgs internals {#sec-release-23.11-nixpkgs-internals} - The `qemu-vm.nix` module by default now identifies block devices via diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix index 501f126e1a30567..b1dc34326793bda 100644 --- a/nixos/modules/services/monitoring/prometheus/exporters.nix +++ b/nixos/modules/services/monitoring/prometheus/exporters.nix @@ -65,6 +65,7 @@ let "redis" "rspamd" "rtl_433" + "scaphandre" "script" "shelly" "snmp" @@ -301,6 +302,21 @@ in Please specify either 'services.prometheus.exporters.sql.configuration' or 'services.prometheus.exporters.sql.configFile' ''; + } { + assertion = cfg.scaphandre.enable -> (pkgs.stdenv.hostPlatform.isx86_64 == true); + message = '' + Only x86_64 host platform architecture is not supported. + ''; + } { + assertion = cfg.scaphandre.enable -> ((lib.kernel.whenHelpers pkgs.linux.version).whenOlder "5.11" true).condition == false; + message = '' + A kernel version older than '5.11' is required. ${pkgs.linux.version} + ''; + } { + assertion = cfg.scaphandre.enable -> (builtins.elem "intel_rapl_common" config.boot.kernelModules); + message = '' + Please enable 'intel_rapl_common' in 'boot.kernelModules'. + ''; } ] ++ (flip map (attrNames exporterOpts) (exporter: { assertion = cfg.${exporter}.firewallFilter != null -> cfg.${exporter}.openFirewall; message = '' diff --git a/nixos/modules/services/monitoring/prometheus/exporters/scaphandre.nix b/nixos/modules/services/monitoring/prometheus/exporters/scaphandre.nix new file mode 100644 index 000000000000000..2f0d31049a879d8 --- /dev/null +++ b/nixos/modules/services/monitoring/prometheus/exporters/scaphandre.nix @@ -0,0 +1,31 @@ +{ config, lib, pkgs, options }: + +with lib; + +let + logPrefix = "services.prometheus.exporter.scaphandre"; + cfg = config.services.prometheus.exporters.scaphandre; +in { + port = 8080; + extraOpts = { + telemetryPath = mkOption { + type = types.str; + default = "/metrics"; + description = lib.mdDoc '' + Path under which to expose metrics. + ''; + }; + }; + + serviceOpts = { + serviceConfig = { + ExecStart = '' + ${pkgs.scaphandre}/bin/scaphandre prometheus \ + --address ${cfg.listenAddress} \ + --port ${toString cfg.port} \ + --suffix ${cfg.telemetryPath} \ + ${concatStringsSep " \\\n " cfg.extraFlags} + ''; + }; + }; +} diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix index a69f2347b54b163..772067b520c830b 100644 --- a/nixos/tests/prometheus-exporters.nix +++ b/nixos/tests/prometheus-exporters.nix @@ -1085,6 +1085,22 @@ let ''; }; + scaphandre = { + exporterConfig = { + enable = true; + }; + metricProvider = { + boot.kernelModules = [ "intel_rapl_common" ]; + }; + exporterTest = '' + wait_for_unit("prometheus-scaphandre-exporter.service") + wait_for_open_port(8080) + wait_until_succeeds( + "curl -sSf 'localhost:8080/metrics'" + ) + ''; + }; + shelly = { exporterConfig = { enable = true; diff --git a/pkgs/servers/scaphandre/default.nix b/pkgs/servers/scaphandre/default.nix index cc01b684e9e15e7..7abfea74578ad3e 100644 --- a/pkgs/servers/scaphandre/default.nix +++ b/pkgs/servers/scaphandre/default.nix @@ -55,7 +55,7 @@ rustPlatform.buildRustPackage rec { description = "Electrical power consumption metrology agent"; homepage = "https://github.com/hubblo-org/scaphandre"; license = licenses.asl20; - platforms = platforms.linux; + platforms = with platforms; [ "x86_64-linux"]; maintainers = with maintainers; [ gaelreyrol ]; }; }