70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
"""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,
|
|
}
|