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')
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')
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
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