目录
背景概述
软件版本
- 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"
点击下方的“Direct link 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 等配置,如果渲染还是有问题,遵循如下步骤尝试排查:
- 随便找张图尝试渲染
- 如果报错,则查看grafana-image-renderer容器的日志+Grafana的日志(文件)
- 尝试找到有问题的配置项,修复后重复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的根目录