1. 程式人生 > >調用阿裏雲api獲取阿裏雲數據同步服務(DTS)並且作圖發送郵件的整個流程

調用阿裏雲api獲取阿裏雲數據同步服務(DTS)並且作圖發送郵件的整個流程

python matplotlib 阿裏雲api

前言

在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 7ps.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)並且作圖發送郵件的整個流程