"""Grafana Monitoring Dashboard Tool.""" import requests TOOLS = [ { "type": "function", "function": { "name": "get_grafana_status", "description": "Grafana Monitoring-Status: Health, Dashboards, Datasources, Alerts. Nutze bei 'Grafana', 'Monitoring Dashboard', 'Alerts'.", "parameters": {"type": "object", "properties": {}, "required": []}, }, }, ] GRAFANA_URL = "http://100.66.78.56:3000" GRAFANA_USER = "admin" GRAFANA_PASS = "astral66" def _api(path): try: r = requests.get( f"{GRAFANA_URL}{path}", auth=(GRAFANA_USER, GRAFANA_PASS), timeout=10, ) if r.ok: return r.json() return None except Exception: return None def handle_get_grafana_status(**kw): health = _api("/api/health") if not health: return "Grafana nicht erreichbar (100.66.78.56:3000 / CT 143 pve-mu-3)" lines = [f"Grafana v{health.get('version', '?')} — DB: {health.get('database', '?')}"] lines.append("URL: https://grafana.orbitalo.net") lines.append("Server: CT 143 (Raspi-Broker) auf pve-mu-3 Muldenstein") datasources = _api("/api/datasources") or [] lines.append(f"\nDatasources: {len(datasources)}") for ds in datasources: lines.append(f" {ds.get('name', '?')} ({ds.get('type', '?')}) — DB: {ds.get('database', '-')}") dashboards = _api("/api/search?type=dash-db") or [] lines.append(f"\nDashboards: {len(dashboards)}") for db in dashboards: url = f"https://grafana.orbitalo.net{db.get('url', '')}" lines.append(f" {db.get('title', '?')} — {url}") alerts = _api("/api/alertmanager/grafana/api/v2/alerts") or [] if alerts: firing = [a for a in alerts if a.get("status", {}).get("state") == "active"] lines.append(f"\nAlerts: {len(alerts)} gesamt, {len(firing)} aktiv") for a in firing[:5]: labels = a.get("labels", {}) lines.append(f" {labels.get('alertname', '?')} — {labels.get('severity', '?')}") else: lines.append("\nAlerts: keine aktiven") return "\n".join(lines) HANDLERS = { "get_grafana_status": handle_get_grafana_status, }