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


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    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.