正文
春节“嗖”的一下就过完了,在年前领导交代另一个任务,想要每天统计一下在阿里云DTS(数据同步)服务的延迟情况,于是我就要使用阿里云的api去写一个脚本,每小时运行一次,然后将这24个数字输出出来给领导过目。
阿里云dts的sdk包在这里:https://help.aliyun.com/document_detail/57694.html?spm=a2c4g.11186623.6.675.W811bN ,直接点击Python
下载即可,不过这个地址经我测试使用非国内IP 地址是打不开的,需要使用国内IP地址下载。
下载完毕之后,上传到linux服务器并解压,解压后的样子如图:
由于我们这次只是查看同步作业状态,所用的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
#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"])
整个脚本执行的效果如下:
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
但是要注意!上面这两个方法有一定的安全隐患,而且只能全是字符串可用,如果有的value
是True
、False
、Null
这样的字眼的话,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