def output(self, months=3): """Render out the image of the rrd""" def1 = DEF(rrdfile=self.datafile, vname='queue', dsName=self.ds1.name) line1 = LINE(defObj=def1, color='#01FF13', legend='Queue Depth', stack=True) # area1 = AREA(defObj=def1, color='#FFA902', legend='Bookmarks') # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph start_date = time.mktime((today - timedelta(days=7)).timetuple()) end_date = time.mktime(today.timetuple()) g = Graph(self.outputfile, start=int(start_date), end=int(end_date), vertical_label='count', color=ca) g.data.extend([def1, line1]) if not os.path.exists(os.path.dirname(self.outputfile)): os.makedirs(os.path.dirname(self.outputfile)) g.write()
def graph(self, outfile): elems = { "cu": DEF(rrdfile=self.db.filename, dsName="cpu_user", vname="cu"), "cn": DEF(rrdfile=self.db.filename, dsName="cpu_nice", vname="cn"), "cs": DEF(rrdfile=self.db.filename, dsName="cpu_sys", vname="cs"), "ci": DEF(rrdfile=self.db.filename, dsName="cpu_idle", vname="ci"), "cw": DEF(rrdfile=self.db.filename, dsName="cpu_iowt", vname="cw") } cpu_expr = "%%s,100,*,%s,/" % SysStat.jiffies() calc_elems = { "user": CDEF(vname="uperc", rpn=cpu_expr % elems["cu"].vname), "nice": CDEF(vname="nperc", rpn=cpu_expr % elems["cn"].vname), "sys": CDEF(vname="sperc", rpn=cpu_expr % elems["cs"].vname), "iowt": CDEF(vname="wperc", rpn=cpu_expr % elems["cw"].vname), #"max": VDEF(vname="maxcpu", rpn="%s,MINIMUM" % elems["ci"].vname), } graph_elems = { "max": LINE(value=100 * SysStat.num_cpu(), color="#000000"), "user": AREA(defObj=calc_elems["user"], color="#88ff88", legend="User"), "nice": AREA(defObj=calc_elems["nice"], color="#aaffaa", legend="Nice", stack=True), "sys": AREA(defObj=calc_elems["sys"], color="#ff8888", legend="System", stack=True), "iowt": AREA(defObj=calc_elems["iowt"], color="#ffffaa", legend="IO wait", stack=True), } g = Graph(outfile) g.data.extend(elems.values()) g.data.extend(calc_elems.values()) g.data.extend(graph_elems.values()) g.write()
def graph_request(self, period='day'): def1 = DEF(rrdfile=self.rrdfile, vname='request', dsName="requests", cdef="AVERAGE") vdef1 = VDEF(vname='max', rpn='request,MAXIMUM') vdef2 = VDEF(vname='avg', rpn='request,AVERAGE') vdef3 = VDEF(vname='last', rpn='request,LAST') area1 = AREA(defObj=def1, color='#336600', legend='Requests') gprint1 = GPRINT(vdef1, "Max\\: %5.1lf %S") gprint2 = GPRINT(vdef2, "Avg\\: %5.1lf %S") gprint3 = GPRINT(vdef3, "Current\\: %5.1lf %Sreq/sec") ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' img = "request-%s.png" % period imgname = self.static_path +"/"+ img start = '-1'+period g = Graph(imgname, imgformat='PNG', step=start, vertical_label='request/sec', color=ca, width=700, height=150) g.data.extend([def1, vdef1, vdef2, vdef3, area1, gprint1, gprint2, gprint3]) g.write()
def draw(rrd_file_name, img_file_name, start_time, end_time): data_rx= DEF(vname='rx', rrdfile=rrd_file_name, dsName='eth0_rx') data_tx= DEF(vname='tx', rrdfile=rrd_file_name, dsName='eth0_tx') graph_line_rx = LINE(defObj=data_rx, color='#FF0000', legend='rx') graph_line_tx = LINE(defObj=data_tx, color='#0000FF', legend='tx') img = Graph(filename=img_file_name, start=start_time, end=end_time, title='Network\ speed\ img', base=1024) img.data.extend([data_rx, data_tx, graph_line_rx, graph_line_tx]) img.write()
def draw(rrd_file_name, img_file_name, start_time, end_time): swap_total = os.popen("free -b | tail -1 | awk '{print $2}'").read() data_swap_used = DEF(vname='used', rrdfile=rrd_file_name, dsName='swap_used') line_total = LINE(value=int(swap_total), color='#000000', legend='Total') area_used = AREA(defObj=data_swap_used, color='#FF0000', legend='Used') img = Graph(filename=img_file_name, title='Swap\ Infomation', start=start_time, end=end_time, base=1024) img.data.extend([data_swap_used, line_total, area_used]) img.write()
def drawsimplegraph(req, rrdpathname, rrd, ds, rra, height=600, width=1200, start='default', end='default' ): filename = Rrdpath.objects.get(name=str(rrdpathname)).path fullfilename = filename + '/' + rrd if os.path.isfile(fullfilename): rrdobj = RRD(fullfilename, mode='r') info = rrdobj.getData() ds = str(ds) rra = str(rra) #step = info['step'] if (start == 'default'): start = info['lastupdate'] - (7 * 86400) if (end == 'default'): end = info['lastupdate'] gitems = [] gitems.append(DEF(rrdfile=fullfilename, vname="fudge", dsName=ds)) gitems.append(CDEF(vname='kmh', rpn='%s' % gitems[0].vname)) gitems.append(AREA(defObj=gitems[1], color='#006600', legend=rrd+" "+str(start)+" "+str(end))) g = Graph('-', imgformat='png', start=str(start), end=str(end), vertical_label=ds) g.title = rrd + '/' + ds + '/' + rra g.full_size_mode = True g.only_graph = req.GET.get('onlygraph', False) g.no_legend = req.GET.get('nolegend', True) g.height = req.GET.get('height', 600) g.width = req.GET.get('width', 1200) g.data.extend(gitems) a = g.write() return HttpResponse(a,content_type="image/png")
def get_rrdgraph(rrd_file_path, data_source_name, graph_title=None, start_time='N', end_time='N', width=None, height=None, line_color='#FF0000', line_width=1): if path.isfile(rrd_file_path) is not True: raise RrdDoesNotExist("{} not available".format(rrd_file_path)) output_file = '/tmp/rrd_graph_{0}.png'.format(int(time.time() * 1000)) data_source_name = data_source_name.encode("ascii") def1 = DEF(rrdfile=rrd_file_path, vname=data_source_name, dsName=data_source_name) line1 = LINE(value=data_source_name, color=line_color, width=line_width) g = Graph(output_file, start=start_time, end=end_time, title=graph_title, lower_limit=0, imgformat='PNG', width=width, height=height) g.data.extend([def1, line1]) g.write() return output_file
def output(self, months=3): """Render out the image of the rrd""" def1 = DEF(rrdfile=self.datafile, vname='bookmark_count', dsName=self.ds1.name) def2 = DEF(rrdfile=self.datafile, vname='unique_count', dsName=self.ds2.name) def3 = DEF(rrdfile=self.datafile, vname='tag_count', dsName=self.ds3.name) line1 = LINE(defObj=def1, color='#01FF13', legend='Bookmarks', stack=True) line2 = LINE(defObj=def2, color='#DA7202', legend='Unique', stack=True) line3 = LINE(defObj=def3, color='#BD4902', legend='Tags', stack=True) # area1 = AREA(defObj=def1, color='#FFA902', legend='Bookmarks') # area2 = AREA(defObj=def2, color='#DA7202', legend='Unique') # area3 = AREA(defObj=def3, color='#BD4902', legend='Tags') # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph start_date = time.mktime((today - timedelta(weeks=28)).timetuple()) end_date = time.mktime(today.timetuple()) g = Graph(self.outputfile, start=int(start_date), end=int(end_date), vertical_label='count', color=ca) g.data.extend([def1, def2, def3, line3, line2, line1]) if not os.path.exists(os.path.dirname(self.outputfile)): os.makedirs(os.path.dirname(self.outputfile)) g.write()
def draw(rrd_file_name, img_file_name, start_time, end_time): mem_total = os.popen("free -b | head -2 | tail -1 | awk '{print $2}'").read() data_mem_used = DEF(vname='used', rrdfile=rrd_file_name, dsName='mem_used') #data_mem_free = DEF(vname='free', rrdfile=rrd_file_name, dsName='mem_free') data_mem_buffers = DEF(vname='buffers', rrdfile=rrd_file_name, dsName='mem_buffers') data_mem_cached = DEF(vname='cached', rrdfile=rrd_file_name, dsName='mem_cached') data_mem_buffers_and_cached_over_used = CDEF(vname='bacou', rpn='buffers,cached,+') data_mem_real_used = CDEF(vname='real_used', rpn='used,bacou,-') line_total = LINE(value=int(mem_total), color='#000000', legend='Total') area_used = AREA(defObj=data_mem_real_used, color='#FF0000', legend='Used') area_buffers_and_cached = AREA(defObj=data_mem_buffers_and_cached_over_used, color='#0000FF', legend='Cached', stack=True) img = Graph(filename=img_file_name, title='Memory\ Infomation', start=start_time, end=end_time, base=1024) img.data.extend([data_mem_used, data_mem_buffers, data_mem_cached, data_mem_buffers_and_cached_over_used,data_mem_real_used, line_total, area_used, area_buffers_and_cached]) img.write()
def generate_graph_hardware(filename,starttime,endtime,steps, xaxis,header,ca,lstline): try: #name file of rrdfile. rrdfile = rrd_info.get_filename(filename) namefile = "%s_%s_%s.png" %(filename,starttime,endtime) lst = [] (resultcreate,errorcreate) = utils.create_folder(REPORT_PATH_IMAGE) if resultcreate == False: raise utils.UIException(str(errorcreate)) # name file of picture REPORT_PATH_IMAGEname = os.path.join(REPORT_PATH_IMAGE ,namefile) g = Graph(REPORT_PATH_IMAGEname, start=starttime, end=endtime,vertical_label="Percentage",lower_limit='0',upper_limit='100',title=header,x_grid=xaxis,y_grid='1:20',width=560,height=110,color=ca) if filename == 'ram': cflineram = [] cflineram = lineusedram(rrdfile,0) g.data.extend(cflineram) if filename == 'cpu': cflinecpu = [] cflinecpu = linecpu(rrdfile,0) g.data.extend(cflinecpu) if filename =="hd": cflineswap = [] cflineusage = [] c = [] cflineswap = lineswapused(rrdfile,0) cflineusage = linehdusage(rrdfile,0) c.extend(cflineswap) c.extend(cflineusage) g.data.extend(c) g.write() return get_path_image(REPORT_PATH_IMAGEname, namefile) except utils.UIException ,e: print "Error Info at generate_graph_hardware : %s" %e return ""
def __init__(self, devices, plugin, data_source, time_from=time()-60*60, time_to=time(), width=settings.GRAPH_WIDTH, height=settings.GRAPH_HEIGHT, mode=AGGREGATED, comment="", add_comment=True): """ Constructor. Needed parameters: list of devices, plugin name, data source name Optional parameters: time_from and time_to (default before 1 hour till now), width and height of graph in pixel, mode aggregated or multi-line, comment To set multi-line graph use mode=rrdscout.MULTI_LINE """ self.devices = devices self.plugin = plugin self.data_source = data_source self.time_from = time_from self.time_to = time_to self.width = width self.height = height self.mode = mode self.title = "" self.y_label = "" self.attachment_name = "" self.comment = comment self.add_comment = add_comment self.out_file = tempfile.NamedTemporaryFile('rw', suffix='.%s' % settings.GRAPH_FORMAT, dir=settings.TEMP_DIR, delete=True) self._defs = [] self._cdefs = [] self._def_map = {} self._cdef_map = {} self._cdef_values = {} self._metadata = {} self._lines = [] self._areas = {} self._vdefs = [] self._gprints = [] self._got_errors = False self._cf_map = {'min': 'MINIMUM', 'max': 'MAXIMUM', 'average': 'AVERAGE'} graph_color = ColorAttributes() graph_color.back = settings.COLOR_BACK graph_color.canvas = settings.COLOR_CANVAS graph_color.font = settings.COLOR_FONT graph_color.shadea = settings.COLOR_SHADEA graph_color.shadeb = settings.COLOR_SHADEB graph_color.mgrid = settings.COLOR_MGRID graph_color.axis = settings.COLOR_AXIS graph_color.arrow = settings.COLOR_ARROW self.graph = PyrrdGraph(self.out_file.name, start=self.time_from, end=self.time_to, width=self.width, height=self.height, color=graph_color)
def rrd_stuff(): filename = 'test.rrd' #dataSource = from_file() #def1 = DEF(rrdfile=filename, vname='myspeed', # dsName=dataSource.name) def1 = DEF(rrdfile=filename, vname='myspeed', dsName='speed') cdef1 = CDEF(vname='kmh', rpn='%s,3600,*' % def1.vname) cdef2 = CDEF(vname='fast', rpn='kmh,100,GT,kmh,0,IF') cdef3 = CDEF(vname='good', rpn='kmh,100,GT,0,kmh,IF') vdef1 = VDEF(vname='mymax', rpn='%s,MAXIMUM' % def1.vname) vdef2 = VDEF(vname='myavg', rpn='%s,AVERAGE' % def1.vname) line1 = LINE(value=100, color='#990000', legend='Maximum Allowed') area1 = AREA(defObj=cdef3, color='#006600', legend='Good Speed') area2 = AREA(defObj=cdef2, color='#CC6633', legend='Too Fast') line2 = LINE(defObj=vdef2, color='#000099', legend='My Average', stack=True) gprint1 = GPRINT(vdef2, '%6.2lf kph') from pyrrd.graph import ColorAttributes ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' from pyrrd.graph import Graph graphfile = "rrdgraph.png" g = Graph(graphfile, start=920805000, end=920810000, vertical_label='km/h', color=ca) g.data.extend([def1, cdef1, cdef2, cdef3, vdef1, vdef2, line1, area1, area2, line2, gprint1]) g.write()
def _render(self, params): ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' currentTime = int(time.time()) start = currentTime - getIntOrElse(params, "start", (3 * hour)) end = currentTime - getIntOrElse(params, "end", 0) logarithmic = getBooleanOrElse(params, "logarithmic", False) step = getIntOrElse(params, "step", 60) width = getIntOrElse(params, "width", 800) height = getIntOrElse(params, "height", 400) graphs = getStringOrElse(params, "graphs", getAllZaehlerNames()) upperlimit = getIntOrElse(params, "upperlimit", None) lowerlimit = getIntOrElse(params, "lowerlimit", None) generated_file = "/tmp/%d-%d.png" % (time.time(),random.randint(0, 100000)) g = Graph(generated_file, start=start, end=end, vertical_label='100mWh/min', color=ca) g.data.extend(self._createLines(graphs)) g.width = width g.height = height g.step = step g.logarithmic = logarithmic if upperlimit: g.upper_limit=upperlimit if lowerlimit: g.lower_limit=lowerlimit g.rigid=True g.write() return generated_file
def createimages(self, currentTime=None): if currentTime is None: currentTime = int(time.time()) if os.path.isfile(self.rrdfile): myRRD = rrd.RRD(self.rrdfile, mode='r') def1 = DEF(rrdfile=myRRD.filename, vname='Watt', dsName='power') def2 = DEF(rrdfile=myRRD.filename, vname='Wh', dsName='energy') vdef1 = VDEF(vname='maxpower', rpn='%s,MAXIMUM' % def1.vname) vdef2 = VDEF(vname='avgpower', rpn='%s,AVERAGE' % def1.vname) vdef3 = VDEF(vname='maxenergy', rpn='%s,MAXIMUM' % def2.vname) cdef1 = CDEF(vname='Joule', rpn='%s,3600,*' % def2.vname) area1 = AREA(defObj=def1, color='#006600', legend='Our Power') area2 = AREA(defObj=cdef1, color='#006600', legend='Our Energy') line1 = LINE(defObj=vdef1, color='#660000', legend='Our Maximum') line2 = LINE(defObj=vdef2, color='#009900', legend='Our Average') gprint1 = GPRINT(vdef2,'average power %6.0lf watt') gprint2 = GPRINT(vdef1,'maximum power %6.0lf watt') # setup the labels and definitions also setup # the different file sizes labels = ['power\ in\ Watt','energy\ in\ Joule'] definitions = [ [def1, vdef1, vdef2, area1, gprint1, gprint2, line1, line2], [def2,cdef1, area2]] #setup a dummpy image g = Graph('dummpy.png', end=currentTime, color=self.colors, imgformat='png') for num in range(0, len(labels)): g.vertical_label = labels[num] g.data = definitions[num] for t in self.times: g.start = (currentTime - (t[0] * 60)) for size in self.sizes: g.width = size[0][0] g.height = size[0][1] g.filename = self.graphfile+'_%s_%s_%s.png' % ( labels[num].split('\ ',1)[0], t[1], size[1] ) g.write(debug=False)
def generate_graph_netusage(filename,starttime,endtime,steps, xaxis,header,ca,lstline): try: # for net work usage i add more rrdfile = rrd_info.get_filename(filename) print "RRD file name %s Network." %(rrdfile) namefile = "%s_%s_%s.png" %(filename,starttime,endtime) (resultcreate,errorcreate) = utils.create_folder(REPORT_PATH_IMAGE) if resultcreate == False: raise utils.UIException(str(errorcreate)) # REPORT_PATH_IMAGE the place to store pic. REPORT_PATH_IMAGEname = os.path.join(REPORT_PATH_IMAGE,namefile) lst = [] g = Graph(REPORT_PATH_IMAGEname, start=starttime, end=endtime,vertical_label="\"Bit Per Second\"",color=ca,lower_limit='0',title=header) g.x_grid = xaxis #g.y_grid = '1:20' g.width = 560 for each_lstline in lstline: cfline = [] if each_lstline == rrd_info.net_inbound: cfline = linenet_inbound(rrdfile,steps) elif each_lstline == rrd_info.net_outbound: cfline = linenet_outbound(rrdfile, steps) if len(cfline) > 0: lst.extend(cfline) g.data.extend(lst) g.write() return get_path_image(REPORT_PATH_IMAGEname, namefile) except utils.UIException ,e: print "Error Info At reportrrd.py method generate_graph_netusage : %s" %e return ""
def __init__(self, devices, plugin, data_source, time_from=time()-60*60, time_to=time(), width=settings.GRAPH_WIDTH, height=settings.GRAPH_HEIGHT, mode=AGGREGATED, comment="", add_comment=True): """ Constructor. Needed parameters: list of devices, plugin name, data source name Optional parameters: time_from and time_to (default before 1 hour till now), width and height of graph in pixel, mode aggregated or multi-line, comment To set multi-line graph use mode=rrdscout.MULTI_LINE """ self.devices = devices self.plugin = plugin self.data_source = data_source self.time_from = time_from self.time_to = time_to self.width = width self.height = height self.mode = mode self.title = "" self.y_label = "" self.attachment_name = "" self.comment = comment self.add_comment = add_comment self.out_file = tempfile.NamedTemporaryFile('rw', suffix='.png', dir=settings.TEMP_DIR, delete=True) self._defs = [] self._cdefs = [] self._def_map = {} self._cdef_map = {} self._cdef_values = {} self._metadata = {} self._lines = [] self._areas = {} self._vdefs = [] self._gprints = [] self._got_errors = False self._cf_map = {'min': 'MINIMUM', 'max': 'MAXIMUM', 'average': 'AVERAGE'} graph_color = ColorAttributes() graph_color.back = '#ffffff' graph_color.shadea = '#ffffff' graph_color.shadeb = '#ffffff' self.graph = PyrrdGraph(self.out_file.name, start=self.time_from, end=self.time_to, width=self.width, height=self.height, color=graph_color)
def render(stringName, key, startTime, endTime): if debug: print "Enter Function render(filename, value)" #balken zeichnen def1 = DEF(rrdfile = baseDir + stringName + "_" + key + ".rrd", vname='kW', dsName="kW") #command fetches data from the rrd area1 = AREA(defObj=def1, color='#FFA902', legend='kW') #mittelwert linie zeichnen (muss noch berechnet werden line1 = LINE(value=100, color='#990000', legend='Average') # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph #startTime = endTime - (10 * 60 * 60) #10h anzeigen, sollte noch variabel sein g = Graph(baseDir + stringName + "_" + key + ".png", start=startTime, end=endTime, vertical_label='data', color=ca) g.data.extend([def1, area1, line1]) g.width = 800 g.height = 400 g.write()
def _initialize(self): """ set up erything we need """ # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Let's set up the objects that will be added to the graphs result = [] for graphName, graphData in graphsDefinition.items(): tmp = [] for sourceName, sourceData in graphData["sources"].items(): def1 = DEF(rrdfile=self._filename, vname=sourceName, dsName=sourceName) tmp.append(def1) if sourceName.startswith("zaehlerstand"): cdef1 = CDEF(vname='verbrauchpros-'+def1.vname, rpn='%s,86400,*' % def1.vname) tmp.append(cdef1) if sourceData["type"] == "line": tmp.append(LINE(value=sourceName, color=sourceData["color"], legend=sourceData["title"])) elif sourceData["type"] == "area": tmp.append(AREA(value=sourceName, color=sourceData["color"], legend=sourceData["title"])) # Now that we've got everything set up, let's make a graph g = Graph('dummy.png', vertical_label=graphData["verticalLabel"], color=ca) g.data.extend(tmp) g.title = '"%s"' % graphData["title"] # create a new variable g.filenameBase = graphName if graphData.get("logarithmic"): g.logarithmic=True result.append(g) return result
class RRDGraph(object): def __init__(self, filename, start=None, end=None, step=None, title='', vertical_label='', width=600, height=180, color=None): self.filename = filename self.start = start self.end = end self.step = step self.height = height self.width = width self.title = title self.vertical_label = vertical_label self.color = color self.graph = None def prepare(self, args): self.graph = Graph(self.filename, start=self.start, end=self.end, step=self.step, height=self.height, width=self.width, title=self.title, vertical_label=self.vertical_label, color=self.color) self.graph.data.extend(args) def plot(self): self.graph.write()
def do_graph(self): ''' Create the graph image file ''' if self._filename == '': raise Exception("Invalid filename") if self._view == 'y': start = 3600 * 24 * 365 elif self._view == 'm': start = 3600 * 24 * 30 elif self._view == 'w': start = 3600 * 24 * 7 else: start = 3600 * 24 print "Write image", self._filename rrd_graph = RRDGraph(self._filename, start=-start, end=-1, vertical_label=self._label) rrd_graph.data.extend(self._data) if self._width > 0: rrd_graph.width = self._width if self._height > 0: rrd_graph.height = self._height #rrd_graph.write(debug=True) rrd_graph.write()
roundRobinArchives.append(RRA(cf='AVERAGE', xff=0.5, steps=60, rows=12)) rrd = RRD(filename, ds=dataSources, rra=roundRobinArchives, start=timestamp-1) if not os.path.isfile(rrd.filename): rrd.create() i = 0 for rtt in parse_rtt(lines): print i, rtt rrd.bufferValue(timestamp+i, int(1000 * rtt)) i += 1 if i % 100 == 0: rrd.update() rrd.update() from pyrrd.graph import DEF, CDEF, VDEF, LINE, AREA, GPRINT, COMMENT, Graph comment = COMMENT("RTT from SMO to Creagan Dearga") rttus = DEF(rrdfile=rrd.filename, vname="rttus", dsName="rtt") rttms = CDEF(vname="rttms", rpn="%s,1000,/" % rttus.vname) rtt = LINE(defObj=rttms, color="#2299ff", legend="RTT") rttmax = VDEF(vname="rttmax", rpn="%s,MAXIMUM" % rttms.vname) rttavg = VDEF(vname="rttavg", rpn="%s,AVERAGE" % rttms.vname) rttmaxp = GPRINT(rttmax, "Maximum: %6.2lf") rttavgp = GPRINT(rttavg, "Average: %6.2lf") imgfile = "/tmp/testgraph.png" g = Graph(imgfile, start=timestamp, end=timestamp+263342, vertical_label="ms") g.data.extend([rttus,rttms,rtt,rttmax,rttmaxp,rttavg,rttavgp,comment]) g.write()
def vdef(rrdfile, trafficname, requestname): ### ### def def_out = DEF(rrdfile=rrdfile, vname="out", dsName="out") def_in = DEF(rrdfile=rrdfile, vname="in", dsName="in") def_request = DEF(rrdfile=rrdfile, vname="request", dsName="request") ### vdef vdef_out1 = VDEF(vname="maxout", rpn="%s,MAXIMUM" % def_out.vname) vdef_out2 = VDEF(vname="avgout", rpn="%s,AVERAGE" % def_out.vname) vdef_in1 = VDEF(vname="maxin", rpn="%s,MAXIMUM" % def_in.vname) vdef_in2 = VDEF(vname="avgin", rpn="%s,AVERAGE" % def_in.vname) vdef_request1 = VDEF(vname="maxreq", rpn="%s,MAXIMUM" % def_request.vname) vdef_request2 = VDEF(vname="avgreq", rpn="%s,AVERAGE" % def_request.vname) ### line line_out = LINE(2, defObj=def_out, color="#2029CC", legend="Out") line_in = LINE(2, defObj=def_in, color="#00FF00", legend="In") line_request = LINE(2, defObj=def_request, color="#FF0000", legend="Request") ### gprint gprint_out1 = GPRINT(vdef_out1, "max\\: %5.1lf %Sbps") gprint_out2 = GPRINT(vdef_out2, "avg\\: %5.1lf %Sbps\\n") gprint_in1 = GPRINT(vdef_in1, "max\\: %5.1lf %Sbps") gprint_in2 = GPRINT(vdef_in2, "avg\\: %5.1lf %Sbps\\n") gprint_request1 = GPRINT(vdef_request1, "max\\: %5.1lf %S") gprint_request2 = GPRINT(vdef_request2, "avg\\: %5.1lf %S\\n") ### # for delta in settings.DELTA: hour = 60 * 60 day = 24 * 60 * 60 step = settings.step endTime = int(time.time()) - 600 delta = 1 * hour start = endTime - delta ### traffic g_traffic = Graph(trafficname, step=step, start=start, end=endTime, vertical_label="Bytes/s", color=color()) g_traffic.data.extend( [ def_out, def_in, vdef_out1, vdef_out2, vdef_in1, vdef_in2, line_out, gprint_out1, gprint_out2, line_in, gprint_in1, gprint_in2, ] ) g_traffic.title = '"report traffic "' g_traffic.write(debug=True) ### request g_request = Graph(requestname, step=step, start=start, end=endTime, vertical_label="Requests/s", color=color()) g_request.data.extend([def_request, vdef_request1, vdef_request2, line_request, gprint_request1, gprint_request2]) g_request.title = '"report request "' g_request.write(debug=True) return True
area2 = AREA(defObj=cdef2, color="#A32001", legend="Bits Out") # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = "#333333" ca.canvas = "#333333" ca.shadea = "#000000" ca.shadeb = "#111111" ca.mgrid = "#CCCCCC" ca.axis = "#FFFFFF" ca.frame = "#AAAAAA" ca.font = "#FFFFFF" ca.arrow = "#FFFFFF" # Now that we've got everything set up, let's make a graph g = Graph("dummy.png", end=endTime, vertical_label="Bits", color=ca) g.data.extend([def1, def2, cdef1, cdef2, area2, area1]) g.title = '"In- and Out-bound Traffic Across Local Router"' # g.logarithmic = ' ' # Iterate through the different resoltions for which we want to # generate graphs. for time, step in times: # First, the small graph g.filename = graphfile % (exampleNum, time) g.width = 400 g.height = 100 g.start = endTime - time g.step = step g.write(debug=False)
def draw_graph(data, group): ## Graph bytes_in, bytes_out, request, by time+group filename = 'network.rrd' graphfile_traffic = 'traffic%s.png' %group # graphfileLg_traffic = 'traffic-large.png' graphfile_request = 'request%s.png' %group # graphfileLg_request = 'request-large' #define times hour = 60 * 60 day = 24 * 60 * 60 week = 7 * day month = day * 30 quarter = month * 3 half = 365 * day / 2 year = 365 * day delta = settings.DELTA * hour step = 1 endTime = int(time.time()) - 600 startTime = endTime - 360000 maxSteps = int((endTime-startTime)/step) # create RRD file # DSTYPE # Counter:Use this format with value of snmp MIB like traffic counter or # packet number for a interface. # Gauge:Use this format for value like temperature, indicator of pressure. # Derive:Use this format if you variation or settings.DELTA between a moment and # an another moment like the rate of of people entering or leaving a # room and derive works exactly like COUNTER but without overflow checks. # Absolute:Use this format when you count the number of mail after an alert. # # HEARTBEAT # Is define the frequency between each update of value in the database but some time # it is possible to have UNKNOWN value. # MIN AND MAX are optional parameters witch define the range of your data source (DS). # If your value is out of the range the value will be defined as UNKNOWN. # If you don not know exactly the range of you value you can set the MIN and MAX value with # U for unknown dss = [] ds1 = DS(dsName='bytes_out', dsType='ABSOLUTE', heartbeat=200) ds2 = DS(dsName='bytes_in', dsType='ABSOLUTE', heartbeat=200) ds3 = DS(dsName='request', dsType='COUNTER', heartbeat=200) dss.extend([ds1, ds2, ds3]) rras1 = [] rra1 = RRA(cf='AVERAGE', xff=0.5, steps=1, rows=1440) rra2 = RRA(cf='AVERAGE', xff=0.5, steps=6, rows=2016) rra3 = RRA(cf='AVERAGE', xff=0.5, steps=60, rows=720) rras1.extend([rra1, rra2, rra3]) myRRD = RRD(filename, step=step, ds=dss, rra=rras1, start=startTime) myRRD.create(debug=False) ## RRD update counter = 0 for i in data: counter += 1 bytes_in = i['bytes_in'] bytes_out = i['bytes_out'] requests = i['request'] times = i['time'] print bytes_out/1000000 myRRD.bufferValue(times, bytes_out, bytes_in, requests) if counter % 100 == 0: myRRD.update(debug=True) myRRD.update(debug=True) ## RRD graph def1 = DEF(rrdfile=myRRD.filename, vname='output', dsName=ds1.name) def2 = DEF(rrdfile=myRRD.filename, vname='input', dsName=ds2.name) def3 = DEF(rrdfile=myRRD.filename, vname='request', dsName=ds3.name) vdef11 = VDEF(vname='max_out', rpn='%s,MAXIMUM' % def1.vname) vdef12 = VDEF(vname='avg_out', rpn='%s,AVERAGE' % def1.vname) vdef21 = VDEF(vname='max_in', rpn='%s,MAXIMUM' % def2.vname) vdef22 = VDEF(vname='avg_in', rpn='%s,AVERAGE' % def2.vname) vdef31 = VDEF(vname='max_request', rpn='%s,MAXIMUM' % def3.vname) vdef32 = VDEF(vname='avg_request', rpn='%s,AVERAGE' % def3.vname) line1 = LINE(2, defObj=def1, color='#2029CC', legend='Out') line2 = LINE(2, defObj=def2, color='#00FF00', legend='In') line3 = LINE(2, defObj=def3, color='#FF0000', legend='Request') gprint11 = GPRINT(vdef11, 'max\\: %5.1lf %Sbps') gprint12 = GPRINT(vdef12, 'avg\\: %5.1lf %Sbps\\n') gprint21 = GPRINT(vdef21, 'max\\: %5.1lf %Sbps') gprint22 = GPRINT(vdef22, 'avg\\: %5.1lf %Sbps\\n') gprint31 = GPRINT(vdef31, 'max\\: %5.1lf %S') gprint32 = GPRINT(vdef32, 'avg\\: %5.1lf %S\\n') # ColorAttributes ca = ColorAttributes() ca.back = '#CCCDE2' #background ca.canvas = '#FFFFFF'#the background of the actual graph ca.shadea = '#000000'#left and top border ca.shadeb = '#111111'#right and bottom border ca.mgrid = '#6666CC' #maior grid ca.axis = '#000000' #axis of the graph ca.frame = '#CCCDE2' #line around the color spots ca.font = '#000000' #color of the font ca.arrow = '#CC0000' # arrow head pointing up and forward ## graph traffic g = Graph(graphfile_traffic, end=endTime, vertical_label='Bytes/s', color=ca) g.data.extend([def1, def2, vdef11, vdef12, vdef21, vdef22, line1, gprint11, gprint12, line2, gprint21, gprint22]) g.title = '"report traffic %s"'%group g.start=endTime - delta g.step = step g.width = 397 g.height = 182 g.write(debug=True) # g.filename = graphfileLg_traffic # g.width = 800 # g.height = 400 # g.write() ## graph request g1 = Graph(graphfile_request, end=endTime, vertical_label='Request/s', color=ca) g1.data.extend([def3, vdef31, vdef32, line3, gprint31, gprint32]) g1.title = '"report request %s"'%group g1.start=endTime - settings.DELTA g1.step = step g1.width = 397 g1.height = 182 g1.write(debug=False)
def graph_data(gtype = None, period = MON_START_DAY, size = 'M'): # Makes chart one of hardcoded templates (rrdgraph) # Period and size are specified as well if RRD is None or not options.rrd_enabled: return defs = [] cdefs = [] vdefs = [] gprints =[] items = [] if size=='M': _sizef='' else: _sizef = '-' + size.lower() _start = '-%s' % period _graph_file = '%s%s.%s.png' % (os.path.join(options.monitor_graph_path, gtype),_sizef,period) _label='' _title='' _step = None _upper_limit=None _low_limit=None _units_exponent =None _clrs1 = COLOR_SET_1[:] _clrs1.reverse() _clrs2 = COLOR_SET_2[:] _clrs2.reverse() _colors = _clrs1 + _clrs2 _sorted = RRDs.keys() _sorted.sort() if gtype == MON_GRAPH_CPU: _colors = COLOR_SET_3[:] _title = 'CPU loading' _label = 'Percent (%)' _upper_limit = 100 _low_limit = 0 _units_exponent = 0 for _inst in _sorted: defs.append(DEF(vname=('cpu_mcs_%s' % _inst),rrdfile=RRDs[_inst].filename,dsName=gtype, start=_start,step=_step)) cdefs.append(CDEF(vname=('cpu_s_%s' % _inst),rpn=('cpu_mcs_%s,0.0001,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst)) elif gtype == MON_GRAPH_BYTES: _colors = COLOR_SET_3[:] _title = 'Network' _label = 'bit/s' for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('bytes_sec_%s' % _inst),rrdfile=_rrd.filename,dsName=gtype,start=_start,step=_step)) cdefs.append(CDEF(vname=('bits_%s' % _inst),rpn=('bytes_sec_%s,8,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=False)) if size<>'S': vdefs.append(VDEF(vname=('traffic_%s' % _inst), rpn=(','.join([('bytes_sec_%s' % _inst), 'TOTAL'])))) gprints.append(GPRINT(vdefObj=vdefs[-1:].pop(), format=_inst +' = %.3lf %sB')) if len(cdefs)>1: cdefs.append( CDEF(vname='bits_total', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),mul(['ADDNAN'],len(cdefs)-1))) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend='TOTALS', width=2)) elif gtype == MON_GRAPH_DESKTOP: _title = 'Unique Desktop connections' _label = 'pcs/min' for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('desktop_u_%s' % _inst),rrdfile=_rrd.filename,dsName=gtype, start=_start,step=_step,reduce='AVERAGE')) cdefs.append(CDEF(vname=('desktop_u_min_%s' % _inst),rpn=('desktop_u_%s,60,*' % _inst))) items.append(AREA(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=True)) elif gtype == MON_GRAPH_TRANS: _title = 'Completed Transactions' if size<>'S': _title += ' (app/desktop interactions)' _label = 'pcs/min' _colors = COLOR_SET_3[:] for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('completed_%s' % _inst),rrdfile=_rrd.filename,dsName=gtype,start=_start,step=_step)) cdefs.append(CDEF(vname=('completed_min_%s' % _inst),rpn=('completed_%s,60,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=False)) if size<>'S': vdefs.append(VDEF(vname=('total_completed_%s' % _inst), rpn=(','.join([('completed_%s' % _inst), 'TOTAL'])))) gprints.append(GPRINT(vdefObj=vdefs[-1:].pop(), format=_inst +' = %.0lf%s')) if len(cdefs)>1: cdefs.append( CDEF(vname='pcs_total', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),mul(['ADDNAN'],len(cdefs)-1))) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend='TOTALS', width=2)) elif gtype == MON_GRAPH_TRANS_UNIQUE: _title = 'Unique ClientID Transactions' _label = 'pcs/min' _colors = COLOR_SET_3[:] for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('t_unique_%s' % _inst),rrdfile=_rrd.filename,dsName=gtype,start=_start,step=_step)) cdefs.append(CDEF(vname=('t_unique_min_%s' % _inst),rpn=('t_unique_%s,60,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=False)) if len(cdefs)>1: cdefs.append( CDEF(vname='pcs_total', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),mul(['ADDNAN'],len(cdefs)-1))) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend='TOTALS', width=2)) elif gtype == MON_GRAPH_DURATION: _title = 'Transaction Average Duration' _label = 'seconds' _colors = COLOR_SET_3[:] for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('duration_%s' % _inst),rrdfile=_rrd.filename,dsName='duration', start=_start,step=_step)) defs.append(DEF(vname=('completed_%s' % _inst),rrdfile=_rrd.filename,dsName='t_completed', start=_start,step=_step)) cdefs.append(CDEF(vname=('duration_of_transaction_%s' % _inst), rpn=('duration_%s,0.001,*,completed_%s,0,EQ,1,completed_%s,IF,/' % (_inst,_inst,_inst)))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst)) if len(cdefs)>1: cdefs.append( CDEF(vname='duration_avg', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),[str(len(cdefs)),'AVG'])) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), width=2, color=_colors.pop(), legend='AVERAGE')) elif gtype == MON_GRAPH_CPU_MAX: _colors = COLOR_SET_3[:] _title = 'CPU loading picks' _label = 'Percent (%)' _upper_limit = 100 _low_limit = 0 _units_exponent = 0 for _inst in _sorted: defs.append(DEF(vname=('cpu_mcs_%s' % _inst),rrdfile=RRDs[_inst].filename,dsName='cpu', start=_start,step=_step,cdef='MAX')) cdefs.append(CDEF(vname=('cpu_s_%s' % _inst),rpn=('cpu_mcs_%s,0.0001,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst)) elif gtype == MON_GRAPH_BYTES_MAX: _colors = COLOR_SET_3[:] _title = 'Network (picks)' _label = 'bit/s' for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('bytes_sec_%s' % _inst),rrdfile=_rrd.filename,dsName='bytes', cdef='MAX', start=_start,step=_step)) cdefs.append(CDEF(vname=('bits_%s' % _inst),rpn=('bytes_sec_%s,8,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=False)) if len(cdefs)>1: cdefs.append( CDEF(vname='bits_total', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),mul(['ADDNAN'],len(cdefs)-1))) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend='TOTALS', width=2)) elif gtype == MON_GRAPH_DESKTOP_MAX: _title = 'Unique Desktop connections (picks)' _label = 'pcs/min' for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('desktop_u_%s' % _inst),rrdfile=_rrd.filename,dsName='agents_u', cdef='MAX', start=_start,step=_step)) cdefs.append(CDEF(vname=('desktop_u_min_%s' % _inst),rpn=('desktop_u_%s,60,*' % _inst))) items.append(AREA(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=True)) elif gtype == MON_GRAPH_TRANS_MAX: _title = 'Completed Transactions picks\n(app/desktop interactions)' _label = 'pcs/min' _colors = COLOR_SET_3[:] for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('completed_%s' % _inst),rrdfile=_rrd.filename,dsName='t_completed', cdef='MAX', start=_start,step=_step)) cdefs.append(CDEF(vname=('completed_min_%s' % _inst),rpn=('completed_%s,60,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=False)) if len(cdefs)>1: cdefs.append( CDEF(vname='pcs_total', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),mul(['ADDNAN'],len(cdefs)-1))) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend='TOTALS', width=2)) elif gtype == MON_GRAPH_TRANS_UNIQUE_MAX: _title = 'Unique ClientID Transactions (picks)' _label = 'pcs/min' _colors = COLOR_SET_3[:] for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('t_unique_%s' % _inst),rrdfile=_rrd.filename,dsName='t_unique', cdef='MAX', start=_start,step=_step)) cdefs.append(CDEF(vname=('t_unique_min_%s' % _inst),rpn=('t_unique_%s,60,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst, stack=False)) if len(cdefs)>1: cdefs.append( CDEF(vname='pcs_total', rpn=','.join(chain(imap(attrgetter('vname'),cdefs),mul(['ADDNAN'],len(cdefs)-1))) ) ) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend='TOTALS', width=2)) elif gtype == MON_GRAPH_DURATION_MAX: _title = 'Transaction Average Duration (picks)' _label = 'seconds' _colors = COLOR_SET_3[:] for (_inst,_rrd) in RRDs.items(): defs.append(DEF(vname=('duration_avg_%s' % _inst),rrdfile=_rrd.filename,dsName='duration_avg', cdef='MAX', start=_start,step=_step)) cdefs.append(CDEF(vname=('duration_avg_s_%s' % _inst),rpn=('duration_avg_%s,0.001,*' % _inst))) items.append(LINE(defObj=cdefs[-1:].pop(), color=_colors.pop(), legend=_inst)) g = Graph(_graph_file, title='"%s (%s)"' % (_title,period), start=_start, vertical_label='"%s"' % _label, width=MON_SIZE[size][0], height=MON_SIZE[size][1], color=color_style(), units_exponent=_units_exponent, upper_limit=_upper_limit, lower_limit=_low_limit ) g.data.extend (defs + cdefs + items + vdefs + gprints) try: g.write() except ExternalCommandError as e: pass
area2 = AREA(defObj=cdef2, color='#A32001', legend='Bits Out') # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph g = Graph('dummy.png', end=endTime, vertical_label='Bits', color=ca) g.data.extend([def1, def2, cdef1, cdef2, area2, area1]) g.title = '"In- and Out-bound Traffic Across Local Router"' #g.logarithmic = ' ' # Iterate through the different resoltions for which we want to # generate graphs. for time, step in times: # First, the small graph g.filename = graphfile % (exampleNum, time) g.width = 400 g.height = 100 g.start = endTime - time g.step = step g.write(debug=False)
def draw_total(res): ## graph total(bytes_out, bytes_in, request) by time # define name filename = 'total.rrd' graphfile_total_traffic = 'total_traffic.png' # graphfileLg_total_traffic = 'total_traffic-large.png' graphfile_total_request = 'total_request.png' # graphfileLg_total_request = 'total_request-large' #define times hour = 60 * 60 day = 24 * 60 * 60 week = 7 * day month = day * 30 quarter = month * 3 half = 365 * day / 2 year = 365 * day delta = settings.DELTA * hour step = 1 endTime = int(time.time()) - 600 startTime = endTime - 360000 maxSteps = int((endTime-startTime)/step) ## Create RRD dss = [] ds1 = DS(dsName='total_bytes_out', dsType='ABSOLUTE', heartbeat=200) ds2 = DS(dsName='total_bytes_in', dsType='ABSOLUTE', heartbeat=200) ds3 = DS(dsName='total_request', dsType='ABSOLUTE', heartbeat=200) dss.extend([ds1, ds2, ds3]) rras1 = [] rra1 = RRA(cf='AVERAGE', xff=0.5, steps=1, rows=1440) rra2 = RRA(cf='AVERAGE', xff=0.5, steps=6, rows=2016) rra3 = RRA(cf='AVERAGE', xff=0.5, steps=60, rows=720) rras1.extend([rra1, rra2, rra3]) myRRD = RRD(filename, step=step, ds=dss, rra=rras1, start=startTime) myRRD.create(debug=False) ## RRD update counter = 0 for i in res: counter += 1 total_bytes_in = int(i['total_bytes_in']) total_bytes_out = int(i['total_bytes_out']) total_requests = int(i['total_request']) t_times = int(i['time']) print total_bytes_out/1000000 myRRD.bufferValue(t_times, total_bytes_out, total_bytes_in, total_requests) if counter % 100 == 0: myRRD.update(debug=True) myRRD.update(debug=True) ## RRD graph def1 = DEF(rrdfile=myRRD.filename, vname='output', dsName=ds1.name, cdef='AVERAGE') def2 = DEF(rrdfile=myRRD.filename, vname='input', dsName=ds2.name, cdef='AVERAGE') def3 = DEF(rrdfile=myRRD.filename, vname='request', dsName=ds3.name, cdef='AVERAGE') # Out vdef11 = VDEF(vname='max_out', rpn='%s,MAXIMUM' % def1.vname) vdef12 = VDEF(vname='avg_out', rpn='%s,AVERAGE' % def1.vname) vdef13 = VDEF(vname='min_out', rpn='%s,MINIMUM' % def1.vname) line1 = LINE(2, defObj=def1, color='#2029CC', legend='Out') gprint11 = GPRINT(vdef11, 'max\\: %5.1lf %Sbps') gprint12 = GPRINT(vdef12, 'avg\\: %5.1lf %Sbps') gprint13 = GPRINT(vdef13, 'min\\: %5.1lf %Sbps\\n') # In vdef21 = VDEF(vname='max_in', rpn='%s,MAXIMUM' % def2.vname) vdef22 = VDEF(vname='avg_in', rpn='%s,AVERAGE' % def2.vname) line2 = LINE(2, defObj=def2, color='#00FF00', legend='In') gprint21 = GPRINT(vdef21, 'max\\: %5.1lf %Sbps') gprint22 = GPRINT(vdef22, 'avg\\: %5.1lf %Sbps\\n') # Request vdef31 = VDEF(vname='max_request', rpn='%s,MAXIMUM' % def3.vname) vdef32 = VDEF(vname='avg_request', rpn='%s,AVERAGE' % def3.vname) line3 = LINE(2, defObj=def3, color='#FF0000', legend='Request') gprint31 = GPRINT(vdef31, 'max\\: %5.1lf %S') gprint32 = GPRINT(vdef32, 'avg\\: %5.1lf %S\\n') # ColorAttributes ca = ColorAttributes() ca.back = '#CCCDE2' #background ca.canvas = '#FFFFFF'#the background of the actual graph ca.shadea = '#000000'#left and top border ca.shadeb = '#111111'#right and bottom border ca.mgrid = '#6666CC' #major grid ca.axis = '#000000' #axis of the graph ca.frame = '#CCCDE2' #line around the color spots ca.font = '#000000' #color of the font ca.arrow = '#CC0000' # arrow head pointing up and forward ## g = Graph(graphfile_total_traffic, end=endTime, vertical_label='Bytes/s', color=ca) g.data.extend([def1, def2, vdef11, vdef12, vdef13, vdef21, vdef22, line1, gprint11, gprint12, gprint13, line2, gprint21, gprint22]) g.title = '"report total traffic"' g.start = endTime - delta g.step = step g.width = 397 g.height = 182 g.write(debug=True) # g.filename = graphfileLg_total_traffic # g.width = 800 # g.height = 400 # g.write() # ## g1 = Graph(graphfile_total_request, end=endTime, vertical_label='Request/s', color=ca) g1.data.extend([def3, vdef31, vdef32, line3, gprint31, gprint32]) g1.title = '"report total request"' g1.start = endTime - settings.DELTA g1.step = step g1.width = 397 g1.height = 182 g1.write(debug=True)
line1 = LINE(value=100, color='#990000', legend='Maximum Allowed') area1 = AREA(defObj=cdef3, color='#006600', legend='Good Speed') area2 = AREA(defObj=cdef2, color='#CC6633', legend='Too Fast') line2 = LINE(defObj=vdef2, color='#000099', legend='My Average', stack=True) gprint1 = GPRINT(vdef2, '%6.2lf kph') from pyrrd.graph import ColorAttributes ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' from pyrrd.graph import Graph graphfile = "/tmp/rrdgraph.png" g = Graph(graphfile, start=920805000, end=920810000, vertical_label='km/h', color=ca) g.data.extend([ def1, cdef1, cdef2, cdef3, vdef1, vdef2, line1, area1, area2, line2, gprint1 ]) g.write()
area3 = AREA(defObj=def3, color='#BD4902', legend='Raw Data 2') area4 = AREA(defObj=def4, color='#A32001', legend='Raw Data 1') line1 = LINE(defObj=vdef1, color='#01FF13', legend='Average', stack=True) # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph startTime = endTime - 3 * month g = Graph(graphfile, start=startTime, end=endTime, vertical_label='data', color=ca) g.data.extend([def1, def2, def3, def4, vdef1, area4, area3, area2, area1]) g.write() g.filename = graphfileLg g.width = 800 g.height = 400 g.write()
def prepare(self, args): self.graph = Graph(self.filename, start=self.start, end=self.end, step=self.step, height=self.height, width=self.width, title=self.title, vertical_label=self.vertical_label, color=self.color) self.graph.data.extend(args)
# Let's set up the objects that will be added to the graph def1 = DEF(rrdfile=myRRD.filename, vname='myspeed', dsName=ds1.name) vdef1 = VDEF(vname='myavg', rpn='%s,AVERAGE' % def1.vname) area1 = AREA(defObj=def1, color='#FFA902', legend='Raw Data') line1 = LINE(defObj=vdef1, color='#01FF13', legend='Average', stack=True) # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph startTime = endTime - 3 * month g = Graph(graphfile, start=startTime, end=endTime, vertical_label='data', color=ca) g.data.extend([def1, vdef1, area1]) g.write() g = Graph(graphfile_lg, start=startTime, end=endTime, vertical_label='data', color=ca) g.width = 800 g.height = 400 g.data.extend([def1, vdef1, area1]) g.write()
class Graph(object): def __init__(self, devices, plugin, data_source, time_from=time()-60*60, time_to=time(), width=settings.GRAPH_WIDTH, height=settings.GRAPH_HEIGHT, mode=AGGREGATED, comment="", add_comment=True): """ Constructor. Needed parameters: list of devices, plugin name, data source name Optional parameters: time_from and time_to (default before 1 hour till now), width and height of graph in pixel, mode aggregated or multi-line, comment To set multi-line graph use mode=rrdscout.MULTI_LINE """ self.devices = devices self.plugin = plugin self.data_source = data_source self.time_from = time_from self.time_to = time_to self.width = width self.height = height self.mode = mode self.title = "" self.y_label = "" self.attachment_name = "" self.comment = comment self.add_comment = add_comment self.out_file = tempfile.NamedTemporaryFile('rw', suffix='.png', dir=settings.TEMP_DIR, delete=True) self._defs = [] self._cdefs = [] self._def_map = {} self._cdef_map = {} self._cdef_values = {} self._metadata = {} self._lines = [] self._areas = {} self._vdefs = [] self._gprints = [] self._got_errors = False self._cf_map = {'min': 'MINIMUM', 'max': 'MAXIMUM', 'average': 'AVERAGE'} graph_color = ColorAttributes() graph_color.back = '#ffffff' graph_color.shadea = '#ffffff' graph_color.shadeb = '#ffffff' self.graph = PyrrdGraph(self.out_file.name, start=self.time_from, end=self.time_to, width=self.width, height=self.height, color=graph_color) def _generate_defs(self): """ FOR INTERNAL USE ONLY This generates an RRD DEF objects for every data source in every device (rrd file) and saves them in the list self._defs. Additionally it generates a dictionary def_map with key is DEF name and value is a lookup key for metadata Saves meta information for DEFs and CDEFs like device, data source and cf in metadata """ def_count = 0 self._defs = [] self._def_map = {} for device in self.devices: rrd_file = get_rrd_file(device, self.plugin, self.data_source) if os.path.isfile(rrd_file): # Get all data sources from rrd for data_source in get_data_sources(rrd_file): for cf in self._cf_map.keys(): metadata_key = cf + str(def_count) # generate definition def_vname = 'def_%s_%s_%s' % (data_source, cf, str(def_count)) self._def_map[def_vname] = metadata_key self._metadata.setdefault(metadata_key, {}) self._metadata[metadata_key]['data_source'] = data_source self._metadata[metadata_key]['device'] = device self._metadata[metadata_key]['cf'] = cf self._defs.append( DEF(rrdfile=rrd_file, dsName=data_source, cdef=cf.upper(), vname=def_vname) ) def_count += 1 def _generate_cdefs(self): """ FOR INTERNAL USE ONLY This generates an RRD CDEF object for every DEF object and saves them in the list self._cdefs. Additionally it generates a dictionary cdef_map with key is CDEF name and value is a lookup key for metadata metadata saves meta information for DEFs and CDEFs like device, data source and cf This function adds a vnames lookup which includes all DEF objects that should be calculated to build the CDEF """ def_count = 0 self._cdefs = [] self._cdef_map = {} self._cdef_values = {} # generate cdef map # for every data_source keep a list of definitions to calculate for (def_vname, metadata_key) in self._def_map.items(): if self.mode == MULTI_LINE: cdef_vname = 'cdef_%s_%s_%s' % (self._metadata[metadata_key]['data_source'], self._metadata[metadata_key]['cf'], def_count) def_count += 1 else: cdef_vname = 'cdef_%s_%s' % (self._metadata[metadata_key]['data_source'], self._metadata[metadata_key]['cf']) self._cdef_map[cdef_vname] = metadata_key self._cdef_values.setdefault(cdef_vname, []).append(def_vname) def_count = 0 # Iterate over all cdefs and either generate a rpn to aggregate all defs in values or if mode is multi-line # generate a rpn for every single def for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] if self.mode == MULTI_LINE: for vname in self._cdef_values[cdef_vname]: cdef = CDEF(vname=cdef_vname + "_" + str(def_count), rpn=self._generate_rpn(cdef_opts['data_source'], vname)) self._metadata[metadata_key].setdefault('cdef_objs', []).append(cdef) self._cdefs.append(cdef) def_count += 1 else: cdef = CDEF(vname=cdef_vname + "_" + str(def_count), rpn=self._generate_rpn(cdef_opts['data_source'], self._cdef_values[cdef_vname])) self._metadata[metadata_key].setdefault('cdef_objs', []).append(cdef) self._cdefs.append(cdef) def_count += 1 def _generate_lines(self): """ FOR INTERNAL USE ONLY This generates an RRD LINE object to graph for every CDEF object with the CF average and saves them in the list self._lines. """ color_count = 0 self._lines = [] for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] # Draw only average value as line if cdef_opts['cf'] == "average": for cdef_obj in cdef_opts['cdef_objs']: if color_count >= len(settings.COLOR_LINES): color_count = 0 line_color = settings.COLOR_LINES[color_count] color_count += 1 if self.mode == MULTI_LINE: self._lines.append(LINE(defObj=cdef_obj, color=line_color, legend=cdef_opts['device'] + " - " + str(color_count))) else: self._lines.append(LINE(defObj=cdef_obj, color=line_color)) def _generate_areas(self): """ FOR INTERNAL USE ONLY This generates an RRD AREA object for every CDEF object with the CF min or max and saves them in the list self._areas. Only useful in aggregated (single line) graphs """ self._areas = {} for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] if cdef_opts['cf'] == "max": self._areas.setdefault('max', []).append(AREA(defObj=cdef_opts['cdef_objs'][0], color=settings.COLOR_AREA_MAX)) elif cdef_opts['cf'] == "min": self._areas.setdefault('min', []).append(AREA(defObj=cdef_opts['cdef_objs'][0], color=settings.COLOR_AREA_MIN)) def _generate_table(self): """ FOR INTERNAL USE ONLY This generates an RRD VDEF and GPRINT object for every CDEF object and saves them in the list self._vdefs and self._gprints. """ def_count = 0 self._vdefs = [] self._gprints = [] for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] if cdef_opts['cf'] == "average": vdef = VariableDefinition(vname="vdef_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "AVERAGE")) gprint_label = gettext("Avg") vdef_last = VariableDefinition(vname="vdef_last_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "LAST")) self._vdefs.append(vdef_last) if cdef_opts['data_source'] not in settings.DATA_SOURCES_WITHOUT_SUMMARY: self._gprints.append(GPRINT(vdef_last, 'Last %0.1lf')) # Draw min and max as area if cdef_opts['cf'] == "max": vdef = VariableDefinition(vname="vdef_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "MAXIMUM")) gprint_label = gettext("Max") elif cdef_opts['cf'] == "min": vdef = VariableDefinition(vname="vdef_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "MINIMUM")) gprint_label = gettext("Min") # create table if vdef and cdef_opts['data_source'] not in settings.DATA_SOURCES_WITHOUT_SUMMARY: self._vdefs.append(vdef) self._gprints.append(GPRINT(vdef, gprint_label + ' %0.1lf')) def_count += 1 def _generate_rpn(self, data_source, vnames): """ FOR INTERNAL USE ONLY Generate calculation for given data source Look into the setting if we should automatically recalculate this data_source We add 0 if we cannot find any way to recalculate """ if type(vnames) == str: vnames = [vnames] # if no cdefop is given we just add 0 default_cdef = '$VALUE,0,+' rpn = settings.CALC_OPERATION.get(settings.DATA_SOURCE_CONVERT.get(data_source)) summands = [] if not rpn: rpn = default_cdef for def_vname in vnames: rpn = rpn.replace('$VALUE', def_vname) rpn = rpn.replace('$QUANTITY', str(len(vnames))) summands.append(rpn) if len(vnames) == 1: rpn = summands[0] else: rpn = ",".join(summands) # postfix operation for each pair of summands for i in range(1, len(vnames)): rpn += ",+" return rpn def _generate_title(self): """ FOR INTERNAL USE ONLY Generate the graph title Look into settings if we should automatically translate the data source name Make sure there are no spaces """ if len(self.devices) == 1: self.title = translate(self.data_source, self.devices[0]).replace(' ', '_') else: self.title = translate(self.data_source).replace(' ', '_') def _generate_y_axis_label(self): """ FOR INTERNAL USE ONLY Generate the label for the graph """ self.y_label = "" for device in self.devices: device = get_device_name(device) rrd_file = get_rrd_file(device, self.plugin, self.data_source) if os.path.isfile(rrd_file): # Get all data sources from rrd for data_source in get_data_sources(rrd_file): self.y_label = "".join(Graph.get_label_for_data_source(data_source)) self.y_label = self.y_label.replace(' ','_') @staticmethod def get_label_for_data_source(data_source): """ Return the converted data source name or the data source name if we cannot find a conversion """ return settings.GRAPH_LABEL.get(data_source, data_source) @staticmethod def generate_comment(label_input): """ Generate a comment for graph from device list or just make sure that a comment doesnt overflow and have unwanted chars """ graph_comment = "" if type(label_input) == list: graph_comment = ','.join([get_device_name(x).split('.')[0] for x in label_input]) elif type(label_input) == str or type(label_input) == unicode: graph_comment = label_input.lstrip("'").rstrip("'") else: try: graph_comment = str(label_input) except ValueError: pass if len(graph_comment) > MAX_GRAPH_COMMENT_SIZE: graph_comment = graph_comment[0:MAX_GRAPH_COMMENT_SIZE] + "..." # elif len(graph_comment) < MAX_GRAPH_COMMENT_SIZE: # graph_comment = graph_comment + " " * int(MAX_GRAPH_COMMENT_SIZE) - len(graph_comment) graph_comment = graph_comment.replace("\"", "").replace("'", "") return graph_comment.encode("ascii", "ignore") def generate_attachment_name(self, suffix="png"): """ Generate the attachment file name for the graph for the given suffix Default suffix is png """ self.attachment_name = "" if len(self.devices) == 1: self.attachment_name = quote(self.devices[0].replace('.', '_')) + "_" + quote(self.plugin) + \ "_" + quote(self.data_source + "." + suffix) else: self.attachment_name = quote(self.plugin) + "_" + quote(self.data_source + "." + suffix) def generate_graph(self): """ Generate all needed RRD objects like DEFs, CDEFs, LINES etc and stuff them together to create a graph You can use failed() to check if we got errors otherwise graph will be in out_file """ self._generate_defs() self._generate_cdefs() self._generate_lines() self._generate_title() self._generate_y_axis_label() self.generate_attachment_name() self.graph.title = self.title # Add vertical axes label self.graph.vertical_label = self._generate_y_axis_label() # Add all data to the graph self.graph.data = [] self.graph.data.extend(self._defs) self.graph.data.extend(self._cdefs) # min must be after max to overpaint max color in area if self.mode == AGGREGATED: self._generate_areas() self.graph.data.extend(self._areas['max']) self.graph.data.extend(self._areas['min']) self.graph.data.extend(sorted(self._lines, key=lambda x: x.legend)) # Add a graph comment if self.add_comment: if self.comment: graph_comment = self.generate_comment(self.comment) else: graph_comment = self.generate_comment(self.devices) self.graph.data.append(GraphComment(graph_comment, autoNewline=False)) # Add table if self.mode == AGGREGATED: self._generate_table() self.graph.data.extend(self._vdefs) self.graph.data.extend(sorted(self._gprints, key=lambda x: x.format)) try: self.graph.write() except Exception: self.__got_error = True def generation_failed(self): """ Returns true if generation failed """ if len(self._defs) == 0 or self._got_errors: return True else: return False
def GenerateGraph(): data = db.GetDataHumidityRrd(10000) #print len(data) filename = 'humidity.rrd' graphfile = 'humidity.png' graphfileLg = 'humidity-large.png' day = 24 * 60 * 60 week = 7 * day month = day * 30 quarter = month * 3 half = 365 * day / 2 year = 365 * day startTime = data[0][0] -1 endTime = data[-1][0] step = 1000 maxSteps = int((endTime-startTime)/step) # Let's create and RRD file and dump some data in it dss = [] ds1 = DS(dsName='humidity', dsType='GAUGE', heartbeat=60) dss.extend([ds1]) #week: RA:AVERAGE:0.5:6:336 #For Daily Graph, every 5 minute average for 24 hours: #RRA:AVERAGE:0.5:1:288 rra1 = RRA(cf='AVERAGE', xff=0.5, steps=1, rows=1440) #For Weekly Graph, every 30 minute average for 7 days: #RRA:AVERAGE:0.5:6:336 #rra1 = RRA(cf='AVERAGE', xff=0.5, steps=6, rows=336) #For Monthly Graph, every 2 hour average for 30 days: #RRA:AVERAGE:0.5:24:360 #rra1 = RRA(cf='AVERAGE', xff=0.5, steps=32, rows=1080) #For Yearly Graph, every 1 day average for 365 days: #RRA:AVERAGE:0.5:288:365 #rra1 = RRA(cf='AVERAGE', xff=0.5, steps=96, rows=365) rras = [] #rra1 = RRA(cf='AVERAGE', xff=0.5, steps=24, rows=1460) rras.append(rra1) myRRD = RRD(filename, ds=dss, rra=rras, start=startTime) myRRD.create() # let's generate some data... currentTime = startTime i = 0 for row in data: timestamp = row[0] value1 = row[1] # lets update the RRD/purge the buffer ever 100 entires i = i + 1 if i % 100 == 0: myRRD.update(debug=False) # when you pass more than one value to update buffer like this, # they get applied to the DSs in the order that the DSs were # "defined" or added to the RRD object. myRRD.bufferValue(timestamp, value1) # add anything remaining in the buffer myRRD.update() # Let's set up the objects that will be added to the graph def1 = DEF(rrdfile=myRRD.filename, vname='anturi1', dsName=ds1.name) vdef1 = VDEF(vname='myavg', rpn='%s,AVERAGE' % def1.vname) sensor1 = LINE(defObj=def1, color='#4544FC', legend='anturi1') line1 = LINE(defObj=vdef1, color='#01FF13', legend='Average', stack=True) # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#000000' ca.canvas = '#000000' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph #startTime = endTime - 3 * month g = Graph(graphfile, start=startTime, end=endTime, vertical_label='kosteus', color=ca) g.data.extend([def1, vdef1, sensor1]) g.write() g.filename = graphfileLg g.width = 690 g.height = 300 g.write()
time.sleep(2) c -= 1 def1 = DEF(rrdfile=myRRD.filename, vname='myzaehlerstand', dsName=dataSource.name) cdef1 = CDEF(vname='verbrauchpros', rpn='%s,86400,*' % def1.vname) vdef1 = VDEF(vname='myavg', rpn='%s,AVERAGE' % def1.vname) line = LINE(defObj=cdef1, color='#006600', legend='Zaehlerstand') gprint1 = GPRINT(vdef1, '%6.2lf KWh per Day') ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' from pyrrd.graph import Graph graphfile = "/tmp/rrdgraph.png" g = Graph(graphfile, start=startTime , end=startTime + 300, vertical_label='w/s', color=ca) g.step = 10 g.data.extend([def1, cdef1, line, vdef1, gprint1]) g.width = 800 g.height = 400 g.write()
def graph_totals(ip=None): graph_type = ip.split('.')[2] + "-" + ip.split('.')[3] if ip else 'network' graph_setups = [ ('total_bytes', 'Bytes'), ('total_pkts', 'Packets'), ('total_flows', 'Flows'), ('total_log_bytes', 'logBytes'), ('total_log_pkts', 'logPackets'), ('total_log_flows', 'logFlows'), ('int_ip_entropy', 'IntIPEntropy'), ('ext_ip_entropy', 'ExtIPEntropy'), ('d_int_ip_entropy', 'deltaIntIPEntropy'), ('d_ext_ip_entropy', 'deltaExtIPEntropy'), ('wireless_retries', 'nRetries') ] dss = [] for graph in graph_setups: dss.append( DS(dsName=graph[0], dsType='GAUGE', heartbeat=900) ) dbl_graph_setups = [ ('ivo_bytes', 'Bytes'), ('ivo_pkts', 'Pkts'), ('ivo_flows', 'Flows')] for graph in dbl_graph_setups: dss.append( DS(dsName='in_'+graph[0], dsType='GAUGE', heartbeat=900) ) dss.append( DS(dsName='out_'+graph[0], dsType='GAUGE', heartbeat=900) ) myRRD = RRD(rrd_file % graph_type, step=60, ds=dss, rra=rras, start=startTime-60) myRRD.create(debug=False) counter = 0 for flow_key in keys: if ip: if ip in flows[flow_key]['internal']: in_bytes, out_bytes = (flows[flow_key])['internal'][ip]['in_bytes'], (flows[flow_key])['internal'][ip]['out_bytes'] in_pkts, out_pkts = (flows[flow_key])['internal'][ip]['in_pkts'], (flows[flow_key])['internal'][ip]['out_pkts'] in_flows, out_flows = (flows[flow_key])['internal'][ip]['in_flows'], (flows[flow_key])['internal'][ip]['out_flows'] total_bytes = in_bytes + out_bytes total_pkts = in_pkts + out_pkts total_flows = in_flows + out_flows log_bytes, log_pkts, log_flows = log(total_bytes, 2), log(total_pkts, 2), log(total_flows, 2) nretries = (flows[flow_key])['internal'][ip]['nretries'] else: in_bytes = out_bytes = in_pkts = out_pkts = in_flows = out_flows = 'U' total_bytes = total_pkts = total_flows = 'U' log_bytes = log_pkts = log_flows = 'U' nretries = 'U' myRRD.bufferValue( int(flow_key), total_bytes, total_pkts, total_flows, log_bytes, log_pkts, log_flows, flow_entropies[flow_key]['external'][ip] if ip in flow_entropies[flow_key]['external'] else 0, 0, delta_flow_entropies[flow_key]['external'][ip] if ip in flow_entropies[flow_key]['external'] else 0, 0,#delta_flow_entropies[flow_key]['internal'][ip], nretries, in_bytes, out_bytes, in_pkts, out_pkts, in_flows, out_flows, ) else: in_bytes, out_bytes = (flows[flow_key])['in_bytes'], (flows[flow_key])['out_bytes'] in_pkts, out_pkts = (flows[flow_key])['in_pkts'], (flows[flow_key])['out_pkts'] in_flows, out_flows = (flows[flow_key])['in_flows'], (flows[flow_key])['out_flows'] total_bytes = in_bytes + out_bytes total_pkts = in_pkts + out_pkts total_flows = in_flows + out_flows log_bytes = log(total_bytes, 2) if total_bytes else 0 log_pkts = log(total_pkts, 2) if total_pkts else 0 log_flows = log(total_flows, 2) if total_flows else 0 nretries = (flows[flow_key])['nretries'] myRRD.bufferValue( int(flow_key), total_bytes, total_pkts, total_flows, log_bytes, log_pkts, log_flows, flow_entropies[flow_key]['global_external'], 0,#flow_entropies[flow_key]['global_internal'], delta_flow_entropies[flow_key]['global_external'], 0,#delta_flow_entropies[flow_key]['global_internal'], nretries, in_bytes, out_bytes, in_pkts, out_pkts, in_flows, out_flows, ) counter += 1 if counter % 10 == 0: myRRD.update() myRRD.update() for idx, (feature, label) in enumerate(graph_setups[:-1]): def1 = DEF(rrdfile=myRRD.filename, vname=label, dsName=dss[idx].name) vdef1 = VDEF(vname='avg', rpn='%s,AVERAGE' % def1.vname) vdef2 = VDEF(vname='min', rpn='%s,MINIMUM' % def1.vname) vdef3 = VDEF(vname='max', rpn='%s,MAXIMUM' % def1.vname) vdef4 = VDEF(vname='stdev', rpn='%s,STDEV' % def1.vname) cdef1 = CDEF(vname='slightlyhigh', rpn='%s,avg,stdev,+,GE,%s,UNKN,IF' % (def1.vname, def1.vname)) cdef2 = CDEF(vname='abnormallyhigh', rpn='%s,avg,stdev,1.5,*,+,GE,%s,UNKN,IF' % (def1.vname, def1.vname)) cdef3 = CDEF(vname='vhigh', rpn='%s,avg,stdev,2.0,*,+,GE,%s,UNKN,IF' % (def1.vname, def1.vname)) cdef4 = CDEF(vname='slightlylow', rpn='%s,avg,stdev,-,LE,%s,UNKN,IF' % (def1.vname, def1.vname)) cdef5 = CDEF(vname='abnormallylow', rpn='%s,avg,stdev,1.5,*,-,LE,%s,UNKN,IF' % (def1.vname, def1.vname)) cdef6 = CDEF(vname='vlow', rpn='%s,avg,stdev,2.0,*,-,LE,%s,UNKN,IF' % (def1.vname, def1.vname)) area1 = AREA(defObj=def1, color='#00FF00') area2 = AREA(defObj=cdef1, color='#FFFF00') area3 = AREA(defObj=cdef2, color='#FF9900') area4 = AREA(defObj=cdef3, color='#FF0000') area5 = AREA(defObj=cdef4, color='#FFFF00') area6 = AREA(defObj=cdef4, color='#FF9900') area7 = AREA(defObj=cdef4, color='#FF0000') gprint1 = GPRINT(vdef1, 'Average %.2lf') gprint2 = GPRINT(vdef2, 'Min %.2lf') gprint3 = GPRINT(vdef3, 'Max %.2lf') gprint4 = GPRINT(vdef4, 'Stdev %.2lf') g = Graph(graph_file % (graph_type, feature), start=int(keys[0]), end=int(keys[-1]) ) g.data.extend([def1, vdef1, vdef2, vdef3, vdef4, cdef1, cdef2, cdef3, cdef4, cdef5, cdef6, area1, area2, area3, area4, area5, area6, area7, gprint1, gprint2, gprint3, gprint4 ]) if idx > 5: g.width = 380 else: g.width = 540 g.height = 100 g.write() wireless_index = len(graph_setups) - 1 wireless_feature, wireless_label = graph_setups[wireless_index] def1 = DEF(rrdfile=myRRD.filename, vname=wireless_label, dsName=dss[wireless_index].name) line1 = LINE(defObj=def1, color='#FF0000') g = Graph(graph_file % (graph_type, wireless_feature), start=int(keys[0]), end=int(keys[-1]) ) g.data.extend([def1, line1]) g.width = 1800 g.height = 80 g.write() for idx, (feature, label) in enumerate(dbl_graph_setups): def1 = DEF(rrdfile=myRRD.filename, vname=label+'IN', dsName=(dss[len(dss)-(len(dbl_graph_setups)*2)+(idx*2)]).name) def2 = DEF(rrdfile=myRRD.filename, vname=label+'OUT', dsName=(dss[len(dss)-(len(dbl_graph_setups)*2)+(idx*2)+1]).name) cdef1 = CDEF(vname=label[0]+'IN', rpn='%s' % def1.vname) cdef2 = CDEF(vname=label[0]+'OUT', rpn='%s,-1,*' % def2.vname) area1 = AREA(defObj=cdef1, color='#FF0000') area2 = AREA(defObj=cdef2, color='#00FF00') g = Graph(graph_file % (graph_type, feature), start=int(keys[0]), end=int(keys[-1])) g.data.extend([def1, def2, cdef1, cdef2, area1, area2]) g.width = 380 g.height = 100 g.write()
def4 = DEF(rrdfile=myRRD.filename, vname='mydementia', dsName=ds4.name) vdef1 = VDEF(vname='myavg', rpn='%s,AVERAGE' % def1.vname) area1 = AREA(defObj=def1, color='#FFA902', legend='Raw Data 4') area2 = AREA(defObj=def2, color='#DA7202', legend='Raw Data 3') area3 = AREA(defObj=def3, color='#BD4902', legend='Raw Data 2') area4 = AREA(defObj=def4, color='#A32001', legend='Raw Data 1') line1 = LINE(defObj=vdef1, color='#01FF13', legend='Average', stack=True) # Let's configure some custom colors for the graph ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' # Now that we've got everything set up, let's make a graph startTime = endTime - 3 * month g = Graph(graphfile, start=startTime, end=endTime, vertical_label='data', color=ca) g.data.extend([def1, def2, def3, def4, vdef1, area4, area3, area2, area1]) g.write() g.filename = graphfileLg g.width = 800 g.height = 400 g.write()
def graph_connection(self, period='day'): def1 = DEF(rrdfile=self.rrdfile, vname='connections', dsName="connections", cdef="AVERAGE") def2 = DEF(rrdfile=self.rrdfile, vname='reading', dsName="reading", cdef="AVERAGE") def3 = DEF(rrdfile=self.rrdfile, vname='writing', dsName="writing", cdef="AVERAGE") def4 = DEF(rrdfile=self.rrdfile, vname='waiting', dsName="waiting", cdef="AVERAGE") # TOTAL vdef1 = VDEF(vname='max', rpn='connections,MAXIMUM') vdef2 = VDEF(vname='avg', rpn='connections,AVERAGE') vdef3 = VDEF(vname='last', rpn='connections,LAST') vdef4 = VDEF(vname='min', rpn='connections,MINIMUM') line1 = LINE(1, defObj=def1, color='#22FF22', legend='Total') gprint1 = GPRINT(vdef1, "Max\\: %5.1lf %S") gprint2 = GPRINT(vdef2, "Avg\\: %5.1lf %S") gprint3 = GPRINT(vdef3, "Current\\: %5.1lf %S") gprint4 = GPRINT(vdef4, "Min\\: %5.1lf %S\\n") # READING reading_vdef1 = VDEF(vname='rmax', rpn='reading,MAXIMUM') reading_vdef2 = VDEF(vname='ravg', rpn='reading,AVERAGE') reading_vdef3 = VDEF(vname='rlast', rpn='reading,LAST') reading_vdef4 = VDEF(vname='rmin', rpn='reading,MINIMUM') line2 = LINE(1, defObj=def2, color='#0022FF', legend='Reading') reading_gprint1 = GPRINT(reading_vdef1, "Max\\: %5.1lf %S") reading_gprint2 = GPRINT(reading_vdef2, "Avg\\: %5.1lf %S") reading_gprint3 = GPRINT(reading_vdef3, "Current\\: %5.1lf %S") reading_gprint4 = GPRINT(reading_vdef4, "Min\\: %5.1lf %S\\n") # writing writing_vdef1 = VDEF(vname='wmax', rpn='writing,MAXIMUM') writing_vdef2 = VDEF(vname='wavg', rpn='writing,AVERAGE') writing_vdef3 = VDEF(vname='wlast', rpn='writing,LAST') writing_vdef4 = VDEF(vname='wmin', rpn='writing,MINIMUM') line3 = LINE(1, defObj=def3, color='#FF0000', legend='Writing') writing_gprint1 = GPRINT(writing_vdef1, "Max\\: %5.1lf %S") writing_gprint2 = GPRINT(writing_vdef2, "Avg\\: %5.1lf %S") writing_gprint3 = GPRINT(writing_vdef3, "Current\\: %5.1lf %S") writing_gprint4 = GPRINT(writing_vdef4, "Min\\: %5.1lf %S\\n") # WAITING waiting_vdef1 = VDEF(vname='wamax', rpn='waiting,MAXIMUM') waiting_vdef2 = VDEF(vname='waavg', rpn='waiting,AVERAGE') waiting_vdef3 = VDEF(vname='walast', rpn='waiting,LAST') waiting_vdef4 = VDEF(vname='wamin', rpn='waiting,MINIMUM') line4 = LINE(1, defObj=def4, color='#00AAAA', legend='Waiting') waiting_gprint1 = GPRINT(waiting_vdef1, "Max\\: %5.1lf %S") waiting_gprint2 = GPRINT(waiting_vdef2, "Avg\\: %5.1lf %S") waiting_gprint3 = GPRINT(waiting_vdef3, "Current\\: %5.1lf %S") waiting_gprint4 = GPRINT(waiting_vdef4, "Min\\: %5.1lf %S\\n") ca = ColorAttributes() ca.back = '#333333' ca.canvas = '#333333' ca.shadea = '#000000' ca.shadeb = '#111111' ca.mgrid = '#CCCCCC' ca.axis = '#FFFFFF' ca.frame = '#AAAAAA' ca.font = '#FFFFFF' ca.arrow = '#FFFFFF' img = "connection-%s.png" % period imgname = self.static_path +"/"+ img start = '-1'+period g = Graph(imgname, imgformat='PNG', step=start, vertical_label='connections', color=ca, width=700, height=150) g.data.extend([def1, vdef1, vdef2, vdef3, vdef4, line1, gprint1, gprint2, gprint3, gprint4]) g.data.extend([def2, reading_vdef1, reading_vdef2, reading_vdef3, reading_vdef4, line2, reading_gprint1, reading_gprint2, reading_gprint3, reading_gprint4]) g.data.extend([def3, writing_vdef1, writing_vdef2, writing_vdef3, writing_vdef4, line3, writing_gprint1, writing_gprint2, writing_gprint3, writing_gprint4]) g.data.extend([def4, waiting_vdef1, waiting_vdef2, waiting_vdef3, waiting_vdef4, line4, waiting_gprint1, waiting_gprint2, waiting_gprint3, waiting_gprint4]) g.write()
def drawgraph(req, graphid): now = int(time.time()) ginfo = Rrdgraph.objects.get(pk=graphid) gobjects = GraphItems.objects.filter(graph__id=graphid).order_by('seq') gitems = [] secondsago = secsago(req) if secondsago == 0: secondsago = 3600 # secsago = ginfo.timespan end = int(req.GET.get('end', now)) start = int(req.GET.get('start', end - secondsago)) for gobject in gobjects: #cycle through graph items...need to order this above if gobject.itemtype == 'S': #Handle Static RRD DataSources rootdir = gobject.rrdds.rootdir.path subpath = gobject.rrdds.subpath rrdds = gobject.rrdds.ds filename = rootdir + '/' + gobject.rrdds.subpath rra = gobject.rra namesuff = str(gobject.seq) legendtext = subpath+" "+rrdds+" "+rra+ " " gitems.append(DEF(rrdfile=filename, vname='d'+namesuff, dsName=rrdds)) gitems.append(CDEF(vname='c'+namesuff, rpn='%s' % 'd'+namesuff)) linetype = gobject.linetype.upper() mycolor = '#' + gobject.color + gobject.transparency if linetype == 'A': gitems.append(AREA(value='c'+namesuff, color=mycolor, legend=legendtext, stack=gobject.stack)) elif linetype[:1] == 'L': gitems.append(LINE(linetype[-1:], 'c'+namesuff, color=mycolor, legend=legendtext, stack=gobject.stack)) else: gitems.append(LINE(0, 'c'+namesuff, color=mycolor, legend=legendtext, stack=gobject.stack)) if gobject.itemtype == 'R': #Handle Regex regtextarr = gobject.option_text.rsplit(' ',2) rrddslist = Rrdfiles.objects.filter(rootdir__name__regex=regtextarr[0]).filter(subpath__regex=regtextarr[1]).filter(ds__regex=regtextarr[2]) i = 0 colors = [] colorset = GraphItemColorCycleColor.objects.filter(name='weeee').order_by('seq') for x in colorset: colors.append(str('#' + x.color)) for rrdds in rrddslist: rootdir = rrdds.rootdir.path subpath = rrdds.subpath rrdds = rrdds.ds filename = rootdir + subpath rra = gobject.rra linetype = gobject.linetype.upper() mycolor = colors[i % len(colors)] namesuff = str(gobject.seq) + '_' + str(i) legendtext = subpath+" "+rrdds+" ("+rra+ ") " gitems.append(DEF(rrdfile=filename, vname='d'+namesuff, dsName=rrdds)) gitems.append(CDEF(vname='c'+namesuff, rpn='%s' % 'd'+namesuff)) if linetype == 'A': gitems.append(AREA(value='c'+namesuff, color=mycolor, legend=legendtext, stack=gobject.stack)) elif linetype[:1] == 'L': gitems.append(LINE(linetype[-1:], 'c'+namesuff, color=mycolor, legend=legendtext, stack=gobject.stack)) else: gitems.append(LINE(0, 'c'+namesuff, color=mycolor, legend=legendtext, stack=gobject.stack)) prnFmt = '%6.2lf' vdef = VDEF(vname='va'+namesuff, rpn='%s,AVERAGE' % ('d'+namesuff) ) gitems.append(vdef) gitems.append(GPRINT(vdef, ('Avg\:'+prnFmt))) vdef = VDEF(vname='vn'+namesuff, rpn='%s,MINIMUM' % ('d'+namesuff) ) gitems.append(vdef) gitems.append(GPRINT(vdef, ('Min\:'+prnFmt))) vdef = VDEF(vname='vx'+namesuff, rpn='%s,MAXIMUM' % ('d'+namesuff) ) gitems.append(vdef) gitems.append(GPRINT(vdef, ('Max\:'+prnFmt))) vdef = VDEF(vname='vl'+namesuff, rpn='%s,LAST' % ('d'+namesuff) ) gitems.append(vdef) gitems.append(GPRINT(vdef, ('LAST\:'+prnFmt+'\\n'))) #gitems.append(COMMENT('\\n', False)) i = i + 1 if gobject.itemtype == 'C': #Handle Custom CDEFS pass if gobject.itemtype == 'V': #Handle Custom VDEFs pass cs = req.GET.get('cs', ginfo.gcolorscheme) colsch = GraphColorScheme.objects.get(pk=cs) ca = ColorAttributes() ca.back = '#' + colsch.cback + colsch.tback ca.canvas = '#' + colsch.ccanvas + colsch.tcanvas ca.shadea = '#' + colsch.cshadea + colsch.tshadea ca.shadeb = '#' + colsch.cshadeb + colsch.tshadeb ca.mgrid = '#' + colsch.cmgrid + colsch.tmgrid ca.axis = '#' + colsch.caxis + colsch.taxis ca.frame = '#' + colsch.cframe + colsch.tframe ca.font = '#' + colsch.cfont + colsch.tfont ca.arrow = '#' + colsch.carrow + colsch.tarrow #make a pyrrd Graph object, destination standard out (-) g = Graph('-', imgformat='png', start=start, end=end, color=ca, vertical_label='"'+ginfo.vertical_label+'"') #populate it with our url params, defaulting to Rrdgraph instance (ginfo) options fullsizemode = req.GET.get('fullsizemode') if (fullsizemode in ['0', 'False' , 'false', 'no', 'No']): g.full_size_mode = False else: g.full_size_mode = True graphonly = req.GET.get('graphonly') if (graphonly in ['1', 'True' , 'true', 'yes']): g.only_graph = True noleg = req.GET.get('nolegend') if (noleg in ['1', 'True' , 'true', 'yes']): g.no_legend = True log = req.GET.get('logarithmic') if (log in ['1', 'True' , 'true', 'yes', 'Yes']): g.logarithmic = True elif (log in ['0', 'False' , 'false', 'no', 'No']): g.logarithmic = False else: g.logarithmic = getattr(ginfo, 'logarithmic', False) g.disable_rrdtool_tags = True g.height = req.GET.get('height', 600) g.width = req.GET.get('width', 1200) g.title = '"'+ginfo.name+'"' g.data.extend(gitems) #write in our gitems we generated a = g.write() #gets the binary image finally #minetype #just a thing to cause an error and debug return HttpResponse(a,mimetype="image/png")
# skip a line in the file after last sensor try: f = open(resultsfile, "a") try: f.write("\n") finally: f.close() except (IOError): print "\nCould not write to the file\n" # write to the graph files gb = Graph( graphfile_blk, start=start_time, end=next_meas_time - measurement_interval, color=black_bkgnd, vertical_label="Degrees\ F", width=600, height=how_high, title=title_it, ) gw = Graph( graphfile_wht, start=start_time, end=next_meas_time - measurement_interval, color=white_bkgnd, vertical_label="Degrees\ F", width=600, height=how_high, title=title_it, )
class Graph(object): def __init__(self, devices, plugin, data_source, time_from=time()-60*60, time_to=time(), width=settings.GRAPH_WIDTH, height=settings.GRAPH_HEIGHT, mode=AGGREGATED, comment="", add_comment=True): """ Constructor. Needed parameters: list of devices, plugin name, data source name Optional parameters: time_from and time_to (default before 1 hour till now), width and height of graph in pixel, mode aggregated or multi-line, comment To set multi-line graph use mode=rrdscout.MULTI_LINE """ self.devices = devices self.plugin = plugin self.data_source = data_source self.time_from = time_from self.time_to = time_to self.width = width self.height = height self.mode = mode self.title = "" self.y_label = "" self.attachment_name = "" self.comment = comment self.add_comment = add_comment self.out_file = tempfile.NamedTemporaryFile('rw', suffix='.%s' % settings.GRAPH_FORMAT, dir=settings.TEMP_DIR, delete=True) self._defs = [] self._cdefs = [] self._def_map = {} self._cdef_map = {} self._cdef_values = {} self._metadata = {} self._lines = [] self._areas = {} self._vdefs = [] self._gprints = [] self._got_errors = False self._cf_map = {'min': 'MINIMUM', 'max': 'MAXIMUM', 'average': 'AVERAGE'} graph_color = ColorAttributes() graph_color.back = settings.COLOR_BACK graph_color.canvas = settings.COLOR_CANVAS graph_color.font = settings.COLOR_FONT graph_color.shadea = settings.COLOR_SHADEA graph_color.shadeb = settings.COLOR_SHADEB graph_color.mgrid = settings.COLOR_MGRID graph_color.axis = settings.COLOR_AXIS graph_color.arrow = settings.COLOR_ARROW self.graph = PyrrdGraph(self.out_file.name, start=self.time_from, end=self.time_to, width=self.width, height=self.height, color=graph_color) def _generate_defs(self): """ FOR INTERNAL USE ONLY This generates an RRD DEF objects for every data source in every device (rrd file) and saves them in the list self._defs. Additionally it generates a dictionary def_map with key is DEF name and value is a lookup key for metadata Saves meta information for DEFs and CDEFs like device, data source and cf in metadata """ def_count = 0 self._defs = [] self._def_map = {} for device in self.devices: rrd_file = get_rrd_file(device, self.plugin, self.data_source) if os.path.isfile(rrd_file): # Get all data sources from rrd for data_source in get_data_sources(rrd_file): for cf in self._cf_map.keys(): metadata_key = cf + str(def_count) # generate definition def_vname = 'def_%s_%s_%s' % (data_source, cf, str(def_count)) self._def_map[def_vname] = metadata_key self._metadata.setdefault(metadata_key, {}) self._metadata[metadata_key]['data_source'] = data_source self._metadata[metadata_key]['device'] = device self._metadata[metadata_key]['cf'] = cf self._defs.append( DEF(rrdfile=rrd_file, dsName=data_source, cdef=cf.upper(), vname=def_vname) ) def_count += 1 def _generate_cdefs(self): """ FOR INTERNAL USE ONLY This generates an RRD CDEF object for every DEF object and saves them in the list self._cdefs. Additionally it generates a dictionary cdef_map with key is CDEF name and value is a lookup key for metadata metadata saves meta information for DEFs and CDEFs like device, data source and cf This function adds a vnames lookup which includes all DEF objects that should be calculated to build the CDEF """ def_count = 0 self._cdefs = [] self._cdef_map = {} self._cdef_values = {} # generate cdef map # for every data_source keep a list of definitions to calculate for (def_vname, metadata_key) in self._def_map.items(): if self.mode == MULTI_LINE: cdef_vname = 'cdef_%s_%s_%s' % (self._metadata[metadata_key]['data_source'], self._metadata[metadata_key]['cf'], def_count) def_count += 1 else: cdef_vname = 'cdef_%s_%s' % (self._metadata[metadata_key]['data_source'], self._metadata[metadata_key]['cf']) self._cdef_map[cdef_vname] = metadata_key self._cdef_values.setdefault(cdef_vname, []).append(def_vname) def_count = 0 # Iterate over all cdefs and either generate a rpn to aggregate all defs in values or if mode is multi-line # generate a rpn for every single def for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] if self.mode == MULTI_LINE: for vname in self._cdef_values[cdef_vname]: cdef = CDEF(vname=cdef_vname + "_" + str(def_count), rpn=self._generate_rpn(cdef_opts['data_source'], vname)) self._metadata[metadata_key].setdefault('cdef_objs', []).append(cdef) self._cdefs.append(cdef) def_count += 1 else: cdef = CDEF(vname=cdef_vname + "_" + str(def_count), rpn=self._generate_rpn(cdef_opts['data_source'], self._cdef_values[cdef_vname])) self._metadata[metadata_key].setdefault('cdef_objs', []).append(cdef) self._cdefs.append(cdef) def_count += 1 def _generate_lines(self): """ FOR INTERNAL USE ONLY This generates an RRD LINE object to graph for every CDEF object with the CF average and saves them in the list self._lines. """ color_count = 0 self._lines = [] for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] # Draw only average value as line if cdef_opts['cf'] == "average": for cdef_obj in cdef_opts['cdef_objs']: if color_count >= len(settings.COLOR_LINES): color_count = 0 line_color = settings.COLOR_LINES[color_count] color_count += 1 if self.mode == MULTI_LINE: self._lines.append(LINE(defObj=cdef_obj, color=line_color, legend=cdef_opts['device'] + " - " + str(color_count))) else: self._lines.append(LINE(defObj=cdef_obj, color=line_color)) def _generate_areas(self): """ FOR INTERNAL USE ONLY This generates an RRD AREA object for every CDEF object with the CF min or max and saves them in the list self._areas. Only useful in aggregated (single line) graphs """ self._areas = {} for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] if cdef_opts['cf'] == "max": self._areas.setdefault('max', []).append(AREA(defObj=cdef_opts['cdef_objs'][0], color=settings.COLOR_AREA_MAX)) elif cdef_opts['cf'] == "min": self._areas.setdefault('min', []).append(AREA(defObj=cdef_opts['cdef_objs'][0], color=settings.COLOR_AREA_MIN)) def _generate_table(self): """ FOR INTERNAL USE ONLY This generates an RRD VDEF and GPRINT object for every CDEF object and saves them in the list self._vdefs and self._gprints. """ def_count = 0 self._vdefs = [] self._gprints = [] for (cdef_vname, metadata_key) in self._cdef_map.items(): cdef_opts = self._metadata[metadata_key] if cdef_opts['cf'] == "average": vdef = VariableDefinition(vname="vdef_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "AVERAGE")) gprint_label = gettext("Avg") vdef_last = VariableDefinition(vname="vdef_last_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "LAST")) self._vdefs.append(vdef_last) if cdef_opts['data_source'] not in settings.DATA_SOURCES_WITHOUT_SUMMARY: self._gprints.append(GPRINT(vdef_last, 'Last %0.1lf')) # Draw min and max as area if cdef_opts['cf'] == "max": vdef = VariableDefinition(vname="vdef_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "MAXIMUM")) gprint_label = gettext("Max") elif cdef_opts['cf'] == "min": vdef = VariableDefinition(vname="vdef_" + str(def_count), rpn="%s,%s" % (cdef_vname + "_" + str(def_count), "MINIMUM")) gprint_label = gettext("Min") # create table if vdef and cdef_opts['data_source'] not in settings.DATA_SOURCES_WITHOUT_SUMMARY: self._vdefs.append(vdef) self._gprints.append(GPRINT(vdef, gprint_label + ' %0.1lf')) def_count += 1 def _generate_rpn(self, data_source, vnames): """ FOR INTERNAL USE ONLY Generate calculation for given data source Look into the setting if we should automatically recalculate this data_source We add 0 if we cannot find any way to recalculate """ if type(vnames) == str: vnames = [vnames] # if no cdefop is given we just add 0 default_cdef = '$VALUE,0,+' rpn = settings.CALC_OPERATION.get(settings.DATA_SOURCE_CONVERT.get(data_source)) summands = [] if not rpn: rpn = default_cdef for def_vname in vnames: rpn = rpn.replace('$VALUE', def_vname) rpn = rpn.replace('$QUANTITY', str(len(vnames))) summands.append(rpn) if len(vnames) == 1: rpn = summands[0] else: rpn = ",".join(summands) # postfix operation for each pair of summands for i in range(1, len(vnames)): rpn += ",+" return rpn def _generate_title(self): """ FOR INTERNAL USE ONLY Generate the graph title Look into settings if we should automatically translate the data source name Make sure there are no spaces """ if len(self.devices) == 1: self.title = translate(self.data_source, self.devices[0]).replace(' ', '_') else: self.title = translate(self.data_source).replace(' ', '_') def _generate_y_axis_label(self): """ FOR INTERNAL USE ONLY Generate the label for the graph """ self.y_label = "" for device in self.devices: device = get_device_name(device) rrd_file = get_rrd_file(device, self.plugin, self.data_source) if os.path.isfile(rrd_file): # Get all data sources from rrd for data_source in get_data_sources(rrd_file): self.y_label = "".join(Graph.get_label_for_data_source(data_source)) self.y_label = self.y_label.replace(' ','_') @staticmethod def get_label_for_data_source(data_source): """ Return the converted data source name or the data source name if we cannot find a conversion """ return settings.GRAPH_LABEL.get(data_source, data_source) @staticmethod def generate_comment(label_input): """ Generate a comment for graph from device list or just make sure that a comment doesnt overflow and have unwanted chars """ graph_comment = "" if type(label_input) == list: graph_comment = ','.join([get_device_name(x).split('.')[0] for x in label_input]) elif type(label_input) == str or type(label_input) == unicode: graph_comment = label_input.lstrip("'").rstrip("'") else: try: graph_comment = str(label_input) except ValueError: pass if len(graph_comment) > MAX_GRAPH_COMMENT_SIZE: graph_comment = graph_comment[0:MAX_GRAPH_COMMENT_SIZE] + "..." # elif len(graph_comment) < MAX_GRAPH_COMMENT_SIZE: # graph_comment = graph_comment + " " * int(MAX_GRAPH_COMMENT_SIZE) - len(graph_comment) graph_comment = graph_comment.replace("\"", "").replace("'", "") return graph_comment.encode("ascii", "ignore") def generate_attachment_name(self, suffix="png"): """ Generate the attachment file name for the graph for the given suffix Default suffix is png """ self.attachment_name = "" if len(self.devices) == 1: self.attachment_name = quote(self.devices[0].replace('.', '_')) + "_" + quote(self.plugin) + \ "_" + quote(self.data_source + "." + suffix) else: self.attachment_name = quote(self.plugin) + "_" + quote(self.data_source + "." + suffix) def generate_graph(self): """ Generate all needed RRD objects like DEFs, CDEFs, LINES etc and stuff them together to create a graph You can use failed() to check if we got errors otherwise graph will be in out_file """ self._generate_defs() self._generate_cdefs() self._generate_lines() self._generate_title() self._generate_y_axis_label() self.generate_attachment_name(suffix=settings.GRAPH_FORMAT) self.graph.title = self.title # Add vertical axes label self.graph.vertical_label = self._generate_y_axis_label() # Add all data to the graph self.graph.data = [] self.graph.data.extend(self._defs) self.graph.data.extend(self._cdefs) # min must be after max to overpaint max color in area if self.mode == AGGREGATED: self._generate_areas() self.graph.data.extend(self._areas['max']) self.graph.data.extend(self._areas['min']) self.graph.data.extend(sorted(self._lines, key=lambda x: x.legend)) # Add a graph comment if self.add_comment: if self.comment: graph_comment = self.generate_comment(self.comment) else: graph_comment = self.generate_comment(self.devices) self.graph.data.append(GraphComment(graph_comment, autoNewline=False)) # Add table if self.mode == AGGREGATED: self._generate_table() self.graph.data.extend(self._vdefs) self.graph.data.extend(sorted(self._gprints, key=lambda x: x.format)) try: self.graph.write() except Exception: self.__got_error = True def generation_failed(self): """ Returns true if generation failed """ if len(self._defs) == 0 or self._got_errors: return True else: return False