70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
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)
|