167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								{ config, pkgs, lib, ... }:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								with lib;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								let
							 | 
						||
| 
								 | 
							
								  cfg = config.services.prometheus.pushgateway;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  cmdlineArgs =
							 | 
						||
| 
								 | 
							
								       opt "web.listen-address" cfg.web.listen-address
							 | 
						||
| 
								 | 
							
								    ++ opt "web.telemetry-path" cfg.web.telemetry-path
							 | 
						||
| 
								 | 
							
								    ++ opt "web.external-url" cfg.web.external-url
							 | 
						||
| 
								 | 
							
								    ++ opt "web.route-prefix" cfg.web.route-prefix
							 | 
						||
| 
								 | 
							
								    ++ optional cfg.persistMetrics ''--persistence.file="/var/lib/${cfg.stateDir}/metrics"''
							 | 
						||
| 
								 | 
							
								    ++ opt "persistence.interval" cfg.persistence.interval
							 | 
						||
| 
								 | 
							
								    ++ opt "log.level" cfg.log.level
							 | 
						||
| 
								 | 
							
								    ++ opt "log.format" cfg.log.format
							 | 
						||
| 
								 | 
							
								    ++ cfg.extraFlags;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  opt = k : v : optional (v != null) ''--${k}="${v}"'';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								in {
							 | 
						||
| 
								 | 
							
								  options = {
							 | 
						||
| 
								 | 
							
								    services.prometheus.pushgateway = {
							 | 
						||
| 
								 | 
							
								      enable = mkEnableOption "Prometheus Pushgateway";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      package = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.package;
							 | 
						||
| 
								 | 
							
								        default = pkgs.prometheus-pushgateway;
							 | 
						||
| 
								 | 
							
								        defaultText = "pkgs.prometheus-pushgateway";
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Package that should be used for the prometheus pushgateway.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      web.listen-address = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr types.str;
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Address to listen on for the web interface, API and telemetry.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          <literal>null</literal> will default to <literal>:9091</literal>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      web.telemetry-path = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr types.str;
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Path under which to expose metrics.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          <literal>null</literal> will default to <literal>/metrics</literal>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      web.external-url = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr types.str;
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          The URL under which Pushgateway is externally reachable.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      web.route-prefix = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr types.str;
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Prefix for the internal routes of web endpoints.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          Defaults to the path of
							 | 
						||
| 
								 | 
							
								          <option>services.prometheus.pushgateway.web.external-url</option>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      persistence.interval = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr types.str;
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        example = "10m";
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          The minimum interval at which to write out the persistence file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          <literal>null</literal> will default to <literal>5m</literal>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      log.level = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr (types.enum ["debug" "info" "warn" "error" "fatal"]);
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Only log messages with the given severity or above.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          <literal>null</literal> will default to <literal>info</literal>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      log.format = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.nullOr types.str;
							 | 
						||
| 
								 | 
							
								        default = null;
							 | 
						||
| 
								 | 
							
								        example = "logger:syslog?appname=bob&local=7";
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Set the log target and format.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          <literal>null</literal> will default to <literal>logger:stderr</literal>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      extraFlags = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.listOf types.str;
							 | 
						||
| 
								 | 
							
								        default = [];
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Extra commandline options when launching the Pushgateway.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      persistMetrics = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.bool;
							 | 
						||
| 
								 | 
							
								        default = false;
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Whether to persist metrics to a file.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          When enabled metrics will be saved to a file called
							 | 
						||
| 
								 | 
							
								          <literal>metrics</literal> in the directory
							 | 
						||
| 
								 | 
							
								          <literal>/var/lib/pushgateway</literal>. The directory below
							 | 
						||
| 
								 | 
							
								          <literal>/var/lib</literal> can be set using
							 | 
						||
| 
								 | 
							
								          <option>services.prometheus.pushgateway.stateDir</option>.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      stateDir = mkOption {
							 | 
						||
| 
								 | 
							
								        type = types.str;
							 | 
						||
| 
								 | 
							
								        default = "pushgateway";
							 | 
						||
| 
								 | 
							
								        description = ''
							 | 
						||
| 
								 | 
							
								          Directory below <literal>/var/lib</literal> to store metrics.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          This directory will be created automatically using systemd's
							 | 
						||
| 
								 | 
							
								          StateDirectory mechanism when
							 | 
						||
| 
								 | 
							
								          <option>services.prometheus.pushgateway.persistMetrics</option>
							 | 
						||
| 
								 | 
							
								          is enabled.
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  config = mkIf cfg.enable {
							 | 
						||
| 
								 | 
							
								    assertions = [
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        assertion = !hasPrefix "/" cfg.stateDir;
							 | 
						||
| 
								 | 
							
								        message =
							 | 
						||
| 
								 | 
							
								          "The option services.prometheus.pushgateway.stateDir" +
							 | 
						||
| 
								 | 
							
								          " shouldn't be an absolute directory." +
							 | 
						||
| 
								 | 
							
								          " It should be a directory relative to /var/lib.";
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								    systemd.services.pushgateway = {
							 | 
						||
| 
								 | 
							
								      wantedBy = [ "multi-user.target" ];
							 | 
						||
| 
								 | 
							
								      after    = [ "network.target" ];
							 | 
						||
| 
								 | 
							
								      serviceConfig = {
							 | 
						||
| 
								 | 
							
								        Restart  = "always";
							 | 
						||
| 
								 | 
							
								        DynamicUser = true;
							 | 
						||
| 
								 | 
							
								        ExecStart = "${cfg.package}/bin/pushgateway" +
							 | 
						||
| 
								 | 
							
								          optionalString (length cmdlineArgs != 0) (" \\\n  " +
							 | 
						||
| 
								 | 
							
								            concatStringsSep " \\\n  " cmdlineArgs);
							 | 
						||
| 
								 | 
							
								        StateDirectory = if cfg.persistMetrics then cfg.stateDir else null;
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |