Herbstpflanze

wall < "whisper-Daten aufräumen"

Broadcast message from spillerm@unixe.de (pts/1) (Di Mrz 13 08:37:31 2018):
4

Hosts kommen, Hosts gehen; Services werden eingerichtet, umbenannt, verworfen; Checks werden von by_ssh und nrpe auf den Icinga 2-Core umgestellt; kurz: es gibt viele gute Gründe für veraltete Datenbestände in Sachen Graphite.

Störend finde ich diese Altlasten insofern, als dass sie

  • Ressourcen verbraten: und das nicht gerade zu knapp — wir sprechen hier durchaus von vielen Gigabyte auf schnellen (und somit teuren) Datenträgern
  • Verwirrung stiften: spätestens, wenn Kollegen Dashboards in Grafana erstellen wollen, sind sie verblüfft bezüglich der Auswahlmöglichkeiten, die sich ihnen bieten. Denn sind Daten vorhanden, werden sie als Option angeboten, auch wenn sie veraltet sind

Ich habe also zwei Möglichkeiten: entweder ich mumpfe die wsp-Files entsprechend um, merge, verschiebe, was auch immer nötig ist, um die Daten zu halten — das bietet sich an, wenn ein Service-Check lediglich umbenannt wird. Im Falle entsorgter Hosts will ich die Daten aber auf lange Sicht ganz verwerfen. Beides will ich mir nun endlich mal hier aufnotieren — ist nämlich ganz klassisch etwas, das ich jedes Mal aufs Neue nachschlagen muss… ;)

Löschen veralteter Daten

Welche Dateien wurden seit mindestens 180 Tagen nicht mehr beschrieben? Mit dem folgenden Aufruf liste ich mir diese auf — zusammen mit einer Hochrechnung, wieivel Speicherplatz freigeschaufelt würde, wenn ich den Kram sofort über die Wupper schicke. Meine whisper-Daten liegen in /var/lib/graphite/whisper/icinga2 — der Pfad kann in deinem Setup natürlich anders heißen.

$ find /var/lib/graphite/whisper/icinga2 \
-name "*wsp" \
-mtime +180 \
-exec echo -n -e {}"\0" \; \
| du -hc --files0-from=-
...
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/reachable.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/acknowledgement.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/max_check_attempts.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/state.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/downtime_depth.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/latency.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/current_attempt.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/execution_time.wsp
424K	/var/lib/graphite/whisper/icinga2/oldhost/services/Cert/http/metadata/state_type.wsp
11G     total

Jetzt wird es spannend: genau diese wsp-Files sollen gelöscht werden. Teste den Aufruf vorher und teste ihn nicht ohne Backup, ich übernehme keine Haftung dafür falls er auf deinem Systemen irgendwo Amok läuft! :)

$ find /var/lib/graphite/whisper/icinga2 \
-type f \
-mtime +180 \
-name "*wsp" \
-exec rm '{}' \;

Dieser Löschvorgang verläuft kommentarlos; wenn du anschließend den ersten Aufruf erneut ausführst wirst du feststellen, dass keine Daten mehr gelistet werden. Allerdings wurden lediglich die wsp-Daten gelöscht — was zurückbleibt sind Massen leerer Ordner. Wie viele das genau sind, kannst du dir mit folgendem Aufruf listen lassen — lässt du die Pipe an wc -l weg erhälst du stattdessen die konkrete Liste der Ordner:

$ find /var/lib/graphite/whisper/icinga2 \
-type d \
-empty \
| wc -l
5896

Kein Mensch braucht Massen leerer Ordner — also werden nun auch die in die Tonne getreten.

$ find /var/lib/graphite/whisper/icinga2 \
-type d \
-empty \
-delete

Für Mutige, die ihren Skills hier voll und ganz vertrauen: lässt sich natürlich prima in Cron-Jobs verpacken.

#!/bin/bash

PROG=$( basename $0 )
WHISPER_DATA="/var/lib/graphite/whisper/icinga2"
DAYS="180"

logger "=> Starting $PROG"

SAVED_SPACE="$( find $WHISPER_DATA \
-name '*wsp' \
-mtime +$DAYS \
-exec echo -n -e {}'\0' \; \
| du -hc --files0-from=- \
| tail -n 1 \
| awk '{print $1}' )"

logger "$PROG about to delete $SAVED_SPACE..."

find $WHISPER_DATA \
-type f \
-mtime +$DAYS \
-name "*wsp" \
-exec rm '{}' \;

EMPTY_FOLDERS="$( find $WHISPER_DATA \
-type d \
-empty \
| wc -l )"

logger "$PROG about to delete $EMPTY_FOLDERS folders..."

find $WHISPER_DATA \
-type d \
-empty \
-delete

logger "$PROG ... done!"

Merge whisper files

Irgendwann kam ich mal auf die großartige Idee, Service-Checks umzubenennen; da ich die bis dahin gesammelten Performance Daten nicht verlieren wollte, musste ich mit whisper-fill und whisper-resize die Säge auspacken und mir einen Workaround schnitzen. Beim Aufräumen fand ich das zugehörige Script, und auch wenn ich es gerade nicht mehr brauche (und es ein wenig rudimentär ist), ist es zum vollständigen Verwerfen doch zu schade.

#!/bin/bash

SERVICE_OLD="$1"
SERVICE_NEW="$2"
WHISPER="/var/lib/graphite/whisper/icinga2"
LOG="/tmp/Processed_Hosts"

if [ -e $LOG ] ; then
  touch $LOG
fi

echo d > $LOG
cd $WHISPER

## Jetzt finden wir alle, die diesen alten Service haben
for h in $(dirname `find * -type d -iname $SERVICE_OLD` | cut -d "/" -f1)
do
  SOURCE="$WHISPER/$h/services/$SERVICE_OLD"
  TARGET="$WHISPER/$h/services/$SERVICE_NEW"

  cd $SOURCE
  for f in $(find * -type f -iname "*.wsp")
  do
    if [ -a $f ] ; then
      whisper-fill $f $TARGET/$f
      whisper-resize --nobackup $TARGET/$f 1min:7d 3min:30d 30min:180d 6h:2y
      chown -R _graphite: $TARGET
      echo "Processed $(basename $f) for $h..." >> $LOG
    fi
  done
  echo "==> Now deleting $SOURCE..." >> $LOG
  echo "" >> $LOG
  rm -rf $SOURCE
done

UnterschriftFalls es dir irgendwie nützlich ist: have fun! 💚

4

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.