from buildman.enums import BuildJobResult from util.cloudwatch import get_queue 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. """ 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 _send_to_queue(self, *args, **kwargs): self._queue.put((args, kwargs)) def report_completion_status(self, status): if status == BuildJobResult.COMPLETE: status_name = self._completed_name elif status == BuildJobResult.ERROR: status_name = self._failed_name elif status == BuildJobResult.INCOMPLETE: status_name = self._incompleted_name else: return self._send_to_queue(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 self._reporter = NullReporter() if app is not None: reporter_type = app.config.get('BUILD_METRICS_TYPE', 'Null') if reporter_type == 'CloudWatch': namespace = app.config['BUILD_METRICS_NAMESPACE'] completed_name = app.config['BUILD_METRICS_COMPLETED_NAME'] failed_name = app.config['BUILD_METRICS_FAILED_NAME'] incompleted_name = app.config['BUILD_METRICS_INCOMPLETED_NAME'] request_queue = get_queue(app) self._reporter = CloudWatchBuildReporter(request_queue, namespace, completed_name, failed_name, incompleted_name) def __getattr__(self, name): return getattr(self._reporter, name, None)