Example #1
0
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
Example #2
0
    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
Example #3
0
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