archibald hat kein sudo und kein linger, aber Docker-Gruppe. Muster wie bei der llama-swap-Telemetrie auf dem ROG: ein Nutzer-Cron fuehrt den Exporteur aus, Telegraf laeuft als Container daneben und pusht per Remote Write zum Collector im Mesh. - scripts/archivebox-telemetrie.py: liest die ArchiveBox-Logs und die SQLite-DB IM Container (Host-User mm darf index.sqlite3 nicht oeffnen, Container-User 911 schon) und schreibt eine Prometheus-Exposition. Kein node-Label -- das setzt Telegraf per global_tags. - scripts/install-archivebox-telemetrie.sh: installiert Exporteur, Cron-Eintrag (jede Minute) und den Container, mit --dry-run. - stacks/telegraf-container/: telegraf 1.39, network_mode host, inputs.file (data_format prometheus), outputs.prometheus_remote_write.
91 lines
3.4 KiB
Bash
Executable File
91 lines
3.4 KiB
Bash
Executable File
#!/bin/sh
|
|
# =============================================================================
|
|
# ArchiveBox-Runner-Telemetrie auf einem Knoten OHNE sudo einrichten.
|
|
#
|
|
# Drei Teile, alle ohne Root:
|
|
# 1. Exporteur-Skript nach ~/bin (liest Logs + DB im Container, schreibt .prom)
|
|
# 2. Cron-Eintrag (jede Minute) -- der Cron-Daemon des Hosts, kein Nutzer-Timer
|
|
# (linger=no wuerde Nutzer-Units beim Abmelden abraeumen)
|
|
# 3. Telegraf-Container (Docker-Gruppe) mit Remote Write an den Collector
|
|
#
|
|
# Aufruf: sh install-archivebox-telemetrie.sh [--dry-run]
|
|
# Vorbedingungen: python3, docker (Docker-Gruppe), cron laufen.
|
|
# =============================================================================
|
|
set -eu
|
|
|
|
DRY="${1:-}"
|
|
NODE="${NODE_NAME:-archibald}"
|
|
HOME_DIR="${HOME:-/home/mm}"
|
|
BIN="$HOME_DIR/bin/archivebox-telemetrie.py"
|
|
STACK_DIR="$HOME_DIR/stacks/telegraf-archibald"
|
|
PROM_URL="${PROM_URL:-http://100.83.134.46:9090/api/v1/write}"
|
|
|
|
say() { printf '%s\n' "$*"; }
|
|
run() {
|
|
if [ "$DRY" = "--dry-run" ]; then say "DRY: $*"; else eval "$@"; fi
|
|
}
|
|
|
|
say "== Vorbedingungen =="
|
|
for c in python3 docker crontab; do
|
|
command -v "$c" >/dev/null 2>&1 || { say "FEHLER: $c fehlt"; exit 1; }
|
|
say "ok: $c -> $(command -v "$c")"
|
|
done
|
|
docker ps >/dev/null 2>&1 || { say "FEHLER: Docker nicht nutzbar (Gruppe?)"; exit 1; }
|
|
say "ok: Docker nutzbar"
|
|
|
|
say "== 1. Exporteur =="
|
|
run "mkdir -p '$HOME_DIR/bin' '$HOME_DIR/abx-telemetrie'"
|
|
run "chmod 755 '$HOME_DIR/abx-telemetrie'"
|
|
if [ "$DRY" != "--dry-run" ]; then
|
|
here=$(cd "$(dirname "$0")" && pwd)
|
|
run "cp '$here/archivebox-telemetrie.py' '$BIN'"
|
|
run "chmod 755 '$BIN'"
|
|
fi
|
|
|
|
say "== 2. Cron (jede Minute, idempotent) =="
|
|
LINE="* * * * * LC_ALL=C /usr/bin/python3 $BIN >/dev/null 2>&1"
|
|
if [ "$DRY" = "--dry-run" ]; then
|
|
say "DRY: crontab-Zeile -> $LINE"
|
|
else
|
|
tmp=$(mktemp)
|
|
crontab -l 2>/dev/null | grep -v 'archivebox-telemetrie.py' > "$tmp" || true
|
|
printf '%s\n' "$LINE" >> "$tmp"
|
|
crontab "$tmp"
|
|
rm -f "$tmp"
|
|
say "crontab jetzt:"
|
|
crontab -l | sed 's/^/ /'
|
|
fi
|
|
|
|
say "== 3. Telegraf-Container =="
|
|
run "mkdir -p '$STACK_DIR'"
|
|
here=$(cd "$(dirname "$0")" && pwd)
|
|
if [ "$DRY" != "--dry-run" ]; then
|
|
run "cp '$here/../stacks/telegraf-container/docker-compose.yml' '$STACK_DIR/'"
|
|
run "cp '$here/../stacks/telegraf-container/telegraf.conf' '$STACK_DIR/'"
|
|
# NODE_NAME/PROM_URL aus der Datei gegen die hier gesetzten Werte stellen.
|
|
run "sed -i \"s|NODE_NAME: .*|NODE_NAME: $NODE|\" '$STACK_DIR/docker-compose.yml'"
|
|
run "sed -i \"s|PROM_URL: .*|PROM_URL: $PROM_URL|\" '$STACK_DIR/docker-compose.yml'"
|
|
fi
|
|
|
|
say "== Probelauf des Exporteurs =="
|
|
if [ "$DRY" != "--dry-run" ]; then
|
|
run "/usr/bin/python3 '$BIN'"
|
|
say "--- $HOME_DIR/abx-telemetrie/abx.prom (Kopf) ---"
|
|
head -20 "$HOME_DIR/abx-telemetrie/abx.prom"
|
|
fi
|
|
|
|
say "== Container starten =="
|
|
if [ "$DRY" != "--dry-run" ]; then
|
|
( cd "$STACK_DIR" && docker compose up -d )
|
|
sleep 20
|
|
docker logs --since 60s telegraf-archibald 2>&1 | grep -c 'E!' | sed 's/^/ E!-Zeilen: /'
|
|
docker exec telegraf-archibald sh -c 'cat /var/lib/abx-prom/abx.prom | head -3' \
|
|
| sed 's/^/ Container sieht: /'
|
|
fi
|
|
|
|
say ""
|
|
say "== Abnahme (auf dem Collector ausfuehren) =="
|
|
say "curl -s --data-urlencode 'query=archivebox_telemetrie_timestamp_seconds' http://<collector>:9090/api/v1/query"
|
|
say "curl -s --data-urlencode 'query=count by (node)(archivebox_runner_up)' http://<collector>:9090/api/v1/query"
|
|
say "OK -- Knoten $NODE eingerichtet."
|