#!/usr/bin/python # vim: set fileencoding=utf-8 : # # Munin plugin to show the amount of memory used by libvirt managed virtual # machines # # Copyright 2008 Guido Guenther # # License: GPLv2 # # depends: python-libvirt # #%# capabilities=autoconf #%# family=contrib import re, sys, os import libvirt def canon(name): return re.sub(r"[^a-zA-Z0-9_]", "_", name) def print_config(uri): """print the plugin config, determine the domains""" try: conn = libvirt.openReadOnly(uri) except libvirt.libvirtError, err: print >>sys.stderr, "Error opening to %s connection: %s" % (uri, err) return 1 hostname = conn.getHostname() print """graph_title Virtual Domain Memory Usage graph_vlabel Memory Usage / Bytes graph_category Virtual Machines graph_info This graph shows the current amount of memory used by each virtual machine graph_args --base 1024 -l 0 host_mem.label %(hostname)s (host) host_mem.type GAUGE host_mem.min 0 host_mem.draw LINE1 total.type GAUGE total.label total total.info memory used by virtual machines on host %(hostname)s total.graph no total.min 0 total_pc.type GAUGE total_pc.label used memory percentage total_pc.info memory in percent used by virtual machines on host %(hostname)s total_pc.graph no total_pc.min 0 total_pc.max 100 total_pc.warning 90 total_pc.critical 95""" % dict(hostname=hostname) ids = conn.listDomainsID() draw = "AREA" for id in ids: dom = conn.lookupByID(id) name = dom.name() print "%s_mem.label %s" % (canon(name), name) print "%s_mem.type GAUGE" % canon(name) print "%s_mem.min 0" % canon(name) print "%s_mem.draw %s" % (canon(name), draw) if draw == "AREA": draw = "STACK" return 0 def fetch_values(uri): total = 0 try: conn = libvirt.openReadOnly(uri) except libvirt.libvirtError, err: print >>sys.stderr, "Error opening to %s connection: %s" % (uri, err) return 1 ids = conn.listDomainsID() hostmem = conn.getInfo()[1] * 1024 * 1024 print "host_mem.value %d" % hostmem for id in ids: dom = conn.lookupByID(id) name = dom.name() mem = dom.info()[2] * 1024 total += mem print "%s_mem.value %d" % (canon(name), mem) print "total.value %d" % total print "total_pc.value %.0f" % (100.0 * total / float(hostmem)) return 0 def main(sys): uri = os.getenv("uri", "qemu:///system") if len(sys) > 1: if sys[1] in [ 'autoconf', 'detect' ]: if libvirt.openReadOnly(uri): print "yes" return 0 else: print "no" return 1 elif sys[1] == 'config': return print_config(uri) return fetch_values(uri) if __name__ == "__main__": sys.exit(main(sys.argv)) # vim:et:ts=4:sw=4: