阿里云获取DTS服务延迟值的脚本

正文

春节“嗖”的一下就过完了,在年前领导交代另一个任务,想要每天统计一下在阿里云DTS(数据同步)服务的延迟情况,于是我就要使用阿里云的api去写一个脚本,每小时运行一次,然后将这24个数字输出出来给领导过目。

阿里云dts的sdk包在这里:https://help.aliyun.com/document_detail/57694.html?spm=a2c4g.11186623.6.675.W811bN ,直接点击Python下载即可,不过这个地址经我测试使用非国内IP 地址是打不开的,需要使用国内IP地址下载。

下载完毕之后,上传到linux服务器并解压,解压后的样子如图:
paradin

由于我们这次只是查看同步作业状态,所用的py就是DescribeSynchronizationJobStatusRequest.py,现在我们就可以写脚本,假设这个脚本叫getDTS.py,那么整个内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python
#coding=utf-8
#auther:ChrisChan@2018-2-24
#这个脚本是用来获取DTS服务的延迟值
from aliyunsdkcore import client
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
import json
import sys #由于这个包不是通过pip install的方式安装,要调用其它路径的python脚本就要使用sys方法
sys.path.append('sdk压缩包的绝对路径')
import DescribeSynchronizationJobStatusRequest

# 创建Client实例
clt = client.AcsClient('阿里云AK','阿里云SK','所属地域')

# 创建request并设置参数
request = DescribeSynchronizationJobStatusRequest.DescribeSynchronizationJobStatusRequest()
request.set_accept_format('json')

# 写上对应的服务ID
request.set_SynchronizationJobId("这里写上DTS的ID")

response = clt.do_action_with_exception(request)
print response
delay = json.loads(response)
print "===================================================="
print "当前延迟是:" + str(delay["DataSynchronizationStatus"]["Delay"])
print "当前同步速度是:" + str(delay["Performance"]["FLOW"])

整个脚本执行的效果如下:
paradin

dts的延迟时间是5秒计算一次,API请求会取到最新的延迟时间,控制台是每隔20秒才刷新一次。

补充

getDTS.py这个脚本获取到的response是一个str字符串,这里我使用json.loads来将其转化成了dict模式。但是除了这个方法还有两个方法:

1
2
3
4
5
6
7
8
9
10
11
12
>>> user
"{'name' : 'jim', 'sex' : 'male', 'age': 18}"
>>> b=eval(user)
>>> b
{'age': 18, 'name': 'jim', 'sex': 'male'}
>>> print b['sex']
male
>>> exec("c="+user)
>>> c
{'age': 18, 'name': 'jim', 'sex': 'male'}
>>> print c['name']
jim

但是要注意!上面这两个方法有一定的安全隐患,而且只能全是字符串可用,如果有的valueTrueFalseNull这样的字眼的话,eval是不支持的,所以没法正确转换,就会爆这样的错:NameError: name 'True' is not defined

参考资料

https://help.aliyun.com/document_detail/49453.html?spm=a2c4g.11186623.6.667.sRyVqY
https://segmentfault.com/q/1010000000174694
https://www.crifan.com/resolved_in_python_using_eval_to_force_variable_to_convert_a_string_to_a_dictionary_when_the_error_nameerror_name_39null39_is_not_defined/
https://segmentfault.com/q/1010000000345915
paradin

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------