使用Python走阿里云API获取SLB相关监控信息,然后用在Zabbix监控上。
一、先安装需要的模块
# pip install aliyunsdkcore
# pip install aliyunsdkslb
# pip install aliyunsdkcms
二、获取SLB实例,用于Zabbix上自动发现
# /usr/bin/python
# coding:utf-8
# discovery_slb.py
import json
import sys
import time
import datetime
from aliyunsdkcore import client
from aliyunsdkslb.request.v20140515 import DescribeLoadBalancersRequest
from aliyunsdkslb.request.v20140515 import DescribeLoadBalancerAttributeRequest
Id = 'xxx'
Secret = 'xxx'
RegionId = 'cn-shenzhen'
LoadBalancersList = []
LoadBalancersDict = {}
ZabbixDataDict = {}
clt = client.AcsClient(Id, Secret, RegionId)
request = DescribeLoadBalancersRequest.DescribeLoadBalancersRequest();
request.set_accept_format('json')
response = json.loads(clt.do_action_with_exception(request), encoding='utf-8')
for i in response['LoadBalancers']['LoadBalancer']:
LoadBalancersDict["{#LOADBALANCERID}"] = i['LoadBalancerId']
LoadBalancersDict["{#LOADBALANCERVIP}"] = i['Address']
LoadBalancersList.append(LoadBalancersDict)
ZabbixDataDict['data'] = LoadBalancersList
print(ZabbixDataDict)
'''
result:
{'data': [{'{#LOADBALANCERID}': 'lb-wz9qncudq2wwlely1g3ar', '{#LOADBALANCERVIP}': '120.78.29.236'}, \
{'{#LOADBALANCERID}': 'lb-wz9qncudq2wwlely1g3ar', '{#LOADBALANCERVIP}': '120.78.29.236'}]}
'''
三、采集SLB实例上的各种监控指标数据
#!/bin/python
#coding=utf-8
# slb监控指标信息
# check_slb.py
import json
import sys
import time
import datetime
from aliyunsdkcore import client
from aliyunsdkcms.request.v20180308 import QueryMetricListRequest # 查询一段时间的
from aliyunsdkcms.request.v20180308 import QueryMetricLastRequest # 查询最新的一条记录
Id = 'xxx'
Secret = 'xxx'
RegionId = 'cn-shenzhen'
clt = client.AcsClient(Id,Secret,RegionId)
#只获取三分钟内的数据(有时值是三个有时是两个,但是我只取最后一个)
start_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()-180))
timestamp_start = int(time.mktime(time.strptime(start_time, "%Y-%m-%d %H:%M:%S")))*1000
def getMetriceData(metrice,slbid,slbip,slbport):
request = QueryMetricLastRequest.QueryMetricLastRequest()
request.set_accept_format('json')
#两个参数按照预设值设定,参见参考资料描述
request.set_Project('acs_slb_dashboard')
request.set_Metric(metrice)
request.set_StartTime(timestamp_start)
#从系统输入参数获取IP地址和SLB-ID
request.set_Dimensions({'instanceId':slbid}) #'port':slbport,'vip':slbip})
request.set_Period('60')
result = clt.do_action_with_exception(request)
datadict = json.loads(result)
res = datadict['Datapoints'] # [-2]['Average']
return json.loads(res)[0]['Average']
Type = sys.argv[1]
Slb_Id = sys.argv[2]
Slb_IP = sys.argv[3]
Slb_Port = sys.argv[4]
if (Type == 'UnhealthyServerCount'): # 后端异常实例个数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'TrafficRXNew'): # 端口每秒流入数据量 bit/s
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'TrafficTXNew'): # 端口每秒流出数据量 bit/s
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'ActiveConnection'): # 端口当前活跃连接数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'InactiveConnection'): # 端口当前非活跃连接数,既访问SLB后未断开的空闲的连接
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'MaxConnection'): # 端口当前并发连接数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'InstanceActiveConnection'): # 实例每秒活跃连接数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'InstanceDropConnection'): # 实例每秒丢失连接数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'InstanceMaxConnection'): # 实例每秒最大并发连接数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)
elif (Type == 'InstanceNewConnection'): # 实例每秒新建连接数
res = getMetriceData(Type,Slb_Id,Slb_IP,Slb_Port)
print(res)