import logging from trollius import From from util.cloudwatch import get_queue logger = logging.getLogger(__name__) class BuildReporter(object): """ Base class for reporting build statuses to a metrics service. """ def report_completion_status(self, status): """ Method to invoke the recording of build's completion status to a metric service. This must _not_ block because it is assumed to run in an event loop. """ raise NotImplementedError class NullReporter(BuildReporter): """ The /dev/null of BuildReporters. """ def report_completion_status(self, *args): pass class CloudWatchBuildReporter(BuildReporter): """ Implements a BuildReporter for Amazon's CloudWatch. """ def __init__(self, queue, namespace_name, completed_name, failed_name, incompleted_name): self._queue = queue self._namespace_name = namespace_name self._completed_name = completed_name self._failed_name = failed_name self._incompleted_name = incompleted_name def report_completion_status(self, status): if status == 'complete': status_name = self._completed_name elif status == 'error': status_name = self._failed_name elif status == 'incomplete': status_name = self._incompleted_name else: return yield From(self._queue.put(self._namespace_name, status_name, 1, unit='Count')) class BuildMetrics(object): """ BuildMetrics initializes a reporter for recording the status of build completions. """ def __init__(self, app=None): self._app = app if app is not None: reporter_type = app.config.get('BUILD_METRICS_TYPE', 'Null') if reporter_type == 'CloudWatch': namespace = app.config.get('BUILD_METRICS_NAMESPACE') completed_name = app.config.get('BUILD_METRICS_COMPLETED_NAME') failed_name = app.config.get('BUILD_METRICS_FAILED_NAME') incompleted_name = app.config.get('BUILD_METRICS_INCOMPLETED_NAME') request_queue = get_queue(app) self._reporter = CloudWatchBuildReporter(request_queue, namespace, completed_name, failed_name, incompleted_name) else: self._reporter = NullReporter() def __getattr__(self, name): return getattr(self._reporter, name, None)