public-access-proxy: collect haproxy stats

This commit is contained in:
Astro 2021-09-09 18:21:38 +02:00
parent d72ae64d7d
commit 7830b1a2b3
3 changed files with 58 additions and 1 deletions

View File

@ -3,6 +3,7 @@
{
imports = [
./proxy.nix
./stats.nix
];
networking.hostName = "public-access-proxy";
@ -40,5 +41,4 @@
networking.firewall.allowedTCPPorts = [ 80 443 ];
system.stateVersion = "18.09";
}

View File

@ -0,0 +1,43 @@
#!/usr/bin/env ruby
require 'socket'
HOSTNAME = IO::readlines("/proc/sys/kernel/hostname").join.chomp
INTERVAL = 60
def read_stats
sock = UNIXSocket.new("/run/haproxy/haproxy-stats.sock")
sock.send "show stat\n", 0
data = sock.read()
sock.close
cols = []
results = []
data.lines.each do |line|
line.chomp!
if line =~ /^#\s*(.+)$/
cols = $1.split(/,/)
else
rec = {}
cols.zip(line.split(/,/)).each do |col,val|
rec[col] = val if val and not val.empty?
end
results << rec
end
end
results
end
loop do
read_stats.each do |rec|
pxname = rec['pxname']
svname = rec['svname']
rec.each do |key,val|
next if key == 'pxname' or key == 'svname' or not val =~ /^\d+$/
puts "PUTVAL \"#{HOSTNAME}/haproxy_#{pxname}-#{svname}/current-#{key}\" interval=#{INTERVAL} N:#{val}"
end
end
sleep INTERVAL
end

View File

@ -0,0 +1,14 @@
{ pkgs, lib, ... }:
{
c3d2.hq.statistics.enable = true;
services.collectd.plugins.exec = ''
Exec "collectd" "${pkgs.ruby}/bin/ruby" "${./haproxy-stats.rb}"
'';
# add a socket that is world-accessible
services.haproxy.config = ''
global
stats socket /run/haproxy/haproxy-stats.sock mode 666
'';
}