grafana dashboard 批量导出备份 Grafana

sanyan555 4月前 509

昨天因为手误使用tar命令将很久之前的备份文件覆盖了真实配置(/var/lib/grafana),花了一天时间重做了所有的dashboards,一把辛酸泪;

今天整理了下grafana的备份方法。

grafana提供单个dashboard的导出另存为json,但是批量导出也不方便;

如果没有在配置文件中特殊指定,备份/var/lib/grafana文件夹就可以,但为了防止昨天惨痛经历,还是另外再多做一份dashboards的备份吧。

网上很多支持grafana导入导出的小工具/脚本,此处采用 https://gist.github.com/crisidev/bd52bdcc7f029be2f295


1.grafana中获取api key

menu--configuration--api keys -- add API key,记录下key

2.脚本中使用到 jq tr命令,需要提前安装

3.脚本使用 sh grafana_db_bak.sh $host $key

grafana_db_bak.sh

#/bin/bash
#
# add the "-x" option to the shebang line if you want a more verbose output
#
# set some colors for status OK, FAIL and titles
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" # purple
 
# usage log "string to log" "color option"
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() {
   # Check if hostname and key are provided
   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=$(echo $HOST | awk -F[/:] '{print $4}')
 
   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 ---------------------------------"


备份结果

至此,再也不用怕dashboard被改掉了


最新回复 (1)
  • lizzano 2月前
    0 引用 2
    有两个可以优化的点:
    1. 运行脚本传入的host是需要带http协议的
    2. 脚本86行,在获取dashboard title时,macOS下的sed是不支持-r参数的,可以加个uname判断下系统

    总的来说还是一个很好的工具,感谢分享!
    • 运维开源项目互助社区—致敬开源
      3
        立即登录 立即注册 
返回