Exemple #1
0
    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()
Exemple #2
0
 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()
Exemple #5
0
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()
Exemple #6
0
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
Exemple #8
0
    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()
Exemple #10
0
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 ""
Exemple #11
0
    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)
Exemple #12
0
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)
Exemple #15
0
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 ""
Exemple #16
0
    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)
Exemple #17
0
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()
Exemple #18
0
    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
Exemple #19
0
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()
Exemple #20
0
    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()
Exemple #21
0
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()
Exemple #22
0
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
Exemple #23
0
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)
Exemple #24
0
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)
Exemple #25
0
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
Exemple #26
0
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)
Exemple #27
0
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)
Exemple #28
0
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()
Exemple #29
0
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()
Exemple #30
0
 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)
Exemple #31
0
# 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()
Exemple #32
0
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()
Exemple #34
0
  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()
Exemple #35
0
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()
Exemple #36
0
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()
Exemple #38
0
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,
            )
Exemple #40
0
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