Esempio n. 1
0
    def __init__(self, app, driver, addr, metrics_diver, metrics_addr,
                 metrics_name, send_inteval, loop):
        """
        :type tracer: str
        :type tracer_url: str
        :type statsd_addr: str
        :type statsd_prefix: str
        :type send_inteval: float
        :type loop: asyncio.AbstractEventLoop
        """
        if driver is not None and driver != 'zipkin':
            raise UserWarning('Unsupported tracer driver')
        if metrics_diver is not None and metrics_diver != 'statsd':
            raise UserWarning('Unsupported metrics driver')

        addr = addr or ''
        super(TracerTransport, self).__init__(addr,
                                              send_inteval=send_inteval,
                                              loop=loop)
        self.app = app
        self.loop = loop
        self._driver = driver
        self._metrics_diver = metrics_diver
        self._metrics_addr = metrics_addr
        self._metrics_name = metrics_name

        self.stats = None
        if metrics_diver == 'statsd':
            addr = metrics_addr.split(':')
            host = addr[0]
            port = int(addr[1]) if len(addr) > 1 else 8125
            self.stats = StatsdClient(host, port)
            asyncio.ensure_future(self.stats.run(), loop=loop)
Esempio n. 2
0
async def main():
    client = StatsdClient('192.168.32.231', 8125)
    asyncio.ensure_future(client.run())

    while True:
        await collect_cpu(client)
        await asyncio.sleep(5)

    await client.stop()
Esempio n. 3
0
            async def run_client():
                await asyncio.sleep(1.0)
                client = StatsdClient('127.0.0.1', 9999, flush_interval=0.05)
                async def sender():
                    for name, val, rate in counters:
                        await asyncio.sleep(0.01)
                        client.send_counter(name, val, rate)
                    await asyncio.sleep(0.2)
                    print('stopping')
                    await client.stop()
                    print('stopped')

                await asyncio.gather(client.run(), sender())
                await server.stop()
Esempio n. 4
0
 async def initialize(self, app=None):
     settings = app_settings['statsd']
     app_settings['statsd_client'] = StatsdClient(
         settings['host'], settings['port'],
         settings.get('packet_size', 512),
         settings.get('flush_interval', 1.0))
     asyncio.ensure_future(app_settings['statsd_client'].run())
Esempio n. 5
0
    def __init__(self, tracer, tracer_url, statsd_addr, statsd_prefix,
                 send_inteval, loop):
        tracer_url = tracer_url or 'http://localhost:9411/'
        super(TracerTransport, self).__init__(tracer_url,
                                              send_inteval=send_inteval,
                                              loop=loop)
        self.loop = loop
        self.__tracer = tracer
        self.__statsd_addr = statsd_addr
        self.__statsd_prefix = statsd_prefix

        self.stats = None
        if self.__statsd_addr:
            addr = self.__statsd_addr.split(':')
            host = addr[0]
            port = int(addr[1]) if len(addr) > 1 else 8125
            self.stats = StatsdClient(host, port)
            asyncio.ensure_future(self.stats.run(), loop=loop)
Esempio n. 6
0
def get_statsd_client(server="127.0.0.1",
                      port=8125,
                      packet_size=512,
                      flush_interval=.01):
    from aiostatsd.client import StatsdClient
    client = StatsdClient(server,
                          port,
                          packet_size=packet_size,
                          flush_interval=flush_interval)
    return client
Esempio n. 7
0
def get_statsd_client(server="127.0.0.1",
                      port=8125,
                      packet_size=512,
                      flush_interval=.01):
    if StatsdClient is None:
        raise ImportError("You need to install aiostatsd")
    client = StatsdClient(server,
                          port,
                          packet_size=packet_size,
                          flush_interval=flush_interval)
    return client
Esempio n. 8
0
class TracerTransport(azt.Transport):
    def __init__(self, app, driver, addr, metrics_diver, metrics_addr,
                 metrics_name, send_inteval, loop):
        """
        :type tracer: str
        :type tracer_url: str
        :type statsd_addr: str
        :type statsd_prefix: str
        :type send_inteval: float
        :type loop: asyncio.AbstractEventLoop
        """
        if driver is not None and driver != 'zipkin':
            raise UserWarning('Unsupported tracer driver')
        if metrics_diver is not None and metrics_diver != 'statsd':
            raise UserWarning('Unsupported metrics driver')

        addr = addr or ''
        super(TracerTransport, self).__init__(addr,
                                              send_inteval=send_inteval,
                                              loop=loop)
        self.app = app
        self.loop = loop
        self._driver = driver
        self._metrics_diver = metrics_diver
        self._metrics_addr = metrics_addr
        self._metrics_name = metrics_name

        self.stats = None
        if metrics_diver == 'statsd':
            addr = metrics_addr.split(':')
            host = addr[0]
            port = int(addr[1]) if len(addr) > 1 else 8125
            self.stats = StatsdClient(host, port)
            asyncio.ensure_future(self.stats.run(), loop=loop)

    async def close(self):
        if self.stats:
            try:
                await asyncio.sleep(.001, loop=self.loop)
                await self.stats.stop()
            except Exception as e:
                self.app.log_err(e)
        await super(TracerTransport, self).close()

    async def _send(self):
        data = self._queue[:]

        try:
            if self.stats:
                await self._send_to_statsd(data)
        except Exception as e:
            self.app.log_err(e)

        try:
            if self._driver == 'zipkin':
                # TODO отправить pull request в aiozipkin: не отправлять
                # TODO запрос, если self._queue пуста
                await super(TracerTransport, self)._send()
            else:
                self._queue = []
        except Exception as e:
            self.app.log_err(e)

    async def _send_to_statsd(self, data):
        if self.stats:
            for rec in data:
                tags = []
                t = rec['tags']
                if azc.HTTP_PATH in t and 'kind' in rec:
                    name = 'http'
                    if rec["kind"] == 'SERVER':
                        tags.append(('kind', 'in'))
                    else:
                        tags.append(('kind', 'out'))

                    copy_tags = {
                        azc.HTTP_STATUS_CODE: 'status',
                        azc.HTTP_METHOD: 'method',
                        azc.HTTP_HOST: 'host',
                        'api.key': 'api_key',
                        'api.method': 'api_method',
                        'api.code': 'api_code',
                        'api_merc.code': 'api_merc_code',
                    }
                    for tag_key, tag_name in copy_tags.items():
                        if tag_key in t:
                            tags.append((tag_name, t[tag_key]))

                elif rec['name'].startswith('db:'):
                    name = 'db'
                    tags.append(('kind', rec['name'][len('db:'):]))
                elif rec['name'].startswith('redis:'):
                    name = 'redis'
                    tags.append(('kind', rec['name'][len('redis:'):]))
                else:
                    name = rec['name']

                name = name.replace(' ', '_').replace(':', '_')
                name = self._metrics_name + name
                name = STATS_CLEAN_NAME_RE.sub('', name)

                if len(tags) > 0:
                    for tag in tags:
                        t = tag[1].replace(':', '-')
                        t = STATS_CLEAN_TAG_RE.sub('', t)
                        name += ',' + tag[0] + "=" + t
                self.stats.send_timer(name,
                                      int(round(rec["duration"] / 1000)),
                                      rate=1.0)
Esempio n. 9
0
class TracerTransport(azt.Transport):
    def __init__(self, tracer, tracer_url, statsd_addr, statsd_prefix,
                 send_inteval, loop):
        tracer_url = tracer_url or 'http://localhost:9411/'
        super(TracerTransport, self).__init__(tracer_url,
                                              send_inteval=send_inteval,
                                              loop=loop)
        self.loop = loop
        self.__tracer = tracer
        self.__statsd_addr = statsd_addr
        self.__statsd_prefix = statsd_prefix

        self.stats = None
        if self.__statsd_addr:
            addr = self.__statsd_addr.split(':')
            host = addr[0]
            port = int(addr[1]) if len(addr) > 1 else 8125
            self.stats = StatsdClient(host, port)
            asyncio.ensure_future(self.stats.run(), loop=loop)

    async def close(self):
        if self.stats:
            try:
                await asyncio.sleep(.001, loop=self.loop)
                await self.stats.stop()
            except Exception as e:
                logging.exception(e)
        await super(TracerTransport, self).close()

    async def _send(self):
        data = self._queue[:]

        try:
            if self.__statsd_addr:
                await self._send_to_statsd(data)
        except Exception as e:
            logging.exception(e)

        try:
            if self.__tracer == 'zipkin':
                await super(TracerTransport, self)._send()
            else:
                self._queue = []
        except Exception as e:
            logging.exception(e)

    async def _send_to_statsd(self, data):
        if self.stats:
            for rec in data:
                tags = []
                t = rec['tags']
                if azc.HTTP_PATH in t and 'kind' in rec:
                    name = 'http'
                    if rec["kind"] == 'SERVER':
                        tags.append(('kind', 'in'))
                    else:
                        tags.append(('kind', 'out'))

                    copy_tags = {
                        azc.HTTP_STATUS_CODE: 'status',
                        azc.HTTP_METHOD: 'method',
                        azc.HTTP_HOST: 'host',
                        'api.key': 'api_key',
                        'api.method': 'api_method',
                        'api.code': 'api_code',
                        'api_merc.code': 'api_merc_code',
                    }
                    for tag_key, tag_name in copy_tags.items():
                        if tag_key in t:
                            tags.append((tag_name, t[tag_key]))

                elif rec['name'].startswith('db:'):
                    name = 'db'
                    tags.append(('kind', rec['name'][len('db:'):]))
                elif rec['name'].startswith('redis:'):
                    name = 'redis'
                    tags.append(('kind', rec['name'][len('redis:'):]))
                elif rec['name'] == 'sleep':
                    name = 'sleep'
                else:
                    name = rec['name']

                name = self.__statsd_prefix + name
                name = name.replace(' ', '_')
                name = STATS_CLEAN_NAME_RE.sub('', name)

                if len(tags) > 0:
                    for tag in tags:
                        t = tag[1].replace(':', '-')
                        t = STATS_CLEAN_TAG_RE.sub('', t)
                        name += ',' + tag[0] + "=" + t
                self.stats.send_timer(name,
                                      int(round(rec["duration"] / 1000)),
                                      rate=1.0)