Grafana将监控信息渲染成图片并且邮件发送的过程
背景
去年12月份时自己创建了一套Grafana监控
可以监控redis,hikari,启动时间,补丁更新时间等等事项.
但是因为后续的事情比较多, 一直有一点荒废了.
最近折腾阿里云, 让阿里云给自己发了一个简单的大屏展示.
突然想其实自己也可以做到, 不用非得通过阿里云的设置.
然后就花了一点时间来进行处理.
提高工作效率,也算是对自己之前工作投入的一个总结和回顾.
原理
Grafana 通过 render 的方式将监控结果渲染成图片.
然后通过python将图片发送到指定邮箱.
第一步Grafana的渲染-安装插件
注意这里需要安装grafana的插件
grafana-cli plugins install grafana-image-renderer
需要注意,这个命令默认是安装到 /var/lib/grafana 目录中的.
我这边是离线安装的. 所以需要将目录放到
/grafana/plugins-bundled 目录中区
然后就可以看到 已安装组件中有了render的插件.
第二步创建api-key
需要说明, 我这边的版本是Grafana10 的版本
中文版的情况下创建api-key感觉与网上不一致.
首页-管理-服务账户
创建服务账户
然后创建tokens 记录就可以了.
注意token 只会展示一次, 需要牢记.
第三步获取渲染页面
在某个需要发送邮件的页面点击 右上角的 三个点 打开设置界面
点击分享->
分享最下面有一个 直接连接至渲染后的图像
就会展示出来一个界面:
https://grafana.myapp.online/render/d-solo/ecc353a4-e59f-411a-bef5-5119073da22f/5Lqn5ZOB5ZCv5Yqo5pe26Ze05bGV56S6?
orgId=1&from=1710462091996&to=1710483691996&panelId=2&width=1000&height=500&tz=Asia%2FShanghai
需要注意 from to 的部分: &from=1710462091996&to=1710483691996
是指定时间的
如果想自动渲染, 建议去掉这一部分的时间 比如之后的为:
https://grafana.myapp.online/render/d-solo/ecc353a4-e59f-411a-bef5-5119073da22f/5Lqn5ZOB5ZCv5Yqo5pe26Ze05bGV56S6?
orgId=1&panelId=2&width=1000&height=1500&tz=Asia%2FShanghai
需要注意 &width=1000&height=1500 可以根据需要进行修改.
第四步 python的方式命令行方式获取图片
直接仿照网上的资料进行处理.
import urllib.request
def download_img(img_url, api_token):
header = {"Authorization": "Bearer " + api_token}
request = urllib.request.Request(img_url, headers=header)
try:
response = urllib.request.urlopen(request)
img_name = "summary.png"
filename = "/grafana/images/"+ img_name
if (response.getcode() == 200):
with open(filename, "wb") as f:
f.write(response.read())
return filename
except:
return "failed"
if __name__ == '__main__':
img_url = "$步骤三种的url"
api_token = "glsa_hefKCHeCihkirNQSA4VXp39jPADsqXbh_4e8f3a4f"
download_img(img_url, api_token)
第五步 发送邮件
继续仿照网上的资料进行处理
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.utils import parseaddr, formataddr
sender = '[email protected]'
to_address = ['[email protected]', '[email protected]']
cc_reciver = ['[email protected]', '[email protected]']
reciver = to_address + cc_reciver
smtpserver = "mail.qq.com:30"
username = '[email protected]'
password = 'yourpassword'
msgRoot = MIMEMultipart('related')
msgRoot['Subject'] = '自动化应用服务器监控日报-应用判活'
msgRoot['From'] = sender
msgRoot['To'] = ",".join( to_address ) # 发给多人
msgRoot['Cc'] = ";".join(cc_reciver) # 抄送人
# 以下为邮件正文内容,含有一个居中的标题和一张图片
content = MIMEText('<html><head><style>#string{text-align:center;font-size:25px;}</style><div id="string">自动化环境运行情况:<div></head><body><img src="cid:image1" alt="image1"></body></html>','html','utf-8')
content = content.decode('utf-8').encode('gbk')
msgRoot.attach(content)
fp = open('/grafana/images/summary.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', 'image1') # 这个id用于上面html获取图片
msgRoot.attach(msgImage)
# 连接邮件服务器,因为使用SMTP授权码的方式登录,必须是465端口
# 如果是SSL需要用 ssl 如果不是 SMTP就可以了.
# smtp = smtplib.SMTP_SSL('mail.qq.com:465')
smtp = smtplib.SMTP('mail.qq.com:30')
smtp.login(username, password)
smtp.sendmail(sender, reciver, msgRoot.as_string())
smtp.quit()
第六步 计划任务
cd /grafana/images
python3 getimage
sleep 5
python3 sendemail
保存为 auto shell 脚本:
计划任务
crontab -e
59 22 * * * /grafana/images/auto
每天晚上自动报告情况