| #!/usr/bin/env python |
| |
| # Copyright 2021-present Open Networking Foundation |
| # |
| # SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0 |
| |
| # This implements a simple agent that polls the central Edge Monitoring Server |
| # to find out whether the local cluster is in a maintenance window, and exports |
| # the result as a Prometheus metric. The metric can be used to inhibit alerts |
| # from the local cluster. |
| |
| import os |
| import json |
| import time |
| import threading |
| import urllib.request |
| from flask import Flask, Response |
| import prometheus_client as prom |
| |
| # URL of the Edge Monitoring Server where this edge's status can be fetched |
| # I.e., put /<edge-name> at the end of the URL |
| AETHER_EDGE_STATUS_URL = os.environ.get("AETHER_EDGE_STATUS_URL") |
| |
| # Seconds to sleep at end of loop |
| SLEEP_INTERVAL = 60 |
| |
| app = Flask(__name__) |
| maint_window = prom.Gauge("aetheredge_in_maintenance_window", "Currently in a maintenance window") |
| |
| def pull_maintenance_events(): |
| while True: |
| # Pull latest status |
| print ("[INFO] Pulling edge status from %s" % AETHER_EDGE_STATUS_URL) |
| try: |
| response = urllib.request.urlopen(AETHER_EDGE_STATUS_URL) |
| data = json.load(response) |
| # print (" * Got: ", data) |
| |
| # Export metric to Prometheus |
| in_window = data['edge']['maintenance']['in_window'] |
| print ("[INFO] In maintenance window: %s" % in_window) |
| maint_window.set(int(in_window)) |
| except: |
| print("[WARN] Could not retrieve edge status, will keep trying") |
| pass |
| |
| time.sleep(SLEEP_INTERVAL) |
| |
| @app.route('/metrics', methods=['GET']) |
| def get_prometheus_metrics(): |
| res = [] |
| res.append(prom.generate_latest(maint_window)) |
| return Response(res, mimetype="text/plain") |
| |
| @app.route('/healthz', methods=['GET']) |
| def get_health(): |
| return {'message': 'healthy'} |
| |
| if __name__ == '__main__': |
| if not (AETHER_EDGE_STATUS_URL): |
| print("[ERROR] AETHER_EDGE_STATUS_URL must be present in the local environment") |
| exit(1) |
| print(" * Starting maintenance window polling thread") |
| print(" * AETHER_EDGE_STATUS_URL: %s" % AETHER_EDGE_STATUS_URL) |
| t = threading.Thread(target=pull_maintenance_events) |
| t.start() |
| app.run(debug=True, host='0.0.0.0', port=8080) |