import logging import time import os from string import maketrans from awslimitchecker.checker import AwsLimitChecker from prometheus_client import start_http_server, Summary, Gauge REQUEST_TIME = Summary( 'update_processing_seconds', 'Time spent querying aws for limits' ) gauges = {} trantab = maketrans(' -.', '___') def main(): port = int(os.environ.get('ALC_PORT', '8080')) interval = int(os.environ.get('ALC_INTERVAL', '60')) logger = logging.getLogger() logger.setLevel(logging.ERROR) checkers = {} for region in ['us-east-1', 'us-east-2', 'us-west-1', 'us-west-2']: checkers[region] = AwsLimitChecker(region=region) start_http_server(port) for region, checker in checkers.iteritems(): update(checker, region) time.sleep(interval) @REQUEST_TIME.time() def update(checker, region): try: checker.find_usage() labels = {'region': region} for service, svc_limits in sorted(checker.get_limits().items()): for limit_name, limit in sorted(svc_limits.items()): path = '.'.join([service, limit_name]) usage = limit.get_current_usage() metric = limit.get_limit() update_service(path, usage, metric, region) except Exception as e: logging.exception("message") def update_service(path, usage, limit, region): g = gauge(path) g.labels(region=region, type='limit').set(limit) for resource in usage: metric_type = 'current' if resource.resource_id: metric_type = resource.resource_id g.labels(region=region, type=metric_type).set(resource.get_value()) def gauge(path): path = path.lower().translate(trantab, '()') g = gauges.get(path, None) if g is None: g = Gauge(path, '', ['region', 'type']) gauges[path] = g return g if __name__ == "__main__": main()