xen_cpus now detects number of cpus
[invirt/packages/xvm-munin-config.git] / host / usr / share / xvm-munin-host-config / plugins / xen_cpu
1 #!/usr/bin/python
2
3 import sys
4 sys.path.append('/usr/lib/xen-default/lib/python/')
5 from xen.xm.main import SERVER_LEGACY_XMLRPC, SERVER_XEN_API, parseServer, parseAuthentication
6 from xen.xend import sxp
7 import atexit
8 import sys
9 import os
10
11 serverType, serverURI = parseServer()
12
13 if serverType != SERVER_LEGACY_XMLRPC:
14     print >>sys.stderr, "xen_cpu is untested with this Xen server type"
15     sys.exit(1)
16
17 if serverType == SERVER_XEN_API:
18     from xen.xm import XenAPI
19     server = XenAPI.Session(serverURI)
20     username, password = parseAuthentication()
21     server.login_with_password(username, password)
22     def logout():
23         try:
24             server.xenapi.session.logout()
25         except:
26             pass
27     atexit.register(logout)
28 else:
29     from xen.util.xmlrpcclient import ServerProxy
30     server = ServerProxy(serverURI)
31
32 if len(sys.argv) > 1:
33     cmd = sys.argv[1]
34 else:
35     cmd = None
36
37 def getDomains():
38     ret = {}
39     if serverType == SERVER_XEN_API:
40         domains = server.xenapi.VM.get_all_records()
41         metrics = server.xenapi.VM_metrics.get_all_records()
42         for d in domains.values():
43             ret['uuid_'+d['uuid'].replace('-', '_')] = {'name': d['name_label'],
44                                                         'cpu_time': sum(metrics[d['metrics']]['VCPUs_utilisation'].values()),
45                                                         'domid': d['domid'],
46                                                         'uuid': d['uuid'],
47                                                         # No equivalent
48                                                         }
49         return ret
50     else:
51         domains = server.xend.domains_with_state(True, 'all', True)
52         for d in domains:
53             data = {'name': sxp.child_value(d, 'name', 'UNKNOWN'),
54                     'cpu_time': sxp.child_value(d, 'cpu_time', 0.0),
55                     'domid': sxp.child_value(d, 'domid', -1),
56                     'uuid': sxp.child_value(d, 'uuid', 'NONE'),
57                     }
58             try:
59                 sched = server.xend.domain.sched_credit_get(data['name'])
60                 data['sched-credit'] = sched
61             except:
62                 data['sched-credit'] = None
63             ret['uuid_'+sxp.child_value(d, 'uuid', 'NONE').replace('-', '_')] = data
64         return ret
65
66 cpus = os.sysconf('SC_NPROCESSORS_CONF')
67
68 upper_limit = cpus * 100
69
70 if cmd == 'config':
71     print """
72 graph_title Xen domain CPU usage
73 graph_args --base 1000 -r --lower-limit 0 --upper-limit %d
74 graph_vlabel %
75 graph_scale no
76 graph_info This graph shows how CPU time is spent by Xen domains.
77 graph_category system
78 graph_period second""" % (upper_limit,)
79     domains = getDomains()
80     for d in sorted(domains):
81         name = domains[d]['name']
82         if name[0:2] == 'd_':
83             name = 'db domid %d' % domains[d]['domid']
84         print "%s.label %s" % (d, name)
85         if domains[d]['domid'] == 0:
86             print "%s.draw AREA" % d
87         else:
88             print "%s.draw STACK" % d
89         print "%s.max 19200000000" % d # 64x 100% CPU usage
90         print "%s.min 0" % d
91         print "%s.type DERIVE" % d
92         if domains[d].get('sched-credit'):
93             print "%s.info uuid %s CPU weight %d cap %d%%" % (d, domains[d]['uuid'], domains[d]['sched-credit']['weight'], domains[d]['sched-credit']['cap'])
94         else:
95             print "%s.info uuid %s" % (d, domains[d]['uuid'])
96         print "%s.cdef %s,10000,/" % (d, d)
97     sys.exit(0)
98
99 domains = getDomains()
100 for d in sorted(domains):
101     print "%s.value %s" % (d, long(domains[d]['cpu_time']*1000000))