基于Python调用zabbix监控的API接口详解,将数据展现到前台过程、思路分析
这是zabbix的官网,文档内容非常丰富,建议有需要的,可以多花点时间看一下官方的文档。下面这是部署在我的虚拟机下的zabbix监控上图中报红色的zabbix是因为那两个虚拟机我没有打开,只打开了zabbix-master我们可以看到我使用了linux server这个模板,有51个监控项,以及触发器和图形。我做的运维平台的监控原理大致是这样一个过程:首先,zabbix部署了一...
这是zabbix的官网,文档内容非常丰富,建议有需要的,可以多花点时间看一下官方的文档。
下面这是部署在我的虚拟机下的zabbix监控
上图中报红色的zabbix是因为那两个虚拟机我没有打开,只打开了zabbix-master
我们可以看到我使用了linux server这个模板,有51个监控项,以及触发器和图形。
我做的运维平台的监控原理大致是这样一个过程:
- 首先,zabbix部署了一个名为Linux Server的主机组,该主机组下面部署了3台linux主机,每台linux主机下面各设置了大约50各监控项。
- 我在后端调用zabbix的API接口,由主机组---------> 主机---------> 监控项---------> 获取数据,最后将获取的数据返回到前台。
- 后端获取的数据,在后端使用dataHandle(),去搜集数据(这里是json格式的),并且存为一个字典,然后在去遍历,并返回给前台。
举个例子:获取网络流量流出数据
1,首先定义一个接口方法:
def getNetOutDataTraffic(*args, **b):
'''
网络流出数据
'''
NetOutDataTraffic_data = json.dumps({
"jsonrpc": "2.0",
"method": "history.get",
"params": {
"output": "extend",
# "itemids": b["parameter"],
"itemids": 28461, # net.if.out[eno16777736] 网卡out数据
"history": 3, #这里有5个可选参数分别是0,1,2,3,4,默认是3,下面会介绍每个参数的意义
"limit": 16
},
"auth": b["session"],
"id": 2
})
return NetOutDataTraffic_data
########################################################################
或者也可以单独去获取某个监控主机组下的单个主机的某个单独的监控项:
比如说:
def getfsused(*args, **b):
'''
获取磁盘使用量
'''
disk_data = json.dumps({
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"hostids": b["parameter"],
"search": {
"key_": "vfs.fs.size[/,used]" # 只查询key_包含“vfs.fs.size[/,used]”字段的item
# "key_": "vfs.fs.size[/,free]"
}
},
"auth": b["session"],
"id": 2
})
return disk_data
上面定义的方法,可以看出是获取eno16777736网卡,这个流出16条历史数据,也可以价格desc参数,进行排序,也可以基于一个时间段进行排序,也可以根据sortfield某个字段进行排序,等等。下面会进行详细解释。这是官网API文档。非常详细。
2,使用dataHandle(),去搜集通过API获取的数据,并且进行遍历,
'''获取网络流量流出数据'''
netOutDataTraffic_dict = dataHandle(func=getNetOutDataTraffic, hostid=hostid)
进行遍历获取到的16条历史数据:
netOutdatalist = [] #首先定义一个空列表进行存value这个多条数据
for i in netOutDataTraffic_dict: # 然后进行遍历
netOutdatalist.append(i['value'])
netOutDataTraffic_now = netOutdatalist
# netInDataTraffic_now # 网络流量流入历史数据 net.if.in[eno16777736]
3,将遍历的结果返回给前台,用 **render()**进行渲染。
"netOutDatatraffic_now": netOutDataTraffic_now, # 网络流量流出数据
前台只需要使用Django的tag,就可以捕获到后台传来的数据。
整个核心代码:
@login_required
def getMonitor(request):
"""
获取zabbix监控的主机列表
"""
monitorform = monitorForm()
zabbix_host_info = dataHandle(func=getZabbixHost)
monitor_hostnames = []
cpuutils_now = ''
cpuload_now = ''
fsused_now = ''
fsfree_now = ''
fshomefree_now = ''
fshomeused_now = ''
fsbootfree_now = ''
fsbootused_now = ''
fsmemsize_now = ''
fsCpuUserHistory_now = ''
fsCpuUserHistory_now_x = ''
fsCpuSysHistory_now = ''
netInDataTraffic_now = ''
netInDataTraffic_now_x = ''
netOutDataTraffic_now = ''
for i in zabbix_host_info:
monitor_hostid = i['hostid']
monitor_hostname = i['host']
monitor_hostnames = monitor_hostnames + [(monitor_hostid, monitor_hostname)]
host_num = len(monitor_hostnames)
monitorform.fields['monitorHost'].choices = monitor_hostnames
'''获取提交的主机ID'''
try:
if request.method == "POST":
if "monitorHost" in request.POST: # name为monitorHost的表单提交
hostid = request.POST.get('monitorHost', '')
else:
hostid = 10084
else:
hostid = 10084
'''获取提交主机的itemids'''
itemids = dataHandle(func=getZabbixitem,hostid=hostid)
'''获取CPU使用率'''
cpuutils_dict = dataHandle(func=getZabbixCPUutil, hostid=hostid)
'''获取CPU负载'''
cpuload_dict = dataHandle(func=getZabbixCPUload, hostid=hostid)
'''获取硬盘使用量'''
fsused_dict = dataHandle(func=getfsused, hostid=hostid)
'''获取硬盘空闲'''
fsfree_dict = dataHandle(func=getfsfree, hostid=hostid)
'''获取home目录free空间'''
fshomefree_dict = dataHandle(func=getfshomefree, hostid=hostid)
'''获取home目录used空间'''
fshomeused_dict = dataHandle(func=getfshomeused, hostid=hostid)
'''获取boot目录free空间'''
fsbootfree_dict = dataHandle(func=getfsbootfree, hostid=hostid)
'''获取boot目录used空间'''
fsbootused_dict = dataHandle(func=getfsbootused, hostid=hostid)
'''获取memory的大小'''
fsmemsize_dict = dataHandle(func=getmemsize, hostid=hostid)
'''获取用户空间使用CPU比例历史数据'''
fsCpuUserHistory_dict = dataHandle(func=getCpuUserHistory, hostid=hostid)
'''获取内核空间使用CPU比例的历史数据'''
fsCpuSysHistory_dict = dataHandle(func=getCpuSysHistory, hostid=hostid)
'''获取网络流量流ru数据'''
netInDataTraffic_dict = dataHandle(func=getNetInDataTraffic, hostid=hostid)
'''获取网络流量流出数据'''
netOutDataTraffic_dict = dataHandle(func=getNetOutDataTraffic, hostid=hostid)
for i in cpuutils_dict:
cpuutils_now = i['prevvalue'] # CPU当前使用率百分比
for i in cpuload_dict:
cpuload_now = i['prevvalue'] # CPU当前负载百分比
for i in fsused_dict:
fsused_now = i['prevvalue'] # 根磁盘使用量
for i in fsfree_dict:
fsfree_now = i['prevvalue'] # 根磁盘空闲
for i in fshomefree_dict:
fshomefree_now = i['prevvalue'] # home分区空闲
for i in fshomeused_dict:
fshomeused_now = i['prevvalue'] # home分区使用量
for i in fsbootfree_dict:
fsbootfree_now = i['prevvalue'] # boot分区空闲量
for i in fsbootused_dict:
fsbootused_now = i['prevvalue'] # boot分区使用量
for i in fsmemsize_dict:
fsmemsize_now = i['prevvalue'] # memory大小
cpuuserdatalist = []
for i in fsCpuUserHistory_dict:
cpuuserdatalist.append(i['value'])
fsCpuUserHistory_now = cpuuserdatalist
# fsCpuHistory_now # 历史数据大小 system.cpu.util[,user]
cpuuserdatelist=[]
for i in fsCpuUserHistory_dict:
cpuuserdatelist.append(i['clock'])
fsCpuUserHistory_now_x = cpuuserdatelist # 历史数据时间轴 system.cpu.util[,user]
cpusysdatalist = []
for i in fsCpuSysHistory_dict:
cpusysdatalist.append(i['value'])
fsCpuSysHistory_now = cpusysdatalist
# fsCpuSysHistory_now # 内核空间使用CPU比例历史数据大小 system.cpu.util[,system]
netIndatalist = []
for i in netInDataTraffic_dict:
netIndatalist.append(i['value'])
netInDataTraffic_now = netIndatalist
# netInDataTraffic_now # 网络流量流入历史数据 net.if.in[eno16777736]
netIndatelist = []
for i in netInDataTraffic_dict:
netIndatelist.append(i['clock'])
netInDataTraffic_now_x = netIndatelist
# netInDataTraffic_now # 获取网络流量流入历史数据的时间戳 net.if.in[eno16777736]
netOutdatalist = []
for i in netOutDataTraffic_dict:
netOutdatalist.append(i['value'])
netOutDataTraffic_now = netOutdatalist
# netInDataTraffic_now # 网络流量流入历史数据 net.if.in[eno16777736]
except KeyError as e:
print(e)
pass
'''获取内存使用率最后..次的数据'''
me_data = monitorMemory.objects.filter(hostid=hostid)
'''返回的前端的字典'''
monitor_dict = {
"monitorform": monitorform, # 监控主机的表单
"monitor_hostnames": monitor_hostnames, # 监控的主机的下拉菜单列表
"host_num": host_num, # 监控的主机个数
"cpuutils_now": cpuutils_now, # CPU当前使用率
"cpuload_now": cpuload_now, # CPU当前负载
"fsused_now": fsused_now, # 磁盘使用量
"fsfree_now": fsfree_now, # 磁盘空闲
"fshomefree_now": fshomefree_now, # home 空闲
"fshomeused_now": fshomeused_now, # home partation used
"fsbootfree_now": fsbootfree_now, # boot 分区free
"fsbootused_now": fsbootused_now, # boot 分区used
"fsmemsize_now": fsmemsize_now, # memory 大小
"fsCpuUserHistory_now": fsCpuUserHistory_now, # CPU用户空间 历史数据大小
"fsCpuUserHistory_now_x": fsCpuUserHistory_now_x, # CPU用户空间历史数据大小
"fsCpuSysHistory_now": fsCpuSysHistory_now, # CPU内核空间历史数据大小
"netInDatatraffic_now": netInDataTraffic_now, # 网络流量流入数据
"netInDatatraffic_now_x": netInDataTraffic_now_x, # 网络流量流入数据时间戳
"netOutDatatraffic_now": netOutDataTraffic_now, # 网络流量流出数据
"data": me_data,
}
return render(request, 'Monitor.html', monitor_dict)
上面是大致的思路,比较简单。但是要想熟悉整个操作,那么zabbix的api必须要会使用,每个监控项的参数也会用。
######################################################################
这里先说一下web ui下添加监控项的参数:
大致就能明白后台读的监控项是怎么来的了,是我们自己创建的,或者说是使用的监控模板里面的,从最后一张图可以看出来,基本上每一个监控项后面都有参数,我们不难发现<> 包围起来的参数,是可选参数,而[],这个参数是必选。而且监控项是key:value 这种格式的。
下面开始一一介绍:
首先贴上官方文档:
https://www.zabbix.com/documentation/3.4/manual/api/reference/history/get
二、Zabbix API可以通过JSON RPC协议来获取历史数据。可以采用脚本或者任何支持JSON RPC的工具来使用API。
基本请求格式
Zabbix API 简化的JSON请求如下:
{
"jsonrpc": "2.0",
"method": "method.name",
"params": {
"param_1_name": "param_1_value",
"param_2_name": "param_2_value"
},
"id": 1,
"auth": "a826fca79a0795ccc1224dc76329972f",
}
下面一行一行来看:
● “jsonrpc”: “2.0”-这是标准的JSON RPC参数以标示协议版本。所有的请求都会保持不变。
● “method”: “method.name”-这个参数定义了真实执行的操作。例如:host.create、item.update,history.get等等
● “params”-这里通过传递JSON对象来作为特定方法的参数。如果你希望创建监控项,"name"和"key_“参数是需要的,每个方法需要的参数在Zabbix API文档中都有描述。
● “id”: 1-这个字段用于绑定JSON请求和响应。响应会跟请求有相同的"id”。在一次性发送多个请求时很有用,这些也不需要唯一或者连续
● “auth”: “a826fca79a0795ccc1224dc76329972f”-这是一个认证令牌【authentication token】用以鉴别用户、访问API。这也是使用API进行相关操作的前提-获取认证ID。
举个例子:
获取192.168.211.60从2014.2.19 14:00:00到2014.2.19 14:10:00的cpu_idle值.
基于curl命令:
(1):认证并且取得加密字段
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":
"2.0","method":"user.login","params":{"user":"xxxx","password":"xxxx"},"auth":
null,"id":0}' http://x.x.x.x/api_jsonrpc.php
#之后会得到一串输出:{"jsonrpc":"2.0","result":"a826fca79a0795ccc1224dc76329972f","id":0}。记住这
段输出。
(2)获取监控主机的hostids
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"host.get","params":{"output":["hostid"],"filter": {"host":"192.168.211.60"}},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
#"hostid":"10243"
(3)获得监控项itemids
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"item.get","params":{"output":"itemids","hostids":"10243","search":{"key_":"system.cpu.util
[,idle,avg1]"}},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
#“item”:"24526"
(4)获取监控项"system.cpu.util[,idle,avg1]"在2014.2.19 14:00~14:20的值
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"history.get","params":{"history":0,"itemids":["24526"],"time_from":"1392789600","time_till":"1392790200","output":"extend"},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
输出:
#输出:
[{"itemid":"24526","clock":"1392789646","value":"95.7539","ns":"138978589"},
{"itemid":"24526","clock":"1392789706","value":"84.9595","ns":"578198422"},
{"itemid":"24526","clock":"1392789766","value":"94.5259","ns":"186216653"},
{"itemid":"24526","clock":"1392789826","value":"96.2286","ns":"789434167"},
{"itemid":"24526","clock":"1392789886","value":"94.7712","ns":"191954191"},
{"itemid":"24526","clock":"1392789946","value":"90.8338","ns":"781241168"},
{"itemid":"24526","clock":"1392790006","value":"89.1735","ns":"294674458"},
{"itemid":"24526","clock":"1392790066","value":"92.3015","ns":"877714419"},
{"itemid":"24526","clock":"1392790126","value":"96.3051","ns":"426421789"},
{"itemid":"24526","clock":"1392790186","value":"97.7931","ns":"174500891"}]
#“value”就是cpu idle值,采样间隔时间与监控项的数据更新时间一致。
补充:获取192.168.211.60监控项"system.cpu.util[,idle,avg1]"在2019年09月11日 下午2:02:46 的值
curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc": "2.0","method":"history.get","params":{"history":0,"itemids":["24526"],"time_from":"1392789600","time_till":"1392790200","output":"extend","filter":{"clock":"1572789766"}},"auth": "a826fca79a0795ccc1224dc76329972f","id": 0}' http://x.x.x.x/api_jsonrpc.php
#"value":"94.5259"要获取的值
三、根据zabbix的参数选项是否为必须,进行解释
address:是我的项目测试地址:192.168.36.133,这里由于是本机直接使用127.0.0.1
一定要注意后面获取历史数据时,参数得到问题,要把history改为0,不然会出现获取不到数据。
一定要注意,因为这个问题,我一直没发现是这个原因,后来仔细看了官方文档才发现问题出在这里。
1,user.login方法获得认证密钥。
1)请求的方法参数
参数名称 | 值类型 | 说明 | 是否必须 |
---|---|---|---|
jsonrpc | str | 接口版本 | 是 |
method | str | 请求方法 | 是 |
params | json | 请求方法参数 | 是 |
user | str | zabbix账号 | 是 |
password | str | zabbix密码 | 是 |
auth | str | 认证的key | 是 |
id | int | 认证id | 是 |
2) 请求的示例
[root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"auth":null,"id":0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:32:10 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 68
Content-Type: application/json
返回得到response数据格式
{"jsonrpc":"2.0","result":"e66e63d8916eebceeae3cddf721f4e93","id":0}[root@zabbix-master cmdd]#
2, hostgroup.get方法获取所有主机组ID
参数名称 | 值类型 | 说明 | 是否必须 |
---|---|---|---|
jsonrpc | str | 接口版本 | 是 |
method | str | 请求方法 | 是 |
params | json | 请求方法参数 | 是 |
output | array | 输出格式 | 是 |
groupid | str | 主机组id | 是 |
name | str | 主机组名 | 是 |
auth | str | 认证的key | 是 |
id | int | 认证id | 是 |
- 请求的示例
root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:37:57 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 666
Content-Type: application/json
输出的结果response数据格式
{"jsonrpc":"2.0","result":[{"groupid":"5","name":"Discovered hosts"},{"groupid":"7","name":"Hypervisors"},{"groupid":"2","name":"Linux servers"},{"groupid":"1","name":"Templates"},{"groupid":"12","name":"Templates/Applications"},{"groupid":"13","name":"Templates/Databases"},{"groupid":"8","name":"Templates/Modules"},{"groupid":"9","name":"Templates/Network Devices"},{"groupid":"10","name":"Templates/Operating Systems"},{"groupid":"11","name":"Templates/Servers Hardware"},{"groupid":"14","name":"Templates/Virtualization"},{"groupid":"6","name":"Virtual machines"},{"groupid":"15","name":"Web \u76d1\u63a7\u7ec4"},{"groupid":"4","name":"Zabbix servers"}],"id":0}[root@zabbix-master cmdd]#
[root@zabbix-master cmdd]#
[root@zabbix-master cmdd]#
3,host.get方法获取单个主机组下所有的主机ID
1)请求的方法参数
参数名称 | 值类型 | 说明 | 是否必须 |
---|---|---|---|
jsonrpc | str | 接口版本 | 是 |
method | str | 请求方法 | 是 |
params | json | 请求方法参数 | 是 |
output | array | 输出格式 | 是 |
groupid | str | 主机组id | 是 |
auth | str | 认证的key | 是 |
id | int | 认证id | 是 |
2)请求的示例
[root@zabbix-master cmdd]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"2"},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:40:03 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 163
Content-Type: application/json
输出的结果response数据格式
{"jsonrpc":"2.0","result":[{"hostid":"10256","name":"zabbix server"},{"hostid":"10257","name":"zabbix slaver1"},{"hostid":"10262","name":"zabbix slaver2"}],"id":0}[root@zabbix-master cmdd]#
4,itemsid.get方法获取单个主机下所有的监控项ID
1)请求的方法参数
参数名称 | 值类型 | 说明 | 是否必须 |
---|---|---|---|
jsonrpc | str | 接口版本 | 是 |
method | str | 请求方法 | 是 |
params | json | 请求方法参数 | 是 |
output | array | 输出格式 | 是 |
groupid | str | 主机组id | 是 |
auth | str | 认证的key | 是 |
id | int | 认证id | 是 |
- 请求的示例
[root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":["itemids","key_"],"hostids":"10256"},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:43:03 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 2566
Content-Type: application/json
输出的数据结果response数据格式
{"jsonrpc":"2.0","result":[
{"itemid":"28344","key_":"agent.hostname"},
{"itemid":"28345","key_":"agent.ping"},
{"itemid":"28346","key_":"agent.version"},
{"itemid":"28347","key_":"kernel.maxfiles"},
{"itemid":"28348","key_":"kernel.maxproc"},
{"itemid":"28460","key_":"net.if.in[eno16777736]"},
{"itemid":"28461","key_":"net.if.out[eno16777736]"},
{"itemid":"28334","key_":"net.tcp.service[ssh]"},
{"itemid":"28349","key_":"proc.num[,,run]"},
{"itemid":"28350","key_":"proc.num[]"},
{"itemid":"28351","key_":"system.boottime"},
{"itemid":"28352","key_":"system.cpu.intr"},{"itemid":"28353","key_":"system.cpu.load[percpu,avg15]"},
{"itemid":"28354","key_":"system.cpu.load[percpu,avg1]"},{"itemid":"28355","key_":"system.cpu.load[percpu,avg5]"},{"itemid":"28356","key_":"system.cpu.switches"},
{"itemid":"28357","key_":"system.cpu.util[,idle]"},{"itemid":"28358","key_":"system.cpu.util[,interrupt]"},{"itemid":"28359","key_":"system.cpu.util[,iowait]"},
{"itemid":"28360","key_":"system.cpu.util[,nice]"},
{"itemid":"28361","key_":"system.cpu.util[,softirq]"},{"itemid":"28362","key_":"system.cpu.util[,steal]"},
{"itemid":"28363","key_":"system.cpu.util[,system]"},
{"itemid":"28364","key_":"system.cpu.util[,user]"},{"itemid":"28365","key_":"system.hostname"},
{"itemid":"28366","key_":"system.localtime"},{"itemid":"28367","key_":"system.swap.size[,free]"},{"itemid":"28368","key_":"system.swap.size[,pfree]"},
{"itemid":"28369","key_":"system.swap.size[,total]"},{"itemid":"28370","key_":"system.uname"},
{"itemid":"28371","key_":"system.uptime"},{"itemid":"28372","key_":"system.users.num"},{"itemid":"28373","key_":"vfs.file.cksum[/etc/passwd]"},
{"itemid":"28462","key_":"vfs.fs.inode[/,pfree]"},{"itemid":"28463","key_":"vfs.fs.inode[/boot,pfree]"},
{"itemid":"28464","key_":"vfs.fs.inode[/home,pfree]"},{"itemid":"28465","key_":"vfs.fs.size[/,free]"},{"itemid":"28468","key_":"vfs.fs.size[/,pfree]"},
{"itemid":"28471","key_":"vfs.fs.size[/,total]"},{"itemid":"28474","key_":"vfs.fs.size[/,used]"},
{"itemid":"28466","key_":"vfs.fs.size[/boot,free]"},{"itemid":"28469","key_":"vfs.fs.size[/boot,pfree]"},{"itemid":"28472","key_":"vfs.fs.size[/boot,total]"},
{"itemid":"28475","key_":"vfs.fs.size[/boot,used]"},
{"itemid":"28467","key_":"vfs.fs.size[/home,free]"},{"itemid":"28470","key_":"vfs.fs.size[/home,pfree]"},
{"itemid":"28473","key_":"vfs.fs.size[/home,total]"},{"itemid":"28476","key_":"vfs.fs.size[/home,used]"},
{"itemid":"28374","key_":"vm.memory.size[available]"},{"itemid":"28517","key_":"vm.memory.size[free]"},
{"itemid":"28375","key_":"vm.memory.size[total]"}],"id":0}
[root@zabbix-master cmdd]#
[root@zabbix-master cmdd]#
5,history.get方法获取单个监控项的历史数据
- 请求的方法参数
参数名称 | 值类型 | 说明 | 是否必须 |
---|---|---|---|
jsonrpc | str | 接口版本 | 是 |
method | str | 请求方法 | 是 |
params | json | 请求方法参数 | 是 |
output | array | 输出格式 | 是 |
history | int | 所返回的历史对象类型. 0 - numeric float; 1 - character; 2 - log; 3 - numeric unsigned; 4 - text. Default: 3. | 是 |
hostids | str/array | 主机组id | 是 |
time_from | timestamp | 仅返回在给定时间之后或之后收到的值 | 否 |
itemids | timestamp | 仅返回在给定时间之前或之前收到的值 | 否 |
sortfield | str/array | 按照给定的属性对结果进行排序(可以是itemid或者clock) | 否 |
sortorder | str/array | ASC- 升序; DESC - 降序 | 否 |
limit | int | 限制返回采集最近几次数据(通常带上) | 否 |
countOutput | flag | 返回结果中的记录数,而不是实际的数据 | 否 |
auth | str | 认证的key | 是 |
id | int | 认证id | 是 |
2) 请求的示例
[root@zabbix-master cmdd]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"history.get","params":{"history":0,"itemids":"28362","output":"extend","limit":10},"auth":"e66e63d8916eebceeae3cddf721f4e93","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Fri, 13 Sep 2019 11:55:51 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 774
Content-Type: application/json
输出结果:response数据格式
{"jsonrpc":"2.0","result":[{"itemid":"28362","clock":"1567768062","value":"0.0000","ns":"221267790"},
{"itemid":"28362","clock":"1567768122","value":"0.0000","ns":"280608396"},
{"itemid":"28362","clock":"1567768182","value":"0.0000","ns":"334630728"},
{"itemid":"28362","clock":"1567768242","value":"0.0000","ns":"52002418"},
{"itemid":"28362","clock":"1567768302","value":"0.0000","ns":"121115996"},
{"itemid":"28362","clock":"1567768362","value":"0.0000","ns":"189875910"},
{"itemid":"28362","clock":"1567768422","value":"0.0000","ns":"334948438"},
{"itemid":"28362","clock":"1567768482","value":"0.0000","ns":"427439259"},
{"itemid":"28362","clock":"1567768542","value":"0.0000","ns":"627033918"},
{"itemid":"28362","clock":"1567768602","value":"0.0000","ns":"693077056"}
],"id":0}
[root@zabbix-master cmdd]#
[root@zabbix-master cmdd]#
[root@zabbix-master cmdd]#
--------------------注:要获取最新数据limit为1即可----------------
6,get方法的通用参数
参数名称 | 值类型 | 说明 |
---|---|---|
countOutput | flag | 返回结果中的记录数,而不是实际的数据 |
editable | boolean | 如果设置为true仅返回用户具有写入权限的对象,默认为false |
excludeSearch | flag | 返回与search参数中给出的标准不匹配的结果 |
filter | object | 仅返回与给定过滤器完全匹配的结果,接受一个数组,其中的键是属性名称,并且值是单个值或要匹配的值的数组 |
limit | int | 限制返回的记录数 |
output | query | 要返回的对象属性,默认值:extend |
preservekeys | flag | 在结果数组中使用ID作为键 |
search | object | 返回匹配给定通配符搜索的结果,接受一个数组,其中键是属性名,值是要搜索的字符串.如果没有额外的选项,这将执行LIKE “%…%”搜索,仅适用于string和text领域 |
searchByAny | boolean | 如果设置为true返回与filteror或search参数中给出的任何条件匹配的结果,而不是所有这些结果,默认false |
searchWildcardsEnabled | boolean | 如果设置为true使能“*”作为search参数中的通配符,默认值为false |
sortfield | str/array | 按照给定的属性对结果进行排序(可以是itemid或者clock) |
sortorder | str/array | ASC- 升序; DESC - 降序 |
startSearch | flag | 该search参数将比较领域的开始,也就是进行LIKE “…%”搜索来代替 |
四、下面开始基于python来实现API接口调用,并且使用curl来获取结果对比。
1. user.login方法获取zabbix server的认证结果
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/user/login
# vim auth.py内容如下:
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.1/zabbix/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
# auth user and password
data = json.dumps(
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 0
})
# 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']
python脚本运行结果:
[root@Xururu ~]# python auth.py
Auth Successful. The Auth ID Is: 0c29d9efcee2ce856c41431d0dcd60d9
curl命令:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":
"2.0","method":"user.login","params":{"user":"Admin","password":"zabbix"},"auth":
null,"id":0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令运行结果:
{"jsonrpc":"2.0","result":"9f08062e9315803e94dbd6a5f1828a45","id":0}
2. hostgroup.get方法获取所有主机组ID
把认证密钥放到脚本中,每次获取数据时都需要认证。此处是获取zabbix server上的所有主机组名称与ID号。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/hostgroup/get
python脚本:
[root@Xururu ~]# vim get_hostgroup_list.py
内容如下:
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.1/zabbix/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
# request json
data = json.dumps(
{
"jsonrpc":"2.0",
"method":"hostgroup.get",
"params":{
"output":["groupid","name"],
},
"auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string
"id":1,
})
# create request object
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
result.close()
print "Number Of Hosts: ", len(response['result'])
#print response
for group in response['result']:
print "Group ID:",group['groupid'],"\tGroupName:",group['name']
python脚本执行结果:
[root@Xururu ~]# python get_hostgroup_list.py
Number Of Hosts: 6
Group ID: 5 GroupName: Discovered hosts
Group ID: 7 GroupName: Hypervisors
Group ID: 2 GroupName: Linux servers
Group ID: 1 GroupName: Templates
Group ID: 6 GroupName: Virtual machines
Group ID: 4 GroupName: Zabbix servers
curl命令:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令运行结果:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc": "2.0","method":"hostgroup.get","params":{"output":["groupid","name"]},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 01:54:39 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 270
Content-Type: application/json
{"jsonrpc":"2.0","result":[{"groupid":"5","name":"Discovered hosts"},{"groupid":"7","name":"Hypervisors"},{"groupid":"2","name":"Linux servers"},{"groupid":"1","name":"Templates"},{"groupid":"6","name":"Virtual machines"},{"groupid":"4","name":"Zabbix servers"}],"id":0}
3 host.get方法获取单个主机组下所有的主机ID。
根据标题2中获取到的主机组id,把主机组id填入到下边脚本中,就可以获得该主机组下所有的主机id。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/host/get
python脚本:
[root@Xururu ~]# vim get_group_one.py
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.1/zabbix/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
# request json
data = json.dumps(
{
"jsonrpc":"2.0",
"method":"host.get",
"params":{
"output":["hostid","name"],
"groupids":"14", ###修改此处
},
"auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string
"id":1,
})
# create request object
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
result.close()
print "Number Of Hosts: ", len(response['result'])
for host in response['result']:
print "Host ID:",host['hostid'],"HostName:",host['name']
python脚本执行结果:
[root@Xururu ~]# python get_group_one.py
Number Of Hosts: 0
curl命令:
[root@Xururu ~]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令执行结果:
[root@Xururu ~]# curl -i -X POST -H'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"host.get","params":{"output":["hostid","name"],"groupids":"14"},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 02:14:19 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 36
Content-Type: application/json
{"jsonrpc":"2.0","result":[],"id":0}
4. itemsid.get方法获取单个主机下所有的监控项ID
根据标题3中获取到的所有主机id与名称,找到你想要获取的主机id,获取它下面的所有items。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/item
python脚本:
[root@Xururu ~]# vim get_items.py
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.1/zabbix/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
# request json
data = json.dumps(
{
"jsonrpc":"2.0",
"method":"item.get",
"params":{
"output":["itemids","key_"],
"hostids":"10146",###修改此处
},
"auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string
"id":1,
})
# create request object
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
result.close()
print "Number Of Hosts: ", len(response['result'])
for host in response['result']:
print host
#print "Host ID:",host['hostid'],"HostName:",host['name']
python脚本运行结果:
[root@Xururu ~]# python get_items.py
Number Of Hosts: 0
curl命令:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":"itemids","hostids":"10146","search":{"key_":"net.if.out[eth2]"}},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令执行结果:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"item.get","params":{"output":"itemids","hostids":"10146","search":{"key_":"net.if.out[eth2]"}},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 02:25:37 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 36
Content-Type: application/json
{"jsonrpc":"2.0","result":[],"id":0} ### 执行结果
5. history.get方法获取单个监控项的历史数据
根据第4项的获取到的所有items id的值,找到想要监控的那项,获取它的历史数据。
官方地址:https://www.zabbix.com/documentation/2.2/manual/api/reference/history/get
python脚本:
[root@Xururu ~]# vim get_items_history.py
#!/usr/bin/env python2.7
#coding=utf-8
import json
import urllib2
from urllib2 import URLError
# based url and required header
url = "http://127.0.0.1/zabbix/api_jsonrpc.php"
header = {"Content-Type":"application/json"}
# request json
data = json.dumps(
{
"jsonrpc":"2.0",
"method":"history.get",
"params":{
"output":"extend",
"history":3,
"itemids":"25159",
"limit":10
},
"auth":"0c29d9efcee2ce856c41431d0dcd60d9", # theauth id is what auth script returns, remeber it is string
"id":1,
})
# create request object
request = urllib2.Request(url,data)
for key in header:
request.add_header(key,header[key])
# get host list
try:
result = urllib2.urlopen(request)
except URLError as e:
if hasattr(e, 'reason'):
print 'We failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server could not fulfill the request.'
print 'Error code: ', e.code
else:
response = json.loads(result.read())
result.close()
print "Number Of Hosts: ", len(response['result'])
for host in response['result']:
print host
#print "Host ID:",host['hostid'],"HostName:",host['name']
Python脚本执行结果:
[root@Xururu ~]# python get_items_history.py
Number Of Hosts: 0
curl命令:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"history.get","params":{"history":3,"itemids":"25154","output":"extend","limit":10},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
curl命令执行结果:
[root@Xururu ~]# curl -i -X POST -H 'Content-Type:application/json' -d '{"jsonrpc":"2.0","method":"history.get","params":{"history":3,"itemids":"25154","output":"extend","limit":10},"auth":"0c29d9efcee2ce856c41431d0dcd60d9","id": 0}' http://127.0.0.1/zabbix/api_jsonrpc.php
HTTP/1.1 200 OK
Date: Sun, 13 Aug 2017 02:34:44 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips PHP/5.4.16
X-Powered-By: PHP/5.4.16
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 36
Content-Type: application/json
{"jsonrpc":"2.0","result":[],"id":0}
以上便是整个项目调用zabbix,所需要的资料,最好是自己看下官方手册,中间遇到的很多问题,我也是在官方手册中找到了答案。
通过上面的分析:
下面进行一个实例数据获取到展现:
def getfshomeused(*args, **b):
'''
获取home分区使用大小
'''
diskhome_data = json.dumps({
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": "extend",
"hostids": b["parameter"],
"search": {
"key_": "vfs.fs.size[/home,used]" # 只查询磁盘的homeused
}
},
"auth": b["session"],
"id": 2
})
return diskhome_data
'''获取home目录used空间'''
fshomeused_dict = dataHandle(func=getfshomeused, hostid=hostid)
'''进行遍历'''
for i in fshomeused_dict:
fshomeused_now = i['prevvalue'] # home分区使用量
'''返回的前端的字典'''
monitor_dict = {
"fshomeused_now": fshomeused_now, # home partation used
}
return render(request, 'Monitor.html', monitor_dict)
这是前端展示核心代码:
// #################### 【Home分区】图形 ####################
// 基于准备好的dom,初始化echarts实例
// Home分区使用饼图
var myChart_fshomesize = echarts.init(document.getElementById('main_fshomesize'));
option_fshomesize = {
title:
{
text: 'Home分区使用情况',
subtext: 'home分区单位MB',
x: 'center'
},
tooltip:
{
trigger: 'item',
formatter: "{a} <br/>{b} : {c} ({d}%)"
},
legend:
{
orient: 'vertical',
left: 'left',
data: ['home分区空闲', 'home分区用量']
},
series: [
{
name: '分区情况',
type: 'pie',
radius: ['50%', "70"],
avoidLabelOverlap: false,
label: {
normal: {
show: false,
position: 'center',
fontSize: 14
},
emphasis: {
show: true,
textStyle: {
fontSize: '30',
fontWeight: 'bold'
}
}
},
data: [
{value: {{ fshomefree_now }}, name: 'home分区空闲'},
{value: {{ fshomeused_now }}, name: 'home分区用量', itemStyle: {color: "#00CC00"}}
]
}
]
};
myChart_fshomesize.showLoading(); //显示loading
setInterval(function () {
myChart_fshomesize.hideLoading(); //显示完成后不显示loading
option_fshomesize.series[0].data[0].value = (({{ fshomefree_now }}) / 1048576).toFixed(2) - 0;
option_fshomesize.series[0].data[1].value = (({{ fshomeused_now }}) / 1048576).toFixed(2) - 0;
myChart_fshomesize.setOption(option_fshomesize, true);
}, 2000);
我这里方便清晰展示进行了单位换算,换算后的单位为Mb,
好了,以上内容有些多,但是把整个API接口如何使用,和如何获取到数据,并收集数据,再传到前台进行Echarts数据展示,进行了综合解释。感兴趣的可以多尝试尝试。。。。。
更多推荐
所有评论(1)