Nagios check mk: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
(Updated for use in Proxmox VE 5&6; based on https://github.com/Adorfer/check_mk-1/blob/patch-1/qemu_kvm/checks/qemu and https://github.com/Adorfer/check_mk-1/blob/patch-1/qemu_kvm/checks/qemu) |
||
Line 1: | Line 1: | ||
This is a check for the Nagios check addon "check_mk" (http://mathias-kettner.de/check_mk.html). The idea is that only VM's that are running while doing the inventory are getting monitored. If a VM is added or removed do | This is a check for the Nagios check addon "check_mk" (http://mathias-kettner.de/check_mk.html). The idea is that only VM's that are running while doing the inventory are getting monitored. If a VM is added or removed do "Full Scan" | ||
The check also collects performance data for %CPU load caused by the VM and % of total memory consumption of the VM as well as it's reserved virtual memory size (VSZ) of the related kvm process. | |||
The check also collects performance data for %CPU load caused by the VM and % of memory consumption of the VM. | |||
===Client-Check=== | ===Client-Check=== | ||
/usr/lib/check_mk_agent/plugins/mh_qemu | /usr/lib/check_mk_agent/plugins/mh_qemu | ||
<pre> | <pre> | ||
#!/bin/ | #!/bin/bash | ||
#/usr/lib/check_mk_agent/plugins | |||
# | # based upon 'qemu' from | ||
# 12/2010 Matthias Henze | |||
# Lizenz: GPL v2 | |||
# | # | ||
# | # updated for libvirtd (virsh) by | ||
# | # Jonathan Mills 09/2011 | ||
# | |||
# | # updated by | ||
# | # Christian Burmeister 05/2015 | ||
# | # updated by | ||
# | # adorfer 01/2017 for proxmox 4 pve | ||
# | # updated by proxmox 07/2019 for proxmox ve 5&6 | ||
if which qm >/dev/null ; then | if which qm >/dev/null ; then | ||
echo '<<<qemu>>>' | |||
qm list | grep -v VMID | while read L | |||
do | |||
if [[ ! -z $L ]]; then | |||
ID=$(echo $L | awk '{print $1}') | |||
XNAME=$(echo $L | awk '{$1=$NF=$(NF-1)=$(NF-2)=$(NF-3)="";print $0}') | |||
NAME=`echo $XNAME | sed 's/ /_/g'` | |||
STATE=$(echo $L | awk '{print $(NF-3)}') | |||
PID=$(ps aux | grep kvm | grep "id $ID" | head -1 | tail -1| awk '{print $2}') | |||
if [[ ! -z $PID ]] && [ "$PID" -gt "0" ]; then | |||
PS=$(ps aux | grep kvm | grep $PID | head -1|tail -1) | |||
MEM=$(echo $PS|awk -- '{print $5}') | |||
MEM=$(echo $MEM / 1024 | bc) | |||
DATA=$(top -p $PID -n 1 -b | tail -1) | |||
PCPU=$(echo $DATA | awk -- '{print $9}'|tr , .) | |||
PMEM=$(echo $DATA | awk -- '{print $10}'|tr , .) | |||
MCPU=$(echo $PS | sed 's/.*maxcpus=\([^ ]*\)\ .*/\1/' ) | |||
RCPU=$(echo "scale=1; $PCPU / $MCPU"| bc) | |||
else | |||
MEM="" | |||
RCPU="" | |||
PMEM="" | |||
fi | |||
echo $ID" "$NAME" "$STATE" "$MEM" "$RCPU" "$PMEM | |||
fi | |||
done | |||
fi | fi | ||
</pre> | </pre> | ||
===Plugin=== | ===Plugin=== | ||
/omd/versions/ | /omd/versions/default/share/check_mk/checks/qemu | ||
The path asumes the use of OMD (Open source Monitoring Distribution). | The path asumes the use of OMD (Open source Monitoring Distribution). | ||
Line 43: | Line 61: | ||
# -*- encoding: utf-8; py-indent-offset: 4 -*- | # -*- encoding: utf-8; py-indent-offset: 4 -*- | ||
# | # based upon 'qemu' from | ||
# 12/2010 Matthias Henze | # 12/2010 Matthias Henze | ||
# Lizenz: GPL v2 | # Lizenz: GPL v2 | ||
# | |||
# updated for libvirtd (virsh) by | |||
# Jonathan Mills 09/2011 | |||
# | |||
# updated by | |||
# Christian Burmeister 05/2015 | |||
# updated by Proxmox 07/2019 | |||
# Example output from agent: | # Example output from agent: | ||
#<<<qemu>>> | # <<<qemu>>> | ||
# | # 4 i-4B9008BE running 2048 4.0 2.7 | ||
# 5 i-44F608B6 running 2048 0.0 0.7 | |||
# | |||
Line 64: | Line 87: | ||
for line in info: | for line in info: | ||
if line[2] == "running": # only VM's running while inventory are monitored ! | if line[2] == "running": # only VM's running while inventory are monitored ! | ||
vm = line[0] | vm = line[1] # we want to capture hostname, not vm id here | ||
# Fix annoying OpenStack misnaming of VMs | |||
name = vm.split('-') | |||
if name[0] == "instance": | |||
name[0] = "i" | |||
vm = '-'.join(name) | |||
## | |||
inventory.append( (vm, None) ) | inventory.append( (vm, None) ) | ||
return inventory | return inventory | ||
# check | # check | ||
def check_qemu( | def check_qemu(name, param, info): | ||
for line in info: | for line in info: | ||
perfdata = [] | perfdata = [] | ||
vm = line[1] | |||
host = vm.split('-') | |||
if host[0] == "instance": | |||
host[0] = "i" | |||
vm = '-'.join(host) | |||
if vm == name: | |||
item = line[0] | |||
status = line[2] | status = line[2] | ||
assigned_mem = line[3] | |||
infotext = "%s (id: %s" % (status, item) | |||
if status == "running": | if status == "running": | ||
perfdata.append( ( " | # 4 i-4B9008BE running 2048 4.0 2.7 | ||
if len(line) == 6: | |||
current_cpu = int(round(float(line[4]))) | |||
infotext += ", CPU: %s%%" % (current_cpu) | |||
perfdata.append( ( "cpu_%", current_cpu ) ) | |||
current_mem = int(round(float(line[5]))) | |||
infotext += ", Memory: (Virtual SiZe: %s MB, used: %s%%" % (assigned_mem ,current_mem) | |||
perfdata.append( ( "memory_current_%", current_mem ) ) | |||
perfdata.append( ( "memory__assigned_MB", assigned_mem ) ) | |||
infotext += "))" | |||
warn = 80 | |||
if current_cpu > warn or current_mem > warn: | |||
return (1, "WARN - status is " + infotext, perfdata) | |||
else: | |||
return (0, "OK - status is " + infotext, perfdata) | |||
else: | else: | ||
infotext += ")" | |||
return (2, "CRITICAL - status is " + infotext, perfdata) | return (2, "CRITICAL - status is " + infotext, perfdata) | ||
return (3, "UNKNOWN - VM | |||
return (3, "UNKNOWN - VM not found in agent output") | |||
# declare the check to Check_MK | # declare the check to Check_MK | ||
check_info['qemu'] = \ | check_info['qemu'] = \ | ||
(check_qemu, "VM %s", 1, inventory_qemu) | |||
</pre> | </pre> | ||
[[Category: | [[Category: HOWTO]] |
Revision as of 10:21, 29 July 2019
This is a check for the Nagios check addon "check_mk" (http://mathias-kettner.de/check_mk.html). The idea is that only VM's that are running while doing the inventory are getting monitored. If a VM is added or removed do "Full Scan"
The check also collects performance data for %CPU load caused by the VM and % of total memory consumption of the VM as well as it's reserved virtual memory size (VSZ) of the related kvm process.
Client-Check
/usr/lib/check_mk_agent/plugins/mh_qemu
#!/bin/bash #/usr/lib/check_mk_agent/plugins # based upon 'qemu' from # 12/2010 Matthias Henze # Lizenz: GPL v2 # # updated for libvirtd (virsh) by # Jonathan Mills 09/2011 # # updated by # Christian Burmeister 05/2015 # updated by # adorfer 01/2017 for proxmox 4 pve # updated by proxmox 07/2019 for proxmox ve 5&6 if which qm >/dev/null ; then echo '<<<qemu>>>' qm list | grep -v VMID | while read L do if [[ ! -z $L ]]; then ID=$(echo $L | awk '{print $1}') XNAME=$(echo $L | awk '{$1=$NF=$(NF-1)=$(NF-2)=$(NF-3)="";print $0}') NAME=`echo $XNAME | sed 's/ /_/g'` STATE=$(echo $L | awk '{print $(NF-3)}') PID=$(ps aux | grep kvm | grep "id $ID" | head -1 | tail -1| awk '{print $2}') if [[ ! -z $PID ]] && [ "$PID" -gt "0" ]; then PS=$(ps aux | grep kvm | grep $PID | head -1|tail -1) MEM=$(echo $PS|awk -- '{print $5}') MEM=$(echo $MEM / 1024 | bc) DATA=$(top -p $PID -n 1 -b | tail -1) PCPU=$(echo $DATA | awk -- '{print $9}'|tr , .) PMEM=$(echo $DATA | awk -- '{print $10}'|tr , .) MCPU=$(echo $PS | sed 's/.*maxcpus=\([^ ]*\)\ .*/\1/' ) RCPU=$(echo "scale=1; $PCPU / $MCPU"| bc) else MEM="" RCPU="" PMEM="" fi echo $ID" "$NAME" "$STATE" "$MEM" "$RCPU" "$PMEM fi done fi
Plugin
/omd/versions/default/share/check_mk/checks/qemu
The path asumes the use of OMD (Open source Monitoring Distribution).
#!/usr/bin/python # -*- encoding: utf-8; py-indent-offset: 4 -*- # based upon 'qemu' from # 12/2010 Matthias Henze # Lizenz: GPL v2 # # updated for libvirtd (virsh) by # Jonathan Mills 09/2011 # # updated by # Christian Burmeister 05/2015 # updated by Proxmox 07/2019 # Example output from agent: # <<<qemu>>> # 4 i-4B9008BE running 2048 4.0 2.7 # 5 i-44F608B6 running 2048 0.0 0.7 # inventory def inventory_qemu(checkname, info): inventory = [] for line in info: if line[2] == "running": # only VM's running while inventory are monitored ! vm = line[1] # we want to capture hostname, not vm id here # Fix annoying OpenStack misnaming of VMs name = vm.split('-') if name[0] == "instance": name[0] = "i" vm = '-'.join(name) ## inventory.append( (vm, None) ) return inventory # check def check_qemu(name, param, info): for line in info: perfdata = [] vm = line[1] host = vm.split('-') if host[0] == "instance": host[0] = "i" vm = '-'.join(host) if vm == name: item = line[0] status = line[2] assigned_mem = line[3] infotext = "%s (id: %s" % (status, item) if status == "running": # 4 i-4B9008BE running 2048 4.0 2.7 if len(line) == 6: current_cpu = int(round(float(line[4]))) infotext += ", CPU: %s%%" % (current_cpu) perfdata.append( ( "cpu_%", current_cpu ) ) current_mem = int(round(float(line[5]))) infotext += ", Memory: (Virtual SiZe: %s MB, used: %s%%" % (assigned_mem ,current_mem) perfdata.append( ( "memory_current_%", current_mem ) ) perfdata.append( ( "memory__assigned_MB", assigned_mem ) ) infotext += "))" warn = 80 if current_cpu > warn or current_mem > warn: return (1, "WARN - status is " + infotext, perfdata) else: return (0, "OK - status is " + infotext, perfdata) else: infotext += ")" return (2, "CRITICAL - status is " + infotext, perfdata) return (3, "UNKNOWN - VM not found in agent output") # declare the check to Check_MK check_info['qemu'] = \ (check_qemu, "VM %s", 1, inventory_qemu)