調用阿裏雲api獲取阿裏雲數據同步服務(DTS)並且作圖發送郵件的整個流程
在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(‘/tmp/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.dahuatech.com‘
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
調用阿裏雲api獲取阿裏雲數據同步服務(DTS)並且作圖發送郵件的整個流程