项目背景介绍:zabbix已经在服务器搭建好了,只是需要远程调用zabbix的监控数据。通过php调用访问配置zabbix的服务器,获取监控数据,PHP在于Js交互(jQuery框架),将监控的数据显示在网页之上,网页已经写好,只需要修改部分Js文件以及编写php文件即可。获取要监控的设备是通过配置文件的方式,配置文件中写的是要监控的主机名
文章目录
有两种方式获取监控数据,第一种是通过直接访问zabbix数据库的方式获取指定数据,第二种就是通过zabbix的自带的api接口直接获取目标数据。前者访问速度快,但是zabbix的表结构较为复杂,直接访问数据库需要对数据库的表结构有较为清楚的认识;后者访问速度慢,但是有现成的接口,不需要除了复杂的表结构关系,省时省力。
一、zabbix表结构
host表
-
hostid:主机的 id
-
proxy_hostid:代理主机的 id
-
host:这里代表主机的 ip
-
status:代表主机的状态:数据库存储有三个值:0 代表被监控,1 代表未监控,3 代表该主机是模板主机 (通过 zabbix 的 api 的 host.get 只能获取到状态为 0 的主机,通过 template.get 能获取到状态为 3 的主机)
-
name:主机的别名 / 昵称
-
flags:这个主机是否启用:0 代表启用,1 代表未启用
-
templateid:模板 id(有点像自关联)
-
description:对主机的描述
item表
-
itemid:监控项的 id
-
type:监控项的类型:常见的有 agent,SNMP,agent (active) 等
-
hostid:监控项关联的主机 id
-
name:监控项的名称
-
key_ : 监控项 item 的 key 值,(数据库中存储的这个 key_的内容大概就是监控表达式比如:system.swap.size [,free] 这种
-
delay:配置 item 时候配置的 “Update Interval”,开发中没用到,不清楚。
-
history:监控项数据在历史表中保留的时间天数
-
trends:监控项数据在 trends 表中保留的天数
-
status:监控项的状态:0 代表能够使用,1 代表不能够使用
-
value_type:重点中的重点:有五个值:0,1,2,3,4,代表监控项不同的返回类型,这个值决定了监控项的数据会存储在哪张历史表中
0 - numeric float;
1 - character;
2 - log;
3 - numeric unsigned;
4 - text. -
units:监控项数据的单位
history表
-
itemid:监控项的 id
-
clock:时间戳,监控项采集数据的触发时间
-
value:监控项采集数据的值
-
ns:纳秒
-
注意:历史表与监控表的关系:使用history.get来获取历史数据,需要传入的参数不止 一个监控项的id,还需传入监控项的value_type,因为如果不传入value_type,history.get方法默认取 history这个表的数据,如果itemid对应不上,就取不到数据。我们要获取的值,内存和磁盘都是numeric unsigned也就说 value_type=3,cpu是numeric float,value_type=0
alter表
- alertid:报警的id
- alerttype:报警的类型
- clock:报警触发的时间
- message:报警的信息
二、php调用zabbix的api
zabbix的官方文档:
zabbix接口文档
(一)php获取zabbix的认证
php利用自身的开源框架curl,发送http请求,获取zabbix的认证auth
$url = 'http://xxx/zabbix/api_jsonrpc.php';//xxx是配置zabbix的ip地址
$header = array("Content-type: application/json-rpc");
// get token
function Curl($url, $header, $info)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $info);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response);
}
function get_token($url, $header)
{
$user = 'xxx';//配置的zabbix的用户名
$password = 'xxx';//配置的zabbix的密码
$logininfo = array(
'jsonrpc' => '2.0',
'method' => 'user.login',//调用的zabbix的api,用于远程登录
'params' => array(
'user' => $user,
'password' =>