136 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   cfg = config.services.scollector;
 | |
| 
 | |
|   collectors = pkgs.runCommand "collectors" { preferLocalBuild = true; }
 | |
|     ''
 | |
|     mkdir -p $out
 | |
|     ${lib.concatStringsSep
 | |
|         "\n"
 | |
|         (lib.mapAttrsToList
 | |
|           (frequency: binaries:
 | |
|             "mkdir -p $out/${frequency}\n" +
 | |
|             (lib.concatStringsSep
 | |
|               "\n"
 | |
|               (map (path: "ln -s ${path} $out/${frequency}/$(basename ${path})")
 | |
|                    binaries)))
 | |
|           cfg.collectors)}
 | |
|     '';
 | |
| 
 | |
|   conf = pkgs.writeText "scollector.toml" ''
 | |
|     Host = "${cfg.bosunHost}"
 | |
|     ColDir = "${collectors}"
 | |
|     ${cfg.extraConfig}
 | |
|   '';
 | |
| 
 | |
| in {
 | |
| 
 | |
|   options = {
 | |
| 
 | |
|     services.scollector = {
 | |
| 
 | |
|       enable = mkOption {
 | |
|         type = types.bool;
 | |
|         default = false;
 | |
|         description = ''
 | |
|           Whether to run scollector.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       package = mkOption {
 | |
|         type = types.package;
 | |
|         default = pkgs.scollector;
 | |
|         defaultText = "pkgs.scollector";
 | |
|         example = literalExample "pkgs.scollector";
 | |
|         description = ''
 | |
|           scollector binary to use.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       user = mkOption {
 | |
|         type = types.str;
 | |
|         default = "scollector";
 | |
|         description = ''
 | |
|           User account under which scollector runs.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       group = mkOption {
 | |
|         type = types.str;
 | |
|         default = "scollector";
 | |
|         description = ''
 | |
|           Group account under which scollector runs.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       bosunHost = mkOption {
 | |
|         type = types.str;
 | |
|         default = "localhost:8070";
 | |
|         description = ''
 | |
|           Host and port of the bosun server that will store the collected
 | |
|           data.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       collectors = mkOption {
 | |
|         type = with types; attrsOf (listOf path);
 | |
|         default = {};
 | |
|         example = literalExample "{ \"0\" = [ \"\${postgresStats}/bin/collect-stats\" ]; }";
 | |
|         description = ''
 | |
|           An attribute set mapping the frequency of collection to a list of
 | |
|           binaries that should be executed at that frequency. You can use "0"
 | |
|           to run a binary forever.
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       extraOpts = mkOption {
 | |
|         type = with types; listOf str;
 | |
|         default = [];
 | |
|         example = [ "-d" ];
 | |
|         description = ''
 | |
|           Extra scollector command line options
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|       extraConfig = mkOption {
 | |
|         type = types.lines;
 | |
|         default = "";
 | |
|         description = ''
 | |
|           Extra scollector configuration added to the end of scollector.toml
 | |
|         '';
 | |
|       };
 | |
| 
 | |
|     };
 | |
| 
 | |
|   };
 | |
| 
 | |
|   config = mkIf config.services.scollector.enable {
 | |
| 
 | |
|     systemd.services.scollector = {
 | |
|       description = "scollector metrics collector (part of Bosun)";
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
| 
 | |
|       path = [ pkgs.coreutils pkgs.iproute ];
 | |
| 
 | |
|       serviceConfig = {
 | |
|         User = cfg.user;
 | |
|         Group = cfg.group;
 | |
|         ExecStart = "${cfg.package}/bin/scollector -conf=${conf} ${lib.concatStringsSep " " cfg.extraOpts}";
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     users.users.scollector = {
 | |
|       description = "scollector user";
 | |
|       group = "scollector";
 | |
|       uid = config.ids.uids.scollector;
 | |
|     };
 | |
| 
 | |
|     users.groups.scollector.gid = config.ids.gids.scollector;
 | |
| 
 | |
|   };
 | |
| 
 | |
| }
 | 
