Difference between revisions of "Monitoring Proxmox guests with check mk"

From Levy

(Created page with "This article has two scripts that are needed to monitor te state of VMs runnning on a Proxmox server with check_mk. The scripts come from the Proxmox wiki, but needed adapting...")
 
Line 5: Line 5:
== Client-Check ==
== Client-Check ==


Place this script on your Proxmox server in <tt>/usr/lib/check_mk_agent/plugins/mh_qemu</tt> and make sure it's executable.
Place this script on your Proxmox server in <tt>/usr/lib/check_mk_agent/plugins/mk_qemu</tt> and make sure it's executable.
  #!/bin/bash
  #!/bin/bash
  #/usr/lib/check_mk_agent/plugins
  #/usr/lib/check_mk_agent/plugins

Revision as of 12:27, 16 March 2020

This article has two scripts that are needed to monitor te state of VMs runnning on a Proxmox server with check_mk. The scripts come from the Proxmox wiki, but needed adapting to work with check_mk 1.6. 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

Place this script on your Proxmox server in /usr/lib/check_mk_agent/plugins/mk_qemu and make sure it's executable.

#!/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

Create the following script on your check_mk server /omd/versions/default/share/check_mk/checks/qemu. Again, make sure it's executable.

#!/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(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)