Grafana Backup via API

vorhergehende Artikel in: Linux TeleGrafana
10.08.2022

Ich habe mich vom Internet inspirieren lassen - ich bin ein großer Freund von Telegraf und Grafana, allerdings gibt es eine Sache, die mich stört: Dass das Tool unbedingt eine eigene Versionshistorie verwalten will und man nicht auf einfache Art und Weise Dashboards sichern und wieder einspielen kann.

Ich habe mich daher im Internet umgesehen und bin auf folgende Idee gestoßen - das Skript, das hier vorgestellt wird funktioniert natürlich nicht mehr mit der API der Version 7.0.0, die bei mir zum Einsatz kommt - aber nach dem alten Grundsatz "Fehlt Dir was? Programmiers Dir doch!" habe ich dieses Skript als Grundlage genommen und mit einigen Änderungen funktioniert jetzt bereits folgendes:

  • automatisches Herunterladen von Dashboards (auch in Foldern) als JSON
  • automatisches Herunterladen von DataSources als JSON
  • Commit in Git
Dazu muss man noch sagen, dass man ein API-Token "Administrator" benötigt, da man sonst die Datasources nicht auslesen kann. Wer einem Skript keine so weitreichenden Rechte einräumen möchte, muss auf das Backup der Datasources verzichten.

Nach langer Vorrede nun hier also das Skript:

#!/usr/bin/env bash
# shellcheck disable=SC1091,SC2154,SC2002
. ./env.sh
echo "Dashboards"
out=$(curl -s $ADDITIONAL_CURL_ARGS -H "Authorization: Bearer $token" -X GET "$grafanaurl/search?query=&starred=false&type=dash-db")
#echo "$out"
for uid in $(echo "$out" | jq -r '.[] | .uid'); do
  shortname=grafana-dashboard-$uid.json
  curl $ADDITIONAL_CURL_ARGS -H "Authorization: Bearer $token" "$grafanaurl/dashboards/uid/$uid" | jq > "$shortname"
  name="grafana-dashboard-$(cat "$shortname" |jq -r '.meta.slug')-$uid.json"
#  echo "$name"
  mv "$shortname" "$name"
  echo "DASH $uid EXPORTED as $name"
done
echo "Datasources"
datasources=$(curl -s $ADDITIONAL_CURL_ARGS -H "Authorization: Bearer $token" -X GET "$grafanaurl/datasources")
#echo "$datasources"
for uid in $(echo "$datasources" | jq -r '.[] | .id'); do
  shortname="datasource-$uid.json"
  curl -s $ADDITIONAL_CURL_ARGS -H "Authorization: Bearer $token" -X GET "$grafanaurl/datasources/$uid" | jq > "$shortname"
  name="datasource-$(cat "$shortname" |jq -r '.name')-$uid.json"
  mv "$shortname" "$name"
  echo "DATASOURCE $uid exported as $name"
done
git add .
git status
timestamp=$(date +"%Y-%m-%dT%H:%M:%S")
git commit -a -m "update $timestamp"
echo "git push nicht vergessen!"
#git push

Nachdem das Skript durchgelaufen ist - git push nicht vergessen!

Das Skript benötigt noch einige Informationen, damit es arbeiten kann. Diese werden über das sourced Skript env.sh bereitgestellt, das man nicht committen sollte und das beispielsweise so aussieht:

#API Token - für Backup von Datasources muss das ein Admin-Token sein!
export token=ADMIN_TOKEN
#Grafana API connection endpoint
export grafanaurl=https://host:port/api
#to ignore self signed certificates
export ADDITIONAL_CURL_ARGS=-k

Es existiert auch ein experimentelles Skript zum Einspielen der Backups - allerdings werden die Dashboards alle in den Ordner "General" eingespielt und man sollte hinterher auf jeden Fall prüfen, ob die Ausgabe des Skripts irgendwelche Fehler meldet. Außerdem werden Notifications und Alerts noch nicht wieder korrekt wiederhergestellt! Das Skript benötigt die entsprechend korrekt gefüllte Datei env.sh - genau wie das zum Anfertigen des Backup:

#!/usr/bin/env bash
# shellcheck disable=SC1091,SC2154,SC2002
. ./env.sh
echo "Datasources not yet supported..."

echo "Dashboards"
echo "Beware: restored dashboards reside in folder 'General'!"
regex="grafana-dashboard-.*-(.*?).json"
for file in grafana-dashboard-*-*.json ; do
    : # do something with "$file" here
    if [[ "$file" =~ $regex ]]
    then
        uid="${BASH_REMATCH[1]}"
        echo "restoring $file (UID=$uid)"
        curl -X POST $ADDITIONAL_CURL_ARGS -H "Authorization: Bearer $token" -H "Content-Type: application/json" \
        --data-binary "@$file" "$grafanaurl/dashboards/db"
    else
        echo "$file doesn't match" >&2 # this could get noisy if there are a lot of non-matching files
    fi
done

Artikel, die hierher verlinken

Grafana Backup via API II

18.02.2023

Nachdem ich bereits über erste Versuche, Backups der Grafana-Konfiguration anzufertigen berichtet habe, habe ich mich nun noch einmal darangemacht und das Projekt in eine Form gebracht, in der es vielleicht auch für andere nützlich sein könnte.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Neueste Artikel

  • Osterprojekt 2023: DNSSEC

    Das Osterprojekt dieses Jahr sollte sich mit EMail-Servern, Nameservern, DNSSEC und ACME (LetsEncrypt) beschäftigen.

    Weiterlesen...
  • BoulderDash im Docker-Zoo

    Hin und wieder kriege ich einen kleinen Retro-Flash. Dann beginne ich, nach Computerspielen aus meiner Jugendzeit zu suchen und versinke in Erinnerungen. Eines meiner ersten - wenn nicht sogar das erste - war BoulderDash. Das lernte ich auf einem Atari kennen und kurz danach auch auf einem KC 85/4.

    Weiterlesen...
  • X509 Policies

    Ich wollte schon lange einmal etwas über einen oft missverstandenen und auch ignorierten Aspekt von (x.509) PKI schreiben: Policies

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.