Grafana支持將面板自動呈現為PNG圖像。這允許Grafana自動生成面板的圖像,以便將其包含在警報通知中。需要安裝grafana-image-renderer插件,安裝可以參考官網https://grafana.com/grafana/plugins/grafana-image-renderer/
docker模式運行yml

grafana: container_name: grafana depends_on: - prometheus image: grafana/grafana:7.5.7 volumes: - type: bind source: /etc/localtime target: /etc/localtime - type: volume source: grafana target: /var/lib/grafana environment: GF_SERVER_DOMAIN: 127.0.0.1 GF_RENDERING_SERVER_URL: http://127.0.0.1:8081/render GF_RENDERING_CALLBACK_URL: http://127.0.0.1:3000/ GF_LOG_FILTERS: rendering:debug ports: - "3000:3000" networks: - prom renderer: container_name: renderer image: grafana/grafana-image-renderer:latest volumes: - type: volume source: image-renderer target: /usr/src/app environment: BROWSER_TZ: Asia/Shanghai ports: - "8081:8081" networks:
然后打開grafan,選擇share,點擊 Direct link rendered image,可以看到圖片和對應的url
在呈現圖像時,PNG圖像被臨時寫入文件系統。當圖像呈現時,PNG圖像被臨時寫入Grafana數據文件夾中的PNG文件夾。
url格式如下
http://127.0.0.1:8300/render/d-solo/ZypwSrZnz/xxxx?orgId=1&from=1645077536501&to=1645099136501&panelId=30&width=1000&height=500&tz=Asia%2FShanghai
from和to也可以使用相對時間
http://127.0.0.1:8300/render/d-solo/ZypwSrZnz/xxxx?orgId=1&from=now-1h&to=now&panelId=30&width=1000&height=500&tz=Asia%2FShanghai
注意url中的tz=Asia%2FShanghai,如果未設置grafana-image-renderer也未設置時區,渲染生成的圖片可能存在市區不對的問題
grafana-image-renderer時區以及一些參數設置參考https://grafana.com/docs/grafana/latest/image-rendering/#configuration
docker啟動時可以通過設置環境變量BROWSER_TZ=Asia/Shanghai設置時區,此時url中就不需要再帶tz=Asia%2FShanghai了
grafana-image-renderer 一些參數配置文件,/usr/src/app/config.json,可以設置時區,圖片最高和最寬大小等
既然單個圖表可以生成圖片,整個dashboard也類似的方式
url格式如下:
http://127.0.0.1:8300/render/d/uid?from=now-30m&to=now&var-datasource=xxx&width=1500&height=3200
測試var-datasource也可以不要
從“d/”后面可以進行自己組裝,uid怎么獲取?在你的面板界面的鏈接中可以看到,結構基本差不多。from和to兩個數字是時間戳,后面依此是數據源、圖片的寬和高,其實也可以像圖表一樣跟上tz和timeout參數,但不跟也能正常訪問
然后就可以通過python請求下載和保存圖片,下載時需要認證,可以通過grafana生成api key,用來做認證授權

# 獲取時間戳 def get_time(): t = datetime.datetime.now() # 當前日期 t1 = t.strftime('%Y-%m-%d %H:%M:%S') # 轉為秒級時間戳 ts1 = time.mktime(time.strptime(t1, '%Y-%m-%d %H:%M:%S')) # 轉為毫秒級 end_time = int(str(ts1 * 1000).split(".")[0]) # 1小時前 t2 = (t - datetime.timedelta(hours=1)).strftime("%Y-%m-%d %H:%M:%S") # 轉為秒級時間戳 ts2 = time.mktime(time.strptime(t2, '%Y-%m-%d %H:%M:%S')) # 轉為毫秒級 start_time = int(str(ts2 * 1000).split(".")[0]) return str(start_time), str(end_time) # 下載pic def download_pic(): grafana_server = "xxxxx" url = (grafana_server + '/render/d-solo/xxx' + '?orgId=1&from=' + get_time()[0] + '&to=' + get_time()[1] + "&panelId=30&width=1000&height=500&tz=Asia%2FShanghai" ) print(url) header = {"Content-Type": "application/json","Authorization": "Bearer xxxx"} # 用管理員去Grafana生成API Key res = requests.get(url,headers=header) time_now = int(time.time()) time_local = time.localtime(time_now) dt = time.strftime("%Y-%m-%d",time_local) img_name = "img"+dt+".jpg" filename = img_name with open(filename, "wb") as f: f.write(res.content) return filename download_pic()