Commit Graph
14 Commits
Author SHA1 Message Date
Kalina 59ab6a9a22 fix(docker): auch das Feld health_status verwerfen (String-Feld)
Zweites String-Feld derselben Klasse wie container_id: inputs.docker liefert
health_status="healthy". Telegraf macht daraus docker_container_health_health_status
und Prometheus antwortet 'bad sample value "healthy"' -> der ganze Flush faellt aus,
auch die Container-Statistiken, die damit nichts zu tun haben.

GEMESSEN auf kalina nach dem ersten Fix: genau EINE 'series were dropped'-Zeile
mit 862 Serien im haengenden Batch, last recorded error health_status. Nach dem
Zusatz: 0 E!, 0 dropped, docker_container_* wieder da (kalina 501, imac 1126
Serien).

Feldliste diesmal empirisch erzeugt statt geraten: telegraf --test des
docker-Inputs ohne Prozessoren, alle Felder mit Anfuehrungszeichen gesammelt --
es sind genau ZWEI (container_id, health_status).

VERSION 1.9.3 -> 1.9.4.
2026-10-09 15:43:55 +02:00
Kalina 098f4cf7af fix(output): non_retryable_statuscodes [400,409,413,422] gegen Endlosschleife
Ein permanenter 400 (vergifteter Batch) blieb am FIFO-Kopf und wurde endlos
wiederholt; die gepufferten Samples alterten dabei bis ueber die Akzeptanz-
grenze des Empfaengers (head_min_time ~2x Blockdauer) und waren danach
unzustellbar — der Knoten verstummte dauerhaft.

GEMESSEN 09.10.2026: 9 von 15 Nodes stumm, Sample-Versatz 185-1071 min
(konstant ueber 72 h), 1680 Ablehnungen/h, danach 'Metric buffer overflow'
= endgueltiger Verlust. Mit der Option wird der Batch verworfen statt
wiederholt ('Received non-retryable status 400. Metrics are lost.') und der
Knoten erholt sich beim naechsten Flush selbst. 5xx/408/429 bleiben retrybar.

Zweiter Fix, gleiche Ursache: der vorhandene processors.override traf nur
'docker_log' und liess docker_container_blkio_container_id (String) durch —
der 400 warf die ganze docker_container_*-Familie weg. Neuer Block
namepass=['docker','docker_container*'] mit fieldexclude der *_id-Felder.

VERSION 1.9.2 -> 1.9.3 (loest den Auto-Updater aus).
2026-10-09 15:34:26 +02:00
Kalina 1fe25163d5 feat(agent): metric_buffer_limit 20000 -> 200000 (V1.9.2)
GEMESSEN: x22 erzeugt 13,3 Log-Zeilen/s. Die alte Reserve von 20.000
reichte damit nur ~25 min — bei einem Ausfall von einer Stunde waeren
Logs verloren gegangen, ohne dass es auffiele.

200.000 = ~4 h Reserve, belegt nur waehrend eines Ausfalls (Telegraf
puffert nichts, solange der Push klappt). Ein Ueberlauf wird geloggt
('[outputs.loki] Metric buffer overflow'), also nicht still.

Kein Dienstneustart noetig ausser der regulaere Konfigurationslauf.
2026-09-14 20:07:34 +02:00
mm 72752e523e chore(installer): Update-Only meldet gesetzte ACLs ehrlich + VERSION 1.9.1 2026-09-14 11:29:19 +02:00
mm 6f82bad6f9 fix(acl): Glob-Wurzeln brauchen r-x — Ursache der stummen Datenluecke auf x14
x14 sendete 105 Metriken, aber KEINE apache-Metriken und keine Logs. Der
Installer meldete Erfolg. Telegraf selbst nannte den Grund:

  W! [inputs.tail] Directory "/home/users" is not readable but is followed
     by wildcards, make sure you set read permissions or globbing will not work!

Drei Ursachen, alle behoben:

1. `setfacl -m u:telegraf:x` auf der Glob-Wurzel ist FALSCH. Eine Wildcard wird
   per readdir expandiert — dafuer braucht das Verzeichnis `r-x`, nicht nur `x`.
   Neue Logik: Muster werden mit `set -f` gelesen, dann je Treffer die Datei mit
   `r` und JEDE Ebene zwischen Wurzel und Datei mit `r-x` belegt.
   Gemessen: alte ACL -> 1 Warnung, 1 Punkt (nur /var/log/apache2);
   neue ACL -> 0 Warnungen, 4 Punkte (alle 3 Dateien inkl. User-Homes).

2. Der Gegentest war blind: er las jede gefundene Datei per `head -c 1` als
   telegraf. Das konnte nicht fehlschlagen, weil die Datei vom ROOT-Shell
   expandiert wurde — die Glob-Wurzel blieb unlesbar, Telegraf bekam 0 Treffer,
   die Meldung sagte trotzdem "alle N Logdateien lesen". Jetzt wird die
   GLOB-AUFLOESUNG gemessen: dasselbe Muster im Dienstkontext expandieren und die
   Trefferzahl vergleichen. 0 von 0 zaehlt als Fehler, nicht als Erfolg.

3. `for p in $_pfadquelle` ohne `set -f` expandiert die Muster im Root-Shell.
   _pattern war danach ein konkreter Dateiname, der Wildcard-Zweig lief nie, und
   die ACL landete nur auf den Dateien. Real passiert: "ACL auf 3 Datei(en)",
   "kein Glob-Muster gefunden", 0 Treffer im Dienst.

Verifiziert mit echtem Telegraf 1.40.0 und REALEN KeyHelp-Rechten
(/home/users/<user> 0700, logs 0750, Dateien 0640).
2026-09-14 11:21:00 +02:00
mm 3f9ac51c45 chore: VERSION 1.8.0 (envsubst-Fix) 2026-09-14 10:44:06 +02:00
mm 78f5b9ab5e chore: VERSION 1.7.0 2026-09-14 10:36:40 +02:00
mm 360f91f8a1 chore: VERSION 1.6.0 2026-09-14 10:33:44 +02:00
mm f5b98d2807 fix(installer): Haenger nach "bereits installiert" behoben (VERSION 1.5.0)
x14 blieb nach der letzten Erfolgsmeldung stehen (Abbruch per ^C, kein Fehler).
Ursache: grant_apache_log_access() ruft apt-get install acl auf — OHNE
apt-get update davor und OHNE Timeout. Bei veralteten Paketlisten kann apt in
eine Rueckfrage laufen und unbegrenzt warten. Direkt danach haette der naechste
fetch gehangen: fetch() hatte ueberhaupt kein curl-Timeout.

Fix:
- apt-get update vor dem acl-Install, timeout 180 auf allen Paketmanager-Aufrufen
- fetch() mit -m 30 + 3 Versuchen statt unbegrenztem Warten
- alle weiteren curl-Aufrufe (keyring, Binary, Re-Exec) mit -m/--connect-timeout
- Fortschrittsmeldung vor der ACL-Phase: ein Haenger sah wie ein Absturz aus
2026-09-14 10:29:12 +02:00
mm 1eb7976ec8 fix(installer): Selbstschutz gegen stdin-Frass bei curl|sh (VERSION 1.4.0)
x14 brach mitten in der Installation ab: der Installer gab seinen eigenen
Quelltext aus ("; then", Kommentarzeilen) und blieb stehen.

Ursache: Bei `curl ... | sh` liest die Shell das Skript aus STDIN. apt startet
auf Ubuntu `needrestart` (Meldung "Scanning processes... / Scanning linux
images..."), und das liest stdin — damit war der Rest des Skripts weg. Die
Shell setzte mitten im Quelltext fort. Bei x22 trat es nicht auf, weil Telegraf
dort schon installiert war (kein apt-Lauf).

Fix, drei Schutzschichten:
1. Re-Exec: laeuft das Skript ueber eine Pipe, laedt es sich frisch von der
   Quelle und startet sich neu — mit stdin auf /dev/null. NICHT per cat von
   stdin kopieren: die Shell puffert bereits, die Kopie waere unvollstaendig.
2. NEEDRESTART_MODE=a + DEBIAN_FRONTEND=noninteractive fuer alle apt-Aufrufe.
3. </dev/null an jedem Paketmanager (apt, dnf, yum, apk).
2026-09-14 10:14:10 +02:00
mm 3236d9cede feat(apache): Error-Logs erfassen + drei stille Fallen behoben (VERSION 1.3.0)
Bisher wurden NUR access.log gesammelt — real nachgemessen: 31 logfile-Labels,
0 davon error.log. Bei einem KeyHelp-Host mit PHP/CMS fehlten damit genau die
Fehler, fuer die man ins Monitoring schaut.

Error-Logs jetzt in einem EIGENEN Input (name_override=apache_error), roh nach
Loki, mit Tags logtype=error und logfile=<pfad>. Getrennt vom Access-Grok, weil
das Format nicht passt:
  [Mon Sep 14 00:10:01.123456 2026] [core:error] [pid 9] AH00124: ...
Liefen sie durch den Access-Parser, entstuenden keine Metriken, aber der
Aggregator wuerde sie in leere Gruppen einordnen.

DREI STILLE FALLEN dabei gefunden und behoben:
1. processors.rename hatte namepass=["journal"] — apache_error behielt das
   Feld value, jede Panel-Query mit {.message} haette es nicht gefunden.
2. outputs.loki namepass enthielt apache_error nicht — Input sammelt ein,
   Output verwirft, keine Fehlermeldung, Panels leer (wie bei journal damals).
3. outputs.prometheus namedrop ebenso — sonst wandern Textzeilen in die TSDB.

Verifiziert gegen echte KeyHelp-Formate: access=2 Metriken, error=4 Rohzeilen,
Feld heisst message, 0 Error-Zeilen als Metrik.
2026-09-14 10:03:13 +02:00
mm 6d0d0bd900 fix(apache): Aggregator gegen Zeitstempel-Kollisionen + README korrigiert
Die vorige Massnahme (log_time statt ts) war NICHT ausreichend. Ursache ist
tiefer: Telegraf schreibt pro Sammelzyklus EINEN Zeitstempel fuer den ganzen
Batch, und Remote Write kann nur Millisekunden. Zwei Requests derselben Serie
in derselben Millisekunde -> Prometheus lehnt den ganzen Batch ab -> FIFO-Kopf
sitzt fest -> Node liefert gar nichts mehr (derselbe eingefrorene Timestamp
alle ~15s im Log).

Ein Zeitstempel-Trick kann das nicht loesen. Aggregation schon: basicstats
fasst alle Metriken einer Serie pro 60s zu einem Punkt zusammen. Gemessen an
2000 echten x22-Zeilen: 2000 Punkte -> 4 Punkte, 0 Kollisionen, Requests
vollstaendig gezaehlt (1997).

VERSION 1.2.0, damit der Auto-Updater den Fix ausrollt.
2026-09-14 02:01:13 +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 0e9dce9e47 docs: Updater-Konzept (VERSION+Hash, Timer, force-update, Rollback) 2026-09-13 23:36:38 +02:00