File: client.py

package info (click to toggle)
python-aiomeasures 0.5.14-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 596 kB
  • sloc: python: 5,173; makefile: 159
file content (47 lines) | stat: -rw-r--r-- 1,493 bytes parent folder | download | duplicates (2)
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()