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')