Merge pull request #65751 from mayflower/pkgs/prometheus-postgres-exporter

prometheus-postgres-exporter: init at 0.5.1

Changed files
+96
nixos
modules
services
monitoring
prometheus
tests
pkgs
servers
monitoring
top-level
+1
nixos/modules/services/monitoring/prometheus/exporters.nix
···
"nginx"
"node"
"postfix"
+
"postgres"
"snmp"
"surfboard"
"tor"
+46
nixos/modules/services/monitoring/prometheus/exporters/postgres.nix
···
+
{ config, lib, pkgs, options }:
+
+
with lib;
+
+
let
+
cfg = config.services.prometheus.exporters.postgres;
+
in
+
{
+
port = 9187;
+
extraOpts = {
+
telemetryPath = mkOption {
+
type = types.str;
+
default = "/metrics";
+
description = ''
+
Path under which to expose metrics.
+
'';
+
};
+
dataSourceName = mkOption {
+
type = types.str;
+
default = "user=postgres database=postgres host=/run/postgresql sslmode=disable";
+
example = "postgresql://username:password@localhost:5432/postgres?sslmode=disable";
+
description = ''
+
Accepts PostgreSQL URI form and key=value form arguments.
+
'';
+
};
+
runAsLocalSuperUser = mkOption {
+
type = types.bool;
+
default = false;
+
description = ''
+
Whether to run the exporter as the local 'postgres' super user.
+
'';
+
};
+
};
+
serviceOpts = {
+
environment.DATA_SOURCE_NAME = cfg.dataSourceName;
+
serviceConfig = {
+
User = mkIf cfg.runAsLocalSuperUser (mkForce "postgres");
+
ExecStart = ''
+
${pkgs.prometheus-postgres-exporter}/bin/postgres_exporter \
+
--web.listen-address ${cfg.listenAddress}:${toString cfg.port} \
+
--web.telemetry-path ${cfg.telemetryPath} \
+
${concatStringsSep " \\\n " cfg.extraFlags}
+
'';
+
};
+
};
+
}
+24
nixos/tests/prometheus-exporters.nix
···
'';
};
+
postgres = {
+
exporterConfig = {
+
enable = true;
+
runAsLocalSuperUser = true;
+
};
+
metricProvider = {
+
services.postgresql.enable = true;
+
};
+
exporterTest = ''
+
waitForUnit("prometheus-postgres-exporter.service");
+
waitForOpenPort(9187);
+
waitForUnit("postgresql.service");
+
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'");
+
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'");
+
systemctl("stop postgresql.service");
+
succeed("curl -sSf http://localhost:9187/metrics | grep -qv 'pg_exporter_last_scrape_error 0'");
+
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 0'");
+
systemctl("start postgresql.service");
+
waitForUnit("postgresql.service");
+
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_exporter_last_scrape_error 0'");
+
succeed("curl -sSf http://localhost:9187/metrics | grep -q 'pg_up 1'");
+
'';
+
};
+
snmp = {
exporterConfig = {
enable = true;
+24
pkgs/servers/monitoring/prometheus/postgres-exporter.nix
···
+
{ stdenv, buildGoPackage, fetchFromGitHub }:
+
+
with stdenv.lib;
+
+
buildGoPackage rec {
+
name = "postgres_exporter-${version}";
+
version = "0.5.1";
+
+
goPackagePath = "github.com/wrouesnel/postgres_exporter";
+
+
src = fetchFromGitHub {
+
owner = "wrouesnel";
+
repo = "postgres_exporter";
+
rev = "v${version}";
+
sha256 = "1awcqhiak56nrsaa49lkw6mcbrlm86ls14sp9v69h3a0brc1q7bn";
+
};
+
+
meta = {
+
inherit (src.meta) homepage;
+
description = "A Prometheus exporter for PostgreSQL";
+
license = licenses.asl20;
+
maintainers = with maintainers; [ fpletz ];
+
};
+
}
+1
pkgs/top-level/all-packages.nix
···
prometheus-node-exporter = callPackage ../servers/monitoring/prometheus/node-exporter.nix { };
prometheus-openvpn-exporter = callPackage ../servers/monitoring/prometheus/openvpn-exporter.nix { };
prometheus-postfix-exporter = callPackage ../servers/monitoring/prometheus/postfix-exporter.nix { };
+
prometheus-postgres-exporter = callPackage ../servers/monitoring/prometheus/postgres-exporter.nix { };
prometheus-pushgateway = callPackage ../servers/monitoring/prometheus/pushgateway.nix { };
prometheus-rabbitmq-exporter = callPackage ../servers/monitoring/prometheus/rabbitmq-exporter.nix { };
prometheus-snmp-exporter = callPackage ../servers/monitoring/prometheus/snmp-exporter.nix {