#!/usr/bin/python3 # vim: set fileencoding=utf-8 : # # Munin plugin to show the percent of cputime of libvirt managed virtual # machines # # Copyright 2008 Guido Guenther # # License: GPLv2 # # depends: python-libvirt # #%# capabilities=autoconf #%# family=contrib from __future__ import print_function import re, sys, os import libvirt def canon(name): return re.sub(r"[^a-zA-Z0-9_]", "_", name) def print_config(uri, stack): """print the plugin config, determine the domains""" print("""graph_title Virtual Domain Cpu Time graph_vlabel CPU Time percentage graph_category Virtual Machines graph_info This graph shows the cpu time percentage of each virtual machine graph_args --base 1000 -l 0 total_pc.type DERIVE total_pc.graph no total_pc.min 0 total_pc.max 100 total_pc.label total total_pc.info cputime used by all virtual machines total_pc.warning 90 total_pc.critical 95""") draw = [ "LINE1", "AREA"][stack] conn = libvirt.openReadOnly(uri) ids = conn.listDomainsID() for id in ids: try: dom = conn.lookupByID(id) name = dom.name() except libvirt.libvirtError as err: print("Id: %s: %s" % (id, err), file=sys.stderr) continue if name == "Domain-0": continue print("%s_cputime.label %s" % (canon(name), name)) print("%s_cputime.type DERIVE" % canon(name)) print("%s_cputime.min 0" % canon(name)) print("%s_cputime.draw %s" % (canon(name), draw)) print("%s_cputime.info percent of cputime used by virtual machine '%s'" % (canon(name), name)) if draw == "AREA": draw = "STACK" def fetch_values(uri): conn = libvirt.openReadOnly(uri) ids = conn.listDomainsID() total = 0 processors = float(conn.getInfo()[2]) for id in ids: try: dom = conn.lookupByID(id) name = dom.name() except libvirt.libvirtError as err: print("Id: %s: %s" % (id, err), file=sys.stderr) continue if name == "Domain-0": continue cputime = float(dom.info()[4]) cputime_percentage = 1.0e-7 * cputime / processors total += cputime_percentage print("%s_cputime.value %.0f" % (canon(name), cputime_percentage)) print("total_pc.value %.0f" % total) def main(sys): uri = os.getenv("uri", "qemu:///system") stack = [ False, True ][os.getenv("stack") == "1"] 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': print_config(uri, stack) return 0 fetch_values(uri) return 0 if __name__ == "__main__": sys.exit(main(sys.argv)) # vim:et:ts=4:sw=4: