ZabbixAPI获取CPU信息

需求

根据工作需求,需要每天将前一天的服务器CPU的使用率的最大值通过脚本发送邮件给客户方。但是脚本是实时行为,并不能查找历史数据,所以计划从zabbix获取。有两种方式:一是通过zabbixAPI获取数据,二是从zabbix的数据库直接获取。
推荐使用zabbixAPI方式获取数据,zabbix提供API使用的官方文档。暂时安装zabbix服务版本为3.0,API文档地址

具体实现

脚本打印内容很多,因为我验证脚本是否按照我的想法在处理!
脚本思路:
获取昨日上午9点和昨日下午17点30分的时间戳:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
now = datetime.datetime.now()
print(now)
# 昨天上午9点
yesterday_start = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,microseconds=now.microsecond) - datetime.timedelta(hours=15, minutes=0, seconds=0)
print(yesterday_start)
print(type(yesterday_start))
start_timeArray = time.strptime(str(yesterday_start), "%Y-%m-%d %H:%M:%S")
start_timeStamp = int(time.mktime(start_timeArray))
print(start_timeStamp)
# 昨天下午7点30分
yesterday_end = yesterday_start + datetime.timedelta(hours=8, minutes=30, seconds=0)
print(yesterday_end)
print(type(yesterday_end))
end_timeArray = time.strptime(str(yesterday_end), "%Y-%m-%d %H:%M:%S")
end_timeStamp = int(time.mktime(end_timeArray))
print(end_timeStamp)

start_timeStamp即为昨日9点时间戳,end_timeStamp即为下午17点30分的时间戳,后面要用。
获取zabbixAPI登录的token:

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
29
30
url = "http://x.x.x.x/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
data = json.dumps(
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "xxxxxx",
"password": "xxxxxx"
},
"id": 0
})

def get_token():
# create request object
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# auth and get authid
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Auth Failed, Please Check Your Name AndPassword:",e.code
else:
response = json.loads(result.read())
result.close()
print"Auth Successful. The Auth ID Is:",response['result']
token = response['result']
print token
return token

其中url地址和用户密码已隐藏!
剩下的就是根据token登录API,根据时间、host、key、获取信息。
完整脚本如下:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/python
# coding:utf-8
#Author:Francis

import requests
import json
import urllib2
import time
import re
import requests
import datetime
import os,sys


# 获取当前时间
now = datetime.datetime.now()
print(now)
# 昨天上午9点
yesterday_start = now - datetime.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,microseconds=now.microsecond) - datetime.timedelta(hours=15, minutes=0, seconds=0)
print(yesterday_start)
print(type(yesterday_start))
start_timeArray = time.strptime(str(yesterday_start), "%Y-%m-%d %H:%M:%S")
start_timeStamp = int(time.mktime(start_timeArray))
print(start_timeStamp)
# 昨天下午7点30分
yesterday_end = yesterday_start + datetime.timedelta(hours=8, minutes=30, seconds=0)
print(yesterday_end)
print(type(yesterday_end))
end_timeArray = time.strptime(str(yesterday_end), "%Y-%m-%d %H:%M:%S")
end_timeStamp = int(time.mktime(end_timeArray))
print(end_timeStamp)


url = "http://x.x.x.x/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
data = json.dumps(
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "xxxxxx"
},
"id": 0
})

def get_token():
# create request object
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# auth and get authid
try:
result = urllib2.urlopen(request)
except URLError as e:
print "Auth Failed, Please Check Your Name AndPassword:",e.code
else:
response = json.loads(result.read())
result.close()
print"Auth Successful. The Auth ID Is:",response['result']
token = response['result']
print token
return token


def get_cpu_value_max(hostname,key):
print(hostname)
auth = get_token()
print(auth)

output1 = os.popen(''' curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"host.get","params":{"output":["hostid"],"filter": {"host":"%s"}},"auth": "%s","id": 0}' %s ''' % (hostname,auth,url))
response1 = json.loads(output1.read())
print(response1)
hostid = response1['result'][0]['hostid']
print(hostid)
output2 = os.popen(''' curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"item.get","params":{"output":"itemids","hostids":"%s","search":{"key_":"%s"}},"auth": "%s","id": 0}' %s ''' % (hostid,key,auth,url))
response2 = json.loads(output2.read())
itemid = response2['result'][0]['itemid']
print(itemid)
output3 = os.popen(''' curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"history.get","params":{"history":0,"itemids":["%s"],"time_from":"%d","time_till":"%d","output":"extend"},"auth": "%s","id": 0}' %s ''' % (itemid,start_timeStamp,end_timeStamp,auth,url))
response3 = json.loads(output3.read())
value = []
for i in response3['result']:
value_tmp = i['value']
value.append(value_tmp)
print(value)
value_float = []
for num in value:
value_float.append(float(num))
print(value_float)
print(max(value_float))


def main():
print '-'*100
get_token()
print '-'*100
get_cpu_value_max('gbj_cs01','system.cpu.load[percpu,avg1]')
print '-'*100
get_cpu_value_max('gbj_cs02','system.cpu.load[percpu,avg1]')

if __name__ == '__main__':
main()

curl命令中-i为显示返回头文件,-s为已静默方式执行,因为头文件没有需要信息,所以使用如上方式。
其中在使用zbbixAPI获取历史数据时,zabbix官方给出history.get方式,并且给出参数sortfieldsortorder支持对结果排序,但是好像不支持对数据类型为字符串排序,此脚本中没有使用,此处给出文档地址
脚本最后的结果max(value_float)服务器在昨日上午9点到下午17点30分之间CPU使用率的最大值,也就是昨日系统CPU使用率的峰值!

本文标题:ZabbixAPI获取CPU信息

文章作者:Francis

原始链接:http://www.cnops.com/posts/85977b55.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。