diff --git a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
index 88d075a9a482..fc1cec16ef90 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2111.section.xml
@@ -99,6 +99,14 @@
services.hockeypuck.
+
+
+ buildkite-agent-metrics,
+ a command-line tool for collecting Buildkite agent metrics,
+ now has a Prometheus exporter available as
+ services.prometheus.exporters.buildkite-agent.
+
+
diff --git a/nixos/doc/manual/release-notes/rl-2111.section.md b/nixos/doc/manual/release-notes/rl-2111.section.md
index f7275480ff81..9303393aba34 100644
--- a/nixos/doc/manual/release-notes/rl-2111.section.md
+++ b/nixos/doc/manual/release-notes/rl-2111.section.md
@@ -30,6 +30,7 @@ In addition to numerous new and upgraded packages, this release has the followin
- [Hockeypuck](https://github.com/hockeypuck/hockeypuck), a OpenPGP Key Server. Available as [services.hockeypuck](#opt-services.hockeypuck.enable).
+- [buildkite-agent-metrics](https://github.com/buildkite/buildkite-agent-metrics), a command-line tool for collecting Buildkite agent metrics, now has a Prometheus exporter available as [services.prometheus.exporters.buildkite-agent](#opt-services.prometheus.exporters.buildkite-agent.enable).
## Backward Incompatibilities {#sec-release-21.11-incompatibilities}
diff --git a/nixos/modules/services/monitoring/prometheus/exporters.nix b/nixos/modules/services/monitoring/prometheus/exporters.nix
index 6bd075697fa2..d648de6a4148 100644
--- a/nixos/modules/services/monitoring/prometheus/exporters.nix
+++ b/nixos/modules/services/monitoring/prometheus/exporters.nix
@@ -27,6 +27,7 @@ let
"bird"
"bitcoin"
"blackbox"
+ "buildkite-agent"
"collectd"
"dnsmasq"
"domain"
diff --git a/nixos/modules/services/monitoring/prometheus/exporters/buildkite-agent.nix b/nixos/modules/services/monitoring/prometheus/exporters/buildkite-agent.nix
new file mode 100644
index 000000000000..7557480ac062
--- /dev/null
+++ b/nixos/modules/services/monitoring/prometheus/exporters/buildkite-agent.nix
@@ -0,0 +1,64 @@
+{ config, lib, pkgs, options }:
+
+with lib;
+
+let
+ cfg = config.services.prometheus.exporters.buildkite-agent;
+in
+{
+ port = 9876;
+ extraOpts = {
+ tokenPath = mkOption {
+ type = types.nullOr types.path;
+ apply = final: if final == null then null else toString final;
+ description = ''
+ The token from your Buildkite "Agents" page.
+
+ A run-time path to the token file, which is supposed to be provisioned
+ outside of Nix store.
+ '';
+ };
+ interval = mkOption {
+ type = types.str;
+ default = "30s";
+ example = "1min";
+ description = ''
+ How often to update metrics.
+ '';
+ };
+ endpoint = mkOption {
+ type = types.str;
+ default = "https://agent.buildkite.com/v3";
+ description = ''
+ The Buildkite Agent API endpoint.
+ '';
+ };
+ queues = mkOption {
+ type = with types; nullOr (listOf str);
+ default = null;
+ example = literalExample ''[ "my-queue1" "my-queue2" ]'';
+ description = ''
+ Which specific queues to process.
+ '';
+ };
+ };
+ serviceOpts = {
+ script =
+ let
+ queues = concatStringsSep " " (map (q: "-queue ${q}") cfg.queues);
+ in
+ ''
+ export BUILDKITE_AGENT_TOKEN="$(cat ${toString cfg.tokenPath})"
+ exec ${pkgs.buildkite-agent-metrics}/bin/buildkite-agent-metrics \
+ -backend prometheus \
+ -interval ${cfg.interval} \
+ -endpoint ${cfg.endpoint} \
+ ${optionalString (cfg.queues != null) queues} \
+ -prometheus-addr "${cfg.listenAddress}:${toString cfg.port}" ${concatStringsSep " " cfg.extraFlags}
+ '';
+ serviceConfig = {
+ DynamicUser = false;
+ RuntimeDirectory = "buildkite-agent-metrics";
+ };
+ };
+}