homelab-brain/homelab-ai-bot/tools/loki.py

118 lines
4.1 KiB
Python

"""Loki Log-Abfrage Tools."""
from core import loki_client
TOOLS = [
{
"type": "function",
"function": {
"name": "get_errors",
"description": "Aktuelle Fehler-Logs aus Loki mit Details und Beispielen. Nutze bei 'welche Fehler', 'zeig Fehler', 'was ist kaputt'.",
"parameters": {
"type": "object",
"properties": {
"hours": {"type": "number", "description": "Zeitraum in Stunden (default: 2)", "default": 2}
},
"required": [],
},
},
},
{
"type": "function",
"function": {
"name": "count_errors",
"description": "Zaehlt Fehler-Logs aus Loki und gibt ANZAHL pro Host zurueck. Nutze bei 'wieviele Fehler', 'wie oft', 'Fehleranzahl'.",
"parameters": {
"type": "object",
"properties": {
"hours": {"type": "number", "description": "Zeitraum in Stunden (default: 24)", "default": 24}
},
"required": [],
},
},
},
{
"type": "function",
"function": {
"name": "get_container_logs",
"description": "Logs eines bestimmten Containers aus Loki. Nutze bei 'zeig Logs von X', 'was macht Container Y'.",
"parameters": {
"type": "object",
"properties": {
"container": {"type": "string", "description": "Container-Name/Host"},
"hours": {"type": "number", "description": "Zeitraum (default: 1)", "default": 1}
},
"required": ["container"],
},
},
},
{
"type": "function",
"function": {
"name": "get_silent_hosts",
"description": "Welche Hosts/Container senden keine Logs mehr? Fuer Silence-Detection.",
"parameters": {"type": "object", "properties": {}, "required": []},
},
},
]
def handle_get_errors(hours=2, **kw):
result = loki_client.count_errors(hours=hours)
if "error" in result:
return f"Loki-Fehler: {result['error']}"
count = result["count"]
per_host = result.get("per_host", {})
lines = [f"Fehler ({hours:.0f}h): {count} Eintraege"]
if per_host:
top = sorted(per_host.items(), key=lambda x: x[1], reverse=True)[:5]
lines.append("Top-Hosts:")
for host, n in top:
lines.append(f" {host}: {n}x")
if count > 0:
examples = loki_client.get_errors(hours=hours, limit=5)
real = [e for e in examples if "error" not in e]
if real:
lines.append("Letzte Beispiele:")
for e in real[:3]:
lines.append(f" [{e.get('host','?')}] {e.get('line','')[:120]}")
return "\n".join(lines)
def handle_count_errors(hours=24, **kw):
result = loki_client.count_errors(hours=hours)
if "error" in result:
return f"Loki-Fehler: {result['error']}"
count = result["count"]
per_host = result.get("per_host", {})
lines = [f"{count} Fehler-Eintraege in den letzten {hours:.0f} Stunden"]
if per_host:
top = sorted(per_host.items(), key=lambda x: x[1], reverse=True)[:8]
for host, n in top:
lines.append(f" {host}: {n}x")
return "\n".join(lines)
def handle_get_container_logs(container, hours=1, **kw):
entries = loki_client.query_logs(f'{{host="{container}"}}', hours=hours, limit=20)
return loki_client.format_logs(entries)
def handle_get_silent_hosts(**kw):
silent = loki_client.check_silence(minutes=35)
if not silent:
return "Alle Hosts senden Logs."
if silent and "error" in silent[0]:
return f"Fehler: {silent[0]['error']}"
lines = ["Stille Hosts (keine Logs seit 35+ Min):\n"]
for s in silent:
lines.append(f" {s['host']}")
return "\n".join(lines)
HANDLERS = {
"get_errors": handle_get_errors,
"count_errors": handle_count_errors,
"get_container_logs": handle_get_container_logs,
"get_silent_hosts": handle_get_silent_hosts,
}