118 lines
4.1 KiB
Python
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,
|
|
}
|