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 test_calc_date_args_strings(self): date_from, date_to = metering.calc_date_args("2012-04-11", "2012-04-12", "other") self.assertTrue(type(date_from) is datetime.datetime) self.assertTrue(type(date_to) is datetime.datetime) self.assertEqual(str(date_from.tzinfo), "UTC") self.assertEqual(str(date_to.tzinfo), "UTC")
def test_calc_date_args_datetime_dates(self): date_from, date_to = metering.calc_date_args( datetime.date(2012, 4, 11), datetime.date(2012, 4, 12), "other") self.assertTrue(type(date_from) is datetime.datetime) self.assertTrue(type(date_to) is datetime.datetime) self.assertEqual(str(date_from.tzinfo), "UTC") self.assertEqual(str(date_to.tzinfo), "UTC")
def test_calc_date_args_strings(self): date_from, date_to = metering.calc_date_args( "2012-04-11", "2012-04-12", "other") self.assertTrue(type(date_from) is datetime.datetime) self.assertTrue(type(date_to) is datetime.datetime) self.assertEqual(str(date_from.tzinfo), "UTC") self.assertEqual(str(date_to.tzinfo), "UTC")
def get_report_table_data(self): meters = ceilometer.Meters(self.request) services = { _('Nova'): meters.list_nova(), _('Neutron'): meters.list_neutron(), _('Glance'): meters.list_glance(), _('Cinder'): meters.list_cinder(), _('Swift_meters'): meters.list_swift(), _('Kwapi'): meters.list_kwapi(), _('IPMI'): meters.list_ipmi(), } report_rows = [] date_options = self.request.session.get('period', 7) date_from = self.request.session.get('date_from', '') date_to = self.request.session.get('date_to', '') try: date_from, date_to = metering.calc_date_args(date_from, date_to, date_options) except Exception: exceptions.handle(self.request, _('Dates cannot be recognized.')) try: project_aggregates = metering.ProjectAggregatesQuery(self.request, date_from, date_to, 3600 * 24) except Exception: exceptions.handle(self.request, _('Unable to retrieve project list.')) for meter in meters._cached_meters.values(): service = None for name, m_list in services.items(): if meter in m_list: service = name break res, unit = project_aggregates.query(meter.name) for re in res: values = re.get_meter(meter.name.replace(".", "_")) if values: for value in values: row = {"name": 'none', "project": re.id, "meter": meter.name, "description": meter.description, "service": service, "time": value._apiresource.period_end, "value": value._apiresource.avg, "unit": meter.unit} report_rows.append(row) return report_rows
def load_report_data(request): meters = ceilometer.Meters(request) services = { _('Nova'): meters.list_nova(), _('Neutron'): meters.list_neutron(), _('Glance'): meters.list_glance(), _('Cinder'): meters.list_cinder(), _('Swift_meters'): meters.list_swift(), _('Kwapi'): meters.list_kwapi(), _('IPMI'): meters.list_ipmi(), } project_rows = {} date_options = request.GET.get('date_options', 7) date_from = request.GET.get('date_from') date_to = request.GET.get('date_to') try: date_from, date_to = metering_utils.calc_date_args(date_from, date_to, date_options) except Exception: exceptions.handle(request, _('Dates cannot be recognized.')) try: project_aggregates = metering_utils.ProjectAggregatesQuery(request, date_from, date_to, 3600 * 24) except Exception: exceptions.handle(request, _('Unable to retrieve project list.')) for meter in meters._cached_meters.values(): service = None for name, m_list in services.items(): if meter in m_list: service = name break res, unit = project_aggregates.query(meter.name) for r in res: values = r.get_meter(meter.name.replace(".", "_")) if values: for value in values: row = {"name": 'none', "project": r.id, "meter": meter.name, "description": meter.description, "service": service, "time": value._apiresource.period_end, "value": value._apiresource.avg, "unit": meter.unit} if r.id not in project_rows: project_rows[r.id] = [row] else: project_rows[r.id].append(row) return project_rows
def get_report_table_data(self): meters = ceilometer.Meters(self.request) services = { _('Nova'): meters.list_nova(), _('Neutron'): meters.list_neutron(), _('Glance'): meters.list_glance(), _('Cinder'): meters.list_cinder(), _('Swift_meters'): meters.list_swift(), _('Kwapi'): meters.list_kwapi(), } report_rows = [] date_options = self.request.session.get('period', 7) date_from = self.request.session.get('date_from', '') date_to = self.request.session.get('date_to', '') try: date_from, date_to = metering.calc_date_args(date_from, date_to, date_options) except Exception: exceptions.handle(self.request, _('Dates cannot be recognized.')) try: project_aggregates = metering.ProjectAggregatesQuery(self.request, date_from, date_to, 3600 * 24) except Exception: exceptions.handle(self.request, _('Unable to retrieve project list.')) for meter in meters._cached_meters.values(): service = None for name, m_list in services.items(): if meter in m_list: service = name break res, unit = project_aggregates.query(meter.name) for re in res: values = re.get_meter(meter.name.replace(".", "_")) if values: for value in values: row = {"name": 'none', "project": re.id, "meter": meter.name, "description": meter.description, "service": service, "time": value._apiresource.period_end, "value": value._apiresource.avg} report_rows.append(row) return report_rows
def load_report_data(request): meters = ceilometer.Meters(request) services = { _('Nova'): meters.list_nova(), _('Neutron'): meters.list_neutron(), _('Glance'): meters.list_glance(), _('Cinder'): meters.list_cinder(), _('Swift_meters'): meters.list_swift(), _('Kwapi'): meters.list_kwapi(), } project_rows = {} date_options = request.GET.get('date_options', 7) date_from = request.GET.get('date_from') date_to = request.GET.get('date_to') try: date_from, date_to = utils_metering.calc_date_args(date_from, date_to, date_options) except Exception: exceptions.handle(request, _('Dates cannot be recognised.')) try: project_aggregates = utils_metering.ProjectAggregatesQuery(request, date_from, date_to, 3600 * 24) except Exception: exceptions.handle(request, _('Unable to retrieve project list.')) for meter in meters._cached_meters.values(): service = None for name, m_list in services.items(): if meter in m_list: service = name break res, unit = project_aggregates.query(meter.name) for re in res: values = re.get_meter(meter.name.replace(".", "_")) if values: for value in values: row = {"name": 'none', "project": re.id, "meter": meter.name, "description": meter.description, "service": service, "time": value._apiresource.period_end, "value": value._apiresource.avg} if re.id not in project_rows: project_rows[re.id] = [row] else: project_rows[re.id].append(row) return project_rows
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 = utils_metering.calc_date_args(date_from, date_to, date_options) except Exception: exceptions.handle(self.request, _('Dates cannot be recognized.')) if group_by == 'project': query = utils_metering.ProjectAggregatesQuery(request, date_from, date_to, 3600 * 24) else: query = utils_metering.MeterQuery(request, date_from, date_to, 3600 * 24) resources, unit = query.query(meter_name) resource_name = 'id' if group_by == "project" else 'resource_id' series = self._series_for_meter(resources, resource_name, meter_name, stats_attr, unit) ret = {} ret['series'] = series ret['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
def get_process_list_table_data(self): meters = ceilometer.Meters(self.request) instance = self.tab_group.kwargs['instance'] services = { _('Nova'): meters.list_nova(), _('Neutron'): meters.list_neutron(), _('Glance'): meters.list_glance(), _('Cinder'): meters.list_cinder(), _('Swift_meters'): meters.list_swift(), _('Kwapi'): meters.list_kwapi(), _('IPMI'): meters.list_ipmi(), } report_rows = [] date_options = self.request.session.get('period', 1) date_from = self.request.session.get('date_from', '') date_to = self.request.session.get('date_to', '') try: date_from, date_to = metering.calc_date_args(date_from, date_to, date_options) except Exception: exceptions.handle(self.request, _('Dates cannot be recognized.')) try: project_aggregates = metering.ProjectAggregatesQuery(self.request, date_from, date_to, 3600 * 24) except Exception: exceptions.handle(self.request, _('Unable to retrieve project list.')) meter_name = 'instance.process.list' meter = meters._get_meter(meter_name) self._meter = meter LOG.debug('meter: %s' % meter.__dict__) res, unit = project_aggregates.query(meter.name) LOG.debug('unit: %s' % unit) query = [ {"field": "resource_id", "op": "eq", "value": instance.id}, ] sample_list = api.ceilometer.sample_list(self.request, meter.name, query, limit=1) sample = sample_list[0] self._timestamp = sample.timestamp LOG.debug("sample: %s" % sample) counter_volume = sample.counter_volume LOG.debug("counter_volume: %s" % counter_volume) LOG.debug("counter_volume first char: %s" % counter_volume[0]) LOG.debug("counter_volume last char: %s" % counter_volume[-1]) process_lists = eval(counter_volume) LOG.debug("process_lists: %s" % len(process_lists)) for process_list in process_lists: plist = dict(process_list) LOG.debug("plist: %s" % plist) row = {"offset": plist['offset'], "name": plist['process_name'], "pid": plist['pid'], "uid": plist['uid'], "gid": plist['gid'], "dtb": plist['dtb'], "start_time": plist['start_time'], } report_rows.append(row) return report_rows