示例#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')
示例#2
0
 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")
示例#3
0
 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")
示例#4
0
文件: utils.py 项目: 28607895/horizon
 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")
示例#5
0
文件: utils.py 项目: 28607895/horizon
 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")
示例#6
0
    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
示例#7
0
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
示例#8
0
    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
示例#9
0
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
示例#10
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 = 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')
示例#11
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
示例#12
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
示例#13
0
    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