diff --git a/docs/examples/prometheus.py b/docs/examples/prometheus.py new file mode 100644 index 00000000..ff1e84dc --- /dev/null +++ b/docs/examples/prometheus.py @@ -0,0 +1,71 @@ +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()