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

  • CI/CD mit shellcheck

    13.10.2019

    Ich habe mich entschlossen, in meinen diversen Shell-Projekten shellcheck als Mittel zur Qualitätssicherung einzusetzen.

    Weiterlesen...

Neueste Artikel

  • Linux-System SBOM visualisiert als Graph

    In meinem $dayjob kam neulich die Frage auf, ob es möglich wäre, die aktuelle Softwareinstallation eines Linux-Systems als Software Bill of Materials (SBOM) zu exportieren.

    Weiterlesen...
  • Visualisierung von Datenmodellen als gerichtete Graphen

    Ich habe - motiviert durch meine Experimente zur Visualisierung von Paketabhängigkeiten in Linux-Installationen als interaktive Graphen - versucht, relationale Datenmodelle in ähnlicher Form zu visualisieren und dazu zwei Plugins für die sQLshell geschrieben.

    Weiterlesen...
  • Carl Sagan - Christmas Lectures at the Royal Institution

    Die Royal Institution hat in ihren Schätzen gegraben und die Christmas Lectures von Carl Sagan auf Youtube nochmals veröffentlicht. Meiner Ansicht nach unbedingt lohnenswert für alle, die Englisch verstehen!

    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.