《打造高可用监控系统》之——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的根目录
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术流奶爸奶爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值