def get_stats(machine, start="", stop="", step="", metrics=None): if not metrics: metrics = (list(config.GRAPHITE_BUILTIN_METRICS.keys()) + machine.monitoring.metrics) old_targets = { 'cpu': 'cpu.total.nonidle', 'load': 'load.shorterm', 'ram': 'memory.nonfree_percent', 'disk-read': 'disk.total.disk_octets.read', 'disk-write': 'disk.total.disk_octets.write', 'network-rx': 'interface.total.if_octets.rx', 'network-tx': 'interface.total.if_octets.tx', } targets = [old_targets.get(metric, metric) for metric in metrics] telegraf = machine.monitoring.method == 'telegraf-graphite' handler = MultiHandler( machine.id, telegraf=telegraf, telegraf_since=telegraf and machine.monitoring.method_since ) data = handler.get_data(targets, start, stop, interval_str=step) for item in data: if item['alias'].rfind("%(head)s.") == 0: item['alias'] = item['alias'][9:] data = _clean_monitor_metrics(machine.owner, data) # set activated_at for collectd/telegraf installation status # if no data previously received for machine istatus = machine.monitoring.installation_status if not istatus.activated_at: for val in (point[0] for item in list(data.values()) for point in item['datapoints'] if point[1] >= istatus.started_at): if val is not None: if not istatus.finished_at: istatus.finished_at = time.time() istatus.activated_at = time.time() istatus.state = 'succeeded' machine.save() add_nodata_rule.delay(machine.owner.id) trigger_session_update(machine.owner, ['monitoring']) break return data
def _update_status(self, results): """Update the InstallationStatus of self.machine. Update `self.machine.monitoring.installation_status` and set proper activation timestamps, once monitoring data is available. """ istatus = self.machine.monitoring.installation_status if not istatus.activated_at: for value in results.itervalues(): for point in value['datapoints']: if point[0] is not None and point[1] >= istatus.started_at: if not istatus.finished_at: istatus.finished_at = time.time() istatus.activated_at = time.time() istatus.state = 'succeeded' self.machine.save() owner = self.machine.owner # FIXME Resolve circular imports. from mist.api.rules.tasks import add_nodata_rule add_nodata_rule.delay(owner.id, 'influxdb') trigger_session_update(owner, ['monitoring']) return
def get_stats(machine, start="", stop="", step="", metrics=None): data = {} # If no metrics are specified, then we get all of them if not metrics: metrics = [ ('fetch(\"{id}.*\"' + ', start=\"{start}\", stop=\"{stop}\"' + ', step=\"{step}\")') ] for metric in metrics: query = metric.format(id=machine.id, start=start, stop=stop, step=step) try: raw_machine_data = requests.get( "%s/v1/datapoints?query=%s" % (config.TSFDB_URI, urllib.parse.quote(query)), headers={'x-org-id': machine.owner.id}, timeout=20) except Exception as exc: log.error('Got %r on get_stats for resource %s' % (exc, machine.id)) raise ServiceUnavailableError() if not raw_machine_data.ok: log.error('Got %d on get_stats: %s', raw_machine_data.status_code, raw_machine_data.content) raise ServiceUnavailableError() raw_machine_data = raw_machine_data.json() raw_metrics = list(raw_machine_data.get("series", {}).keys()) for raw_metric in raw_metrics: # We use as key the metric name without the machine id # e.g "id.system.load1 => system.load1" _, returned_metric = raw_metric.split(".", 1) data.update({ returned_metric: { "name": returned_metric, "datapoints": raw_machine_data["series"].get(raw_metric, []), } }) if not isinstance(machine, str): # set activated_at for collectd/telegraf installation status # if no data previously received for machine from mist.api.helpers import trigger_session_update from mist.api.rules.tasks import add_nodata_rule istatus = machine.monitoring.installation_status if not istatus.activated_at: for val in (point[0] for item in list(data.values()) for point in item['datapoints'] if point[1] >= istatus.started_at): if val is not None: if not istatus.finished_at: istatus.finished_at = time.time() istatus.activated_at = time.time() istatus.state = 'succeeded' machine.save() add_nodata_rule.delay(machine.owner.id) trigger_session_update(machine.owner, ['monitoring']) break return data