feat: Statistik-Funktionalität für TI-Status Checker hinzugefügt
- Neue Klasse OutageStatistics für automatische Störungsaufzeichnung - Sammelt Häufigkeit und Dauer von Ausfällen - Parameter --stats/-s zum Senden von Statistik-Berichten über Apprise - Erweiterte Kommandozeilen-Argumente (--debug/-d) - Automatische Aufzeichnung von Störungsbeginn und -ende - Detaillierte Statistiken mit Trends und Service-spezifischen Daten - Umfassende Dokumentation in README_STATISTICS.md
This commit is contained in:
@ -6,6 +6,8 @@ import os
|
||||
from dotenv import load_dotenv
|
||||
import apprise
|
||||
import time
|
||||
import argparse
|
||||
from ti_statistics import OutageStatistics
|
||||
|
||||
# Lade Umgebungsvariablen aus .env Datei
|
||||
load_dotenv()
|
||||
@ -277,7 +279,66 @@ def send_notification(message):
|
||||
print(f"⏳ Warte {delay} Sekunden...")
|
||||
time.sleep(delay)
|
||||
|
||||
def send_statistics_notification():
|
||||
"""Sendet Statistik-Bericht über Apprise"""
|
||||
print("📊 Generiere und sende Statistik-Bericht...")
|
||||
|
||||
# Erstelle Statistik-Objekt
|
||||
stats = OutageStatistics()
|
||||
|
||||
# Generiere Bericht
|
||||
report = stats.generate_statistics_report()
|
||||
|
||||
# Hole alle konfigurierten URLs
|
||||
urls = get_apprise_urls()
|
||||
if not urls:
|
||||
print("❌ Keine Apprise URLs konfiguriert!")
|
||||
return
|
||||
|
||||
# Erstelle Apprise Objekt
|
||||
apobj = apprise.Apprise()
|
||||
|
||||
# Füge alle URLs hinzu
|
||||
for url in urls:
|
||||
apobj.add(url)
|
||||
|
||||
# Erstelle die Nachricht
|
||||
title = "📊 TI-Status Ausfall-Statistiken"
|
||||
body = report
|
||||
|
||||
if is_debug_mode():
|
||||
print(f"📤 Sende Statistik-Bericht an {len(urls)} Endpunkt(e)")
|
||||
print(f"Bericht-Länge: {len(report)} Zeichen")
|
||||
|
||||
# Sende die Nachricht
|
||||
try:
|
||||
result = apobj.notify(
|
||||
title=title,
|
||||
body=body,
|
||||
body_format=apprise.NotifyFormat.MARKDOWN
|
||||
)
|
||||
if result:
|
||||
print("✅ Statistik-Bericht erfolgreich gesendet")
|
||||
else:
|
||||
print("❌ Fehler beim Senden des Statistik-Berichts")
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler beim Senden des Statistik-Berichts: {e}")
|
||||
|
||||
def main():
|
||||
# Parse Kommandozeilen-Argumente
|
||||
parser = argparse.ArgumentParser(description="TI-Status Checker mit Statistik-Funktionalität")
|
||||
parser.add_argument("--stats", "-s", action="store_true",
|
||||
help="Generiert und sendet Statistik-Bericht über Apprise")
|
||||
parser.add_argument("--debug", "-d", action="store_true",
|
||||
help="Aktiviert Debug-Modus")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Wenn --stats gesetzt ist, sende nur Statistiken
|
||||
if args.stats:
|
||||
send_statistics_notification()
|
||||
return
|
||||
|
||||
# Prüfe Konfiguration
|
||||
urls = get_apprise_urls()
|
||||
if not urls:
|
||||
@ -285,7 +346,7 @@ def main():
|
||||
print("Bitte erstelle eine .env Datei basierend auf env.example")
|
||||
return
|
||||
|
||||
if is_debug_mode():
|
||||
if is_debug_mode() or args.debug:
|
||||
print("🔧 Debug-Modus aktiviert")
|
||||
print(f"📋 Benachrichtigungslevel: {get_notification_level()}")
|
||||
print(f"🔍 Filter: {get_notification_filters()}")
|
||||
@ -297,6 +358,9 @@ def main():
|
||||
last_status = state.get("last_status", {})
|
||||
print("Prüfe TI-Status-API auf neue Meldungen...")
|
||||
|
||||
# Erstelle Statistik-Objekt für die Aufzeichnung von Störungen
|
||||
stats = OutageStatistics()
|
||||
|
||||
try:
|
||||
messages = fetch_status_messages()
|
||||
# Extrahiere aktuelle und vorherige Störungen
|
||||
@ -307,13 +371,25 @@ def main():
|
||||
current_outages = extract_outages(app_status)
|
||||
previous_outages = extract_outages(last_status.get("appStatus", {})) if last_status else set()
|
||||
|
||||
# Entwarnungen erkennen
|
||||
# Neue Störungen aufzeichnen
|
||||
new_outages = current_outages - previous_outages
|
||||
for dienst in new_outages:
|
||||
# Bestimme den Störungstyp
|
||||
outage_type = "full" if app_status.get(dienst, {}).get("outage") == "full" else "partial"
|
||||
stats.record_outage_start(dienst, outage_type)
|
||||
if is_debug_mode() or args.debug:
|
||||
print(f"📊 Neue Störung aufgezeichnet: {dienst} ({outage_type})")
|
||||
|
||||
# Entwarnungen erkennen und aufzeichnen
|
||||
resolved = previous_outages - current_outages
|
||||
for dienst in resolved:
|
||||
stats.record_outage_end(dienst)
|
||||
msg = f"✅ Entwarnung: Die Störung bei {dienst.upper()} wurde behoben."
|
||||
print(msg)
|
||||
send_notification(msg)
|
||||
known_messages.add(msg)
|
||||
if is_debug_mode() or args.debug:
|
||||
print(f"📊 Störung beendet aufgezeichnet: {dienst}")
|
||||
|
||||
# Normale neue Meldungen
|
||||
new_messages = [m for m in messages if m not in known_messages]
|
||||
|
||||
Reference in New Issue
Block a user