From 6d4f7efeb9d89fb80ddd826b51f9e6910971b694 Mon Sep 17 00:00:00 2001 From: muhammad samir Date: Tue, 8 Feb 2022 20:30:05 +0100 Subject: [PATCH 1/2] add support for datadog style tags with is compatible with cloudwatch --- statsd/client/base.py | 41 ++++++++++++++++++++++++++--------------- statsd/client/timer.py | 5 +++-- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/statsd/client/base.py b/statsd/client/base.py index e273b417f..2605ff0d8 100644 --- a/statsd/client/base.py +++ b/statsd/client/base.py @@ -23,7 +23,7 @@ def pipeline(self): def timer(self, stat, rate=1): return Timer(self, stat, rate) - def timing(self, stat, delta, rate=1): + def timing(self, stat, delta, rate=1, tags=None): """ Send new timing information. @@ -32,37 +32,43 @@ def timing(self, stat, delta, rate=1): if isinstance(delta, timedelta): # Convert timedelta to number of milliseconds. delta = delta.total_seconds() * 1000. - self._send_stat(stat, '%0.6f|ms' % delta, rate) + self._send_stat(stat, '%0.6f|ms' % delta, rate, tags=tags) - def incr(self, stat, count=1, rate=1): + def incr(self, stat, count=1, rate=1, tags=None): """Increment a stat by `count`.""" - self._send_stat(stat, '%s|c' % count, rate) + self._send_stat(stat, '%s|c' % count, rate, tags=tags) - def decr(self, stat, count=1, rate=1): + def decr(self, stat, count=1, rate=1, tags=None): """Decrement a stat by `count`.""" - self.incr(stat, -count, rate) + self.incr(stat, -count, rate, tags=tags) - def gauge(self, stat, value, rate=1, delta=False): + def gauge(self, stat, value, rate=1, delta=False, tags=None): """Set a gauge value.""" if value < 0 and not delta: if rate < 1: if random.random() > rate: return with self.pipeline() as pipe: - pipe._send_stat(stat, '0|g', 1) - pipe._send_stat(stat, '%s|g' % value, 1) + pipe._send_stat(stat, '0|g', 1, tags=tags) + pipe._send_stat(stat, '%s|g' % value, 1, tags=tags) else: prefix = '+' if delta and value >= 0 else '' - self._send_stat(stat, '%s%s|g' % (prefix, value), rate) + self._send_stat(stat, '%s%s|g' % (prefix, value), rate, tags=tags) - def set(self, stat, value, rate=1): + def set(self, stat, value, rate=1, tags=None): """Set a set value.""" - self._send_stat(stat, '%s|s' % value, rate) + self._send_stat(stat, '%s|s' % value, rate, tags=tags) - def _send_stat(self, stat, value, rate): - self._after(self._prepare(stat, value, rate)) + def _send_stat(self, stat, value, rate, tags=None): + self._after(self._prepare(stat, value, rate, tags=tags)) - def _prepare(self, stat, value, rate): + def _build_tag(self, tag, value): + if value: + return '{}:{}'.format(str(tag), str(value)) + else: + return tag + + def _prepare(self, stat, value, rate, tags=None): if rate < 1: if random.random() > rate: return @@ -71,6 +77,11 @@ def _prepare(self, stat, value, rate): if self._prefix: stat = '%s.%s' % (self._prefix, stat) + if tags: + tag_string = ','.join( + self._build_tag(k, v) for k, v in tags.items()) + return '{}:{}|#{}'.format(stat, value, tag_string) + return '%s:%s' % (stat, value) def _after(self, data): diff --git a/statsd/client/timer.py b/statsd/client/timer.py index fefc9d042..1e10767c9 100644 --- a/statsd/client/timer.py +++ b/statsd/client/timer.py @@ -21,13 +21,14 @@ def safe_wraps(wrapper, *args, **kwargs): class Timer(object): """A context manager/decorator for statsd.timing().""" - def __init__(self, client, stat, rate=1): + def __init__(self, client, stat, rate=1, tags=None): self.client = client self.stat = stat self.rate = rate self.ms = None self._sent = False self._start_time = None + self.tags = tags def __call__(self, f): """Thread-safe timing function decorator.""" @@ -68,4 +69,4 @@ def send(self): if self._sent: raise RuntimeError('Already sent data.') self._sent = True - self.client.timing(self.stat, self.ms, self.rate) + self.client.timing(self.stat, self.ms, self.rate, tags=self.tags) From c3aba40089df38ad4bb5d6769c57328857bffcd9 Mon Sep 17 00:00:00 2001 From: muhammad samir Date: Thu, 10 Feb 2022 10:44:08 +0100 Subject: [PATCH 2/2] increment version to 3.3.1 --- docs/conf.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 341fd48f9..4b8d75781 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -50,7 +50,7 @@ # The short X.Y version. version = '3.3' # The full version, including alpha/beta/rc tags. -release = '3.3.0' +release = '3.3.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.py b/setup.py index 197757f58..e2eb0287c 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setup( name='statsd', - version='3.3.0', + version='3.3.1', description='A simple statsd client.', long_description=open('README.rst').read(), author='James Socol',