def get_context_data(self, request): context = {} meter_list = ceilometer.meter_list(self.request) meters = [] meter_types = [ ("Compute", [ {"name": "cpu", "unit": "ns", "type": "cumulative"}, {"name": "disk.read.requests", "unit": "requests", "type": "cumulative"}, {"name": "disk.read.bytes", "unit": "B", "type": "cumulative"}, {"name": "network.incoming.bytes", "unit": "B", "type": "cumulative"}, {"name": "network.outgoing.bytes", "unit": "B", "type": "cumulative"}, {"name": "network.incoming.packets", "unit": "packets", "type": "cumulative"}, {"name": "network.outgoing.packets", "unit": "packets", "type": "cumulative"}]), ("Network", [ {"name": "network.create", "unit": "network", "type": "delta"}, {"name": "network.update", "unit": "network", "type": "delta"}, {"name": "subnet.create", "unit": "subnet", "type": "delta"}, {"name": "subnet.update", "unit": "subnet", "type": "delta"}, {"name": "port.create", "unit": "port", "type": "delta"}, {"name": "port.update", "unit": "port", "type": "delta"}, {"name": "router.create", "unit": "router", "type": "delta"}, {"name": "router.update", "unit": "router", "type": "delta"}, {"name": "ip.floating.create", "unit": "ip", "type": "delta"}, {"name": "ip.floating.update", "unit": "ip", "type": "delta"}]), ("Object Storage", [ {"name": "storage.objects.incoming.bytes", "unit": "B", "type": "delta"}, {"name": "storage.objects.outgoing.bytes", "unit": "B", "type": "delta"}]) ] # grab different resources for metrics, # and associate with the right type meters = ceilometer.meter_list(self.request) resources = {} for meter in meters: # group resources by meter names if meter.type=='delta' or meter.type=='cumulative': if meter.name not in resources: resources[meter.name] = [] if meter.resource_id not in resources[meter.name]: resources[meter.name].append(meter.resource_id) context = {'meters': meter_types, 'resources': resources} context.update(csrf(request)) return context
def get_context_data(self, request): query = [{"field": "metadata.OS-EXT-AZ:availability_zone", "op": "eq", "value": "nova"}] try: instances = ceilometer.resource_list(request, query, ceilometer_usage_object=None) meters = ceilometer.meter_list(request) except Exception: instances = [] meters = [] exceptions.handle(request, _('Unable to retrieve Nova Ceilometer ' 'metering information.')) instance_ids = set([i.resource_id for i in instances]) instance_meters = set([m.name for m in meters if m.resource_id in instance_ids]) meter_titles = {"instance": _("Duration of instance"), "memory": _("Volume of RAM in MB"), "cpu": _("CPU time used"), "cpu_util": _("Average CPU utilisation"), "vcpus": _("Number of VCPUs"), "disk.read.requests": _("Number of read requests"), "disk.write.requests": _("Number of write requests"), "disk.read.bytes": _("Volume of reads in B"), "disk.write.bytes": _("Volume of writes in B"), "disk.root.size": _("Size of root disk in GB"), "disk.ephemeral.size": _("Size of ephemeral disk " "in GB"), "network.incoming.bytes": _("Number of incoming bytes " "on the network for a VM interface"), "network.outgoing.bytes": _("Number of outgoing bytes " "on the network for a VM interface"), "network.incoming.packets": _("Number of incoming " "packets for a VM interface"), "network.outgoing.packets": _("Number of outgoing " "packets for a VM interface")} for flavor in self._get_flavor_names(request): name = 'instance:%s' % flavor hint = (_('Duration of instance type %s (openstack flavor)') % flavor) meter_titles[name] = hint class MetersWrap(object): """A quick wrapper for meter and associated titles.""" def __init__(self, meter, meter_titles): self.name = meter self.title = meter_titles.get(meter, "") meters_objs = [MetersWrap(meter, meter_titles) for meter in sorted(instance_meters)] context = {'meters': meters_objs} return context
def get_context_data(self, request): query = [{"field": "metadata.OS-EXT-AZ:availability_zone", "op": "eq", "value": "nova"}] try: instances = ceilometer.resource_list(request, query, ceilometer_usage_object=None) meters = ceilometer.meter_list(request) except Exception: instances = [] meters = [] exceptions.handle(request, _('Unable to retrieve Nova Ceilometer ' 'metering information.')) instance_ids = set([i.resource_id for i in instances]) instance_meters = set([m.name for m in meters if m.resource_id in instance_ids]) meter_titles = {"instance": _("Duration of instance"), "memory": _("Volume of RAM in MB"), "cpu": _("CPU time used"), "cpu_util": _("Average CPU utilisation"), "vcpus": _("Number of VCPUs"), "disk.read.requests": _("Number of read requests"), "disk.write.requests": _("Number of write requests"), "disk.read.bytes": _("Volume of reads in B"), "disk.write.bytes": _("Volume of writes in B"), "disk.root.size": _("Size of root disk in GB"), "disk.ephemeral.size": _("Size of ephemeral disk " "in GB"), "network.incoming.bytes": _("Number of incoming bytes " "on the network for a VM interface"), "network.outgoing.bytes": _("Number of outgoing bytes " "on the network for a VM interface"), "network.incoming.packets": _("Number of incoming " "packets for a VM interface"), "network.outgoing.packets": _("Number of outgoing " "packets for a VM interface")} for flavor in self._get_flavor_names(request): name = 'instance:%s' % flavor hint = (_('Duration of instance type %s (openstack flavor)') % flavor) meter_titles[name] = hint class MetersWrap(object): """ A quick wrapper for meter and associated titles. """ def __init__(self, meter, meter_titles): self.name = meter self.title = meter_titles.get(meter, "") meters_objs = [MetersWrap(meter, meter_titles) for meter in sorted(instance_meters)] context = {'meters': meters_objs} return context
def get_meter_list_and_unit(request, meter): try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: meter_list = [] unit = '' return meter_list, unit
def query_data(request, date_from, date_to, group_by, meter, period=None, query=None, additional_query=None): if not period: period = metering.calc_period(date_from, date_to, 50) if additional_query is None: additional_query = [] if date_from: additional_query += [{ 'field': 'timestamp', 'op': 'ge', 'value': date_from }] if date_to: additional_query += [{ 'field': 'timestamp', 'op': 'le', 'value': date_to }] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [ m for m in ceilometer.meter_list(request) if m.name == meter ] unit = meter_list[0].unit except Exception: unit = "" ceilometer_usage = ceilometer.CeilometerUsage(request) try: if group_by: resources = ceilometer_usage.resource_aggregates_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query) else: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query) except Exception: resources = [] exceptions.handle(request, _('Unable to retrieve statistics.')) return resources, unit
def get_context_data(self, request): context = {} meter_list = ceilometer.meter_list(self.request) meters = [] meter_types = [ ("Compute (Nova)", [ {"name": "cpu", "unit": "ns", "type": "cumulative"}, {"name": "disk.read.requests", "unit": "requests", "type": "cumulative"}, {"name": "disk.read.bytes", "unit": "B", "type": "cumulative"}, {"name": "disk.write.bytes", "unit": "B", "type": "cumulative"}, {"name": "disk.write.requests", "unit": "requests", "type": "cumulative"}, {"name": "network.incoming.bytes", "unit": "B", "type": "cumulative"}, {"name": "network.outgoing.bytes", "unit": "B", "type": "cumulative"}, {"name": "network.incoming.packets", "unit": "packets", "type": "cumulative"}, {"name": "network.outgoing.packets", "unit": "packets", "type": "cumulative"}]) ] meters = ceilometer.meter_list(self.request) metersx = ceilometer.Meters(request) if not metersx._ceilometer_meter_list: msg = _("There are no meters defined yet.") messages.warning(request, msg) resources = {} for meter in meters: if meter.type=='delta' or meter.type=='cumulative': if meter.name not in resources: resources[meter.name] = [] if meter.resource_id not in resources[meter.name]: resources[meter.name].append(meter.resource_id) context = {'meters': meter_types, 'resources': resources} context.update(csrf(request)) return context
def query_data(request, date_from, date_to, date_options, group_by, meter, period=None, additional_query=None): date_from, date_to = _calc_date_args(date_from, date_to, date_options) if not period: period = _calc_period(date_from, date_to) if additional_query is None: additional_query = [] if date_from: additional_query += [{'field': 'timestamp', 'op': 'ge', 'value': date_from}] if date_to: additional_query += [{'field': 'timestamp', 'op': 'le', 'value': date_to}] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: unit = "" if group_by == "project": try: tenants, more = api.keystone.tenant_list( request, domain=None, paginate=False) except Exception: tenants = [] exceptions.handle(request, _('Unable to retrieve project list.')) queries = {} for tenant in tenants: tenant_query = [{ "field": "project_id", "op": "eq", "value": tenant.id}] queries[tenant.name] = tenant_query ceilometer_usage = ceilometer.CeilometerUsage(request) resources = ceilometer_usage.resource_aggregates_with_statistics( queries, [meter], period=period, stats_attr=None, additional_query=additional_query) else: query = [] def filter_by_meter_name(resource): """Function for filtering of the list of resources. Will pick the right resources according to currently selected meter. """ for link in resource.links: if link['rel'] == meter: # If resource has the currently chosen meter. return True return False ceilometer_usage = ceilometer.CeilometerUsage(request) try: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query, filter_func=filter_by_meter_name) except Exception: resources = [] exceptions.handle(request, _('Unable to retrieve statistics.')) return resources, unit
def query_data(request, date_from, date_to, date_options, group_by, meter, period=None, additional_query=None): date_from, date_to = _calc_date_args(date_from, date_to, date_options) if not period: period = _calc_period(date_from, date_to) if additional_query is None: additional_query = [] if date_from: additional_query += [{'field': 'timestamp', 'op': 'ge', 'value': date_from}] if date_to: additional_query += [{'field': 'timestamp', 'op': 'le', 'value': date_to}] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: unit = "" if group_by == "project": try: tenants, more = api.keystone.tenant_list( request, domain=None, paginate=False) except Exception: tenants = [] exceptions.handle(request, _('Unable to retrieve tenant list.')) queries = {} for tenant in tenants: tenant_query = [{ "field": "project_id", "op": "eq", "value": tenant.id}] queries[tenant.name] = tenant_query ceilometer_usage = ceilometer.CeilometerUsage(request) resources = ceilometer_usage.resource_aggregates_with_statistics( queries, [meter], period=period, stats_attr=None, additional_query=additional_query) else: query = [] def filter_by_meter_name(resource): """Function for filtering of the list of resources. Will pick the right resources according to currently selected meter. """ for link in resource.links: if link['rel'] == meter: # If resource has the currently chosen meter. return True return False ceilometer_usage = ceilometer.CeilometerUsage(request) try: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query, filter_func=filter_by_meter_name) except Exception: resources = [] exceptions.handle(request, _('Unable to retrieve statistics.')) return resources, unit
def get(self, request, *args, **kwargs): meter = request.GET.get('meter', None) 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') # TODO(lsmola) all timestamps should probably work with # current timezone. And also show the current timezone in chart. if (date_options == "other"): try: if date_from: date_from = datetime.strptime(date_from, "%Y-%m-%d") else: # TODO(lsmola) there should be probably the date # of the first sample as default, so it correctly # counts the time window. Though I need ordering # and limit of samples to obtain that. pass if date_to: date_to = datetime.strptime(date_to, "%Y-%m-%d") # It return beginning of the day, I want the and of # the day, so i will add one day without a second. date_to = (date_to + timedelta(days=1) - timedelta(seconds=1)) else: date_to = datetime.now() except Exception: raise ValueError("The dates haven't been " "recognized") else: try: date_from = datetime.now() - timedelta(days=int(date_options)) date_to = datetime.now() except Exception: raise ValueError("The time delta must be an " "integer representing days.") if date_from and date_to: if date_to < date_from: # TODO(lsmola) propagate the Value error through Horizon # handler to the client with verbose message. raise ValueError("Date to must be bigger than date " "from.") # get the time delta in seconds delta = date_to - date_from if delta.days <= 0: # it's one day delta_in_seconds = 3600 * 24 else: delta_in_seconds = delta.days * 24 * 3600 + delta.seconds # Lets always show 400 samples in the chart. Know that it is # maximum amount of samples and it can be lower. number_of_samples = 400 period = delta_in_seconds / number_of_samples else: # If some date is missing, just set static window to one day. period = 3600 * 24 additional_query = [] if date_from: additional_query += [{'field': 'timestamp', 'op': 'ge', 'value': date_from}] if date_to: additional_query += [{'field': 'timestamp', 'op': 'le', 'value': date_to}] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: unit = "" if request.GET.get('group_by', None) == "project": try: tenants, more = api.keystone.tenant_list( request, domain=None, paginate=False) except Exception: tenants = [] exceptions.handle(request, _('Unable to retrieve tenant list.')) queries = {} for tenant in tenants: tenant_query = [{ "field": "project_id", "op": "eq", "value": tenant.id}] queries[tenant.name] = tenant_query ceilometer_usage = ceilometer.CeilometerUsage(request) resources = ceilometer_usage.resource_aggregates_with_statistics( queries, [meter], period=period, stats_attr=None, additional_query=additional_query) series = self._series_for_meter(resources, 'id', meter_name, stats_attr, unit) else: query = [] def filter_by_meter_name(resource): """Function for filtering of the list of resources. Will pick the right resources according to currently selected meter. """ for link in resource.links: if link['rel'] == meter: # If resource has the currently chosen meter. return True return False ceilometer_usage = ceilometer.CeilometerUsage(request) try: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query, filter_func=filter_by_meter_name) except Exception: resources = [] exceptions.handle(request, _('Unable to retrieve statistics.')) series = self._series_for_meter(resources, 'resource_id', meter_name, stats_attr, unit) ret = {} ret['series'] = series ret['settings'] = {} return HttpResponse(json.dumps(ret), mimetype='application/json')
def get(self, request, *args, **kwargs): meter = request.GET.get('meter', None) 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') # TODO(lsmola) all timestamps should probably work with # current timezone. And also show the current timezone in chart. if (date_options == "other"): try: if date_from: date_from = datetime.strptime(date_from, "%Y-%m-%d") else: # TODO(lsmola) there should be probably the date # of the first sample as default, so it correctly # counts the time window. Though I need ordering # and limit of samples to obtain that. pass if date_to: date_to = datetime.strptime(date_to, "%Y-%m-%d") # It return beginning of the day, I want the and of # the day, so i will add one day without a second. date_to = (date_to + timedelta(days=1) - timedelta(seconds=1)) else: date_to = datetime.now() except Exception: raise ValueError("The dates haven't been " "recognized") else: try: date_from = datetime.now() - timedelta(days=int(date_options)) date_to = datetime.now() except Exception: raise ValueError("The time delta must be an " "integer representing days.") if date_from and date_to: if date_to < date_from: # TODO(lsmola) propagate the Value error through Horizon # handler to the client with verbose message. raise ValueError("Date to must be bigger than date " "from.") # get the time delta in seconds delta = date_to - date_from if delta.days <= 0: # it's one day delta_in_seconds = 3600 * 24 else: delta_in_seconds = delta.days * 24 * 3600 + delta.seconds # Lets always show 400 samples in the chart. Know that it is # maximum amount of samples and it can be lower. number_of_samples = 400 period = delta_in_seconds / number_of_samples else: # If some date is missing, just set static window to one day. period = 3600 * 24 additional_query = [] if date_from: additional_query += [{'field': 'timestamp', 'op': 'ge', 'value': date_from}] if date_to: additional_query += [{'field': 'timestamp', 'op': 'le', 'value': date_to}] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: unit = "" if request.GET.get('group_by', None) == "project": try: tenants, more = api.keystone.tenant_list( request, domain=None, paginate=True, marker="tenant_marker") except Exception: tenants = [] exceptions.handle(request, _('Unable to retrieve tenant list.')) queries = {} for tenant in tenants: tenant_query = [{ "field": "project_id", "op": "eq", "value": tenant.id}] queries[tenant.name] = tenant_query ceilometer_usage = ceilometer.CeilometerUsage(request) resources = ceilometer_usage.resource_aggregates_with_statistics( queries, [meter], period=period, stats_attr=None, additional_query=additional_query) series = self._series_for_meter(resources, 'id', meter_name, stats_attr, unit) else: query = [] def filter_by_meter_name(resource): """Function for filtering of the list of resources. Will pick the right resources according to currently selected meter. """ for link in resource.links: if link['rel'] == meter: # If resource has the currently chosen meter. return True return False ceilometer_usage = ceilometer.CeilometerUsage(request) try: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query, filter_func=filter_by_meter_name) except Exception: resources = [] exceptions.handle(request, _('Unable to retrieve statistics.')) series = self._series_for_meter(resources, 'resource_id', meter_name, stats_attr, unit) ret = {} ret['series'] = series ret['settings'] = {} return HttpResponse(json.dumps(ret), mimetype='application/json')
def get(self, request, *args, **kwargs): meter = request.GET.get('meter', None) 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) resource = request.GET.get('resource', None) stats_attr = request.GET.get('stats_attr', 'avg') if (date_options == "other"): try: if date_from: date_from = datetime.strptime(date_from, "%Y-%m-%d") if date_to: date_to = datetime.strptime(date_to, "%Y-%m-%d") except ValueError: raise exceptions.NotFound else: date_from = datetime.now() - timedelta(days=int(date_options)) date_to = datetime.now() query = [{"field": "metadata.OS-EXT-AZ:availability_zone", "op": "eq", "value": "nova"}] additional_query = [] if date_from: additional_query += [{'field': 'timestamp', 'op': 'ge', 'value': date_from}] if date_to: additional_query += [{'field': 'timestamp', 'op': 'le', 'value': date_to}] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: unit = "" if request.GET.get('group_by', None) == "project": try: tenants, more = api.keystone.tenant_list( request, domain=None, paginate=True, marker="tenant_marker") except Exception: tenants = [] exceptions.handle(request, _('Unable to retrieve tenant list.')) queries = {} for tenant in tenants: tenant_query = [{ "field": "project_id", "op": "eq", "value": tenant.id}] queries[tenant.name] = tenant_query ceilometer_usage = ceilometer.CeilometerUsage(request) resources = ceilometer_usage.resource_aggregates_with_statistics( queries, [meter], period=1000, stats_attr=None, additional_query=additional_query) series = [] for resource in resources: name = resource.id if getattr(resource, meter_name): serie = {'unit': unit, 'name': name, 'data': []} for statistic in getattr(resource, meter_name): date = statistic.duration_end[:19] value = int(getattr(statistic, stats_attr)) serie['data'].append({'x': date, 'y': value}) series.append(serie) else: ceilometer_usage = ceilometer.CeilometerUsage(request) try: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=1000, stats_attr=None, additional_query=additional_query) except Exception: resources = [] exceptions.handle(request, _('Unable to retrieve statistics.')) series = [] for resource in resources: if getattr(resource, meter_name): serie = {'unit': unit, 'name': resource.resource_id, 'data': []} for statistic in getattr(resource, meter_name): date = statistic.duration_end[:19] value = int(getattr(statistic, stats_attr)) serie['data'].append({'x': date, 'y': value}) series.append(serie) ret = {} ret['series'] = series ret['settings'] = {} return HttpResponse(json.dumps(ret), mimetype='application/json')
def get(self, request, *args, **kwargs): meter = request.GET.get("meter", None) 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) resource = request.GET.get("resource", None) stats_attr = request.GET.get("stats_attr", "avg") # TODO(lsmola) all timestamps should probably work with # current timezone. And also show the current timezone in chart. if date_options == "other": try: if date_from: date_from = datetime.strptime(date_from, "%Y-%m-%d") else: # TODO(lsmola) there should be probably the date # of the first sample as default, so it correctly # counts the time window. Though I need ordering # and limit of samples to obtain that. pass if date_to: date_to = datetime.strptime(date_to, "%Y-%m-%d") # It return beginning of the day, I want the and of # the day, so i will add one day without a second. date_to = date_to + timedelta(days=1) - timedelta(seconds=1) else: date_to = datetime.now() except Exception: raise ValueError("The dates haven't been " "recognized") else: try: date_from = datetime.now() - timedelta(days=int(date_options)) date_to = datetime.now() except Exception: raise ValueError("The time delta must be an " "integer representing days.") if date_from and date_to: if date_to < date_from: # TODO(lsmola) propagate the Value error through Horizon # handler to the client with verbose message. raise ValueError("Date to must be bigger than date " "from.") # get the time delta in seconds delta = date_to - date_from if delta.days <= 0: # it's one day delta_in_seconds = 3600 * 24 else: delta_in_seconds = delta.days * 24 * 3600 + delta.seconds # Lets always show 400 samples in the chart. Know that it is # maximum amount of samples and it can be lower. number_of_samples = 400 period = delta_in_seconds / number_of_samples else: # If some date is missing, just set static window to one day. period = 3600 * 24 query = [{"field": "metadata.OS-EXT-AZ:availability_zone", "op": "eq", "value": "nova"}] additional_query = [] if date_from: additional_query += [{"field": "timestamp", "op": "ge", "value": date_from}] if date_to: additional_query += [{"field": "timestamp", "op": "le", "value": date_to}] # TODO(lsmola) replace this by logic implemented in I1 in bugs # 1226479 and 1226482, this is just a quick fix for RC1 try: meter_list = [m for m in ceilometer.meter_list(request) if m.name == meter] unit = meter_list[0].unit except Exception: unit = "" if request.GET.get("group_by", None) == "project": try: tenants, more = api.keystone.tenant_list(request, domain=None, paginate=True, marker="tenant_marker") except Exception: tenants = [] exceptions.handle(request, _("Unable to retrieve tenant list.")) queries = {} for tenant in tenants: tenant_query = [{"field": "project_id", "op": "eq", "value": tenant.id}] queries[tenant.name] = tenant_query ceilometer_usage = ceilometer.CeilometerUsage(request) resources = ceilometer_usage.resource_aggregates_with_statistics( queries, [meter], period=period, stats_attr=None, additional_query=additional_query ) series = [] for resource in resources: name = resource.id if getattr(resource, meter_name): serie = {"unit": unit, "name": name, "data": []} for statistic in getattr(resource, meter_name): date = statistic.duration_end[:19] value = int(getattr(statistic, stats_attr)) serie["data"].append({"x": date, "y": value}) series.append(serie) else: ceilometer_usage = ceilometer.CeilometerUsage(request) try: resources = ceilometer_usage.resources_with_statistics( query, [meter], period=period, stats_attr=None, additional_query=additional_query ) except Exception: resources = [] exceptions.handle(request, _("Unable to retrieve statistics.")) series = [] for resource in resources: if getattr(resource, meter_name): serie = {"unit": unit, "name": resource.resource_id, "data": []} for statistic in getattr(resource, meter_name): date = statistic.duration_end[:19] value = int(getattr(statistic, stats_attr)) serie["data"].append({"x": date, "y": value}) series.append(serie) ret = {} ret["series"] = series ret["settings"] = {} return HttpResponse(json.dumps(ret), mimetype="application/json")
def get_context_data(self, request): context = {} meter_list = ceilometer.meter_list(self.request) meters = [] meter_types = [("Compute", [{ "name": "cpu", "unit": "ns", "type": "cumulative" }, { "name": "disk.read.requests", "unit": "requests", "type": "cumulative" }, { "name": "disk.read.bytes", "unit": "B", "type": "cumulative" }, { "name": "network.incoming.bytes", "unit": "B", "type": "cumulative" }, { "name": "network.outgoing.bytes", "unit": "B", "type": "cumulative" }, { "name": "network.incoming.packets", "unit": "packets", "type": "cumulative" }, { "name": "network.outgoing.packets", "unit": "packets", "type": "cumulative" }]), ("Network", [{ "name": "network.create", "unit": "network", "type": "delta" }, { "name": "network.update", "unit": "network", "type": "delta" }, { "name": "subnet.create", "unit": "subnet", "type": "delta" }, { "name": "subnet.update", "unit": "subnet", "type": "delta" }, { "name": "port.create", "unit": "port", "type": "delta" }, { "name": "port.update", "unit": "port", "type": "delta" }, { "name": "router.create", "unit": "router", "type": "delta" }, { "name": "router.update", "unit": "router", "type": "delta" }, { "name": "ip.floating.create", "unit": "ip", "type": "delta" }, { "name": "ip.floating.update", "unit": "ip", "type": "delta" }]), ("Object Storage", [{ "name": "storage.objects.incoming.bytes", "unit": "B", "type": "delta" }, { "name": "storage.objects.outgoing.bytes", "unit": "B", "type": "delta" }])] # grab different resources for metrics, # and associate with the right type meters = ceilometer.meter_list(self.request) resources = {} for meter in meters: # group resources by meter names if meter.type == 'delta' or meter.type == 'cumulative': if meter.name not in resources: resources[meter.name] = [] if meter.resource_id not in resources[meter.name]: resources[meter.name].append(meter.resource_id) context = {'meters': meter_types, 'resources': resources} context.update(csrf(request)) return context