Nagios check mk

From Proxmox VE
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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 assumes 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)