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).
87 lines
3.7 KiB
Plaintext
87 lines
3.7 KiB
Plaintext
# NetBird Observability — Basis-Konfiguration (alle Linux-Nodes)
|
|
# Variablen aus /etc/default/telegraf: NODE_NAME, PROM_URL, LOKI_URL
|
|
|
|
[global_tags]
|
|
node = "${NODE_NAME}"
|
|
|
|
[agent]
|
|
interval = "15s"
|
|
flush_interval = "15s"
|
|
metric_batch_size = 1000
|
|
# metric_buffer_limit: RAM-Puffer fuer noch nicht zugestellte Metriken.
|
|
# GEMESSEN (x22, rate ueber 5 min): der Host erzeugt 13,3 Log-Zeilen/s.
|
|
# Damit ergibt sich:
|
|
# 20.000 -> ~25 min Reserve (alter Wert — zu knapp fuer einen Ausfall)
|
|
# 200.000 -> ~4 h Reserve (~100-150 MB RAM, nur im Ausfall belegt)
|
|
# Telegraf puffert nur, solange der Push scheitert; im Normalbetrieb bleibt
|
|
# der Puffer leer. Die Reserve ist billiger als eine Luecke im Log.
|
|
#
|
|
# NICHT STILL: ein Ueberlauf wird geloggt
|
|
# [outputs.loki] Metric buffer overflow; N metrics have been dropped
|
|
# pruefen mit: journalctl -u telegraf | grep -i overflow
|
|
metric_buffer_limit = 200000
|
|
hostname = "${NODE_NAME}"
|
|
omit_hostname = false
|
|
|
|
# ---- Metriken → Prometheus Remote Write (imac) ----
|
|
[[outputs.http]]
|
|
url = "${PROM_URL}"
|
|
data_format = "prometheusremotewrite"
|
|
# 60s, NICHT 10s: laeuft die Node hinter dem NetBird-Reverse-Proxy (x05),
|
|
# 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.
|
|
namedrop = ["docker_log", "apache_log", "journal", "apache_error"]
|
|
[outputs.http.headers]
|
|
Content-Type = "application/x-protobuf"
|
|
Content-Encoding = "snappy"
|
|
X-Prometheus-Remote-Write-Version = "0.1.0"
|
|
Authorization = "Bearer ${TELEGRAF_TOKEN}"
|
|
|
|
# ---- Logs → Loki (imac) ----
|
|
[[outputs.loki]]
|
|
domain = "${LOKI_URL}"
|
|
endpoint = "/loki/api/v1/push"
|
|
# 60s aus demselben Grund wie oben: der Proxy-Weg braucht 11-19 s.
|
|
timeout = "60s"
|
|
# `apache_error` MUSS hier stehen: ohne den Namen sammelt der Input die
|
|
# Error-Logs ein und dieser Output verwirft sie wieder — kein Fehler, keine
|
|
# Meldung, die Panels bleiben leer. Derselbe stille Fehler wie bei `journal`.
|
|
namepass = ["docker_log", "apache_log", "journal", "apache_error"]
|
|
sanitize_label_names = true
|
|
metric_name_label = ""
|
|
http_headers = { "Authorization" = "Bearer ${TELEGRAF_TOKEN}" }
|
|
|
|
# ---- Host-Metriken ----
|
|
[[inputs.cpu]]
|
|
percpu = false
|
|
totalcpu = true
|
|
[[inputs.mem]]
|
|
[[inputs.swap]]
|
|
[[inputs.system]]
|
|
fieldexclude = ["uptime_format"]
|
|
[[inputs.disk]]
|
|
ignore_fs = ["tmpfs", "devtmpfs", "overlay", "squashfs", "fuse.lxcfs"]
|
|
[[inputs.diskio]]
|
|
[[inputs.net]]
|
|
[[inputs.processes]]
|
|
[[inputs.kernel]]
|