# Apache: Access-Logs → Loki (roh) UND Request-Metriken → Prometheus # # Zwei Wege aus einem Log — sie ergaenzen sich: # inputs.tail : jede Zeile roh nach Loki (fuer die Fehlersuche im Einzelfall) # inputs.logparser: dieselben Zeilen als Metriken (Request-Rate, Status-Klassen, # Antwortzeit) — das ist, was Panels und Alerts brauchen # # Die Logs landen NICHT in Prometheus: der Remote-Write-Output hat # `namedrop = ["docker_log", "journal"]` — hier kommt `apache_log` dazu. # # FALLE: `from_beginning` existiert bei inputs.tail NICHT (weder im Docker-Image # noch im InfluxData-Paket 1.40). Ein solcher Block laesst den Dienst beim Start # hart scheitern: "plugin inputs.tail: configuration specified the fields # [from_beginning]" → systemctl start schlaegt fehl, ALLE Metriken aus. # Stattdessen: initial_read_offset = "saved-or-end" (Default), damit beim ersten # Lauf nicht die komplette Historie ausgeschuettet wird. # -------------------------------------------------------------------------- # 1) Roh-Logs → Loki # -------------------------------------------------------------------------- # ${APACHE_FILES} rendert zu einer echten TOML-Liste — der Installer baut sie # aus allen gefundenen Logpfaden (Panel-Hoster haben pro VHost eigene Dateien). # Ein einzelner String mit Leerzeichen ("/a.log /b.log") waere ein ungueltiger # Pfad und der Input liefe still leer. [[inputs.tail]] files = ${APACHE_FILES} name_override = "journal" # Beim Erstanlauf nur Neues lesen; danach Position merken. initial_read_offset = "saved-or-end" data_format = "value" data_type = "string" # Vereinheitlicht den Feldnamen auf `message` — das Logs-Panel in Grafana # erwartet es; `value` wuerde als value="…" erscheinen. path_tag = "logfile" [inputs.tail.tags] source = "apache" [[processors.rename]] namepass = ["journal"] order = 1 [[processors.rename.replace]] field = "value" dest = "message" # -------------------------------------------------------------------------- # 2) Request-Metriken (Common/Combined Log Format) → Prometheus # -------------------------------------------------------------------------- # Common Log Format: # 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 # VHost-Apache (Debian-Default) stellt den Hostnamen voran: # example.com:80 127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET / HTTP/1.0" 200 2326 [[inputs.tail]] files = ${APACHE_FILES} name_override = "apache_access" initial_read_offset = "saved-or-end" data_format = "grok" # Korrekte Namen der Telegraf-Grok-Sammlung: COMMON_LOG_FORMAT und # 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}", ] grok_timezone = "UTC" # Kein Tag-Wildwuchs: nur das Noetige als Tag, der Rest als Feld. [inputs.tail.tags] source = "apache" # -------------------------------------------------------------------------- # 3) mod_status (optional, auskommentiert) # -------------------------------------------------------------------------- # Liefert Auslastung (BusyWorkers, ReqPerSec) — nuetzlich, braucht aber # `a2enmod status`, `ExtendedStatus On` und eine lokale Freigabe von # /server-status in der Apache-Config. # # [[inputs.apache]] # urls = ["http://127.0.0.1/server-status?auto"]