if raw_smart_data:
for device, raw_data in raw_smart_data.items():
data = self.extract_smart_features(raw_data)
- self.put_device_metrics(ioctx, device, data)
+ if device and data:
+ self.put_device_metrics(ioctx, device, data)
ioctx.close()
return 0, "", ""
continue
did_device[device] = 1
data = self.extract_smart_features(raw_data)
- self.put_device_metrics(ioctx, device, data)
+ if device and data:
+ self.put_device_metrics(ioctx, device, data)
ioctx.close()
return 0, "", ""
if raw_smart_data:
for device, raw_data in raw_smart_data.items():
data = self.extract_smart_features(raw_data)
- self.put_device_metrics(ioctx, device, data)
+ if device and data:
+ self.put_device_metrics(ioctx, device, data)
ioctx.close()
return 0, "", ""
daemon_type, daemon_id, outb))
def put_device_metrics(self, ioctx, devid, data):
+ assert devid
old_key = datetime.utcnow() - timedelta(
seconds=int(self.retention_period))
prune = old_key.strftime(TIME_FORMAT)
ioctx.remove_omap_keys(op, tuple(erase))
ioctx.operate_write_op(op, devid)
- def show_device_metrics(self, devid, sample):
- # verify device exists
- r = self.get("device " + devid)
- if not r or 'device' not in r.keys():
- return -errno.ENOENT, '', 'device ' + devid + ' not found'
- # fetch metrics
+ def _get_device_metrics(self, devid, sample=None, min_sample=None):
res = {}
ioctx = self.open_connection(create_if_missing=False)
if not ioctx:
- return 0, json.dumps(res, indent=4), ''
+ return {}
with ioctx:
with rados.ReadOpCtx() as op:
- omap_iter, ret = ioctx.get_omap_vals(op, "", sample or '',
+ omap_iter, ret = ioctx.get_omap_vals(op, min_sample or '', sample or '',
MAX_SAMPLES) # fixme
assert ret == 0
try:
for key, value in list(omap_iter):
if sample and key != sample:
break
+ if min_sample and key < min_sample:
+ break
try:
v = json.loads(value)
except (ValueError, IndexError):
except rados.Error as e:
self.log.exception("RADOS error reading omap: {0}".format(e))
raise
+ return res
- return 0, json.dumps(res, indent=4), ''
+ def show_device_metrics(self, devid, sample):
+ # verify device exists
+ r = self.get("device " + devid)
+ if not r or 'device' not in r.keys():
+ return -errno.ENOENT, '', 'device ' + devid + ' not found'
+ # fetch metrics
+ res = self._get_device_metrics(devid, sample=sample)
+ return 0, json.dumps(res, indent=4, sort_keys=True), ''
def check_health(self):
self.log.info('Check health')