Difference between revisions of "Nagios check mk"
Jump to navigation
Jump to search
m |
(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)