"""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, }