From b5bbf9c1ab18384c39ef71de94efbd6c4eec9bbb Mon Sep 17 00:00:00 2001 From: Sergey Lukjanov Date: Thu, 8 Dec 2022 00:40:20 -0800 Subject: [PATCH 1/7] prometheus-smartctl-exporter: unstable-2020-11-14 -> 0.9.1 All patches were already merged in upstream and part of the release. --- .../prometheus/smartctl-exporter/default.nix | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix index 21ccb8178c34..40642b28ce8d 100644 --- a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix +++ b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix @@ -1,36 +1,20 @@ { lib , fetchFromGitHub -, fetchpatch , buildGoModule }: buildGoModule rec { pname = "smartctl_exporter"; - version = "unstable-2020-11-14"; + version = "0.9.1"; src = fetchFromGitHub { owner = "prometheus-community"; repo = pname; - rev = "e27581d56ad80340fb076d3ce22cef337ed76679"; - sha256 = "sha256-iWaFDjVLBIAA9zGe0utbuvmEdA3R5lge0iCh3j2JfE8="; + rev = "refs/tags/v${version}"; + hash = "sha256-fc1NZ5QwzR/jJkeaDm5PMT4wBFFlqZOXKTJMBJWKJJ8="; }; - patches = [ - # Fixes out of range panic (https://github.com/prometheus-community/smartctl_exporter/issues/19) - (fetchpatch { - url = "https://github.com/prometheus-community/smartctl_exporter/commit/15575301a8e2fe5802a8c066c6fa9765d50b8cfa.patch"; - sha256 = "sha256-HLUrGXNz3uKpuQBUgQBSw6EGbGl23hQnimTGl64M5bQ="; - }) - # Fix validation on empty smartctl response (https://github.com/prometheus-community/smartctl_exporter/pull/31) - (fetchpatch { - url = "https://github.com/prometheus-community/smartctl_exporter/commit/744b4e5f6a46e029d31d5aa46642e85f429c2cfa.patch"; - sha256 = "sha256-MgLtYR1SpM6XrZQQ3AgQRmNF3OnaBCqXMJRV9BOzKPc="; - }) - # Fixes missing metrics if outside of query interval (https://github.com/prometheus-community/smartctl_exporter/pull/18) - ./0001-Return-the-cached-value-if-it-s-not-time-to-scan-aga.patch - ]; - - vendorSha256 = "1xhrzkfm2p20k7prgdfax4408g4qpa4wbxigmcmfz7kjg2zi88ld"; + vendorSha256 = "sha256-lQKuT5dzjDHFpRSmcXpKD1RJDlEv+0kcxENkv3mT4FU="; meta = with lib; { description = "Export smartctl statistics for Prometheus"; From 7a11d055a3e93f63a4dd15d74217d3a4d0ead267 Mon Sep 17 00:00:00 2001 From: Sergey Lukjanov Date: Thu, 8 Dec 2022 00:46:22 -0800 Subject: [PATCH 2/7] prometheus-smartctl-exporter: add ldflags to set version --- .../monitoring/prometheus/smartctl-exporter/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix index 40642b28ce8d..efca010ac477 100644 --- a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix +++ b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix @@ -16,6 +16,10 @@ buildGoModule rec { vendorSha256 = "sha256-lQKuT5dzjDHFpRSmcXpKD1RJDlEv+0kcxENkv3mT4FU="; + ldflags = [ + "-X github.com/prometheus/common/version.Version=${version}" + ]; + meta = with lib; { description = "Export smartctl statistics for Prometheus"; homepage = "https://github.com/prometheus-community/smartctl_exporter"; From ebcff906a044b27b7109031ac723ee6baff8b022 Mon Sep 17 00:00:00 2001 From: Sergey Lukjanov Date: Thu, 8 Dec 2022 00:49:20 -0800 Subject: [PATCH 3/7] prometheus-smartctl-exporter: add passthru.tests --- .../monitoring/prometheus/smartctl-exporter/default.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix index efca010ac477..51e04c83b386 100644 --- a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix +++ b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix @@ -1,6 +1,7 @@ { lib , fetchFromGitHub , buildGoModule +, nixosTests }: buildGoModule rec { @@ -20,6 +21,8 @@ buildGoModule rec { "-X github.com/prometheus/common/version.Version=${version}" ]; + passthru.tests = { inherit (nixosTests.prometheus-exporters) smartctl; }; + meta = with lib; { description = "Export smartctl statistics for Prometheus"; homepage = "https://github.com/prometheus-community/smartctl_exporter"; From 4848003a6657c11bcbd8bdec1e5af78426580a2e Mon Sep 17 00:00:00 2001 From: Sergey Lukjanov Date: Thu, 8 Dec 2022 01:16:38 -0800 Subject: [PATCH 4/7] prometheus-smartctl-exporter: add Frostman to maintainers --- .../servers/monitoring/prometheus/smartctl-exporter/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix index 51e04c83b386..df21ef09f9f1 100644 --- a/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix +++ b/pkgs/servers/monitoring/prometheus/smartctl-exporter/default.nix @@ -28,6 +28,6 @@ buildGoModule rec { homepage = "https://github.com/prometheus-community/smartctl_exporter"; license = licenses.lgpl3; platforms = platforms.linux; - maintainers = with maintainers; [ hexa ]; + maintainers = with maintainers; [ hexa Frostman ]; }; } From a49feed2551dd918c0fcd121276edd322cc34948 Mon Sep 17 00:00:00 2001 From: Sergey Lukjanov Date: Thu, 8 Dec 2022 01:21:23 -0800 Subject: [PATCH 5/7] nixos/prometheus.exporters.smartctl: use cli args instead of config Config support was dropped and replaced with CLI args --- .../prometheus/exporters/smartctl.nix | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix b/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix index df424ede6066..302b1d5202cd 100644 --- a/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix +++ b/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix @@ -4,16 +4,12 @@ with lib; let cfg = config.services.prometheus.exporters.smartctl; - format = pkgs.formats.yaml {}; - configFile = format.generate "smartctl-exporter.yml" { - smartctl_exporter = { - bind_to = "${cfg.listenAddress}:${toString cfg.port}"; - url_path = "/metrics"; - smartctl_location = "${pkgs.smartmontools}/bin/smartctl"; - collect_not_more_than_period = cfg.maxInterval; - devices = cfg.devices; - }; - }; + args = concatStrings [ + "--web.listen-address=\"${cfg.listenAddress}:${toString cfg.port}\" " + "--smartctl.path=\"${pkgs.smartmontools}/bin/smartctl\" " + "--smartctl.interval=\"${cfg.maxInterval}\" " + "${concatMapStringsSep " " (device: "--smartctl.device=${device}") cfg.devices}" + ]; in { port = 9633; @@ -60,7 +56,7 @@ in { ] ); ExecStart = '' - ${pkgs.prometheus-smartctl-exporter}/bin/smartctl_exporter -config ${configFile} + ${pkgs.prometheus-smartctl-exporter}/bin/smartctl_exporter ${args} ''; PrivateDevices = lib.mkForce false; ProtectProc = "invisible"; From fdcc9e8202c95eed45cd673afa880171330bb1a9 Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Thu, 8 Dec 2022 22:33:03 +0100 Subject: [PATCH 6/7] nixos/prometheus.exporters.smartctl: Simplify DeviceAllow logic Setting up the DeviceAllow list with explicitly configured devices was a nice idea, but sometimes a configured device (`/dev/nvme0n1` an NVMe namespace) has a parent device (`/dev/nvme0`) that smartctl needs to access to query metrics. Falling back to the block and character definitions is probably a valid fallback. --- .../monitoring/prometheus/exporters/smartctl.nix | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix b/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix index 302b1d5202cd..0c5648c14149 100644 --- a/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix +++ b/nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix @@ -46,15 +46,11 @@ in { "CAP_SYS_ADMIN" ]; DevicePolicy = "closed"; - DeviceAllow = lib.mkOverride 50 ( - if cfg.devices != [] then - cfg.devices - else [ - "block-blkext rw" - "block-sd rw" - "char-nvme rw" - ] - ); + DeviceAllow = lib.mkOverride 50 [ + "block-blkext rw" + "block-sd rw" + "char-nvme rw" + ]; ExecStart = '' ${pkgs.prometheus-smartctl-exporter}/bin/smartctl_exporter ${args} ''; From c7fbae128947d4c656e40386c2ab5c4337f03ecd Mon Sep 17 00:00:00 2001 From: Martin Weinelt Date: Fri, 9 Dec 2022 01:38:22 +0100 Subject: [PATCH 7/7] nixos/tests/prometheus-exporters.smartctl: update test script We can't actually get metrics for a virtual disk drive so the exporter fails to start with 0.9.x. Instead let's just make sure it said that /dev/vda was unavailable. --- nixos/tests/prometheus-exporters.nix | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix index cdf666378fa3..8b40d7e41c00 100644 --- a/nixos/tests/prometheus-exporters.nix +++ b/nixos/tests/prometheus-exporters.nix @@ -1086,13 +1086,8 @@ let ]; }; exporterTest = '' - wait_for_unit("prometheus-smartctl-exporter.service") - wait_for_open_port(9633) wait_until_succeeds( - "curl -sSf 'localhost:9633/metrics'" - ) - wait_until_succeeds( - 'journalctl -eu prometheus-smartctl-exporter.service -o cat | grep "/dev/vda: Unable to detect device type"' + 'journalctl -eu prometheus-smartctl-exporter.service -o cat | grep "Device unavailable"' ) ''; };