diff --git a/nixos/doc/manual/release-notes/rl-2505.section.md b/nixos/doc/manual/release-notes/rl-2505.section.md index 680d3ffb55be..bb3d6b58e8e2 100644 --- a/nixos/doc/manual/release-notes/rl-2505.section.md +++ b/nixos/doc/manual/release-notes/rl-2505.section.md @@ -228,6 +228,10 @@ - [CookCLI](https://cooklang.org/cli/) Server, a web UI for cooklang recipes. +- [Prometheus eBPF Exporter](https://github.com/cloudflare/ebpf_exporter), + Prometheus exporter for custom eBPF metrics. Available as + [services.prometheus.exporters.ebpf](#opt-services.prometheus.exporters.ebpf.enable). + ## Backward Incompatibilities {#sec-release-25.05-incompatibilities} diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix index 258d13e3c7c7..2adc59eefbef 100644 --- a/nixos/modules/services/monitoring/prometheus/exporters.nix +++ b/nixos/modules/services/monitoring/prometheus/exporters.nix @@ -65,6 +65,7 @@ let "dnssec" "domain" "dovecot" + "ebpf" "fastly" "flow" "fritz" diff --git a/nixos/modules/services/monitoring/prometheus/exporters/ebpf.nix b/nixos/modules/services/monitoring/prometheus/exporters/ebpf.nix new file mode 100644 index 000000000000..8ccb6d21623b --- /dev/null +++ b/nixos/modules/services/monitoring/prometheus/exporters/ebpf.nix @@ -0,0 +1,49 @@ +{ + config, + lib, + pkgs, + options, + ... +}: + +let + cfg = config.services.prometheus.exporters.ebpf; + inherit (lib) + mkOption + types + concatStringsSep + ; +in +{ + port = 9435; + extraOpts = { + names = mkOption { + type = types.listOf types.str; + default = [ ]; + example = [ "timers" ]; + description = '' + List of eBPF programs to load + ''; + }; + }; + serviceOpts = { + serviceConfig = { + AmbientCapabilities = [ + "CAP_BPF" + "CAP_DAC_READ_SEARCH" + "CAP_PERFMON" + ]; + CapabilityBoundingSet = [ + "CAP_BPF" + "CAP_DAC_READ_SEARCH" + "CAP_PERFMON" + ]; + ExecStart = '' + ${pkgs.prometheus-ebpf-exporter}/bin/ebpf_exporter \ + --config.dir=${pkgs.prometheus-ebpf-exporter}/examples \ + --config.names=${concatStringsSep "," cfg.names} \ + --web.listen-address ${cfg.listenAddress}:${toString cfg.port} + ''; + }; + }; +} diff --git a/nixos/tests/prometheus-exporters.nix b/nixos/tests/prometheus-exporters.nix index 46b8d13364c6..ef356dbc7bb1 100644 --- a/nixos/tests/prometheus-exporters.nix +++ b/nixos/tests/prometheus-exporters.nix @@ -407,6 +407,20 @@ let ''; }; + ebpf = { + exporterConfig = { + enable = true; + names = [ "timers" ]; + }; + exporterTest = '' + wait_for_unit("prometheus-ebpf-exporter.service") + wait_for_open_port(9435) + succeed( + "curl -sSf http://localhost:9435/metrics | grep 'ebpf_exporter_enabled_configs{name=\"timers\"} 1'" + ) + ''; + }; + fastly = { exporterConfig = { enable = true;