Add custom nix-daemon exporter
Allows us to see which derivations are being built in realtime. It is a bit of a hack, but it seems to work. We simply look at the environment of the child processes of nix-daemon (usually bash) and then look for the $name variable which should hold the current derivation being built. Needs root to be able to read the environ file of the different nix-daemon processes as they are owned by the nixbld* users. See: https://discourse.nixos.org/t/query-ongoing-builds/23486 Reviewed-by: Aleix Boné <abonerib@bsc.es>
This commit is contained in:
		
							parent
							
								
									f4dac10c5b
								
							
						
					
					
						commit
						e371284cbd
					
				| @ -4,6 +4,7 @@ | ||||
|   imports = [ | ||||
|     ../module/slurm-exporter.nix | ||||
|     ./gpfs-probe.nix | ||||
|     ./nix-daemon-exporter.nix | ||||
|   ]; | ||||
| 
 | ||||
|   age.secrets.grafanaJungleRobotPassword = { | ||||
| @ -108,6 +109,7 @@ | ||||
|             "127.0.0.1:${toString config.services.prometheus.exporters.smartctl.port}" | ||||
|             "127.0.0.1:9341" # Slurm exporter | ||||
|             "127.0.0.1:9966" # GPFS custom exporter | ||||
|             "127.0.0.1:9999" # Nix-daemon custom exporter | ||||
|             "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}" | ||||
|           ]; | ||||
|         }]; | ||||
|  | ||||
							
								
								
									
										26
									
								
								m/hut/nix-daemon-builds.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										26
									
								
								m/hut/nix-daemon-builds.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,26 @@ | ||||
| #!/bin/sh | ||||
| 
 | ||||
| # Locate nix daemon pid | ||||
| nd=$(pgrep -o nix-daemon) | ||||
| 
 | ||||
| # Locate children of nix-daemon | ||||
| pids1=$(tr ' ' '\n' < "/proc/$nd/task/$nd/children") | ||||
| 
 | ||||
| # For each children, locate 2nd level children | ||||
| pids2=$(echo "$pids1" | xargs -I @ /bin/sh -c 'cat /proc/@/task/*/children' | tr ' ' '\n') | ||||
| 
 | ||||
| cat <<EOF | ||||
| HTTP/1.1 200 OK | ||||
| Content-Type: text/plain; version=0.0.4; charset=utf-8; escaping=values | ||||
| 
 | ||||
| # HELP nix_daemon_build Nix daemon derivation build state. | ||||
| # TYPE nix_daemon_build gauge | ||||
| EOF | ||||
| 
 | ||||
| for pid in $pids2; do | ||||
|   name=$(cat /proc/$pid/environ 2>/dev/null | tr '\0' '\n' | rg "^name=(.+)" - --replace '$1' | tr -dc ' [:alnum:]_\-\.') | ||||
|   user=$(ps -o uname= -p "$pid") | ||||
|   if [ -n "$name" -a -n "$user" ]; then | ||||
|     printf 'nix_daemon_build{user="%s",name="%s"} 1\n' "$user" "$name" | ||||
|   fi | ||||
| done | ||||
							
								
								
									
										23
									
								
								m/hut/nix-daemon-exporter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								m/hut/nix-daemon-exporter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,23 @@ | ||||
| { pkgs, config, lib, ... }: | ||||
| let | ||||
|   script = pkgs.runCommand "nix-daemon-exporter.sh" { } | ||||
|     '' | ||||
|       cp ${./nix-daemon-builds.sh} $out; | ||||
|       chmod +x $out | ||||
|     '' | ||||
|   ; | ||||
| in | ||||
| { | ||||
|   systemd.services.nix-daemon-exporter = { | ||||
|     description = "Daemon to export nix-daemon metrics"; | ||||
|     path = [ pkgs.procps pkgs.ripgrep ]; | ||||
|     wantedBy = [ "default.target" ]; | ||||
|     serviceConfig = { | ||||
|       Type = "simple"; | ||||
|       ExecStart = "${pkgs.socat}/bin/socat TCP4-LISTEN:9999,fork EXEC:${script}"; | ||||
|       # Needed root to read the environment, potentially unsafe | ||||
|       User = "root"; | ||||
|       Group = "root"; | ||||
|     }; | ||||
|   }; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user