<filename>amplify/agent/collectors/plus/status.py
# -*- coding: utf-8 -*-

from amplify.agent.collectors.plus.abstract import PlusStatusCollector
from amplify.agent.collectors.plus.util.status.cache import CACHE_COLLECT_INDEX
from amplify.agent.collectors.plus.util.status.slab import SLAB_COLLECT_INDEX
from amplify.agent.collectors.plus.util.status.status_zone import (
    STATUS_ZONE_COLLECT_INDEX
)
from amplify.agent.collectors.plus.util.status.stream import (
    STREAM_COLLECT_INDEX
)
from amplify.agent.collectors.plus.util.status.stream_upstream import (
    STREAM_UPSTREAM_PEER_COLLECT_INDEX,
    STREAM_UPSTREAM_COLLECT_INDEX
)
from amplify.agent.collectors.plus.util.status.upstream import (
    UPSTREAM_PEER_COLLECT_INDEX,
    UPSTREAM_COLLECT_INDEX
)

__author__ = "<NAME>"
__copyright__ = "Copyright (C) Nginx, Inc. All rights reserved."
__license__ = ""
__maintainer__ = "<NAME>"
__email__ = "<EMAIL>"


class CacheCollector(PlusStatusCollector):
    short_name = 'plus_cache'
    collect_index = CACHE_COLLECT_INDEX


class StatusZoneCollector(PlusStatusCollector):
    short_name = 'plus_status_zone'
    collect_index = STATUS_ZONE_COLLECT_INDEX


class UpstreamCollector(PlusStatusCollector):
    short_name = 'plus_upstream'
    collect_index = UPSTREAM_PEER_COLLECT_INDEX
    additional_collect_index = UPSTREAM_COLLECT_INDEX

    def collect_from_data(self, data, stamp):
        """
        Aggregates all peer metrics as a single "upstream" entity.
        """
        # data.get('peers', data) is a workaround for supporting an old N+ format
        # http://nginx.org/en/docs/http/ngx_http_status_module.html#compatibility
        peers = data.get('peers', data) if isinstance(data, dict) else data
        for peer in peers:
            super(UpstreamCollector, self).collect_from_data(peer, stamp)

        for method in self.additional_collect_index:
            method(self, data, stamp)

        try:
            self.finalize_latest()
        except Exception as e:
            self.handle_exception(self.finalize_latest, e)


class SlabCollector(PlusStatusCollector):
    short_name = 'plus_slab'
    collect_index = SLAB_COLLECT_INDEX


class StreamCollector(StatusZoneCollector):
    short_name = 'plus_stream'
    collect_index = STREAM_COLLECT_INDEX


class StreamUpstreamCollector(UpstreamCollector):
    short_name = 'plus_stream_upstream'
    collect_index = STREAM_UPSTREAM_PEER_COLLECT_INDEX
    additional_collect_index = STREAM_UPSTREAM_COLLECT_INDEX

<filename>amplify/agent/collectors/plus/status.py
# -*- coding: utf-8 -*-

from amplify.agent.collectors.plus.abstract import PlusStatusCollector
from amplify.agent.collectors.plus.util.status.cache import CACHE_COLLECT_INDEX
from amplify.agent.collectors.plus.util.status.slab import SLAB_COLLECT_INDEX
from amplify.agent.collectors.plus.util.status.status_zone import (
    STATUS_ZONE_COLLECT_INDEX
)
from amplify.agent.collectors.plus.util.status.stream import (
    STREAM_COLLECT_INDEX
)
from amplify.agent.collectors.plus.util.status.stream_upstream import (
    STREAM_UPSTREAM_PEER_COLLECT_INDEX,
    STREAM_UPSTREAM_COLLECT_INDEX
)
from amplify.agent.collectors.plus.util.status.upstream import (
    UPSTREAM_PEER_COLLECT_INDEX,
    UPSTREAM_COLLECT_INDEX
)

__author__ = "<NAME>"
__copyright__ = "Copyright (C) Nginx, Inc. All rights reserved."
__license__ = ""
__maintainer__ = "<NAME>"
__email__ = "<EMAIL>"


class CacheCollector(PlusStatusCollector):
    short_name = 'plus_cache'
    collect_index = CACHE_COLLECT_INDEX


class StatusZoneCollector(PlusStatusCollector):
    short_name = 'plus_status_zone'
    collect_index = STATUS_ZONE_COLLECT_INDEX


class UpstreamCollector(PlusStatusCollector):
    short_name = 'plus_upstream'
    collect_index = UPSTREAM_PEER_COLLECT_INDEX
    additional_collect_index = UPSTREAM_COLLECT_INDEX

    def collect_from_data(self, data, stamp):
        """
        Aggregates all peer metrics as a single "upstream" entity.
        """
        # data.get('peers', data) is a workaround for supporting an old N+ format
        # http://nginx.org/en/docs/http/ngx_http_status_module.html#compatibility
        peers = data.get('peers', data) if isinstance(data, dict) else data
        for peer in peers:
            super(UpstreamCollector, self).collect_from_data(peer, stamp)

        for method in self.additional_collect_index:
            method(self, data, stamp)

        try:
            self.finalize_latest()
        except Exception as e:
            self.handle_exception(self.finalize_latest, e)


class SlabCollector(PlusStatusCollector):
    short_name = 'plus_slab'
    collect_index = SLAB_COLLECT_INDEX


class StreamCollector(StatusZoneCollector):
    short_name = 'plus_stream'
    collect_index = STREAM_COLLECT_INDEX


class StreamUpstreamCollector(UpstreamCollector):
    short_name = 'plus_stream_upstream'
    collect_index = STREAM_UPSTREAM_PEER_COLLECT_INDEX
    additional_collect_index = STREAM_UPSTREAM_COLLECT_INDEX

# -*- coding: utf-8 -*- Aggregates all peer metrics as a single "upstream" entity. # data.get('peers', data) is a workaround for supporting an old N+ format # http://nginx.org/en/docs/http/ngx_http_status_module.html#compatibility