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 Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Multi-User-WebDAV, Docker, GitHub

    17.11.2019

    Nachdem ich mich in letzter Zeit verstärkt mit Docker und dem zugehörigen Ökosystem beschäftige, habe ich begonnen, verschiedenste Dienste in Containern zu testen um zu sehen, ob in manchen Fällen LXC oder KVM nicht doch die bessere Wahl wäre...

    Weiterlesen...

Neueste Artikel

  • Migration der Webseite und aller OpenSource Projekte

    In eigener Sache...

    Weiterlesen...
  • AutoHideToolbar für Java Swing

    Ich habe eine neue Java Swing Komponente erstellt: Es handelt sich um einen Wrapper für von JToolBar abgeleitete Klassen, die die Werkzeugleiste minimieren und sie nur dann einblenden, wenn der Mauszeiger über ihnen schwebt.

    Weiterlesen...
  • Integration von EBMap4D in die sQLshell

    Ich habe bereits in einem früheren Artikel über meine ersten Erfolge berichtet, der sQLshell auf Basis des bestehenden Codes aus dem Projekt EBMap4D eine bessere Integration für Geo-Daten zu spendieren und entsprechende Abfragen, bzw. deren Ergebnisse auf einer Kartenansicht zu visualisieren.

    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, muss 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 Codeberg-Repositories findet man hier.