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

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