《打造高可用監控系統》之——Grafana Alert通過Ceph的S3兼容接口在推送webhook報警時同時渲染圖片並帶上imageUrl參數(報警推送時能有圖片一起帶出來)

背景概述

軟件版本

  • CentOS 7
  • Grafana 6.3.4(注意:後面升級了版本6.6.2,下面會詳述)
  • Ceph(版本未知,是公司的公共服務)

原始目標

將Grafana的報警推送到企業微信中

最終方案

Grafana的報警推送可以從下面這個頁面中找到官方文檔
Alerting Notifications

第一版方案希望找到Grafana的官方插件,可以將報警直接推送到企業微信的機器人中。無奈Grafana暫時沒有官方支持的版本。
所以,第二版方案:通過Grafana的WebHook功能,將數據推出去。

可以看到官方文檔中中All supported notifiers一節提到Webhook的Supports images描述爲yes, external only意思是需要通過外部存儲來存放生成的圖片

具體來看一下webhook推出去的數據(例子來源於官方文檔):

{
  "dashboardId":1,
  "evalMatches":[
    {
      "value":1,
      "metric":"Count",
      "tags":{}
    }
  ],
  "imageUrl":"https://grafana.com/assets/img/blog/mixed_styles.png",
  "message":"Notification Message",
  "orgId":1,
  "panelId":2,
  "ruleId":1,
  "ruleName":"Panel Title alert",
  "ruleUrl":"http://localhost:3000/d/hZ7BuVbWz/test-dashboard?fullscreen\u0026edit\u0026tab=alert\u0026panelId=2\u0026orgId=1",
  "state":"alerting",
  "tags":{
    "tag name":"tag value"
  },
  "title":"[Alerting] Panel Title alert"
}

可以看到,imageUrl字段是具體用於存放圖片地址的

那麼問題來了:怎麼添加外部存儲呢?
見下面一節Enable images in notifications
這一節中提到,外部存儲支持:
It currently supports Amazon S3, Webdav, Google Cloud Storage and Azure Blob Storage
Webdav太老,其他三種基本上不適合天朝網絡,那麼怎麼辦呢?
還好,Ceph有兼容S3的接口,使得我們可以曲線救國!

所以,現在的目標是:

最終目標

讓Grafana接入Ceph的S3接口,在推送時上傳圖片並帶入到鏈接中!

實現

Enable images in notifications一節中提到了2個官方文檔會對我們當前的任務有所幫助
《Image rendering》
《external_image_storage》(這個其實是配置說明中的部分)

配置

具體的配置文件看大家自己的實際部署情況,我們只講具體的配置項:
看到這一段配置

#################################### External Image Storage ##############
[external_image_storage]
# You can choose between (s3, webdav, gcs, azure_blob, local)
provider =

[external_image_storage.s3]
bucket_url =
bucket =
region =
path =
access_key =
secret_key =

嗯,那很自然,給到provider=s3的配置
由於我們要使用的是公司內部的S3接口,那必須要把公司接口的地址配置進去。可是,配置在哪兒呢?
在[external_image_storage.S3]https://grafana.com/docs/grafana/latest/installation/configuration/#endpoint)中我們看到可以通過endpoint將地址寫進去。
就像這樣

[external_image_storage]
# You can choose between (s3, webdav, gcs, azure_blob, local)
provider = s3

[external_image_storage.s3]
#用於覆蓋默認的AWS S3地址
endpoint = http://abc.def.com
bucket_url = 
#這個在配置ceph空間時會有
bucket = aabbcc
#region必須要填寫,否則會報錯!
region = default
path =
#這個在配置ceph空間時會有
access_key = aaaaaaa
#這個在配置ceph空間時會有
secret_key = bbbbbbbb

啦啦啦~配置好了,然後開心地報錯

t=2020-03-04T11:03:03+0800 lvl=eror msg="Failed to upload alert panel image." logger=alerting.notifier error="RequestError: send request failed\ncaused by: Put https://s3.default.amazonaws.com/xxx/w2ooCvnifMJUog4Yaa4C.png: dial tcp: lookup s3.default.amazonaws.com on 10.100.88.88:53: no such host"

o(╥﹏╥)o

命名我們配置了endpoint地址,爲毛會報錯呢?

省略大約8小時的調試過程~~~~

好,最後一招:升級版本!
將版本升級至Grafana6.6.2後發現,默認的配置文件中出現了endpoint的配置(注意:6.3.4版本中都沒有endpoint文本,是我自己根據文檔加上去的)

配置上去後,上傳正常了

Image rendering(圖片渲染)

上面配置完成後,推出的消息帶上了圖片地址,可是爲毛生成的圖片是這樣的?
錯誤的渲染圖片
而我們的期望圖片應該是像這樣的:
期望的圖片
所以,大家一起來看另一個文檔:
回顧一下這個文檔《Image rendering》
其中,PhantomJS一節告訴我們,從6.4版本開始PhantomJS將會被逐漸淘汰,我們要使用Grafana Image Renderer插件來進行圖片渲染。

安裝Grafana-image-renderer

根據上面官方文檔中的方法,安裝過程還是比較簡單的(但是不太順暢。。需要嘗試多次)
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑這句話純屬扯淡,大家別信↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

如何驗證renderer是否正常工作?

在任意一張圖表標題,點擊後展示下拉菜單,選擇"Share"
SharePanel
點擊下方的“Direct link rendered image”後打開跳轉頁面,就像這樣:
Rendered Image

grafana-image-renderer安裝過程與文獻

過程可謂是相當得坎坷!最開始根據官方插件頁面Installation中的安裝方法,通過grafana-cli下載(特別慢)後,各種調試會依賴報錯、超時
解決了依賴問題,讓rendering模式變成了plugin modal後,圖形構建請求也有超時問題。總之:行不通
PS:使用nodejs部署也非常非常麻煩,不推薦!

省略一大堆採坑過程直接給出解決方案:

使用Docker部署grafana-image-renderer

來到官方文檔中Image rendering一章 Run in Docker 一節,這一段給出了使用docker-compose來同時部署grafana-image-renderer和grafana的docker-compose.yml配置。其實可以單獨對grafana-image-renderer進行部署,docker-compose.yml配置如下

version: '2'
services:

# Grafana部分的配置
  grafana:
    image: index.docker.io/grafana/grafana:master
    restart: always
    ports:
    - 3000:3000
    volumes:
    # 映射到宿主機上的目錄,方便管理配置及配置文件
    - /usr/local/grafana-docker/conf:/usr/share/grafana/conf
    # 映射到宿主機上的目錄,方便管理數據文件
    - /usr/local/grafana-docker/data:/var/lib/grafana
    # 映射到宿主機上的目錄,方便管理及查看日誌
    - /usr/local/grafana-docker/log:/var/log/grafana
    environment:
    - GF_INSTALL_IMAGE_RENDERER_PLUGIN=true
    - GRAFANA_VERSION=latest

# Renderer部分配置
  renderer:
    image: index.docker.io/grafana/grafana-image-renderer:latest
    restart: always
    ports:
    - 8081:8081
    #注意:這裏配置container_name用於通過docker內部網絡讓grafana訪問到renderer容器
    container_name: renderer
    environment:
    - GF_RENDERER_PLUGIN_TZ=Asia/Shanghai
    - GF_RENDERER_PLUGIN_IGNORE_HTTPS_ERRORS=true

Docker部署grafana-image-renderer後Grafana配置

這裏需要注意:通過Docker部署後,請求的url配置不能使用localhost的方式。grafana配置如下

[rendering]
# Options to configure external image rendering server like https://github.com/grafana/grafana-image-renderer
server_url = http://renderer:8081/render/
#callback_url = {grafana的根地址}
#注意:經驗證callback_url 這項不填同樣也可以正常使用

要注意的地方

  • 在docker-compose.yml中renderer容器配置需要增加container_name配置項,用於讓Grafana能通過Docker網絡直接訪問到renderer容器(注意server_url = http://renderer:8081/render/中的hostname是renderer的container_name)
    • 注意:如果ports配置項內外網映射端口不一致,此時配置中的端口是docker內部網絡的端口
  • 如果不使用container_name走Docker內網訪問的這種方式,可以直接用宿主機的ID與端口轉發進行訪問
    • 此時配置項server_url = http://{宿主機地址}:8081/render/ (端口爲對外暴露端口)

其他配置相關注意事項

這裏請求中會用到grafana配置中[server]內的domain root_url 等配置,如果渲染還是有問題,遵循如下步驟嘗試排查:

  1. 隨便找張圖嘗試渲染
  2. 如果報錯,則查看grafana-image-renderer容器的日誌+Grafana的日誌(文件)
  3. 嘗試找到有問題的配置項,修復後重復1

總結

接ceph的S3接口的坑

  • Grafana6.3.x版本不支持自定義endpoint
    • 實踐中,升級到6.6.2版本後endpoint配置生效。
    • 如果測試時報錯,log文件中打印出的日誌會提示具體的S3連接地址,可以用於判定endpoint配置是否生效
    • 6.4.x,6.5.x未驗證。建議出現endpoint未覆蓋默認配置時升級到最新版本
  • 該種方式支持除了webhook以外的其它多種方式。具體參見官方文檔All supported notifiers一節中提到yes, external only的部分

Grafana Image Renderer部署的坑

  • 推薦使用Docker的方式部署grafana-image-renderer
    • 鏡像:grafana/grafana-image-renderer:latest
  • 使用docker部署後,server_url 不要使用localhost或127.0.0.1,應當使用ip或域名
  • callback_url 可以不配置。如果要配置,請配置Grafana的根目錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章