Differences

This shows you the differences between two versions of the page.

Link to this comparison view

monitors:xen [2009/11/23 06:13] (current)
Line 1: Line 1:
 +====== Xen Monitor ======
 +
 +^ Author | [[ andrew@eiknet.com | Andrew Rankin ]] |
 +^ Compatibility | Xymon 4.2 |
 +^ Requirements | Python, Python-libvirt,​ Xen, Linux |
 +^ Download | http://​eiknet.com/​mi-vt.py.bz2 |
 +^ Last Update | 2007-09-25 |
 +
 +===== Description =====
 +
 +Xen Monitoring script - This script is handy in that it sends information from the Dom0 on behalf of the DomUs. ​ This way VM data shows up in hobbit with the rest of the DomU host information,​ giving you an easy way to keep tabs on where a VM lives if you move/​migrate it.   It also gives you information about all the DomUs on a Dom0 under the Dom0 in hobbit.
 +
 +
 +===== Installation =====
 +=== Client side ===
 +
 +On the Dom0:
 +
 +  - Install mi-vt.py into the <​client_root>/​ext/​ directory
 +  - Modify mi-vt.py setting the bbhome, domain & hobbit_server variables
 +  - Modify your clientlaunch.cfg,​ adding:
 +
 +<​file>​
 +  # data from libvirt for virtual machines
 +  [vt]
 +          ENVFILE $HOBBITCLIENTHOME/​etc/​hobbitclient.cfg
 +          CMD $HOBBITCLIENTHOME/​ext/​mi-vt.py
 +          LOGFILE $HOBBITCLIENTHOME/​logs/​hobbitclient.log
 +          INTERVAL 5m
 +</​file>​
 +
 +=== Server side ===
 +
 +  * N/A
 +
 +===== Source =====
 +==== mi-vt.py ====
 +<hidden onHidden="​Show Code ⇲" onVisible="​Hide Code ⇱">​
 +<code python>
 +
 +#​!/​usr/​bin/​python -u
 +#####
 +#
 +# Created by Andrew Rankin (andrew [at] eiknet.com).
 +# Monitors current virtual machines on a Dom0 using libvirt and relays its findings to hobbit.
 +#
 +# Parts of this script were borrowed from libvirt example python scripts.
 +
 +#####
 +
 +import libvirt
 +import sys
 +import os
 +import time
 +import socket
 +
 +# Test to see if we are running xen.
 +if not os.access("/​proc/​xen",​ os.R_OK):
 +    sys.exit(1)
 +
 +###############​
 +
 +bbhome = '/​home/​hobbit/​client'​
 +bbtest = '​vt'​
 +domain = ',​domain,​com'​
 +hobbit_server = '​server.domain.com'​
 +test_explanation = '​Virtual Machine Status'​
 +status = {}
 +color = {}
 +hobbittime = time.strftime("​%a %b %e %T %Z %Y", time.localtime())
 +domains = []
 +DATA = {}
 +status_info = {}
 +
 +###############​
 +
 +# Connect to hypervisor
 +conn = libvirt.openReadOnly(None)
 +if conn == None:
 +    print '​Failed to open connection to the hypervisor'​
 +    sys.exit(1)
 +
 +# Get a list of Domains
 +try:
 +    domains = conn.listDomainsID()
 +except:
 +    print '​Failed to list domains'​
 +    sys.exit(1)
 +
 +# Get Physical systems specs
 +try:
 +    (model, memory, cores, mhz, nodes, sockets, cpus, threads) = conn.getInfo()
 +except:
 +    print '​Failed to extract the current node information'​
 +    sys.exit(1)
 +
 +DATA[socket.gethostname()] = "Host Server Specs\nMB Memory: %s\nNum CPUs: %s\nNum Cores: %s\nCPU MHz: %s\n\n"​ \
 +    %( memory, cpus, cores, mhz )
 +
 +for dom in domains:
 +    info = conn.lookupByID(dom).info()
 +    hostname = conn.lookupByID(dom).name()
 +    dom_hostname = socket.gethostname()
 +    percentmem = float()
 +    state = str()
 +    ​
 +    if hostname == "​Domain-0":​
 +        hostname = dom_hostname
 +
 +    # Warn on states
 +    if info[0] == 1:
 +        status[hostname] = bbtest + " OK"
 +        color[hostname] = "​green"​
 +        state = "​Running"​
 +    elif info[0] == 2:
 +        status[hostname] = bbtest + " OK"
 +        color[hostname] = "​green"​
 +        state = "​Blocked"​
 +    elif info[0] == 3:
 +        status[hostname] = bbtest + " Domain Paused"​
 +        color[hostname] = "​yellow"​
 +        state = "​Paused"​
 +    elif info[0] == 4:
 +        status[hostname] = bbtest + " Domain Crashed"​
 +        color[hostname] = "​red"​
 +        state = "​Crashed"​
 +    elif info[0] == 5:
 +        status[hostname] = bbtest + " Domain Dying"
 +        color[hostname] = "​red"​
 +        state = "​Dying"​
 +    elif info[0] == 6:
 +        status[hostname] = bbtest + " Domain Shutdown"​
 +        color[hostname] = "​red"​
 +        state = "​Shutdown"​
 +
 +    # more obvious explanation of colors
 +    if color[hostname] != "​green":​
 +        status_info[hostname] = "​\n\n&"​+color[hostname]+"​ "​+hostname+"​ Domain State is "​+state
 +        ​
 +        # Dom0 to carry warnings from its DomUs
 +        if status_info[dom_hostname] == "":​ status_info[dom_hostname] = "​\n"​
 +        status_info[dom_hostname] += "&"​+color[hostname]+"​ "​+hostname+"​ Domain State is "​+state+"​\n"​
 +        status[dom_hostname] = status[hostname] ​
 +        color[dom_hostname] = color[hostname]
 +    else:
 +        status_info[hostname] = ""​
 +
 +    # Convert to MB
 +    info[1] = info[1] / 1024
 +    info[2] = info[2] / 1024
 +
 +    # Either Figure % memory or if less than 0, set to no max
 +    if info[1] >= 0:
 +        percentmem = ((float(info[2]) / memory) * 100)
 +    else:
 +        percentmem = ((float(info[2]) / memory) * 100)
 +        info[1] = memory
 +
 +    if conn.lookupByID(dom).name() != "​Domain-0":​
 +        # Create our hobbit data for this host    ​
 +        DATA[hostname] = "​State:​ %s\nHostServerMemUsed:​ %.2f%%\nMaxMemSet:​ %s MB\nCurMemSet:​ %s MB\nVCPUs: %d" \
 +     %( state, percentmem, info[1], info[2], info[3] )
 +        # Create our hobbit data for the Dom0, this contains all data from all Virts
 +        DATA[dom_hostname] += hostname+"​\n"​ + DATA[hostname] + "​\n\n"​
 +    ​
 +        # Push the dom0 name back on the end.
 +        DATA[hostname] += "​\nDom0:​ " + dom_hostname
 +
 +# Send away!
 +for key in DATA.keys():​
 +    command = "​%s/​bin/​bb %s '​status %s%s.%s %s %s - %s%s\n\n%s\n\n%s'​\n"​ \
 + %( bbhome, hobbit_server,​ key, domain, bbtest, color[key], hobbittime, status[key],​ status_info[key],​ test_explanation,​ DATA[key] )
 +
 +    try:
 +        os.system(command)
 +    except:
 +        print "​Failed to send data to hobbit"​
 +
 +sys.exit(0)
 +
 +</​code>​
 +</​hidden>​
 +
 +===== Known  Bugs and Issues =====
 +
 +===== To Do =====
 +  * Add CPU Time Tracking
 +
 +===== Credits =====
 +  * Andrew Rankin
 +  * Tom Georgoulias ​
 +
 +===== Changelog =====
 +
 +  * **2007-09-25**
 +    * Initial release
  
  • monitors/xen.txt
  • Last modified: 2009/11/23 06:13
  • (external edit)