1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
import asyncio
import logging
from . import formatting
from aiomeasures.clients.bases import Client
from aiomeasures.collectors import Collector
from aiomeasures.reporters import StatsDReporter
from random import random
class Datadog(Client):
def __init__(self, addr, *, prefix=None, tags=None, loop=None):
"""Sends statistics to the stats daemon over UDP
Parameters:
addr (str): the address in the form udp://host:port
loop (EventLoop): the event loop
prefix (str): prefix for all keys
tags (dict): default tags for everything
"""
self.loop = loop or asyncio.get_event_loop()
self.log = logging.getLogger(__name__)
self.prefix = prefix
self.tags = tags
self.collector = Collector([], 5000)
self.reporter = StatsDReporter(addr, loop=self.loop)
def register(self, metric):
self.collector.append(metric)
asyncio.Task(self.send(), loop=self.loop)
# self.loop.async(self.send())
return metric
def format(self, obj):
return formatting.format(obj, self.prefix, self.tags)
async def send(self):
"""Sends key/value pairs to Datadog agent.
"""
await self.reporter.connect()
rate = random()
formatter = self.format
metrics = self.collector.flush(rate=rate, formatter=formatter)
await self.reporter.send(metrics)
def close(self):
self.reporter.close()
|