From 098f4cf7afdbe67eb437155f163f38a65c1aba5b Mon Sep 17 00:00:00 2001 From: Kalina Date: Fri, 9 Oct 2026 15:34:26 +0200 Subject: [PATCH] fix(output): non_retryable_statuscodes [400,409,413,422] gegen Endlosschleife MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- VERSION | 2 +- telegraf/base.conf | 15 +++++++++++++++ telegraf/docker.conf | 15 +++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8fdcf38..77fee73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.9.2 +1.9.3 diff --git a/telegraf/base.conf b/telegraf/base.conf index 1ae4007..9f93d9e 100644 --- a/telegraf/base.conf +++ b/telegraf/base.conf @@ -31,6 +31,21 @@ # dauert ein POST 11-19 s. Ein 10-s-Timeout bricht dann JEDEN Batch ab — # gemessen 702 abgelehnte Requests in 20 min, die Metriken fehlen still. timeout = "60s" + # GEGEN DIE ENDLOSSCHLEIFE — die wichtigste Zeile hier. + # Ein 400 ist PERMANENT: dieselbe Nutzlast liefert dieselbe Antwort. Ohne + # diese Liste bleibt der abgelehnte Batch am FIFO-Kopf stehen, wird fuer + # immer wiederholt und blockiert jede dahinter gesammelte Serie. Die + # gepufferten Samples altern dabei weiter, bis sie aelter sind als die + # Akzeptanzgrenze des Empfaengers (Prometheus: head_min_time ~2x + # Blockdauer, gemessen 90-120 min) — danach sind sie UNZUSTELLBAR und der + # Knoten ist dauerhaft stumm (gemessen 09.10.2026: 9 von 15 Nodes, Versatz + # 185-1071 min, 1680 Ablehnungen/h, danach 'Metric buffer overflow' = + # endgueltiger Verlust). Mit dieser Zeile wird der Batch VERWORFEN statt + # wiederholt ("Received non-retryable status 400. Metrics are lost.") und + # der Knoten erholt sich beim naechsten Flush von selbst. + # 5xx/408/429 bleiben absichtlich retrybar: dort ist die Nutzlast in + # Ordnung, nur der Server ist gerade nicht bereit. + non_retryable_statuscodes = [400, 409, 413, 422] # Roh-Logs gehoeren NICHT in Prometheus — sie sind Text, keine Zeitreihen. # `apache_error` hier ergaenzen, sonst versucht der Remote-Write-Output # Textzeilen als Metriken zu senden. diff --git a/telegraf/docker.conf b/telegraf/docker.conf index e9c2641..5bc6ac4 100644 --- a/telegraf/docker.conf +++ b/telegraf/docker.conf @@ -19,3 +19,18 @@ [[processors.override]] namepass = ["docker_log"] fieldexclude = ["container_id"] + +# Ohne diesen zweiten Block faellt die GANZE docker_container_*-Familie aus +# jedem Remote-Write-Batch. `inputs.docker` liefert die Felder `container_id` +# und `image_id` als 64-stellige Hex-Strings; Telegraf flacht Messung+Feld zu +# einem Metriknamen ab, daraus wird `docker_container_blkio_container_id` — +# ein STRING-Wert, den Prometheus ablehnt: +# `bad sample value "<64 hex>"` +# Der 400 wirft den KOMPLETTEN Flush weg, also auch alle Serien, an denen +# nichts falsch ist. Der Block oben trifft nur `docker_log` (Loki-Output) und +# hilft hier NICHT — das ist die Falle, an der man den ganzen Vormittag sucht. +# Gemessen 09.10.2026 auf imac: 278 "series were dropped"-Zeilen in 60 min, +# bis zu 2804 Serien im selben haengenden Batch. +[[processors.override]] + namepass = ["docker", "docker_container*"] + fieldexclude = ["container_id", "container_image_id", "container_id_short", "device_id", "image_id"]