Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
    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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
    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')
Ejemplo n.º 10
0
    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')
Ejemplo n.º 11
0
    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')
Ejemplo n.º 12
0
    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")
Ejemplo n.º 13
0
    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