‘r‘) as f:y2 = []for line in f:lst = line.split(‘\n‘)y2.app

时间:2021-09-07 05:09:42

在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=http://www.mamicode.com/图片的网络地点的要领。于是就把刚刚生成的图片上传到阿里云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‘) 将图片作为内容发邮件的脚本