blob: 52eee930adf7d7a67ccd202971a960148a6244dc [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2021-present Open Networking Foundation
#
# SPDX-License-Identifier: Apache-2.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)