kvm-tools/kvmstats/kvmstats
Alexis Ben Miloud--Josselin 15e2165213
All checks were successful
continuous-integration/drone/push Build is passing
[kvmstats] add playbook to deploy kvmstats
Also add a cron to update the stats.
2019-07-31 14:42:50 +02:00

94 lines
2.1 KiB
Bash
Executable file

#!/bin/sh
set -e
error () {
echo "$0": "$@" >&2
exit 1
}
usage () {
echo 'usage: kvmstats [-a] [-u k|m|g] [-o human|html|csv]' >&2
exit 1
}
for DEP in bc virsh
do
command -v $DEP > /dev/null || error $DEP command not found
done
POW=$(echo 1024 ^ 3 | bc)
FMT=human
while [ $# -ne 0 ] && echo "$1" | grep -q '^-[[:alnum:]]'
do
case $1 in
'-a')
SHOW_AVAIL=y
;;
'-o')
case $2 in
'human')
FMT=human
;;
'html')
FMT=html
;;
'csv')
FMT=csv
;;
*)
usage
;;
esac
;;
'-u')
case $2 in
'k')
POW=$(echo 1024 ^ 1 | bc)
;;
'm')
POW=$(echo 1024 ^ 2 | bc)
;;
'g')
POW=$(echo 1024 ^ 3 | bc)
;;
*)
usage
esac
;;
*)
usage
esac
shift
done
for VM in $(virsh list --name --all)
do
echo "$VM"
virsh vcpucount --maximum --current "$VM"
# libvirt store memory in KiB, POW must be lowered by 1
virsh domstats --balloon "$VM" | awk -F= '/balloon.maximum/ { print $2 / '$((POW / 1024))'}'
for BLK in $(virsh domblklist "$VM" | sed '1,2d;/-$/d;/^$/d' | cut -d\ -f1)
do
virsh domblkinfo "$VM" "$BLK"
done | awk '/Physical:/ { size += $2 } END { print int(size / '${POW}') }'
virsh domstate "$VM" | grep -q '^running$' && echo yes || echo no
done | xargs -n5 | {
echo vm vcpu ram disk running
awk '{ print } /yes$/ { vcpu += $2; ram += $3; disk += $4; running++ } END { print "TOTAL(running)", vcpu, ram, disk, running }'
test "$SHOW_AVAIL" && {
nproc
awk '/^MemTotal:/ { print int($2 / '$((POW / 1024))' ) }' /proc/meminfo
} | xargs printf 'AVAILABLE %s %s\n'
} | case $FMT in
'human')
column -t
;;
'html')
awk 'BEGIN{print "<html><body>\n<table>"}{printf "<tr>";for(i=1;i<=NF;i++)printf "<td>%s</td>", $i;print "</tr>"}END{print "</table>\n</body></html>"}'
;;
'csv')
tr ' ' ','
;;
esac