#!/usr/bin/env python3 from flask import Flask, render_template import json import requests app = Flask(__name__) def ratio_to_status(ratio): if ratio > 0.99: return "ok" elif ratio > 0.8: return "warning" else: return "critical" def process_instance(instance): return { "name": instance["metric"]["instance"].split(".")[0], "i": [{"status": "unknown", "ratio": None} for i in range(56 - len(instance["values"]))] + [{"status": ratio_to_status(float(i[1])), "ratio": float(i[1])} for i in instance["values"]], } @app.route("/") def status(): r = requests.get("https://prometheus.monitoring.clerie.de/api/v1/query?query=%28sum_over_time%28up%7Bjob%3D%22node-exporter%22%7D%5B6h%5D%29+%2F+count_over_time%28up%7Bjob%3D%22node-exporter%22%7D%5B6h%5D%29%29%5B14d%3A6h%5D") j = json.loads(r.text) metrics = sorted(map(process_instance, j["data"]["result"]), key=lambda m: m["name"]) return render_template("status.html", metrics=metrics) if __name__ == "__main__": app.run()