Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-gtools / collectd / plugins / ganeti-cpustats.py @ 2439c9d6

History | View | Annotate | Download (1 kB)

1 2439c9d6 Stratos Psomadakis
#!/usr/bin/env python
2 2439c9d6 Stratos Psomadakis
3 2439c9d6 Stratos Psomadakis
import os
4 2439c9d6 Stratos Psomadakis
import collectd
5 2439c9d6 Stratos Psomadakis
6 2439c9d6 Stratos Psomadakis
from glob import glob
7 2439c9d6 Stratos Psomadakis
8 2439c9d6 Stratos Psomadakis
9 2439c9d6 Stratos Psomadakis
def get_vcpus(pid):
10 2439c9d6 Stratos Psomadakis
    """Get a KVM instance vCPU count by looking at its fd's"""
11 2439c9d6 Stratos Psomadakis
    vcpus = 0
12 2439c9d6 Stratos Psomadakis
    for fd in glob("/proc/%d/fd/*" % pid):
13 2439c9d6 Stratos Psomadakis
        # XXX: sad but trueeeeeeeeeeee
14 2439c9d6 Stratos Psomadakis
        if os.readlink(fd) == "anon_inode:kvm-vcpu":
15 2439c9d6 Stratos Psomadakis
            vcpus += 1
16 2439c9d6 Stratos Psomadakis
    return vcpus
17 2439c9d6 Stratos Psomadakis
18 2439c9d6 Stratos Psomadakis
19 2439c9d6 Stratos Psomadakis
def cpustats(data=None):
20 2439c9d6 Stratos Psomadakis
    for file in glob("/var/run/ganeti/kvm-hypervisor/pid/*"):
21 2439c9d6 Stratos Psomadakis
        instance = os.path.basename(file)
22 2439c9d6 Stratos Psomadakis
        try:
23 2439c9d6 Stratos Psomadakis
            pid = int(open(file, "r").read())
24 2439c9d6 Stratos Psomadakis
            proc = open("/proc/%d/stat" % pid, "r")
25 2439c9d6 Stratos Psomadakis
            cputime = [int(proc.readline().split()[42])]
26 2439c9d6 Stratos Psomadakis
        except EnvironmentError:
27 2439c9d6 Stratos Psomadakis
            continue
28 2439c9d6 Stratos Psomadakis
        vcpus = get_vcpus(pid)
29 2439c9d6 Stratos Psomadakis
        proc.close()
30 2439c9d6 Stratos Psomadakis
31 2439c9d6 Stratos Psomadakis
        vl = collectd.Values(type="derive")
32 2439c9d6 Stratos Psomadakis
        vl.host = instance
33 2439c9d6 Stratos Psomadakis
        vl.plugin = "cpu"
34 2439c9d6 Stratos Psomadakis
        vl.type = "virt_cpu_total"
35 2439c9d6 Stratos Psomadakis
        total = sum(cputime) * 100 / (vcpus * os.sysconf("SC_CLK_TCK"))
36 2439c9d6 Stratos Psomadakis
        vl.dispatch(values=[total])
37 2439c9d6 Stratos Psomadakis
38 2439c9d6 Stratos Psomadakis
collectd.register_read(cpustats)
39 2439c9d6 Stratos Psomadakis
40 2439c9d6 Stratos Psomadakis
# vim: set ts=4 sts=4 et sw=4 :