Merge pull request #188754 from snaar/prometheus-ipmi

nixos/services.prometheus.exporters.ipmi: new module along with underlying ipmi_exporter package

Ivv ac5e7351 4aacfbe1

Changed files
+123
nixos
doc
manual
from_md
release-notes
release-notes
modules
services
monitoring
prometheus
tests
pkgs
servers
monitoring
prometheus
top-level
+8
nixos/doc/manual/from_md/release-notes/rl-2211.section.xml
···
</listitem>
<listitem>
<para>
+
<link xlink:href="https://github.com/prometheus-community/ipmi_exporter">Prometheus
+
IPMI exporter</link>, an IPMI exporter for Prometheus.
+
Available as
+
<link linkend="opt-services.prometheus.exporters.ipmi.enable">services.prometheus.exporters.ipmi</link>.
+
</para>
+
</listitem>
+
<listitem>
+
<para>
<link xlink:href="https://writefreely.org">WriteFreely</link>,
a simple blogging platform with ActivityPub support. Available
as
+2
nixos/doc/manual/release-notes/rl-2211.section.md
···
- [Patroni](https://github.com/zalando/patroni), a template for PostgreSQL HA with ZooKeeper, etcd or Consul.
Available as [services.patroni](options.html#opt-services.patroni.enable).
+
- [Prometheus IPMI exporter](https://github.com/prometheus-community/ipmi_exporter), an IPMI exporter for Prometheus. Available as [services.prometheus.exporters.ipmi](#opt-services.prometheus.exporters.ipmi.enable).
+
- [WriteFreely](https://writefreely.org), a simple blogging platform with ActivityPub support. Available as [services.writefreely](options.html#opt-services.writefreely.enable).
<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
+17
nixos/modules/services/monitoring/prometheus/exporters.nix
···
"fastly"
"fritzbox"
"influxdb"
+
"ipmi"
"json"
"jitsi"
"kea"
···
config = mkMerge ([{
assertions = [ {
+
assertion = cfg.ipmi.enable -> (cfg.ipmi.configFile != null) -> (
+
!(lib.hasPrefix "/tmp/" cfg.ipmi.configFile)
+
);
+
message = ''
+
Config file specified in `services.prometheus.exporters.ipmi.configFile' must
+
not reside within /tmp - it won't be visible to the systemd service.
+
'';
+
} {
+
assertion = cfg.ipmi.enable -> (cfg.ipmi.webConfigFile != null) -> (
+
!(lib.hasPrefix "/tmp/" cfg.ipmi.webConfigFile)
+
);
+
message = ''
+
Config file specified in `services.prometheus.exporters.ipmi.webConfigFile' must
+
not reside within /tmp - it won't be visible to the systemd service.
+
'';
+
} {
assertion = cfg.snmp.enable -> (
(cfg.snmp.configurationPath == null) != (cfg.snmp.configuration == null)
);
+41
nixos/modules/services/monitoring/prometheus/exporters/ipmi.nix
···
+
{ config, lib, pkgs, options }:
+
+
with lib;
+
+
let
+
logPrefix = "services.prometheus.exporter.ipmi";
+
cfg = config.services.prometheus.exporters.ipmi;
+
in {
+
port = 9290;
+
+
extraOpts = {
+
configFile = mkOption {
+
type = types.nullOr types.path;
+
default = null;
+
description = lib.mdDoc ''
+
Path to configuration file.
+
'';
+
};
+
+
webConfigFile = mkOption {
+
type = types.nullOr types.path;
+
default = null;
+
description = lib.mdDoc ''
+
Path to configuration file that can enable TLS or authentication.
+
'';
+
};
+
};
+
+
serviceOpts.serviceConfig = {
+
ExecStart = with cfg; concatStringsSep " " ([
+
"${pkgs.prometheus-ipmi-exporter}/bin/ipmi_exporter"
+
"--web.listen-address ${listenAddress}:${toString port}"
+
] ++ optionals (cfg.webConfigFile != null) [
+
"--web.config.file ${escapeShellArg cfg.webConfigFile}"
+
] ++ optionals (cfg.configFile != null) [
+
"--config.file ${escapeShellArg cfg.configFile}"
+
] ++ extraFlags);
+
+
ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+
};
+
}
+13
nixos/tests/prometheus-exporters.nix
···
'';
};
+
ipmi = {
+
exporterConfig = {
+
enable = true;
+
};
+
exporterTest = ''
+
wait_for_unit("prometheus-ipmi-exporter.service")
+
wait_for_open_port(9290)
+
succeed(
+
"curl -sSf http://localhost:9290/metrics | grep 'ipmi_scrape_duration_seconds'"
+
)
+
'';
+
};
+
jitsi = {
exporterConfig = {
enable = true;
+41
pkgs/servers/monitoring/prometheus/ipmi-exporter.nix
···
+
{ lib, buildGoModule, fetchFromGitHub, nixosTests, makeWrapper, freeipmi }:
+
+
buildGoModule rec {
+
pname = "ipmi_exporter";
+
version = "1.6.1";
+
+
src = fetchFromGitHub {
+
owner = "prometheus-community";
+
repo = "ipmi_exporter";
+
rev = "v${version}";
+
hash = "sha256-hifG1lpFUVLoy7Ol3N6h+s+hZjnQxja5svpY4lFFsxw=";
+
};
+
+
vendorHash = "sha256-UuPZmxoKVj7FusOS6H1gn6SAzQIZAKyX+m+QS657yXw=";
+
+
nativeBuildInputs = [ makeWrapper ];
+
+
postInstall = ''
+
wrapProgram $out/bin/ipmi_exporter --prefix PATH : ${lib.makeBinPath [ freeipmi ]}
+
'';
+
+
passthru.tests = { inherit (nixosTests.prometheus-exporters) ipmi; };
+
+
ldflags = [
+
"-s"
+
"-w"
+
"-X github.com/prometheus/common/version.Version=${version}"
+
"-X github.com/prometheus/common/version.Revision=0000000"
+
"-X github.com/prometheus/common/version.Branch=unknown"
+
"-X github.com/prometheus/common/version.BuildUser=nix@nixpkgs"
+
"-X github.com/prometheus/common/version.BuildDate=unknown"
+
];
+
+
meta = with lib; {
+
description = "An IPMI exporter for Prometheus";
+
homepage = "https://github.com/prometheus-community/ipmi_exporter";
+
changelog = "https://github.com/prometheus-community/ipmi_exporter/blob/${src.rev}/CHANGELOG.md";
+
license = licenses.mit;
+
maintainers = with maintainers; [ snaar ];
+
};
+
}
+1
pkgs/top-level/all-packages.nix
···
prometheus-gitlab-ci-pipelines-exporter = callPackage ../servers/monitoring/prometheus/gitlab-ci-pipelines-exporter.nix { };
prometheus-haproxy-exporter = callPackage ../servers/monitoring/prometheus/haproxy-exporter.nix { };
prometheus-influxdb-exporter = callPackage ../servers/monitoring/prometheus/influxdb-exporter.nix { };
+
prometheus-ipmi-exporter = callPackage ../servers/monitoring/prometheus/ipmi-exporter.nix { };
prometheus-jitsi-exporter = callPackage ../servers/monitoring/prometheus/jitsi-exporter.nix { };
prometheus-jmx-httpserver = callPackage ../servers/monitoring/prometheus/jmx-httpserver.nix { };
prometheus-json-exporter = callPackage ../servers/monitoring/prometheus/json-exporter.nix { };