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
