#!/usr/bin/python from xen.xm.main import SERVER_LEGACY_XMLRPC, SERVER_XEN_API, parseServer from xen.xend import sxp serverType, serverURI = parseServer() if serverType == SERVER_XEN_API: from xen.xm import XenAPI server = XenAPI.Session(serverURI) username, password = parseAuthentication() server.login_with_password(username, password) def logout(): try: server.xenapi.session.logout() except: pass atexit.register(logout) else: from xen.util.xmlrpcclient import ServerProxy server = ServerProxy(serverURI) import sys if len(sys.argv) > 1: cmd = sys.argv[1] else: cmd = None def getDomains(): ret = {} if serverType == SERVER_XEN_API: domains = server.xenapu.VM.get_all_records() metrics = server.xenapi.VM_metrics.get_all_records() for d in domains.values(): ret[d['uuid'].replace('-', '_')] = {'name': d['name_label'], 'cpu_time': sum(metrics[d['metrics']]['VCPUs_utilisation'].values()), 'domid': d['domid'], 'uuid': d['uuid'], } return ret else: domains = server.xend.domains_with_state(True, 'all', True) for d in domains: ret[sxp.child_value(d, 'uuid', 'NONE').replace('-', '_')] = {'name': sxp.child_value(d, 'name', 'UNKNOWN'), 'cpu_time': sxp.child_value(d, 'cpu_time', 0.0), 'domid': sxp.child_value(d, 'domid', -1), 'uuid': sxp.child_value(d, 'uuid', 'NONE'), } return ret if cmd == 'config': print """ graph_title Xen domain CPU usage graph_args --base 1000 -r --lower-limit 0 --upper-limit 800 graph_vlabel % graph_scale no graph_info This graph shows how CPU time is spent by Xen domains. graph_category system graph_period second""" domains = getDomains() for d in sorted(domains): name = domains[d]['name'] if name[0:2] == 'd_': name = 'user domain' print "%s.label %s" % (d, name) if domains[d]['domid'] == 0: print "%s.draw AREA" % d else: print "%s.draw STACK" % d print "%s.max 5000" % d print "%s.min 0" % d print "%s.type DERIVE" % d print "%s.info %s" % (d, domains[d]['uuid']) print "%s.cdef %s,10000,/" % (d, d) sys.exit(0) domains = getDomains() for d in sorted(domains): print "%s.value %s" % (d, long(domains[d]['cpu_time']*1000000))