Ejemplo n.º 1
0
def push_metering_info(owner_id):
    """Collect and push new metering data to InfluxDB"""
    now = datetime.datetime.utcnow()
    metering = {}

    # Base InfluxDB URL.
    url = config.INFLUX['host']

    # Create database for storing metering data, if missing.
    db = requests.post('%s/query?q=CREATE DATABASE metering' % url)
    if not db.ok:
        raise Exception(db.content)

    # CPUs
    for machine in Machine.objects(owner=owner_id, last_seen__gte=now.date()):
        metering.setdefault(
            owner_id,
            dict.fromkeys(('cores', 'checks', 'datapoints'), 0)
        )
        try:
            if _skip_metering(machine):
                continue
            metering[owner_id]['cores'] += machine.cores or 0
        except Exception as exc:
            log.error('Failed upon cores metering of %s: %r', machine.id, exc)

    # Checks
    for rule in Rule.objects(owner_id=owner_id):
        try:
            metering[rule.owner_id]['checks'] += rule.total_check_count
        except Exception as exc:
            log.error('Failed upon checks metering of %s: %r', rule.id, exc)

    # Datapoints
    try:
        q = "SELECT MAX(counter) FROM datapoints "
        q += "WHERE owner = '%s' AND time >= now() - 30m" % owner_id
        q += " GROUP BY machine"
        result = requests.get('%s/query?db=metering&q=%s' % (url, q)).json()
        result = result['results'][0]['series']
        for series in result:
            metering[owner_id]['datapoints'] += series['values'][0][-1]
    except Exception as exc:
        log.error('Failed upon datapoints metering: %r', exc)

    # Assemble points.
    points = []
    for owner, counters in metering.iteritems():
        value = ','.join(['%s=%s' % (k, v) for k, v in counters.iteritems()])
        point = 'usage,owner=%s %s' % (owner, value)
        points.append(point)

    # Write metering data.
    data = '\n'.join(points)
    write = requests.post('%s/write?db=metering&precision=s' % url, data=data)
    if not write.ok:
        log.error('Failed to write metering data: %s', write.text)
Ejemplo n.º 2
0
def get_rules(request):
    """
    Tags: rules
    ---
    Get a list of all rules
    """
    auth_context = auth_context_from_request(request)
    if not auth_context.is_owner():
        raise UnauthorizedError('Restricted to Owners')
    return [r.as_dict() for r in Rule.objects(owner_id=auth_context.owner.id)]
Ejemplo n.º 3
0
def disable_monitoring(owner, cloud_id, machine_id, no_ssh=False, job_id=''):
    """Disable monitoring for a machine.

    If `no_ssh` is False, we will attempt to SSH to the Machine and uninstall
    the monitoring agent.

    """
    log.info("%s: Disabling monitoring for machine '%s' in cloud '%s'.",
             owner.id, machine_id, cloud_id)

    try:
        cloud = Cloud.objects.get(owner=owner, id=cloud_id, deleted=None)
    except Cloud.DoesNotExist:
        raise NotFoundError('Cloud does not exist')
    try:
        machine = Machine.objects.get(cloud=cloud, machine_id=machine_id)
    except Machine.DoesNotExist:
        raise NotFoundError("Machine %s doesn't exist" % machine_id)
    if not machine.monitoring.hasmonitoring:
        raise BadRequestError('Machine does not have monitoring enabled')

    # Uninstall monitoring agent.
    ret_dict = {}
    if not no_ssh:
        if job_id:
            job = None
        else:
            job = 'disable_monitoring'
            job_id = uuid.uuid4().hex
        ret_dict['job'] = job

        if machine.monitoring.method in ('telegraf-influxdb',
                                         'telegraf-graphite'):
            # Schedule undeployment of Telegraf.
            mist.api.monitoring.tasks.uninstall_telegraf.delay(
                machine.id, job, job_id)
    if job_id:
        ret_dict['job_id'] = job_id

    # Update monitoring information in db: set monitoring to off, remove rules.
    # If the machine we are trying to disable monitoring for is the only one
    # included in a rule, then delete the rule. Otherwise, attempt to remove
    # the machine from the list of resources the rule is referring to.
    for rule in Rule.objects(owner_id=machine.owner.id):
        if rule.ctl.includes_only(machine):
            rule.delete()
        else:
            rule.ctl.maybe_remove(machine)

    machine.monitoring.hasmonitoring = False
    machine.monitoring.activated_at = 0
    machine.save()

    # tell monitor server to no longer monitor this uuid
    try:
        if machine.monitoring.method in ('telegraf-influxdb',
                                         'telegraf-graphite'):
            traefik.reset_config()
    except Exception as exc:
        log.error(
            "Exception %s while asking monitor server in "
            "disable_monitoring", exc)

    trigger_session_update(owner, ['monitoring'])
    return ret_dict
Ejemplo n.º 4
0
 def get_rules_dict(self):
     from mist.api.rules.models import Rule
     return {
         rule.id: rule.as_dict()
         for rule in Rule.objects(owner_id=self.id)
     }