feat(archive): x22-Log-Archiv-Skript (messen + Backfill, mit Selbstpruefung)
This commit is contained in:
1 parent
49f5dbc335
commit
4da9a59527
1 file changed
+123
Executable
+123
@@ -0,0 +1,123 @@
|
||||
#!/usr/bin/env bash
|
||||
# x22-log-archive.sh — Alte Apache-Logs von x22 einsammeln, parsen, ins Archiv schieben.
|
||||
#
|
||||
# WARUM ES DIESES SKRIPT GIBT
|
||||
# Alte Logs sollen dauerhaft auswertbar bleiben. Der Weg dorthin hat zwei Fallen,
|
||||
# die beide still zuschlagen:
|
||||
# 1. Ein Import in die PRODUKTIONS-TSDB kann die Zeitreferenz verschieben und
|
||||
# damit alle Live-Daten als "too old" verwerfen. Deshalb geht der Import
|
||||
# ausschliesslich in die getrennte Archiv-Instanz (:9091).
|
||||
# 2. OpenMetrics-Zeitstempel sind SEKUNDEN. Millisekunden ergeben Bloecke im
|
||||
# Jahr 58.662, die Prometheus verwirft — die Abfrage bleibt dann leer.
|
||||
# Das Archiver-Skript prueft Punkt 2 selbst (Einheiten-Waechter) und bricht ab.
|
||||
#
|
||||
# AUFRUF auf x22 (als root):
|
||||
# curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/scripts/x22-log-archive.sh -o /root/x22-archive.sh
|
||||
# bash /root/x22-archive.sh # Messen (nichts wird veraendert)
|
||||
# bash /root/x22-archive.sh --backfill # Logs parsen und Archiv-Tarball bauen
|
||||
#
|
||||
# Das Skript AENDERT NICHTS am laufenden Telegraf und importiert nichts selbst —
|
||||
# es liefert eine Datei, die auf dem imac ins Archiv geschoben wird.
|
||||
|
||||
set -eu
|
||||
|
||||
REPO_RAW="${REPO_RAW:-https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main}"
|
||||
OUT_DIR="${OUT_DIR:-/root/apache-archive}"
|
||||
NODE="${NODE:-x22.idx.wf-keyhelp}"
|
||||
BACKFILL=0
|
||||
[ "${1:-}" = "--backfill" ] && BACKFILL=1
|
||||
|
||||
log() { printf '\033[1;34m[x22-archiv]\033[0m %s\n' "$*"; }
|
||||
warn() { printf '\033[1;33m[x22-archiv] WARNUNG:\033[0m %s\n' "$*" >&2; }
|
||||
die() { printf '\033[1;31m[x22-archiv] FEHLER:\033[0m %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
[ "$(id -u)" -eq 0 ] || die "Bitte als root ausfuehren."
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 1) Bestand messen — MESSEN, NICHT RATEN
|
||||
# --------------------------------------------------------------------------
|
||||
log "Bestandsaufnahme der Apache-Logs …"
|
||||
mkdir -p /tmp/x22-archiv
|
||||
curl -fsSL "$REPO_RAW/scripts/apache-log-survey.py" -o /tmp/x22-archiv/survey.py \
|
||||
|| die "survey.py konnte nicht geladen werden ($REPO_RAW/scripts/apache-log-survey.py)"
|
||||
python3 /tmp/x22-archiv/survey.py --node "$NODE" 2>&1 | tee /tmp/x22-archiv/bestand.txt
|
||||
|
||||
if [ "$BACKFILL" -eq 0 ]; then
|
||||
echo
|
||||
log "Das war nur die Messung — es wurde nichts veraendert."
|
||||
echo " Fuer die Archivierung: bash $0 --backfill"
|
||||
echo " Bestand: /tmp/x22-archiv/bestand.txt"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 2) Archiv bauen
|
||||
# --------------------------------------------------------------------------
|
||||
log "Archiver laden …"
|
||||
curl -fsSL "$REPO_RAW/scripts/apache-log-archive.py" -o /tmp/x22-archiv/archive.py \
|
||||
|| die "apache-log-archive.py konnte nicht geladen werden."
|
||||
|
||||
log "Logs parsen und OpenMetrics erzeugen (kann bei viel Historie dauern) …"
|
||||
python3 /tmp/x22-archiv/archive.py --node "$NODE" --out "$OUT_DIR" --include-raw 2>&1 | tail -20
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 3) Selbst pruefen, bevor irgendetwas weitergereicht wird
|
||||
# --------------------------------------------------------------------------
|
||||
OM="$OUT_DIR/apache-archive.openmetrics"
|
||||
[ -s "$OM" ] || die "Keine Ausgabe erzeugt: $OM fehlt oder ist leer."
|
||||
|
||||
log "Selbstpruefung der Ausgabe"
|
||||
python3 - "$OM" <<'PY'
|
||||
import sys, time
|
||||
path = sys.argv[1]
|
||||
lines = [l for l in open(path) if l and not l.startswith("#")]
|
||||
if not lines:
|
||||
print(" FEHLER: keine Datenpunkte"); sys.exit(1)
|
||||
ts = sorted(int(l.rsplit(" ", 1)[1]) for l in lines)
|
||||
now = int(time.time())
|
||||
print(f" Datenpunkte: {len(lines)}")
|
||||
print(f" Zeitraum: {time.strftime('%d.%m.%Y %H:%M', time.gmtime(ts[0]))}"
|
||||
f" .. {time.strftime('%d.%m.%Y %H:%M', time.gmtime(ts[-1]))} UTC")
|
||||
print(f" Einheit: Sekunden (Plausibilitaet geprueft)")
|
||||
# Einheiten-Wache: alles nach 2100 ist kein Sekundenwert
|
||||
if ts[-1] > 4102444800:
|
||||
print(" FEHLER: Zeitstempel nach dem Jahr 2100 -> Millisekunden statt Sekunden"); sys.exit(1)
|
||||
# Zukunft pruefen: das ist der Fehler, der die Produktion kosten kann
|
||||
zukunft = [t for t in ts if t > now + 300]
|
||||
if zukunft:
|
||||
print(f" WARNUNG: {len(zukunft)} Punkte liegen in der ZUKUNFT "
|
||||
f"(max {time.strftime('%d.%m.%Y %H:%M', time.gmtime(zukunft[-1]))}).")
|
||||
print(" Diese Punkte stammen aus einer falschen Systemuhr oder falschen Logs.")
|
||||
else:
|
||||
print(" Zukunfts-Check: OK (kein Punkt nach jetzt)")
|
||||
PY
|
||||
|
||||
TAR="$OUT_DIR/apache-archive.tar.gz"
|
||||
[ -s "$TAR" ] && log "Tarball: $TAR ($(du -h "$TAR" | cut -f1))"
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# 4) Uebergabe
|
||||
# --------------------------------------------------------------------------
|
||||
cat <<EOF
|
||||
|
||||
============================================================
|
||||
FERTIG — naechster Schritt auf dem imac (nichts weiter noetig auf x22)
|
||||
============================================================
|
||||
|
||||
Von hier aus die Ausgabe auf den imac holen und ins ARCHIV einspielen
|
||||
(NICHT in die Produktions-TSDB):
|
||||
|
||||
# 1) Uebertragen (von x22 aus, im NetBird)
|
||||
scp $OM mm@100.83.134.46:/tmp/apache-archive.openmetrics
|
||||
|
||||
# 2) Auf dem imac: Bloecke im ARCHIV-Verzeichnis erzeugen und einspielen
|
||||
ssh mm@192.168.188.177 'sudo /usr/local/bin/prom-archive-import.sh'
|
||||
|
||||
Wichtig: der Import prueft zuerst auf Zukunfts-Zeitstempel und legt einen
|
||||
Snapshot an. Bricht er ab, ist das der Schutz, nicht ein Defekt — Ursache
|
||||
in der Ausgabe pruefen.
|
||||
|
||||
Das Skript fuehrt den Import bewusst NICHT selbst aus: die Produktions-TSDB
|
||||
liegt auf einem anderen Host, und ein automatischer Import von einer Node aus
|
||||
waere genau der Weg, der am 14.09. die Historie gekostet hat.
|
||||
EOF
|
||||
Reference in new issue
Block a user