30 from cm
import settings
31 from cm.utils
import log
32 from cm.utils.exception
import CMException
42 log.error(0,
'stat_error %s %s' % (vm, e))
48 path = settings.PATH_TO_RRD + vm +
'.rrd'
53 return settings.BACKUP_PATH + vm +
'.tar.gz'
76 log.debug(0,
'%s added' % str(x))
78 log.debug(0,
'%s exists' % str(x))
105 raise Exception(
'No VM specified')
107 filesize = os.path.getsize(self.
filepath)
114 cpu_percent = int(self.
vm[
'cpu_time'] / self.
vm[
'cpu_count'] / 10000 / 1000)
115 ret = rrdtool.update(
"%s" % (self.
filepath),
'N:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d' % (int(self.
vm[
'cpu_count']),
116 int(self.
vm[
'cpu_time']) / 100000000 / 10.0 / self.
vm[
'cpu_count'],
117 int(self.
vm[
'rd_req']),
118 int(self.
vm[
'rd_bytes']),
119 int(self.
vm[
'wr_req']),
120 int(self.
vm[
'wr_bytes']),
121 int(self.
vm[
'rx_bytes']),
122 int(self.
vm[
'rx_packets']),
123 int(self.
vm[
'tx_bytes']),
124 int(self.
vm[
'tx_packets']),
127 log.error(0,
'update error: %s' % (rrdtool.error()))
131 raise Exception(
'No VM specified')
133 rarg = [
"%s" % (self.
filepath),
"--step",
"%d" % settings.PERIOD,
134 "DS:cpu_count:GAUGE:%d:0:100000" % (settings.PERIOD * 2),
135 "DS:cpu_time:COUNTER:%d:0:100000" % (settings.PERIOD * 2),
136 "DS:rd_req:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
137 "DS:rd_bytes:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
138 "DS:wr_req:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
139 "DS:wr_bytes:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
140 "DS:rx_bytes:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
141 "DS:rx_packets:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
142 "DS:tx_bytes:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
143 "DS:tx_packets:COUNTER:%d:0:1000000000" % (settings.PERIOD * 2),
145 for s
in settings.STATS:
146 rarg.append(
"RRA:AVERAGE:0.5:%d:%d" % (s[0], s[1]))
149 ret = rrdtool.create(rarg)
151 log.error(0,
'update error: %s' % (rrdtool.error()))
154 log.info(0,
'created: %s' % (self.
filepath))
172 f = os.listdir(settings.PATH_TO_RRD)
178 t.append(rrdtool.first(settings.PATH_TO_RRD + rrd))
179 t.append(rrdtool.last(settings.PATH_TO_RRD + rrd))
180 rrds.update({os.path.splitext(rrd)[0]: t})
183 log.error(0,
'stat_error %s %s' % (rrd, e))
196 raise CMException(
'stat_not_exists')
199 ds_info = rrdtool.info(filepath)
206 step = ds_info[
'step']
208 for key
in ds_info.keys():
212 ds_name = ds_name[0: ds_name.find(
']')]
213 stats.append(ds_name)
214 if 'pdp_per_row' in key:
215 res.append(ds_info[key] * step)
216 first = rrdtool.first(filepath)
217 last = rrdtool.last(filepath)
219 return {
'stats': stats,
'resolutions': res,
'first': first,
'last': last}
221 def get_vm_stats(self, vm, names, start="-5min", end="now", resolution="10"):
223 raise CMException(
'stat_not_exists')
227 info, ds_rrd, data = rrdtool.fetch(filename,
"AVERAGE",
"--start", str(start),
"--end", str(end),
"--resolution", str(resolution))
240 now = int(time.time())
243 ds_info = [
'timestamp']
246 for i
in range(len(ds_rrd)):
249 ds_req[i] = names.index(ds)
256 ds_info.append(total.values())
260 val = [
None for i
in names]
261 for i
in range(len(row)):
266 val[ds_req[i]] = row[i]
273 if end_rrd > now + step:
274 res.append([ts + step,
''])
275 res.append([end_rrd,
''])
280 raise CMException(
'stat_not_exists')
282 r = rrdtool.fetch(
"%s" % vm_id,
'AVERAGE',
'-r', str(res),
'-s',
'-%ds' % (int(res) * 2),
'-e',
'now')
286 i[
'data'] = map(
lambda d:
"" if d
is None else d, r[2][0])
287 ret = dict(zip(i[
'labels'], i[
'data']))
291 def get_vm_total(self, vm, names=['cpu_time', 'rd_req', 'rd_bytes', 'wr_req', 'wr_bytes', 'rx_bytes', 'tx_bytes']):
293 raise CMException(
'stat_not_exists')
295 ds_info = rrdtool.info(filename)
299 ds_all[i] = ds_info[
'ds[%s].last_ds' % i]
304 raise CMException(
'stat_not_exists')
312 d = self.
get_vm_stats(vm, [
'cpu_time'],
'-%ds' % (long(p) + min_res),
'now', min_res)
318 cpus = [i[1]
for i
in d[1:]
if i[1] !=
'']
320 r.update({str(p):
"%.2f" % (sum(cpus) / float(len(cpus)))})