def getLastValues(self, datasource, datapoint, rra='AVERAGE', ago=300, targets=()): """ Get the last value from the specified rrd for each target. @param datasource: target datasource id @param datapoint: target datapoint id @param rra: target RRA @param ago: how many seconds in the past to read, at maximum @param targets: iterable of dicts of target configurations, like: [{'device': {'id': 'localhost', 'name': 'localhost', 'uid': '/zport/dmd/Devices/Server/Linux/devices/localhost', 'uuid': '7e8228b7-a2d6-4dbe-8e35-8b475ad8822e'}, 'id': 'eth0', 'name': 'eth0', 'rrdpath': 'Devices/localhost/os/interfaces/eth0', 'uid': '/zport/dmd/Devices/Server/Linux/devices/localhost/os/interfaces/eth0', 'uuid': 'c35cdc58-a630-42be-b2d4-861c5c02362c'}] @return: 2 item tuple, containing: a dictionary of {uuid -> last value} for each target element, a list of tuples of exceptions, messages """ valueMap = {} errors = [] for targetConfig in targets: try: valueMap[targetConfig['uuid']] = self.getLastValue(datasource, datapoint, rra, ago, targetConfig) except StandardError as ex: msg = "Failure reading configured datapoint %s_%s on target %s" % \ (datasource, datapoint, getTargetId(targetConfig)) errors.append((ex, msg)) return {k: v for k, v in valueMap.items() if v is not None}, errors
def dsTargetKeys(ds): """ ds should have two params: targets: list of targetInfo dicts from targetInfo(target) below. targetDatapoints: list of tuples of (datasource_id, datapoint_id, RRA) """ targetKeys = set() for target in ds.params.get('targets', []): targetElementId = getTargetId(target) for targetDatapoint in ds.params.get('targetDatapoints', []): targetKeys.add('%s:%s' % (targetElementId, targetDatapoint[0])) return targetKeys
def getLastValue(self, datasource, datapoint, rra='AVERAGE', ago=300, targetConfig={}): """ @param datasource: target datasource id @param datapoint: target datapoint id @param rra: target RRA @param ago: how many seconds in the past to read, at maximum @param targetConfig: dict of target configuration, like: {'device': {'id': 'localhost', 'name': 'localhost', 'uid': '/zport/dmd/Devices/Server/Linux/devices/localhost', 'uuid': '7e8228b7-a2d6-4dbe-8e35-8b475ad8822e'}, 'id': 'eth0', 'name': 'eth0', 'rrdpath': 'Devices/localhost/os/interfaces/eth0', 'uid': '/zport/dmd/Devices/Server/Linux/devices/localhost/os/interfaces/eth0', 'uuid': 'c35cdc58-a630-42be-b2d4-861c5c02362c'} @return: last single value from the requested RRD file, or None if not available """ targetValue = targetConfig.get(self._targetKey, None) if not targetValue: log.warn("No %s present for target %s" % (self._targetKey, getTargetId(targetConfig))) return None cachekey = self._getKey(datasource, datapoint, rra, targetValue) #fetch from the cache if able if cachekey in self._cache: log.debug("Using cached value for %s: %s", cachekey, self._cache[cachekey]) return self._cache[cachekey] readValue = self._readLastValue(targetValue, datasource, datapoint, rra, ago) if readValue is not None: self._cache[cachekey] = readValue return readValue else: log.debug("Last value for target %s not present for datapoint %s_%s", getTargetId(targetConfig), datasource, datapoint)