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 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()
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()
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())
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)
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
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
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)
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)