import time from flask import Flask, jsonify, request from prometheus_client import Counter, Summary, start_http_server, Info from timber import axe, LumberJack from config import _CLIENT_CONFIG _VERSION = '0.1.5' lumber = LumberJack() lumber.set_log_level('i') app = Flask(__name__) # Create metrics REQUEST_COUNT = Counter('power_api_requests_total', 'Total API Requests', ['method', 'endpoint']) REQUEST_LATENCY = Summary('power_api_request_latency_seconds', 'API Request Latency', ['method', 'endpoint']) version_info = Info('power_api_version', 'Power API Version') version_info.info({'power_api_version': _VERSION}) client_config_info = Info('power_api_client_config_info', 'Power API Client Config') client_config_info.info({ 'power_api_config_check_cycles': str(_CLIENT_CONFIG['config_check']['cycles']), 'power_api_config_dryrun': str(_CLIENT_CONFIG['dryrun']), 'power_api_retry_attempts': str(_CLIENT_CONFIG['retry']['attempts']), 'power_api_retry_seconds_healthy': str(_CLIENT_CONFIG['retry']['seconds']['healthy']), 'power_api_retry_seconds_unhealthy': str(_CLIENT_CONFIG['retry']['seconds']['unhealthy']), 'power_api_server_addr': str(_CLIENT_CONFIG['server']['address']), 'power_api_server_port': str(_CLIENT_CONFIG['server']['port']) }) @app.before_request def before_request(): request.start_time = time.time() @app.after_request def after_request(response): latency = time.time() - request.start_time REQUEST_COUNT.labels(method=request.method, endpoint=request.path).inc() REQUEST_LATENCY.labels(method=request.method, endpoint=request.path).observe(latency) return response @app.route('/metrics') def metrics(): return str(REQUEST_COUNT.collect()), 200, {'Content-Type': 'text/plain'} @app.route('/power/', methods=['GET']) def get_status(hostname): axe.info(f'Sending power 200 to {hostname}') return hostname, 200 @app.route('/power/_VERSION', methods=['GET']) def get_version(): return _VERSION, 200 @app.route('/power/_CONFIG/client/', methods=['GET']) def get_client_config(hostname): axe.info(f'Config request from {hostname}') return jsonify(_CLIENT_CONFIG), 200 if __name__ == '__main__': start_http_server(port=8000, addr='0.0.0.0') app.run(debug=False, host='0.0.0.0') # start_http_server(port=8000) # app.run(debug=False)