1
2
3
4
5
6
7
8
9
10
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
33
34
36 '''
37 '''
38 meta_type = 'DataPointGraphPoint'
39
40 limit = -1
41 rpn = ''
42 dpName = ''
43 cFunc = 'AVERAGE'
44
45 _properties = ComplexGraphPoint._properties + (
46 {'id':'limit', 'type':'long', 'mode':'w'},
47 {'id':'rpn', 'type':'string', 'mode':'w'},
48 {'id':'dpName', 'type':'string', 'mode':'w'},
49 {'id':'cFunc', 'type':'string', 'mode':'w'},
50 )
51
53 ''' return a description
54 '''
55 return self.dpName
56
57
59 '''
60 Return the id of the datapoint, without the datasource name
61 '''
62 return self.dpName.split('_', 1)[-1]
63
64
67
68
70 """
71 If this graphpoint's graph definition is associated with a perf
72 template and if the datapoint needed by this gp is not present in
73 the perf template then return True, otherwise false.
74 """
75 if self.graphDef.rrdTemplate():
76 if self.dpName \
77 not in self.graphDef.rrdTemplate.getRRDDataPointNames():
78 return True
79 return False
80
81
82 - def getGraphCmds(self, cmds, context, rrdDir, addSummary, idx,
83 multiid=-1, prefix=''):
84 ''' Build the graphing commands for this graphpoint
85 '''
86 graph = []
87
88 rrdFile = os.path.join(rrdDir, self.dpName) + ".rrd"
89
90
91 rawName = self.getDsName('%s-raw' % self.id, multiid, prefix)
92 graph.append("DEF:%s=%s:%s:%s" % (rawName, rrdFile, 'ds0', self.cFunc))
93 graph.append("DEF:%s-max=%s:%s:%s" % (rawName, rrdFile, 'ds0', "MAX"))
94
95
96 if self.rpn:
97 rpn = self.talesEval(self.rpn, context)
98 rpnName = self.getDsName('%s-rpn' % self.id, multiid, prefix)
99 graph.append("CDEF:%s=%s,%s" % (rpnName, rawName, rpn))
100 graph.append("CDEF:%s-max=%s-max,%s" % (rpnName, rawName, rpn))
101
102
103 if self.limit > -1:
104 src = self.rpn and rpnName or rawName
105 limitName = self.getDsName('%s-limit' % self.id, multiid, prefix)
106 graph.append("CDEF:%s=%s,%s,GT,UNKN,%s,IF"%
107 (limitName,src,self.limit,src))
108 graph.append("CDEF:%s-max=%s-max,%s,GT,UNKN,%s,IF"%
109 (limitName,src,self.limit,src))
110
111 if self.limit > -1:
112 src = limitName
113 elif self.rpn:
114 src = rpnName
115 else:
116 src = rawName
117
118
119 graph.append('CDEF:%s=%s' %
120 (self.getDsName(self.id, multiid, prefix), src))
121
122
123 if self.lineType != self.LINETYPE_DONTDRAW:
124 if multiid != -1:
125 fname = os.path.basename(rrdDir)
126 if fname.find('.rrd') > -1: fname = fname[:-4]
127 legend = "%s-%s" % (self.id, fname)
128 else:
129 legend = self.talesEval(self.legend, context) or self.id
130 legend = self.escapeForRRD(legend)
131 drawType = self.lineType
132 if self.lineType == self.LINETYPE_LINE:
133 drawType += str(self.lineWidth)
134 drawCmd ='%s:%s%s' % (
135 drawType,
136 src,
137 self.getColor(idx))
138 drawCmd += ':%s' % legend.ljust(14)
139 if self.stacked:
140 drawCmd += ':STACK'
141 graph.append(drawCmd)
142
143
144 if addSummary:
145 graph.extend(self._summary(src, self.format, ongraph=1))
146
147 return cmds + graph
148
149
150 - def _summary(self, src, format="%5.2lf%s", ongraph=1):
151 """Add the standard summary opts to a graph"""
152 gopts = []
153 funcs = ("LAST", "AVERAGE", "MAX")
154 tags = ("cur\:", "avg\:", "max\:")
155 for i in range(len(funcs)):
156 label = "%s%s" % (tags[i], format or self.DEFAULT_FORMAT)
157 if funcs[i] == "MAX":
158 src += "-max"
159 gopts.append(self.summElement(src, funcs[i], label, ongraph))
160 gopts[-1] += "\j"
161 return gopts
162
163
164 - def summElement(self, src, function, format="%5.2lf%s", ongraph=1):
165 """Make a single summary element"""
166 if ongraph: opt = "GPRINT"
167 else: opt = "PRINT"
168 return ":".join((opt, src, function, format))
169
170
171 InitializeClass(DataPointGraphPoint)
172