grafana自動截圖


    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:
View Code

 

然后打開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()
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM