Grafana将监控信息渲染成图片并且邮件发送的过程

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

每天晚上自动报告情况

第七步 效果

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章