前言
在https://rorschachchan.github.io/2018/02/24/阿里雲獲取DTS服務延遲的腳本/ 文章裏已經寫過,領導現在要求“每天查看阿里雲dts同步的延遲情況和同步速率情況”,並且在https://rorschachchan.github.io/2018/02/27/使用matplotlib畫圖的一個腳本/ 裏面也放了一個使用python matplotlib畫圖的demo,這篇文章的目的就是把整個過程實現,並且把dts圖形以每日郵件的形式發送給領導的效果!
實現需求的思路
本次需求有四個動作,分別是獲取一天以內的DTS延遲和同步速率
、將獲取到的DTS值做成PNG圖像
、將生成的PNG圖像上傳到阿里云云存儲OSS
、把圖片展示到郵件裏併發送給相關領導
。由於第一步獲取一天以內的DTS延遲和同步速率
需要將這個腳本每小時執行一次,執行24次,纔可以執行生成png圖像
這一步,所以後三個其實可以寫成一個大腳本。不過在本文爲了表述的清楚,就把各自不同用途寫成了不同的腳本。
獲取阿里雲DTS延遲和同步速率的腳本
這個腳本這裏再拿出來曬一遍:
#!/usr/bin/env python
#coding=utf-8
#這個腳本是用來獲取dts延遲數字的
from aliyunsdkcore import client
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
import time,json,sys
sys.path.append('/解壓目錄/aliyunsdkdts/request/v20160801/') #這裏看不懂去看https://rorschachchan.github.io/2018/02/24/阿里雲獲取DTS服務延遲的腳本/
import DescribeSynchronizationJobStatusRequest
# 創建 Client 實例
clt = client.AcsClient('這裏填寫ak','這裏填寫sk','填寫對應的地域名')
# 創建 request,並設置參數
request = DescribeSynchronizationJobStatusRequest.DescribeSynchronizationJobStatusRequest()
request.set_SynchronizationJobId("這裏填寫DTS的ID號")
response = clt.do_action_with_exception(request)
delay = json.loads(response)
rate = str(delay["Performance"]["FLOW"])[0:4] #由於同步速率默認是帶單位的,這裏就取前四位
#用A.txt來存儲延遲時長
fd = open("/存儲路徑/A.txt","a")
fd.write(str(delay["DataSynchronizationStatus"]["Delay"]))
fd.write('\n')
fd.close()
#用B.txt來存儲同步速率
fr = open("/存儲路徑/rate.txt","a")
fr.write(rate)
fr.write('\n')
fr.close()
將獲取到的值做成圖片的腳本
由於腳本執行環境是無圖像的阿里雲服務器,系統是centos 7
,ps.slow
這一步會爆錯RuntimeError: could not open display
,所以只能採取把生成的PNG圖像文件保存到本地路徑裏的方法。腳本內容如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import matplotlib as mpl
mpl.use('Agg') #在無法生成圖像的環境下要添加了上面兩句話
import matplotlib.pyplot as plt
import numpy as np
import pylab as pl
x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]
#橫座標的內容
labels=['10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','1','2','3','4','5','6','7','8','9']
#y1是delay延遲時長
with open('/存儲路徑/A.txt', 'r') as f:
y1 = []
for line in f:
lst = line.split('\n') #增加一個換行符,不然數字是不換行的
y1.append(float(lst[0]))
#y2是rate同步速率
with open('/存儲路徑/B.txt', 'r') as f:
y2 = []
for line in f:
lst = line.split('\n')
y2.append(float(lst[0]))
#輸入對應的座標,後面是顏色
plot1,=pl.plot(x,y1,'r')
plot2,=pl.plot(x,y2,'b')
pl.xticks(x,labels)
pl.title('這裏寫標題',size=20)
pl.xlabel('這裏是X軸標題', size=14)
pl.ylabel('這裏寫Y軸標題', size=14)
pl.ylim(0.0,5.0)
#曲線對應註釋
pl.legend([plot1,plot2],('Delay','Sync rate'),'best',numpoints=1)
#開啓網格
pl.grid()
#圖片保存路徑
plt.savefig('/保存路徑/圖片名稱.png', format='png')
將生成的圖片上傳到阿里雲OSS的腳本
由於不想讓“領導去手動點開附件查看圖像”,所以我們乾脆把圖片作爲郵件的正文展示出來,那麼就在html裏就需要img src=圖片的網絡地址
的方法。於是就把剛剛生成的圖片上傳到阿里雲OSS裏,這樣就可以獲得圖片的網絡地址。而且阿里雲OSS是“相同文件名會覆蓋”,所以不用再去刪除。整個腳本內容如下:
# -*- coding: utf-8 -*-
import os
import shutil
import oss2
access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '這裏填寫ak')
access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '這裏填寫sk')
bucket_name = os.getenv('OSS_TEST_BUCKET', '這裏填寫bucket名稱')
endpoint = os.getenv('OSS_TEST_ENDPOINT', '這裏填寫內網end-point')
# 確認上面的參數都填寫正確了
for param in (access_key_id, access_key_secret, bucket_name, endpoint):
assert '<' not in param, '請設置參數:' + param
# 創建Bucket對象,所有Object相關的接口都可以通過Bucket對象來進行
bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name)
bucket.put_object_from_file('上傳到OSS的圖片名稱.png', '/服務器保存路徑/圖片名稱.png')
將圖片作爲內容發郵件的腳本
整個腳本內容如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os,time,re,smtplib,logging
from email.mime.text import MIMEText
from email.header import Header
def send_mail(to_list, cc_list, html, sub):
me = mail_user
msg = MIMEText(html, _subtype='html', _charset='utf-8') # 格式化郵件內容爲html,編碼爲utf-8
msg['Subject'] = sub # 郵件主題
msg['From'] = me # 發件人
msg['To'] = ";".join(to_list) # 收件人,將列表轉換爲字符串
msg['Cc'] = ";".join(cc_list) # 抄送人,將列表轉換爲字符串
try:
send_smtp = smtplib.SMTP() # 實例化
send_smtp.connect(mail_host) # 連接smtp服務器
send_smtp.login(mail_user, mail_pass) # 使用定義的賬號密碼進行登錄
send_smtp.sendmail(me, to_list+cc_list, msg.as_string()) # 發送郵件
send_smtp.close() # 關閉連接
return True
except Exception, e:
logging.basicConfig(filename='logger.log', level=logging.DEBUG)
logging.debug(e)
print ("ERROR!!!!")
return False
if __name__ == '__main__':
mail_host = '郵件服務器地址'
mail_user = '這裏填寫發件人地址'
mail_pass = '填寫對應的密碼'
mailto_list = ['收件人郵箱地址']
mailcc_list = ['抄送人1的郵箱地址','抄送人2的郵箱地址']
html = """
<body>
<br><img src="這裏填寫的是圖片的http地址"></br>
<table color="CCCC33" width="800" border="1" cellspacing="0" cellpadding="5" text-align="center">
<tr>
<td test-align="center">上圖是阿里雲深圳VPC區數據同步過去24小時的情況。<br />
注意事項 1:dts的延遲時間是5秒計算一次,api請求會取到最新的延遲時間,而控制檯是每隔20秒才刷新一次;
注意事項 2:api在延遲時間取值爲整數,即1.x顯示爲2,請知悉;
注意事項 3:此郵件是系統自動發出,如果有任何疑問請聯繫運維人員;
</tr></br>
</table>
</body> """
sub = "阿里雲深圳VPC數據同步情況"
if send_mail(mailto_list,mailcc_list,html,sub):
logging.debug("Send mail succed!")
else:
logging.debug("Send mail failed")
上面四個腳本整個執行下來,效果如下,至此大功告成!
參考資料
https://github.com/aliyun/aliyun-oss-python-sdk/blob/master/examples/object_basic.py