From a9baaf4da4b100ae745dcacc1ad73f685451ef33 Mon Sep 17 00:00:00 2001 From: Mihir Jham Date: Tue, 10 Apr 2018 15:15:03 -0700 Subject: [PATCH] add(plugins): Added a statsd plugin for lemur (#1189) --- .../lemur_statsd/docs/requirements.txt | 1 + .../lemur_statsd/lemur_statsd/__init__.py | 4 ++ .../lemur_statsd/lemur_statsd/plugin.py | 45 +++++++++++++++++++ lemur/plugins/lemur_statsd/setup.py | 24 ++++++++++ 4 files changed, 74 insertions(+) create mode 100644 lemur/plugins/lemur_statsd/docs/requirements.txt create mode 100644 lemur/plugins/lemur_statsd/lemur_statsd/__init__.py create mode 100644 lemur/plugins/lemur_statsd/lemur_statsd/plugin.py create mode 100644 lemur/plugins/lemur_statsd/setup.py diff --git a/lemur/plugins/lemur_statsd/docs/requirements.txt b/lemur/plugins/lemur_statsd/docs/requirements.txt new file mode 100644 index 00000000..73a2e5b6 --- /dev/null +++ b/lemur/plugins/lemur_statsd/docs/requirements.txt @@ -0,0 +1 @@ +datadog==0.14.0 diff --git a/lemur/plugins/lemur_statsd/lemur_statsd/__init__.py b/lemur/plugins/lemur_statsd/lemur_statsd/__init__.py new file mode 100644 index 00000000..3a751848 --- /dev/null +++ b/lemur/plugins/lemur_statsd/lemur_statsd/__init__.py @@ -0,0 +1,4 @@ +try: + VERSION = __import__('pkg_resources').get_distribution(__name__).version +except Exception as e: + VERSION = 'Unknown' diff --git a/lemur/plugins/lemur_statsd/lemur_statsd/plugin.py b/lemur/plugins/lemur_statsd/lemur_statsd/plugin.py new file mode 100644 index 00000000..a6a87c66 --- /dev/null +++ b/lemur/plugins/lemur_statsd/lemur_statsd/plugin.py @@ -0,0 +1,45 @@ +import lemur_statsd as plug + +from flask import current_app +from lemur.plugins.bases.metric import MetricPlugin +from datadog import DogStatsd + + +class StatsdMetricPlugin(MetricPlugin): + title = 'Statsd' + slug = 'statsd-metrics' + description = 'Adds support for sending metrics to Statsd' + version = plug.VERSION + + def __init__(self): + host = current_app.config.get('STATSD_HOST') + port = current_app.config.get('STATSD_PORT') + prefix = current_app.config.get('STATSD_PREFIX') + + self.statsd = DogStatsd(host=host, port=port, namespace=prefix) + + def submit(self, metric_name, metric_type, metric_value, metric_tags=None, options=None): + valid_types = ['COUNTER', 'GAUGE', 'TIMER'] + tags = [] + + if metric_type.upper() not in valid_types: + raise Exception( + "Invalid Metric Type for Statsd, '{metric}' choose from: {options}".format( + metric=metric_type, options=','.join(valid_types) + ) + ) + + if metric_tags: + if not isinstance(metric_tags, dict): + raise Exception("Invalid Metric Tags for Statsd: Tags must be in dict format") + else: + tags = map(lambda e: "{0}:{1}".format(*e), metric_tags.items()) + + if metric_type.upper() == 'COUNTER': + self.statsd.increment(metric_name, metric_value, tags) + elif metric_type.upper() == 'GAUGE': + self.statsd.gauge(metric_name, metric_value, tags) + elif metric_type.upper() == 'TIMER': + self.statsd.timing(metric_name, metric_value, tags) + + return diff --git a/lemur/plugins/lemur_statsd/setup.py b/lemur/plugins/lemur_statsd/setup.py new file mode 100644 index 00000000..6c4c2dd6 --- /dev/null +++ b/lemur/plugins/lemur_statsd/setup.py @@ -0,0 +1,24 @@ +"""Basic package information""" +from __future__ import absolute_import +from setuptools import setup, find_packages + +install_requires = [ + 'lemur', + 'datadog' +] + +setup( + name='lemur_statsd', + version='1.0.0', + author='Cloudflare Security Engineering', + author_email='', + include_package_data=True, + packages=find_packages(), + zip_safe=False, + install_requires=install_requires, + entry_points={ + 'lemur.plugins': [ + 'statsd = lemur_statsd.plugin:StatsdMetricPlugin', + ] + } +)