diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 2b4e3f5bddbd..19f53a175c2c 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -962,6 +962,7 @@ ./services/monitoring/opentelemetry-collector.nix ./services/monitoring/osquery.nix ./services/monitoring/parsedmarc.nix + ./services/monitoring/pgscv.nix ./services/monitoring/prometheus/alertmanager-gotify-bridge.nix ./services/monitoring/prometheus/alertmanager-irc-relay.nix ./services/monitoring/prometheus/alertmanager-webhook-logger.nix diff --git a/nixos/modules/services/monitoring/pgscv.nix b/nixos/modules/services/monitoring/pgscv.nix new file mode 100644 index 000000000000..e60d0d45ab92 --- /dev/null +++ b/nixos/modules/services/monitoring/pgscv.nix @@ -0,0 +1,75 @@ +{ + config, + lib, + pkgs, + utils, + ... +}: + +let + inherit (lib) + mkEnableOption + mkIf + mkOption + mkPackageOption + types + ; + + cfg = config.services.pgscv; + + settingsFormat = pkgs.formats.yaml { }; + configFile = settingsFormat.generate "config.yaml" cfg.settings; +in +{ + options.services.pgscv = { + enable = mkEnableOption "pgSCV, a PostgreSQL ecosystem metrics collector"; + + package = mkPackageOption pkgs "pgscv" { }; + + logLevel = mkOption { + type = types.enum [ + "debug" + "info" + "warn" + "error" + ]; + default = "info"; + description = "Log level for pgSCV."; + }; + + settings = mkOption { + type = settingsFormat.type; + default = { }; + description = '' + Configuration for pgSCV, in YAML format. + + See [configuration reference](https://github.com/cherts/pgscv/wiki/Configuration-settings-reference). + ''; + }; + }; + + config = mkIf cfg.enable { + systemd.services.pgscv = { + description = "pgSCV - PostgreSQL ecosystem metrics collector"; + wantedBy = [ "multi-user.target" ]; + requires = [ "network-online.target" ]; + after = [ "network-online.target" ]; + path = [ pkgs.glibc ]; # shells out to getconf + + serviceConfig = { + User = "postgres"; + Group = "postgres"; + ExecStart = utils.escapeSystemdExecArgs [ + (lib.getExe cfg.package) + "--log-level=${cfg.logLevel}" + "--config-file=${configFile}" + ]; + KillMode = "control-group"; + TimeoutSec = 5; + Restart = "on-failure"; + RestartSec = 10; + OOMScoreAdjust = 1000; + }; + }; + }; +} diff --git a/pkgs/by-name/pg/pgscv/package.nix b/pkgs/by-name/pg/pgscv/package.nix new file mode 100644 index 000000000000..f5a7de029f86 --- /dev/null +++ b/pkgs/by-name/pg/pgscv/package.nix @@ -0,0 +1,43 @@ +{ + lib, + buildGoModule, + fetchFromGitHub, +}: + +buildGoModule rec { + pname = "pgscv"; + version = "0.13.0"; + + src = fetchFromGitHub { + owner = "CHERTS"; + repo = "pgscv"; + tag = "v${version}"; + hash = "sha256-6qhJZHyVtEI4+pqi0dgagDC2RaISV9g/ygrezJO57Sk="; + }; + + vendorHash = "sha256-KahDpLwk+6KXaIfvjr7+nkFuEV4Dw3pyshkJ5XUEdUg="; + + ldflags = [ + "-X=main.appName=pgscv" + "-X=main.gitTag=${src.tag}" + "-X=main.gitCommit=${src.tag}" + "-X=main.gitBranch=${src.tag}" + ]; + + # tests rely on a pretty complex Postgres setup + doCheck = false; + + postInstall = '' + mv $out/bin/{cmd,pgscv} + ''; + + meta = { + description = "PgSCV is a PostgreSQL ecosystem metrics collector"; + homepage = "https://github.com/CHERTS/pgscv/"; + changelog = "https://github.com/CHERTS/pgscv/releases/${version}"; + license = lib.licenses.bsd3; + platforms = lib.platforms.linux; + maintainers = with lib.maintainers; [ k900 ]; + mainProgram = "pgscv"; + }; +}