import logging from util.cloudwatch import get_queue logger = logging.getLogger(__name__) class NullReporter(object): def report(self, *args): pass class CloudWatchReporter(object): """ CloudWatchReporter reports work queue metrics to CloudWatch """ def __init__(self, request_queue, namespace, need_capacity_name, build_percent_name): self._namespace = namespace self._need_capacity_name = need_capacity_name self._build_percent_name = build_percent_name self._put_metrics_queue = request_queue def _send_to_queue(self, *args, **kwargs): self._put_metrics_queue.put((args, kwargs)) def report(self, currently_processing, running_count, total_count): logger.debug('Worker indicated %s running count and %s total count', running_count, total_count) need_capacity_count = total_count - running_count self._send_to_queue(self._namespace, self._need_capacity_name, need_capacity_count, unit='Count') building_percent = 100 if currently_processing else 0 self._send_to_queue(self._namespace, self._build_percent_name, building_percent, unit='Percent') class QueueMetrics(object): """ QueueMetrics initializes a reporter for recording metrics of work queues. """ def __init__(self, app=None): self._app = app self._reporter = NullReporter() if app is not None: reporter_type = app.config.get('QUEUE_METRICS_TYPE', 'Null') if reporter_type == 'CloudWatch': namespace = app.config['QUEUE_METRICS_NAMESPACE'] req_capacity_name = app.config['QUEUE_METRICS_CAPACITY_SHORTAGE_NAME'] build_percent_name = app.config['QUEUE_METRICS_BUILD_PERCENT_NAME'] request_queue = get_queue(app) self._reporter = CloudWatchReporter(request_queue, namespace, req_capacity_name, build_percent_name) def __getattr__(self, name): return getattr(self._reporter, name, None)