#!/usr/bin/env python3 """Queries alertmanager for alerts, outputs json. Can be also used as cli application. Usage: ./query_alertmananger.py -h """ import json import plac import requests def get_alerts(url: str, password: str, user: str = "admin") -> dict: """Query alerts. https://koumoul.com/openapi-viewer/?url=https://raw.githubusercontent.com/prometheus/alertmanager/master/api/v2/openapi.yaml&proxy=false """ api_url = f"{url}/api/v2/alerts" query = {"silenced": "false"} count = 0 alerts = [] state = "unknown" critical_threshold = 2 try: req = requests.get(api_url, auth=(user, password), params=query, timeout=10) alerts_json = req.json() for alert in alerts_json: # pp = pprint.PrettyPrinter(indent=2) # pp.pprint(alert) name = alert["labels"]["alertname"] severity = alert["labels"].get("severity", "unknown") instance = alert["labels"].get("instance", "") alert_state = alert["status"]["state"] release_name = alert["labels"].get("release_name", "") if severity != "none" and alert_state != "suppressed": count += 1 alert_text = f"{name}: {instance}, {release_name} ({severity})" alerts.append(alert_text) if count > critical_threshold: state = "critical" elif count > 0: state = "warning" elif count == 0: state = "ok" summary = f"{count} alerts" except ( requests.exceptions.HTTPError, requests.exceptions.ConnectionError, requests.exceptions.Timeout, ) as err: print("Exception catched: ", err) # traceback.print_exc() summary = "Cant connect" state = "warning" return {"summary": summary, "alerts": alerts, "state": state, "count": count} @plac.pos("url", "URL of alertmanager instance", type=str) @plac.pos("password", "Password", type=str) @plac.opt("port", "Port of alertmanager instance", type=int, abbrev="P") @plac.opt("user", "User name", type=str) def main(url: str, password: str, port: int = 443, user: str = "admin") -> None: """Run main function.""" alerts = get_alerts(url=url, password=password, port=port, user=user) print(json.dumps(alerts)) if __name__ == "__main__": plac.call(main)