Commit Graph
25 Commits
Author SHA1 Message Date
Kalina f8c5f2eb3c feat(rawlogs): Rohlogs fuer den Loki-Import sammeln
Der Prometheus-Archiv-Import verdichtet auf Stunde/Domain/Status und
verwirft Referrer, User-Agent und Client-IP. Fragen nach der Herkunft
liessen sich damit nicht rueckwirkend beantworten.

- raw-log-collect.py: liest access+error (inkl. .gz, rotierte Dateien),
  schreibt ts_ns/labels/rohzeile und meldet Zeilen ohne Zeitstempel
  statt sie still zu verwerfen. Error-Logs ohne Zeitzone (Apache-
  Standard) werden korrekt nach UTC verschoben.
- raw-log-backfill.sh: Wrapper mit Messmodus; sammelt auf dem Host,
  importiert selbst NICHTS.
2026-09-14 17:31:14 +02:00
mm 33534811cb fix(backfill): Abdeckung pruefen — "Zeitraum min..max" war irrefuehrend
Der x22-Backfill meldete "Zeitraum: 03.12.2024 .. 14.09.2026" und liest sich
damit wie zwei Jahre Historie. Tatsaechlich enthielt die Quelle EINEN einzelnen
Punkt vom 03.12.2024 (eine alte Logzeile) und sonst 30 Tage:

  belegte Stunden: 721 von 15.601 im Zeitraum  (4.6 % Abdeckung)
  groesste Luecke: 620 Tage  03.12.2024 21:00 -> 15.08.2026 22:00

min..max allein sagt nichts ueber die Substanz. Die Selbstpruefung nennt jetzt
zusaetzlich die Zahl der belegten Stunden gegen die Spanne, die prozentuale
Abdeckung und — bei unter 50 % — die drei groessten Luecken mit Datum, plus den
Hinweis auf fehlende/rotierte Logs als typische Ursache.

Verifiziert gegen drei Faelle: (A) 1 alter Punkt + 30 Tage -> 4.6 %, Luecke
benannt; (B) 15 Tage durchgehend -> 100 %, kein Alarm; (C) 29 Tage mit 20-h-
Luecke -> 97.3 %, kein Alarm (echte kleine Luecken sind normal).
2026-09-14 15:53:44 +02:00
mm 39e86adfba feat(backfill): Skript fuer alle KeyHelp-Hosts generalisiert
x22-log-backfill.sh heisst jetzt keyhelp-log-backfill.sh und leitet NODE aus
hostname -f ab, wenn es nicht gesetzt ist. Damit ist derselbe Ablauf fuer x14
nutzbar, ohne x22 im instance-Label zu tragen.

Der alte Name bleibt als Alias erhalten (laedt das generische Skript, NODE
vorbelegt auf x22) — bereits verteilte Aufrufe laufen weiter.

Verifiziert im Container mit x14-Nachbau: instance="x14.idx.wf-keyhelp",
Messmodus read-only, Selbstpruefung (Einheit/Zukunft/Domains) greift.
2026-09-14 15:29:11 +02:00
mm c18263e4ed fix(backfill): Survey-Aufruf ohne --node, Hinweis auf Zeilenpufferung
Der Survey kennt kein argparse — '--node' wurde still ignoriert (harmlos, aber
irrefuehrend). Argument entfernt und die Puffer-Falle im Aufruf dokumentiert.
2026-09-14 12:10:03 +02:00
mm df2ee94613 fix(survey): Fortschritt sichtbar — der leere bestand.txt war kein Fehler, sondern ein laufender Scan
BEFUND (x22, gemessen und reproduziert):
Der Aufruf war 'python3 apache-log-survey.py 2>&1 | tee bestand.txt'. Das Skript
gab ALLES erst nach der Scan-Schleife aus (alle print() standen dahinter), und
Python puffert stdout in eine PIPE blockweise (4-8 KB). Die Gesamtausgabe ist
aber nur ~1 KB -> sie landete erst beim Prozessende in der Datei.

Messung mit 2 Mio Zeilen (140 MB):
  mit tee:     nach 5 s = 0 Bytes, fertig nach 41 s -> dann 1028 Bytes
  ohne Pipe:   nach 1 s = 0 Bytes
  python3 -u:  nach 1 s = 0 Bytes
=> Die Datei war leer, weil der Scan LIEF. Auf einem KeyHelp-Host mit tausenden
   Logdateien dauert das Minuten und liest sich wie ein Haenger oder Absturz.

FIX (drei Massnahmen, damit das nie wieder passiert):
1. sys.stdout.reconfigure(line_buffering=True) — jede Zeile geht sofort raus,
   auch durch eine Pipe.
2. Startbanner VOR dem Scan: Anzahl und Gesamtgroesse der Dateien.
3. Fortschrittszeile pro Datei (Nummer/Gesamtzahl, Zeilen, Groesse, Pfad) plus
   eine Zeile fuer nicht lesbare Dateien.

Verifiziert mit 1,4 Mio Zeilen durch eine Pipe: nach 2 s steht das Banner, drei
Fortschrittszeilen erscheinen waehrend des Scans. Gegenprobe mit dem alten Code:
nach 3 s 16 Bytes, alles erst am Ende.
2026-09-14 12:08:48 +02:00
mm 194fa98f97 fix(archive): Error-Logs ohne Zeitzone wurden STILL verworfen + Backfill-Skript
BEFUND (echter Datenverlust, gemessen gegen KeyHelp-Formate):
KeyHelp/Debian schreiben error.log im Access-Format, aber OHNE Zeitzone:
    [01/Sep/2026:10:00:05] [core:error] [pid 9] AH00124: ...
TS_FORMATS kannte nur "%d/%b/%Y:%H:%M:%S %z" (MIT Zone). parse_ts() gab None,
hour wurde "unknown", und der Schreiber ueberspringt unknown-Zeilen:
apache_archive_errors_total fehlte KOMPLETT — kein Fehler, kein Log, Panel leer.
Genau die stille Fehlerklasse, die nicht passieren darf.

FIX:
- Format "%d/%b/%Y:%H:%M:%S" (ohne Zone) ergaenzt.
- Unparsbare Zeitstempel werden GEZAEHLT und laut gemeldet (Domain + Beispiel +
  Hinweis auf TS_FORMATS) statt still zu verschwinden.
- Neu: scripts/x22-log-backfill.sh — messen (read-only) und parsen in einem
  Aufruf, mit Selbstpruefung (Einheiten, Zukunft, Domain-Anzahl) VOR der
  Uebergabe und dem sicheren Import-Befehl am Ende.

Verifiziert im Container gegen echte KeyHelp-Formate inkl. rotierter .1 und
.gz-Datei: Messmodus aendert nichts (MD5-Vergleich), Backfill erzeugt alle
fuenf Metriken inkl. errors_total{level=error} und {level=warn}.
2026-09-14 11:49:05 +02:00
mm 7d3ce17c53 fix(archive): Anleitung zeigt auf das Archiv, nie auf die Produktions-TSDB; x22-Wrapper mit --file 2026-09-14 11:43:19 +02:00
mm 4da9a59527 feat(archive): x22-Log-Archiv-Skript (messen + Backfill, mit Selbstpruefung) 2026-09-14 01:27:31 +02:00
mm 49f5dbc335 chore: __pycache__ nicht committen 2026-09-14 01:25:55 +02:00
mm 5483a4fea8 fix(apache): Sekunden-Kollision behoben (log_time + converter) — Node lieferte gar nichts mehr
Echte x22-Logs: 2000 Zeilen -> 286 Kollisionen (duplicate sample).
Telegraf uebernimmt den Log-Zeitstempel; bei mehreren Treffern pro Sekunde
kollidiert der +1ms-Aufschlag mit echten Zeilen. Prometheus weist den Batch
ab, Telegraf retryt endlos -> FIFO steht -> Node liefert GAR NICHTS mehr.

Fix: eigenes Grok-Muster mit log_time als Feld (Telegraf nutzt eigene ns-Uhr)
+ processors.converter, damit resp_code/verb Tags bleiben.
Gemessen: 2000/2000 Samples, 0 Kollisionen.

Ausserdem: Einheiten-Waechter im Archiver (ms statt s -> Abbruch statt
nutzloser Block).
2026-09-14 01:25:51 +02:00
mm d7149075a2 fix(logs): State-Dir default /tmp + laute Warnung wenn nicht beschreibbar (stiller Totalausfall) 2026-09-13 23:14:20 +02:00
mm c67600f147 fix(logs): Syslog-Zeitstempel nicht selbst berechnen (TZ-Fehler -> Loki wies alles als "too new" ab); adm-Gruppe fuer Host-Logrechte 2026-09-13 23:11:54 +02:00
mm 8d331abe8b feat(logs): syslog-tail.sh fuer Docker-Nodes (kein journalctl im Image, /hostfs read-only) 2026-09-13 22:53:04 +02:00
mm 8ca06bd6d6 perf(logs): journal-tail parst in einem awk-Durchlauf (11s -> 143ms, exec-Timeout behoben) 2026-09-13 22:32:07 +02:00
mm b49f9ccbfd fix(logs): Zeitbudget im journal-tail (exec timed out bei grossem Journal) 2026-09-13 22:29:55 +02:00
mm 8990124c2b fix(logs): journal-LP-Tag jhost statt host (Kollision mit Telegraf global_tag) 2026-09-13 22:28:27 +02:00
mm 258157c943 fix(logs): journald via exec+Cursor statt inputs.journal (existiert nicht) bzw. syslog (fehlt auf PVE) 2026-09-13 22:27:26 +02:00
mm eea9f7fce4 feat(node-info): LAN-IP, NetBird-IP/FQDN und PVE-URL als node_info-Metrik auf jeder Node 2026-09-13 21:56:14 +02:00
mm 17a3e2e746 fix(proxmox): pvenode statt node als Label — node-Filter bleibt konsistent zu den Host-Metriken 2026-09-13 21:45:17 +02:00
mm d2fa6420be feat(proxmox): Counter mit _total-Suffix, mem_usage_percent, swap, diskread/write; gegen pvesh-Reala usgabe 2026-09-13 21:21:04 +02:00
mm 72756babae feat(proxmox): pvesh-basierter exec-Input statt inputs.proxmox (kein Token/ACL noetig) 2026-09-13 21:17:48 +02:00
mm d8cb2432c5 fix(gpu-amd): Ausgabe im Prometheus-Format (kein _value-Suffix); data_format=prometheus 2026-09-13 20:32:52 +02:00
mm 1a3205b31a fix(gpu-amd): Parser ueber Spaltenkopf statt Einheitensuffix (rocm-smi liefert Einheiten nur im Header); VRAM, Junction-/Memory-Temp 2026-09-13 20:25:47 +02:00
mm 0674360563 fix(gpu-amd): Metriknamen statt Tag metric=; Parser sucht Werte anhand der Einheit 2026-09-13 20:24:40 +02:00
mm a19bd82189 feat: GPU-Auto-Erkennung (nvidia_smi, rocm-smi); Testserver-Aufraeumen dokumentiert 2026-09-13 20:11:26 +02:00