网上很多支持grafana导入导出的小工具/脚本,此处采用 https://gist.github.com/crisidev/bd52bdcc7f029be2f295
一般定时备份/var/lib/grafana文件夹就可以
1.grafana中获取api key
2.脚本中使用到 jq tr
命令,需要提前安装
3.脚本使用 sh grafana_db_bak.sh $host $key
脚本调api
导出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
SETCOLOR_SUCCESS="echo -en \\033[0;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_NORMAL="echo -en \\033[0;39m" SETCOLOR_TITLE_PURPLE="echo -en \\033[0;35m"
function log_success() { if [ $# -lt 1 ]; then ${SETCOLOR_FAILURE} echo "Not enough arguments for log function! Expecting 1 argument got $#" exit 1 fi timestamp=$(date "+%Y-%m-%d %H:%M:%S %Z") ${SETCOLOR_SUCCESS} printf "[${timestamp}] $1\n" ${SETCOLOR_NORMAL} } function log_failure() { if [ $# -lt 1 ]; then ${SETCOLOR_FAILURE} echo "Not enough arguments for log function! Expecting 1 argument got $#" exit 1 fi timestamp=$(date "+%Y-%m-%d %H:%M:%S %Z") ${SETCOLOR_FAILURE} printf "[${timestamp}] $1\n" ${SETCOLOR_NORMAL} } function log_title() { if [ $# -lt 1 ]; then ${SETCOLOR_FAILURE} log_failure "Not enough arguments for log function! Expecting 1 argument got $#" exit 1 fi ${SETCOLOR_TITLE_PURPLE} printf "|-------------------------------------------------------------------------|\n" printf "|$1|\n"; printf "|-------------------------------------------------------------------------|\n" ${SETCOLOR_NORMAL} } function init() { if [ $1 -lt 2 ]; then ${SETCOLOR_FAILURE} log_failure "Not enough command line arguments! Expecting two: \$HOSTNAME and \$KEY. Recieved only $1." exit 1 fi DASH_DIR="/grafana_bak" if [ ! -d "${DASH_DIR}" ]; then mkdir "${DASH_DIR}" else log_title "----------------- A $DASH_DIR directory already exists! -----------------" fi } HOST=$1 KEY=$2 init $# $HOST $KEY counter=0 for dashboard_uid in $(curl -sS -H "Authorization: Bearer $KEY" $HOST/api/search\?query\=\& | jq -r '.[] | select( .type | contains("dash-db")) | .uid'); do counter=$((counter + 1)) url=`echo $HOST/api/dashboards/uid/$dashboard_uid | tr -d '\r'` dashboard_json=$(curl -sS -H "Authorization: Bearer $KEY" $url) dashboard_title=$(echo $dashboard_json | jq -r '.dashboard | .title' | sed -r 's/[ \/]+/_/g' ) dashboard_version=$(echo $dashboard_json | jq -r '.dashboard | .version') folder_title=$(echo $dashboard_json | jq -r '.meta | .folderTitle') mkdir -p "$DASH_DIR/$folder_title" echo $dashboard_json > "$DASH_DIR/$folder_title/${dashboard_title}_v${dashboard_version}.json" log_success "Dashboard has been saved\t\t title=\"${dashboard_title}\", uid=\"${dashboard_uid}\", path=\"${DASH_DIR}/$folder_title/${dashboard_title}_v${dashboard_version}.json\"." done log_title "${counter} dashboards were saved"; log_title "------------------------------ FINISHED ---------------------------------"
|
导入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| #!/bin/bash
OPTSPEC=":hp:t:k:" show_help() { cat << EOF Usage: $0 [-p PATH] [-t TARGET_HOST] [-k API_KEY] Script to import dashboards into Grafana -p Required. Root path containing JSON exports of the dashboards you want imported. -t Required. The full URL of the target host -k Required. The API key to use on the target host -h Display this help and exit. EOF }
while getopts "$OPTSPEC" optchar; do case "$optchar" in h) show_help exit ;; p) DASH_DIR="$OPTARG";; t) HOST="$OPTARG";; k) KEY="$OPTARG";; \?) echo "Invalid option: -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument." >&2 exit 1 ;; esac done if [ -z "$DASH_DIR" ] || [ -z "$HOST" ] || [ -z "$KEY" ]; then show_help exit 1 fi
SETCOLOR_SUCCESS="echo -en \\033[0;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" SETCOLOR_NORMAL="echo -en \\033[0;39m" SETCOLOR_TITLE_PURPLE="echo -en \\033[0;35m"
function log_success() { if [ $# -lt 1 ]; then ${SETCOLOR_FAILURE} echo "Not enough arguments for log function! Expecting 1 argument got $#" exit 1 fi timestamp=$(date "+%Y-%m-%d %H:%M:%S %Z") ${SETCOLOR_SUCCESS} printf "[%s] $1\n" "$timestamp" ${SETCOLOR_NORMAL} } function log_failure() { if [ $# -lt 1 ]; then ${SETCOLOR_FAILURE} echo "Not enough arguments for log function! Expecting 1 argument got $#" exit 1 fi timestamp=$(date "+%Y-%m-%d %H:%M:%S %Z") ${SETCOLOR_FAILURE} printf "[%s] $1\n" "$timestamp" ${SETCOLOR_NORMAL} } function log_title() { if [ $# -lt 1 ]; then ${SETCOLOR_FAILURE} log_failure "Not enough arguments for log function! Expecting 1 argument got $#" exit 1 fi ${SETCOLOR_TITLE_PURPLE} printf "|-------------------------------------------------------------------------|\n" printf "|%s|\n" "$1"; printf "|-------------------------------------------------------------------------|\n" ${SETCOLOR_NORMAL} } if [ -d "$DASH_DIR" ]; then DASH_LIST=$(find "$DASH_DIR" -mindepth 1 -name \*.json) if [ -z "$DASH_LIST" ]; then log_title "----------------- $DASH_DIR contains no JSON files! -----------------" log_failure "Directory $DASH_DIR does not appear to contain any JSON files for import. Check your path and try again." exit 1 else FILESTOTAL=$(echo "$DASH_LIST" | wc -l) log_title "----------------- Starting import of $FILESTOTAL dashboards -----------------" fi else log_title "----------------- $DASH_DIR directory not found! -----------------" log_failure "Directory $DASH_DIR does not exist. Check your path and try again." exit 1 fi NUMSUCCESS=0 NUMFAILURE=0 COUNTER=0 for DASH_FILE in $DASH_LIST; do COUNTER=$((COUNTER + 1)) echo "Import $COUNTER/$FILESTOTAL: $DASH_FILE..." RESULT=$(cat "$DASH_FILE" | jq '. * {overwrite: true, dashboard: {id: null}}' | curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $KEY" "$HOST"/api/dashboards/db -d @-) if [[ "$RESULT" == *"success"* ]]; then log_success "$RESULT" NUMSUCCESS=$((NUMSUCCESS + 1)) else log_failure "$RESULT" NUMFAILURE=$((NUMFAILURE + 1)) fi done log_title "Import complete. $NUMSUCCESS dashboards were successfully imported. $NUMFAILURE dashboard imports failed."; log_title "------------------------------ FINISHED ---------------------------------";
|
1
| ./grafana_db_import.sh -t <grafana_ip> -k <api_key> -p <backup folder>
|
缺点
不能备份其他的配置(例如,数据源、用户、秘钥等),而且没有将 Dashboard 和目录对应起来,即不支持备份 Folder
。
高级方案
https://github.com/ysde/grafana-backup-tool
https://fuckcloudnative.io/posts/how-to-back-up-all-of-your-grafana-dashboards/
待写。。。