#!/bin/zsh
setopt no_unset extended_glob
H=${COLLECTD_HOSTNAME:-$HOST}
INTERVAL=${COLLECTD_INTERVAL:-10}
putval(){
printf 'PUTVAL %s/%s/gauge-%s N:%s\n' "$@" || exit $?
}
a() {
awk '
BEGIN{
FS=": "
}
function putval(name, val) {
printf "PUTVAL %s/zsv-%s/gauge-%s N:%f\n", H, $3, name, val
}
/^(ok|timeout): (run|down|finish): /{
sub(/\(pid [0-9]*\) /,"",$4)
sub(/s.*/,"",$4)
sub(/.*\//,"",$3)
putval("ok", $1 == "ok" ? 1 : 0)
putval("uptime", $2 == "run" ? $4 : -$4)
}
' "$@" || exit $?
}
while sleep $INTERVAL; do
sv check /run/service/*(N) | a H=$H
for d in /etc/vservers/*(/N); do
vs=$d:t
vserver $vs running
up=$?
putval $H exe-vserver ${vs}_running $up
if (($up == 0)); then
vserver $vs exec /bin/sh -c 'sv check /run/service/*' | a H=$vs.$H
fi
done
done