import logging import boto from Queue import Queue from threading import Thread logger = logging.getLogger(__name__) def get_queue(app): """ Returns a queue to a new CloudWatchSender. """ access_key = app.config['CLOUDWATCH_AWS_ACCESS_KEY'] secret_key = app.config['CLOUDWATCH_AWS_SECRET_KEY'] queue = Queue() sender = CloudWatchSender(queue, access_key, secret_key) 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): 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 def run(self): try: logger.debug('Starting CloudWatch sender process.') connection = boto.connect_cloudwatch(self._aws_access_key, self._aws_secret_key) except: logger.exception('Failed to connect to CloudWatch.') while True: put_metric_args, kwargs = self._put_metrics_queue.get() logger.debug('Got queued put metrics request.') try: connection.put_metric_data(*put_metric_args, **kwargs) except: logger.exception('Failed to write to CloudWatch')