Ejemplo n.º 1
0
    def get(self, request, *args, **kwargs):
        meter = request.GET.get('meter', None)
        if not meter:
            return HttpResponse(json.dumps({}),
                                content_type='application/json')

        meter_name = meter.replace(".", "_")
        date_options = request.GET.get('date_options', None)
        date_from = request.GET.get('date_from', None)
        date_to = request.GET.get('date_to', None)
        stats_attr = request.GET.get('stats_attr', 'avg')
        group_by = request.GET.get('group_by', None)

        try:
            date_from, date_to = metering_utils.calc_date_args(
                date_from, date_to, date_options)
        except Exception:
            exceptions.handle(self.request, _('Dates cannot be recognized.'))

        if group_by == 'project':
            query = metering_utils.ProjectAggregatesQuery(
                request, date_from, date_to, 3600 * 24)
        else:
            query = metering_utils.MeterQuery(request, date_from, date_to,
                                              3600 * 24)

        resources, unit = query.query(meter)
        series = metering_utils.series_for_meter(request, resources, group_by,
                                                 meter, meter_name, stats_attr,
                                                 unit)

        series = metering_utils.normalize_series_by_unit(series)
        ret = {'series': series, 'settings': {}}
        return HttpResponse(json.dumps(ret), content_type='application/json')
Ejemplo n.º 2
0
    def get(self, request, *args, **kwargs):
        meter = request.GET.get('meter', None)
        if not meter:
            return HttpResponse(json.dumps({}),
                                content_type='application/json')

        meter_name = meter.replace(".", "_")
        date_options = request.GET.get('date_options', None)
        date_from = request.GET.get('date_from', None)
        date_to = request.GET.get('date_to', None)
        stats_attr = request.GET.get('stats_attr', 'avg')
        group_by = request.GET.get('group_by', None)

        try:
            date_from, date_to = metering_utils.calc_date_args(date_from,
                                                               date_to,
                                                               date_options)
        except Exception:
            exceptions.handle(self.request, _('Dates cannot be recognized.'))

        if group_by == 'project':
            query = metering_utils.ProjectAggregatesQuery(request,
                                                          date_from,
                                                          date_to,
                                                          3600 * 24)
        else:
            query = metering_utils.MeterQuery(request, date_from,
                                              date_to, 3600 * 24)

        resources, unit = query.query(meter)
        series = metering_utils.series_for_meter(request, resources,
                                                 group_by, meter,
                                                 meter_name, stats_attr, unit)

        series = metering_utils.normalize_series_by_unit(series)
        ret = {'series': series, 'settings': {}}
        return HttpResponse(json.dumps(ret), content_type='application/json')
Ejemplo n.º 3
0
def get_nodes_stats(request,
                    uuid,
                    meter,
                    date_options=None,
                    date_from=None,
                    date_to=None,
                    stats_attr=None,
                    barchart=None,
                    group_by=None):

    unit = ''
    series = []

    if uuid:
        if group_by == "image_id":
            query = {}
            image_query = [{
                "field": "metadata.%s" % group_by,
                "op": "eq",
                "value": uuid
            }]
            query[uuid] = image_query
        else:
            query = [{'field': 'resource_id', 'op': 'eq', 'value': uuid}]
    else:
        # query will be aggregated across all resources
        group_by = "all"
        query = {'all': []}

    # Disk and Network I/O: data from 2 meters in one chart
    if meter == 'disk-io':
        meters = get_meters([
            'hardware.system_stats.io.outgoing.blocks',
            'hardware.system_stats.io.incoming.blocks'
        ])
    elif meter == 'network-io':
        meters = get_meters([
            'hardware.network.ip.outgoing.datagrams',
            'hardware.network.ip.incoming.datagrams'
        ])
    else:
        meters = get_meters([meter])

    date_from, date_to = metering.calc_date_args(date_from, date_to,
                                                 date_options)

    for meter_id, meter_name in meters:
        label = unicode(LABELS.get(meter_id, meter_name))
        resources, unit = query_data(request=request,
                                     date_from=date_from,
                                     date_to=date_to,
                                     group_by=group_by,
                                     meter=meter_id,
                                     query=query)
        s = metering.series_for_meter(request, resources, group_by, meter_id,
                                      meter_name, stats_attr, unit, label)
        series += s

    series = metering.normalize_series_by_unit(series)

    json_output = create_json_output(series, barchart, unit, date_from,
                                     date_to)

    return json_output
Ejemplo n.º 4
0
def get_nodes_stats(request, node_uuid, instance_uuid, meter,
                    date_options=None, date_from=None, date_to=None,
                    stats_attr=None, barchart=None, group_by=None):
    series = []
    meter_list, unit = get_meter_list_and_unit(request, meter)

    if instance_uuid:
        if 'ipmi' in meter:
            # For IPMI metrics, a resource ID is made of node UUID concatenated
            # with the metric description. E.g:
            # 1dcf1896-f581-4027-9efa-973eef3380d2-fan_2a_tach_(0x42)
            resource_ids = [m.resource_id for m in meter_list
                            if m.resource_id.startswith(node_uuid)]
            queries = [
                [{'field': 'resource_id',
                  'op': 'eq',
                  'value': resource_id}]
                for resource_id in resource_ids
            ]
        else:
            # For SNMP metrics, a resource ID matches exactly the UUID of the
            # associated instance
            if group_by == "image_id":
                query = {}
                image_query = [{"field": "metadata.%s" % group_by,
                                "op": "eq",
                                "value": instance_uuid}]
                query[instance_uuid] = image_query
            else:
                query = [{'field': 'resource_id',
                          'op': 'eq',
                          'value': instance_uuid}]
            queries = [query]
    else:
        # query will be aggregated across all resources
        group_by = "all"
        query = {'all': []}
        queries = [query]

    # Disk and Network I/O: data from 2 meters in one chart
    if meter == 'disk-io':
        meters = get_meters([
            'hardware.system_stats.io.outgoing.blocks',
            'hardware.system_stats.io.incoming.blocks'
        ])
    elif meter == 'network-io':
        meters = get_meters([
            'hardware.network.ip.outgoing.datagrams',
            'hardware.network.ip.incoming.datagrams'
        ])
    else:
        meters = get_meters([meter])

    date_from, date_to = metering.calc_date_args(
        date_from,
        date_to,
        date_options)

    for meter_id, meter_name in meters:
        label = str(LABELS.get(meter_id, meter_name))

        for query in queries:
            resources = query_data(
                request=request,
                date_from=date_from,
                date_to=date_to,
                group_by=group_by,
                meter=meter_id,
                query=query)
            s = metering.series_for_meter(request, resources, group_by,
                                          meter_id, meter_name, stats_attr,
                                          unit, label)
            series += s

    series = metering.normalize_series_by_unit(series)

    json_output = create_json_output(
        series,
        barchart,
        unit,
        date_from,
        date_to)

    return json_output