Refactor metric collection

This change adds a generic queue onto which metrics can be pushed. A
separate module removes metrics from the queue and adds them to Cloudwatch.
Since these are now separate ideas, we can easily change the consumer from
Cloudwatch to anything else.

This change maintains near feature parity (the only change is there is now
just one queue instead of two - not a big deal).
This commit is contained in:
Matt Jibson 2015-08-11 16:39:33 -04:00
parent aee746bec6
commit cfb6e884f2
7 changed files with 46 additions and 147 deletions

View file

@ -7,29 +7,29 @@ from threading import Thread
logger = logging.getLogger(__name__)
def get_queue(app):
def send_cloudwatch(metrics, app):
"""
Returns a queue to a new CloudWatchSender.
Starts sending from metrics to a new CloudWatchSender.
"""
access_key = app.config['CLOUDWATCH_AWS_ACCESS_KEY']
secret_key = app.config['CLOUDWATCH_AWS_SECRET_KEY']
namespace = app.config['CLOUDWATCH_NAMESPACE']
queue = Queue()
sender = CloudWatchSender(queue, access_key, secret_key)
sender = CloudWatchSender(metrics, access_key, secret_key, namespace)
sender.start()
return queue
class CloudWatchSender(Thread):
"""
CloudWatchSender loops indefinitely and pulls metrics off of a queue then sends it to CloudWatch.
"""
def __init__(self, request_queue, aws_access_key, aws_secret_key):
def __init__(self, metrics, aws_access_key, aws_secret_key, namespace):
Thread.__init__(self)
self.daemon = True
self._aws_access_key = aws_access_key
self._aws_secret_key = aws_secret_key
self._put_metrics_queue = request_queue
self._metrics = metrics
self._namespace = namespace
def run(self):
try:
@ -39,9 +39,9 @@ class CloudWatchSender(Thread):
logger.exception('Failed to connect to CloudWatch.')
while True:
put_metric_args, kwargs = self._put_metrics_queue.get()
put_metric_args, kwargs = self._metrics.get()
logger.debug('Got queued put metrics request.')
try:
connection.put_metric_data(*put_metric_args, **kwargs)
connection.put_metric_data(self._namespace, *put_metric_args, **kwargs)
except:
logger.exception('Failed to write to CloudWatch')