Package Products :: Package ZenModel :: Module DataPointGraphPoint
[hide private]
[frames] | no frames]

Source Code for Module Products.ZenModel.DataPointGraphPoint

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, Zenoss Inc. 
  5  # 
  6  # This program is free software; you can redistribute it and/or modify it 
  7  # under the terms of the GNU General Public License version 2 or (at your 
  8  # option) any later version as published by the Free Software Foundation. 
  9  # 
 10  # For complete information please visit: http://www.zenoss.com/oss/ 
 11  # 
 12  ########################################################################### 
 13   
 14  __doc__="""DPGraphPoint 
 15   
 16  Handles GraphPoints that refer to RRDDataPoints 
 17  """ 
 18   
 19  import os 
 20  import os.path 
 21  from ComplexGraphPoint import ComplexGraphPoint 
 22  from Globals import InitializeClass 
 23   
 24   
25 -def manage_addDataPointGraphPoint(context, id, REQUEST = None):
26 ''' This is here so than zope will let us copy/paste/rename 27 graphpoints. 28 ''' 29 gp = DataPointGraphPoint(id) 30 context._setObject(gp.id, gp) 31 if REQUEST: 32 return context.callZenScreen(REQUEST)
33 34
35 -class DataPointGraphPoint(ComplexGraphPoint):
36 ''' 37 ''' 38 meta_type = 'DataPointGraphPoint' 39 40 limit = -1 41 rpn = '' 42 dpName = '' 43 cFunc = 'AVERAGE' 44 45 46 # rpn: Reverse Polish Notation -- applied to the value for this graph point 47 # See Products/ZenRRD/utils.py (rpneval) 48 # dpName: The basename of the rrd file (without extension) that has the data 49 # cFunc: The consolidation function used when that datapoint resolution 50 # exceeds the graph. See Products/ZenModel/RRDGraph dataSourceSum and 51 # http://oss.oetiker.ch/rrdtool/doc/rrdgraph_data.en.html 52 # limit: Maximum permitted value. Values in excess of this are NaNed. 53 # Not used if negative 54 55 _properties = ComplexGraphPoint._properties + ( 56 {'id':'limit', 'type':'long', 'mode':'w'}, 57 {'id':'rpn', 'type':'string', 'mode':'w'}, 58 {'id':'dpName', 'type':'string', 'mode':'w'}, 59 {'id':'cFunc', 'type':'string', 'mode':'w'}, 60 ) 61
62 - def getDescription(self):
63 ''' return a description 64 ''' 65 return self.dpName
66 67
68 - def dataPointId(self):
69 ''' 70 Return the id of the datapoint, without the datasource name 71 ''' 72 return self.dpName.split('_', 1)[-1]
73 74
75 - def getType(self):
76 return 'DataPoint'
77 78
79 - def isBroken(self):
80 """ 81 If this graphpoint's graph definition is associated with a perf 82 template and if the datapoint needed by this gp is not present in 83 the perf template then return True, otherwise false. 84 """ 85 if self.graphDef.rrdTemplate(): 86 if self.dpName \ 87 not in self.graphDef.rrdTemplate.getRRDDataPointNames(): 88 return True 89 return False
90 91
92 - def getGraphCmds(self, cmds, context, rrdDir, addSummary, idx, 93 multiid=-1, prefix=''):
94 ''' Build the graphing commands for this graphpoint 95 ''' 96 graph = [] 97 98 rrdFile = os.path.join(rrdDir, self.dpName) + ".rrd" 99 100 # Create the base DEF 101 rawName = self.getDsName('%s-raw' % self.id, multiid, prefix) 102 graph.append("DEF:%s=%s:%s:%s" % (rawName, rrdFile, 'ds0', self.cFunc)) 103 graph.append("DEF:%s-max=%s:%s:%s" % (rawName, rrdFile, 'ds0', "MAX")) 104 105 # If have rpn then create a new CDEF 106 if self.rpn: 107 rpn = self.talesEval(self.rpn, context) 108 rpnName = self.getDsName('%s-rpn' % self.id, multiid, prefix) 109 graph.append("CDEF:%s=%s,%s" % (rpnName, rawName, rpn)) 110 graph.append("CDEF:%s-max=%s-max,%s" % (rpnName, rawName, rpn)) 111 112 # If have limit then create a new CDEF 113 if self.limit > -1: 114 src = self.rpn and rpnName or rawName 115 limitName = self.getDsName('%s-limit' % self.id, multiid, prefix) 116 graph.append("CDEF:%s=%s,%s,GT,UNKN,%s,IF"% 117 (limitName,src,self.limit,src)) 118 graph.append("CDEF:%s-max=%s-max,%s,GT,UNKN,%s,IF"% 119 (limitName,src,self.limit,src)) 120 121 if self.limit > -1: 122 src = limitName 123 elif self.rpn: 124 src = rpnName 125 else: 126 src = rawName 127 128 # Create a cdef for the munged value 129 graph.append('CDEF:%s=%s' % 130 (self.getDsName(self.id, multiid, prefix), src)) 131 132 # Draw 133 if self.lineType != self.LINETYPE_DONTDRAW: 134 if multiid != -1: 135 fname = os.path.basename(rrdDir) 136 if fname.find('.rrd') > -1: fname = fname[:-4] 137 legend = "%s-%s" % (self.id, fname) 138 else: 139 legend = self.talesEval(self.legend, context) or self.id 140 legend = self.escapeForRRD(legend) 141 drawType = self.lineType 142 if self.lineType == self.LINETYPE_LINE: 143 drawType += str(self.lineWidth) 144 drawCmd ='%s:%s%s' % ( 145 drawType, 146 src, 147 self.getColor(idx)) 148 drawCmd += ':%s' % legend.ljust(14) 149 if self.stacked: 150 drawCmd += ':STACK' 151 graph.append(drawCmd) 152 153 # Add summary 154 if addSummary: 155 graph.extend(self._summary(src, self.format, ongraph=1)) 156 157 return cmds + graph
158 159
160 - def _summary(self, src, format="%5.2lf%s", ongraph=1):
161 """Add the standard summary opts to a graph""" 162 gopts = [] 163 funcs = ("LAST", "AVERAGE", "MAX") 164 tags = ("cur\:", "avg\:", "max\:") 165 for i in range(len(funcs)): 166 label = "%s%s" % (tags[i], format or self.DEFAULT_FORMAT) 167 if funcs[i] == "MAX": 168 src += "-max" 169 gopts.append(self.summElement(src, funcs[i], label, ongraph)) 170 gopts[-1] += "\j" 171 return gopts
172 173
174 - def summElement(self, src, function, format="%5.2lf%s", ongraph=1):
175 """Make a single summary element""" 176 if ongraph: opt = "GPRINT" 177 else: opt = "PRINT" 178 return ":".join((opt, src, function, format))
179 180 181 InitializeClass(DataPointGraphPoint) 182