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).
This commit is contained in:
1 parent
5a213eb580
commit
5483a4fea8
7 files changed
+626
-7
No files matched your search
+26
-6
@@ -58,17 +58,37 @@
|
||||
# COMBINED_LOG_FORMAT — NICHT HTTPD_* (das sind andere Muster, Telegraf kennt
|
||||
# sie nicht: "no pattern found for %{HTTPD_COMBINED_LOG_FORMAT}").
|
||||
# Reihenfolge: spezifischste zuerst — VHost-Varianten vor der einfachen Form.
|
||||
grok_patterns = [
|
||||
"%{HOSTNAME:vh}:%{NUMBER:vport} %{COMBINED_LOG_FORMAT}",
|
||||
"%{HOSTNAME:vh} %{COMBINED_LOG_FORMAT}",
|
||||
"%{COMBINED_LOG_FORMAT}",
|
||||
"%{COMMON_LOG_FORMAT}",
|
||||
]
|
||||
# EIGENES MUSTER statt %{COMBINED_LOG_FORMAT} — wegen eines realen Ausfalls:
|
||||
# Die Log-Zeile hat nur SEKUNDEN-Aufloesung. Telegraf uebernimmt einen
|
||||
# erkannten Zeitstempel als Sample-Zeit; bei mehreren Treffern pro Sekunde
|
||||
# vergibt es +1 ms Aufschlag. Bei hoher Last (>1000 Zeilen/s) laeuft dieser
|
||||
# Aufschlag in die naechste Sekunde und kollidiert mit echten Zeilen:
|
||||
# "duplicate sample for timestamp ...; overrides not allowed"
|
||||
# Gemessen an echten x22-Logs: 2000 Zeilen -> 286 Kollisionen.
|
||||
# Prometheus weist den Batch ab, Telegraf wiederholt ihn endlos — der Node
|
||||
# liefert dann GAR NICHTS mehr (auch keine Systemmetriken).
|
||||
#
|
||||
# Der Fix: das Zeitfeld heisst `log_time` (kein `ts`), darum nutzt Telegraf
|
||||
# seine EIGENE Uhr mit Nanosekunden-Aufloesung. Die Log-Zeit bleibt als Feld
|
||||
# erhalten, der Zeitstempel ist eindeutig.
|
||||
grok_custom_patterns = '''
|
||||
APACHE_LINE (?:%{HOSTNAME:vh}(?::%{NUMBER:vport})? )?%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:http_version})?|-)" %{NUMBER:resp_code:int} (?:%{NUMBER:resp_bytes:int}|-)(?: "%{DATA:referrer}" "%{DATA:agent}")?
|
||||
'''
|
||||
grok_patterns = ["%{APACHE_LINE}"]
|
||||
grok_timezone = "UTC"
|
||||
# Kein Tag-Wildwuchs: nur das Noetige als Tag, der Rest als Feld.
|
||||
[inputs.tail.tags]
|
||||
source = "apache"
|
||||
|
||||
# resp_code und verb waren im eingebauten Muster TAGS. Das eigene Muster
|
||||
# liefert sie als Felder — ohne diesen Schritt haetten die Grafana-Panels,
|
||||
# die nach resp_code filtern, plotzlich keine Daten mehr.
|
||||
[[processors.converter]]
|
||||
namepass = ["apache_access"]
|
||||
order = 1
|
||||
[processors.converter.fields]
|
||||
tag = ["resp_code", "verb"]
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 3) mod_status (optional, auskommentiert)
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
Reference in new issue
Block a user