fix(monitoring): prune Prometheus S3 backups by prefix-date, not file mtime (DEV-465)
The original `rclone delete --min-age 7d` step ate the freshly uploaded backup: rclone preserves each source file's mtime, and Prometheus TSDB chunk/block files retain very old mtimes (weeks-old immutable blocks), so filtering by file age deleted ~72% of the objects immediately after sync (verified: 8.764 GiB destination reduced to 2.310 GiB / 37 objects before we noticed). Replaced the mtime prune with a prefix-name-based prune: every top-level prefix is `prometheus-YYYYMMDD-HHMMSS`, so we parse the encoded date and `rclone purge` whole prefixes older than 7 days. This keeps the latest 7 daily snapshots intact regardless of the Prometheus block ages. Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
parent
63aa116ef1
commit
a5ceedf4da
1 changed files with 39 additions and 4 deletions
|
|
@ -129,10 +129,45 @@ spec:
|
||||||
fi
|
fi
|
||||||
echo "OK: destination size acceptable."
|
echo "OK: destination size acceptable."
|
||||||
|
|
||||||
echo "Pruning prometheus backups older than 7 days..."
|
# Prune by prefix name, NOT by file mtime. rclone preserves
|
||||||
rclone delete "hetzner-s3:${S3_BUCKET}/prometheus/" \
|
# each source file's mtime on upload, and Prometheus TSDB
|
||||||
--min-age 7d || echo "prune step reported errors (continuing)"
|
# chunk files retain very old mtimes (weeks-old blocks),
|
||||||
rclone rmdirs "hetzner-s3:${S3_BUCKET}/prometheus/" --leave-root || true
|
# so `rclone delete --min-age 7d` would eat the just-
|
||||||
|
# uploaded backup. Every top-level prefix is named
|
||||||
|
# `prometheus-YYYYMMDD-HHMMSS`, so we compare the encoded
|
||||||
|
# date to a 7-day threshold and purge whole prefixes.
|
||||||
|
echo "Pruning prometheus backup prefixes older than 7 days..."
|
||||||
|
# BusyBox date lacks GNU's `-d "7 days ago"` and BSD's `-v -7d`,
|
||||||
|
# so compute the cutoff via @epoch which BusyBox does support.
|
||||||
|
CUTOFF_EPOCH=$(( $(date +%s) - 7 * 86400 ))
|
||||||
|
CUTOFF=$(date -d "@${CUTOFF_EPOCH}" +%Y%m%d)
|
||||||
|
echo "Cutoff (delete prefixes with date < ${CUTOFF}):"
|
||||||
|
KEEP=0
|
||||||
|
PRUNE=0
|
||||||
|
for PREFIX in $(rclone lsf --dirs-only "hetzner-s3:${S3_BUCKET}/prometheus/" 2>/dev/null | sed 's:/$::'); do
|
||||||
|
case "${PREFIX}" in
|
||||||
|
prometheus-*)
|
||||||
|
PDATE=$(echo "${PREFIX}" | sed -n 's/^prometheus-\([0-9]\{8\}\)-.*/\1/p')
|
||||||
|
if [ -z "${PDATE}" ]; then
|
||||||
|
echo " SKIP ${PREFIX} (unparseable name)"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ "${PDATE}" -lt "${CUTOFF}" ]; then
|
||||||
|
echo " PURGE ${PREFIX} (date ${PDATE} < ${CUTOFF})"
|
||||||
|
rclone purge "hetzner-s3:${S3_BUCKET}/prometheus/${PREFIX}" \
|
||||||
|
|| echo " WARN purge failed for ${PREFIX} (continuing)"
|
||||||
|
PRUNE=$((PRUNE + 1))
|
||||||
|
else
|
||||||
|
echo " KEEP ${PREFIX} (date ${PDATE})"
|
||||||
|
KEEP=$((KEEP + 1))
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo " SKIP ${PREFIX} (not a prometheus- prefix)"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
echo "Prune summary: kept ${KEEP}, purged ${PRUNE}."
|
||||||
|
|
||||||
echo "Post-run inventory (prometheus/ prefixes):"
|
echo "Post-run inventory (prometheus/ prefixes):"
|
||||||
rclone lsd "hetzner-s3:${S3_BUCKET}/prometheus/" || true
|
rclone lsd "hetzner-s3:${S3_BUCKET}/prometheus/" || true
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue