Grafana-reporter定时报表

未使用: 因为有的dashboard是中文的,所以这个对中文不支持,有解决办法的可以给我留言

场景:

前端组想要看这个dashboard每周发送给他邮箱

这是一个常见的需求,但是目前Grafana没有直接支持,所以我就查了一下,有一个grafana-reporter可以实现这个需求,因为参考的文档比较杂,所以我就在这里简单的记录一下

方案:Grafana-reporter

首先有一个开源工具叫Grafana reporter。他的做法是另起一个服务,然后利用Grafana的一个功能:Links.

在Grafana的Dashboard界面,点击设置按钮可以看到左边的标签中有一个“Links”,该功能可以给当前面板上加一些按钮,来调用某些链接(Link)。所以这个工具的做法是另外运行一个HTTP服务,然后在Grafana的面板中添加这个链接,点击后可以生成当前面板的PDF文件,当然也可以下载该PDF文件。

那么利用这个工具,你就可以自行访问该链接,拼装Dashboard的uid进去,得到该面板的PDF文件,通过脚本下载下来后再发邮件就行了。

这个方法的麻烦之处在于需要另外跑一个服务来提供PDF生成能力,而且PDF也不太好直接放在邮件正文里展现,更适合作为附件存在。

1.安装Grafana-reporter

github地址:https://github.com/IzakMarais/reporter

1.1 docker安装

需注意时区问题,默认生成的报表为UTC时区,推荐使用修改时区后镜像或挂载时区文件

docker run --name grafana-reporter --rm -v /etc/localtime:/etc/localtime -p 8686:8686 --net="host" izakmarais/grafana-reporter

2.匿名模式

2.1 Grafana开启匿名模式

vim /etc/grafana/grafana.ini
[auth.anonymous]
# enable anonymous access
enabled = true  

# specify organization name that should be used for unauthenticated users
;org_name = Main Org.

# specify role for unauthenticated users
org_role = Viewer

2.2 检查匿名登陆

Signout

输入grafana地址

2.3 配置dashboard links

在这里插入图片描述

url: http://10.90.227.77:8686/api/v5/report/$uid

面板uid就是grafana进入到该dashboard页面时,网址中的值如图

在这里插入图片描述

d/$uid

举例:我的网址是:http://10.90.227.77:3000/d/ZNfv6Z6Gk/test?fullscreen&panelId=2

那我的url就是:http://10.90.227.77:8686/api/v5/report/ZNfv6Z6Gk

2.4 点击生成pdf

在这里插入图片描述

在这里插入图片描述

2.5 不支持中文

如果这个dashboard的名字是中文的就会出现如下报错

在这里插入图片描述

在这里插入图片描述

3.API token模式

有的公司不支持匿名访问;所以通过 api进行访问:

参考这个:https://blog.csdn.net/weixin_42963678/article/details/114131640

关闭匿名登陆后点击后 有报错
在这里插入图片描述

3.1 配置API KEY

在这里插入图片描述

在这里插入图片描述

弹出来的key,拷贝到其他地方保存,因为关闭之后就没有这个了

在这里插入图片描述

eyJrIjoibFdvb3R3ZDBhNzlYVG44Nkg0U05wQUpKUE91VFJvOWYiLCJuIjoidGVzdCIsImlkIjoxfQ==

3.2 配置url

得到了key之后,返回编辑link的url

将 http://10.90.227.77:8686/api/v5/report/ZNfv6Z6Gk

改成http://10.90.227.77:8686/api/v5/report/ZNfv6Z6Gk?apitoken=eyJrIjoibFdvb3R3ZDBhNzlYVG44Nkg0U05wQUpKUE91VFJvOWYiLCJuIjoidGVzdCIsImlkIjoxfQ==

3.3 注意版本

这里遇到个问题,因为不同版本的关系,有些版本使用 ?apitoken== ,但是我用的Grafana v7.4.3 (010f20c1c8),应该使用 ?apitoken= ,就是一个=的差别,写错了会报无效key,Got Status 401 Unauthorized, message: {“message”:“invalid API key”} ,这种情况检查一下自己复制key有没有复制对,中英文符号有没有误

还有一个问题,我尝试多次新增key,有些key的值末尾是有 == ,有些key的值是没有 == 的,所以只要复制完全,不需要额外给没有 == 的key添加 ==

在这里插入图片描述

4.发送邮件

参考:https://blog.csdn.net/why_still_confused/article/details/89075244

4.1 配置邮箱

以163邮箱为例

cat >>/etc/mail.rc<<"EOF"
set from=yxxx@163.com
set smtp=smtp.163.com:25
set smtp-auth-user=yxxx@163.com  
set smtp-auth-password="ZLNLFBNUOJYLCVHM"  #客户端授权码
set ssl-verify=ignore    #不使用ssl
set nss-config-dir=/etc/pki/nssdb
EOF

4.2 下载pdf

wget -O test.pdf http://10.90.227.77:8686/api/v5/report/ZNfv6Z6Gk?apitoken=eyJrIjoibFdvb3R3ZDBhNzlYVG44Nkg0U05wQUpKUE91VFJvOWYiLCJuIjoidGVzdCIsImlkIjoxfQ==&from=now-5m&to=now

4.3 发送邮件

echo "a" | mail -s "Grafana监控日报"-`date +%Y-%m-%d` -a test.pdf ylmcr7@163.com

在这里插入图片描述

4.4 定时任务脚本

增加对应的dashboard报告可依照格式添加,并在mail命令中使用-a参数添加附件

cat >reporter.sh<<"EOF"
#/bin/bash
#auuthor:ricardo
#shell for creating grafana dashboard report
filepath=/media/raid10/grafana/report/
date=$(date +%Y-%m-%d)

# dashboard report name
filename_es_general=Elasticsearch-Nginx-generalapi.linghit.com-${date}.pdf
filename_spring=SpringBoot-Statistics-${date}.pdf
filename_es_api=Elasticsearch-Nginx-api.linghit.com-${date}.pdf

# download grafana dashboard report
wget -O ${filepath}${filename_es_general} http://172.16.7.5:8686/api/v5/report/8oPnVDCmz?from=now-24h&to=now&var-host=test.qq.com
wget -O ${filepath}${filename_spring} http://172.16.7.5:8686/api/v5/report/wAu8Swerd?from=now-24h&to=now
wget -O ${filepath}${filename_es_api} http://172.16.7.5:8686/api/v5/report/8oPnVDCmz?from=now-24h&to=now&var-host=test.qq.com

sleep 30s

# send email
mail -v \
-a ${filepath}${filename_es_general} -a ${filepath}${filename_spring} -a ${filepath}${filename_es_api} \
-s "Grafana监控日报"-`date +%Y-%m-%d` \
-c "test@qq.com" test@qq.com < /media/raid10/grafana/content.txt
EOF

版权声明:本文为weixin_46380571原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。