Merge pull request #265696 from Stunkymonkey/nixos-exportarr

nixos/exportarr: init

Changed files
+110 -8
nixos
doc
manual
release-notes
modules
services
monitoring
prometheus
tests
+2
nixos/doc/manual/release-notes/rl-2311.section.md
···
- [ZITADEL](https://zitadel.com), a turnkey identity and access management platform. Available as [services.zitadel](#opt-services.zitadel.enable).
+
- [exportarr](https://github.com/onedr0p/exportarr), Prometheus Exporters for Bazarr, Lidarr, Prowlarr, Radarr, Readarr, and Sonarr. Available as [services.prometheus.exporters.exportarr-bazarr](#opt-services.prometheus.exporters.exportarr-bazarr.enable)/[services.prometheus.exporters.exportarr-lidarr](#opt-services.prometheus.exporters.exportarr-lidarr.enable)/[services.prometheus.exporters.exportarr-prowlarr](#opt-services.prometheus.exporters.exportarr-prowlarr.enable)/[services.prometheus.exporters.exportarr-radarr](#opt-services.prometheus.exporters.exportarr-radarr.enable)/[services.prometheus.exporters.exportarr-readarr](#opt-services.prometheus.exporters.exportarr-readarr.enable)/[services.prometheus.exporters.exportarr-sonarr](#opt-services.prometheus.exporters.exportarr-sonarr.enable).
+
- [netclient](https://github.com/gravitl/netclient), an automated WireGuard® Management Client. Available as [services.netclient](#opt-services.netclient.enable).
- [trunk-ng](https://github.com/ctron/trunk), A fork of `trunk`: Build, bundle & ship your Rust WASM application to the web
+38 -8
nixos/modules/services/monitoring/prometheus/exporters.nix
···
let
inherit (lib) concatStrings foldl foldl' genAttrs literalExpression maintainers
-
mapAttrsToList mkDefault mkEnableOption mkIf mkMerge mkOption
-
optional types mkOptionDefault flip attrNames;
+
mapAttrs mapAttrsToList mkDefault mkEnableOption mkIf mkMerge mkOption
+
optional types mkOptionDefault flip attrNames;
cfg = config.services.prometheus.exporters;
···
# systemd service must be provided by specifying either
# `serviceOpts.script` or `serviceOpts.serviceConfig.ExecStart`
-
exporterOpts = genAttrs [
+
exporterOpts = (genAttrs [
"apcupsd"
"artifactory"
"bind"
···
"domain"
"dovecot"
"fastly"
+
"flow"
"fritzbox"
"graphite"
"idrac"
"imap-mailstat"
"influxdb"
"ipmi"
-
"json"
"jitsi"
+
"json"
"junos-czerwonk"
"kea"
"keylight"
···
"scaphandre"
"script"
"shelly"
-
"snmp"
"smartctl"
"smokeping"
+
"snmp"
"sql"
"statsd"
"surfboard"
···
"v2ray"
"varnish"
"wireguard"
-
"flow"
"zfs"
-
] (name:
-
import (./. + "/exporters/${name}.nix") { inherit config lib pkgs options; }
+
]
+
(name:
+
import (./. + "/exporters/${name}.nix") { inherit config lib pkgs options; }
+
)) // (mapAttrs
+
(name: params:
+
import (./. + "/exporters/${params.name}.nix") { inherit config lib pkgs options; type = params.type ; })
+
{
+
exportarr-bazarr = {
+
name = "exportarr";
+
type = "bazarr";
+
};
+
exportarr-lidarr = {
+
name = "exportarr";
+
type = "lidarr";
+
};
+
exportarr-prowlarr = {
+
name = "exportarr";
+
type = "prowlarr";
+
};
+
exportarr-radarr = {
+
name = "exportarr";
+
type = "radarr";
+
};
+
exportarr-readarr = {
+
name = "exportarr";
+
type = "readarr";
+
};
+
exportarr-sonarr = {
+
name = "exportarr";
+
type = "sonarr";
+
};
+
}
);
mkExporterOpts = ({ name, port }: {
+55
nixos/modules/services/monitoring/prometheus/exporters/exportarr.nix
···
+
{ config, lib, pkgs, options, type }:
+
+
let
+
cfg = config.services.prometheus.exporters."exportarr-${type}";
+
exportarrEnvironment = (
+
lib.mapAttrs (_: toString) cfg.environment
+
) // {
+
PORT = toString cfg.port;
+
URL = cfg.url;
+
API_KEY_FILE = lib.mkIf (cfg.apiKeyFile != null) "%d/api-key";
+
};
+
in
+
{
+
port = 9708;
+
extraOpts = {
+
url = lib.mkOption {
+
type = lib.types.str;
+
default = "http://127.0.0.1";
+
description = lib.mdDoc ''
+
The full URL to Sonarr, Radarr, or Lidarr.
+
'';
+
};
+
+
apiKeyFile = lib.mkOption {
+
type = lib.types.nullOr lib.types.path;
+
default = null;
+
description = lib.mdDoc ''
+
File containing the api-key.
+
'';
+
};
+
+
package = lib.mkPackageOptionMD pkgs "exportarr" { };
+
+
environment = lib.mkOption {
+
type = lib.types.attrsOf lib.types.str;
+
default = { };
+
description = lib.mdDoc ''
+
See [the configuration guide](https://github.com/onedr0p/exportarr#configuration) for available options.
+
'';
+
example = {
+
PROWLARR__BACKFILL = true;
+
};
+
};
+
};
+
serviceOpts = {
+
serviceConfig = {
+
LoadCredential = lib.optionalString (cfg.apiKeyFile != null) "api-key:${cfg.apiKeyFile}";
+
ExecStart = ''${cfg.package}/bin/exportarr ${type} "$@"'';
+
ProcSubset = "pid";
+
ProtectProc = "invisible";
+
SystemCallFilter = ["@system-service" "~@privileged"];
+
};
+
environment = exportarrEnvironment;
+
};
+
}
+15
nixos/tests/prometheus-exporters.nix
···
'';
};
+
exportarr-sonarr = {
+
nodeName = "exportarr_sonarr";
+
exporterConfig = {
+
enable = true;
+
url = "http://127.0.0.1:8989";
+
# testing for real data is tricky, because the api key can not be preconfigured
+
apiKeyFile = pkgs.writeText "dummy-api-key" "eccff6a992bc2e4b88e46d064b26bb4e";
+
};
+
exporterTest = ''
+
wait_for_unit("prometheus-exportarr-sonarr-exporter.service")
+
wait_for_open_port(9707)
+
succeed("curl -sSf 'http://localhost:9707/metrics")
+
'';
+
};
+
fastly = {
exporterConfig = {
enable = true;