I want share with list this file, it contains two classes:

from rrd import RRD, XPORT

- RRD class: Used for "http://ip/host_rrds"; and "http://ip/vm_rrds";
  Usage:
            for host:
              urllib.urlretrieve("http://%s/host_rrds?session_id=%s"; %
(ip, self.session_uuid), "host_rrds.rrd")
              rrd = RRD("host_rrds.rrd")
            for vm:
              urllib.urlretrieve("http://%s/vm_rrds?session_id=%s&uuid=%s";
% (ip, self.session_uuid, uuid), "vm_rrds.rrd")

            Create an object:
            rrd = RRD("vm_rrds.rrd")

            rrd will contains a dict:
                rrd["version"] -> rrrd version
                rrd["step"] -> seconds between data
                rrd["lastupdate"] -> timestamp of last update
                rrd["ds"] -> will contains the keys and values (memory, cpu, ..)
                                  -> "type"
                                  -> "minimal_heartbeat"
                                  -> "min"
                                  -> "max"
                                  -> "last_ds"
                                  -> "value"
                                  -> "unknown_sec"
                                  -> "values" (empty array)

            then you get data (fill rrd[ds][key]["values"] for each key):
                rrdinfo = rrd.get_data(period)

             If you want loop over rrdinfo:
                for key in rrdinfo.keys():
                     print key
                     print rrdinfo[key]["values"]


- XPORT  class: Used for "http://ip/rrd_updates
Example:
            
urllib.urlretrieve("http://%s/rrd_updates?session_id=%s&start=%s&cf=AVERAGE&interval=5&vm_uuid=%s";
% (ip, self.session_uuid, int(time.time())-10, uuid), "update.rrd")
            rrd = XPORT("update.rrd")
            rrdxport = rrd.get_data()
            for key in rrdxport.keys():
                     print key
                     print rrdxport[key]["values"]
#!/usr/bin/env python
# -----------------------------------------------------------------------
#
# Copyright (C) 2009 Alberto Gonzalez Rodriguez [email protected]
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MER-
# CHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# -----------------------------------------------------------------------

import xml.dom.minidom

class XPORT:
    def __init__(self, filename):
        """
        Read file and parse head/ds
        """
        f = open(filename, "r")
        self.data= f.read()
        f.close()
        self.parse_head()
        self.parse_ds()
    def parse_head(self):
        """
        Get "rows", "step" and "columns" from rrd
        """
        self.dom = xml.dom.minidom.parseString(self.data)
        del self.data
        self.rrdinfo = {}
        for field in ["rows", "step", "columns"]:
            self.rrdinfo[field] = self.dom.getElementsByTagName(field)[0].childNodes[0].data
    def parse_ds(self):
        """
        Get "ds" (memory, cpu0..) from rrd
        """
        ds_nodes = self.dom.getElementsByTagName("entry")
        self.rrdinfo["ds"] = {}
        self.keys = []
        for ds_node in ds_nodes:
            name = ds_node.childNodes[0].data.split(":")[3]
            if name in self.keys:
                name = "1" + name
            self.keys.append(name)
            self.rrdinfo["ds"][name] = {}
            self.rrdinfo["ds"][name]['values'] = []
            self.rrdinfo["ds"][name]['max_value'] = 0
    def get_data(self):
        """
        Function to get data array (timestamp, value) for all DS
        """
        for row in self.dom.getElementsByTagName("row"):
            i = 0
            lastupdate = row.childNodes[0].childNodes[0].data
            for values in row.childNodes[1:]:
                value = float(values.childNodes[0].data)
                if value == value and value != float('inf'):
                    self.rrdinfo["ds"][self.keys[i]]['values'].append([int(lastupdate), value])
                elif self.keys[i] == "memory_internal_free":
                    self.rrdinfo["ds"][self.keys[i]]['values'].append([int(lastupdate), 0])
                elif self.keys[i] == "memory":
                    self.rrdinfo["ds"][self.keys[i]]['values'].append([int(lastupdate), 0])

                if value != float('inf'):
                    if self.rrdinfo["ds"][self.keys[i]]['max_value'] < value:
                        self.rrdinfo["ds"][self.keys[i]]['max_value'] = value
                i = i + 1
        return self.rrdinfo["ds"]

class RRD:
    def __init__(self, filename):
        """
        Read file and parse head/ds
        """
        f = open(filename, "r")
        self.data= f.read()
        f.close()
        self.parse_head()
        self.parse_ds()

    def parse_head(self):
        """
        Get "version", "step" and "lastupdate" from rrd
        """
        self.dom = xml.dom.minidom.parseString(self.data)
        del self.data
        self.rrdinfo = {}
        for field in ["version", "step", "lastupdate"]:
            self.rrdinfo[field] = self.dom.getElementsByTagName(field)[0].childNodes[0].data

    def parse_ds(self):
        """
        Get "ds" (memory, cpu0..) from rrd
        """
        ds_nodes = self.dom.getElementsByTagName("ds")
        self.rrdinfo["ds"] = {}
        self.keys = []
        for ds_node in ds_nodes:
            if ds_node.getElementsByTagName("name"):
                name = ds_node.getElementsByTagName("name")[0].childNodes[0].data
                if name in self.keys:
                    name = "1" + name
                self.keys.append(name)
                self.rrdinfo["ds"][name] = {}
                for field in ["type", "minimal_heartbeat",  "min", "max",  "last_ds",  "value",  "unknown_sec"]:
                    self.rrdinfo["ds"][name][field] = ds_node.getElementsByTagName(field)[0].childNodes[0].data
                self.rrdinfo["ds"][name]['values'] = []
                self.rrdinfo["ds"][name]['max_value'] = 0

    def get_data(self, pdp=5):
        """
        Function to get data array (timestamp, value) for all DS, filter by pdp (seconds)
        """
        lastupdate = int(self.rrdinfo["lastupdate"])
        for rra in self.dom.getElementsByTagName("rra"):
            step = int(rra.getElementsByTagName("pdp_per_row")[0].childNodes[0].data)*int(self.rrdinfo["step"])
            if step == pdp:
                database = rra.getElementsByTagName("database")[0]
                lastupdate = int(self.rrdinfo["lastupdate"]) - (int(self.rrdinfo["lastupdate"]) % step)
                lastupdate = lastupdate - (len(database.getElementsByTagName("row")) * step)
                for row in database.getElementsByTagName("row"):
                    i = 0
                    lastupdate = lastupdate + step
                    for value in row.childNodes:
                        value = float(value.childNodes[0].data)
                        if value == value and value != float('inf'):
                            self.rrdinfo["ds"][self.keys[i]]['values'].append([int(lastupdate), value])
                        elif self.keys[i] == "memory_internal_free":
                            self.rrdinfo["ds"][self.keys[i]]['values'].append([int(lastupdate), 0])
                        elif self.keys[i] == "memory":
                            self.rrdinfo["ds"][self.keys[i]]['values'].append([int(lastupdate), 0])

                        if value != float('inf'):
                            if self.rrdinfo["ds"][self.keys[i]]['max_value'] < value:
                                self.rrdinfo["ds"][self.keys[i]]['max_value'] = value
                        i = i + 1
        return self.rrdinfo["ds"]
_______________________________________________
xen-api mailing list
[email protected]
http://lists.xensource.com/mailman/listinfo/xen-api

Reply via email to