博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用 PHP 查询 ZABBIX API 信息, 获得主机当前使用率
阅读量:4078 次
发布时间:2019-05-25

本文共 11234 字,大约阅读时间需要 37 分钟。

目的

利用 PHP 调用 zabbix api 接口, 查询主机, 并返回下面 JSON 数据

内存可用值     (KB)内存总数        (KB)当前 CPU IDLE 值   100%当前 / 盘使用值 (KB)当前 / 盘总数    (KB)

调用方法

http://zabbix.xxxx.com/ext/get_resource.php?host=hostname,hostname,hostname

说明

可以输入一台或以上主机进行查询,  以逗号进行主机名分隔

返回结果说明

可能会出现三种情况

1  主机已在 ZABBIX 注册, 并返回正常的数据2  主机已经在 ZABBIX 注册,  但 ZABBIX AGENT 没有打开, 无法获得当前值3.  主机可能是 WINDOWS 或者没有在 ZABBIX 中注册, 无法获得任何数据

测试返回说明

主机已在 ZABBIX 注册, 并返回正常的数据

http://zabbix.xxx.com/ext/get_resource.php?host=terry-w6im9.vclound.com,pjstaging-x225n.vclound.com,terry-elk-exquv.vclound.com{    "hostlist": {        "terry-w6im9.vclound.com": {            "vm.memory.size[available]": "3874770944",            "vm.memory.size[total]": "4018950144",            "system.cpu.util[,idle]": "99.5082",            "vfs.fs.size[/,used]": "6038204416",            "vfs.fs.size[/,total]": "21002579968"        },        "pjstaging-x225n.vclound.com": {            "vm.memory.size[available]": "2140098560",            "vm.memory.size[total]": "4018950144",            "system.cpu.util[,idle]": "98.5289",            "vfs.fs.size[/,used]": "20229439488",            "vfs.fs.size[/,total]": "21002579968"        },        "terry-elk-exquv.vclound.com": {            "vm.memory.size[available]": "3793350656",            "vm.memory.size[total]": "4018728960",            "system.cpu.util[,idle]": "99.6417",            "vfs.fs.size[/,used]": "3584937984",            "vfs.fs.size[/,total]": "21002579968"        }    }}

主机已经在 ZABBIX 注册, 但 ZABBIX AGENT 没有打开, 无法获得当前值

http://zabbix.vclound.com/ext/get_resource.php?host=terry-w6im9.vclound.com,terry-zskvt.vclound.com{    "hostlist": {        "terry-w6im9.vclound.com": {            "vm.memory.size[available]": "3874770944",            "vm.memory.size[total]": "4018950144",            "system.cpu.util[,idle]": "99.5082",            "vfs.fs.size[/,used]": "6038208512",            "vfs.fs.size[/,total]": "21002579968"        },        "terry-zskvt.vclound.com": {            "vm.memory.size[available]": null,            "vm.memory.size[total]": null,            "system.cpu.util[,idle]": null,            "vfs.fs.size[/,used]": null,            "vfs.fs.size[/,total]": null        }    }}

主机可能是 WINDOWS 或者没有在 ZABBIX 中注册, 无法获得任何数据,

http://zabbix.vclound.com/ext/get_resource.php?host=terry-w6im9.vclound.com,terry.gz.vclound.com{    "hostlist": {        "terry-w6im9.vclound.com": {            "vm.memory.size[available]": "3875835904",            "vm.memory.size[total]": "4018950144",            "system.cpu.util[,idle]": "99.4999",            "vfs.fs.size[/,used]": "6039134208",            "vfs.fs.size[/,total]": "21002579968"        },        "terry.gz.vclound.com": {            "vm.memory.size[available]": null,            "vm.memory.size[total]": null,            "system.cpu.util[,idle]": null,            "vfs.fs.size[/,used]": null,            "vfs.fs.size[/,total]": null        }    }}

api 缺点

数据返回时间值太慢
经过测试, 30 台主机并发查询,
返回时间结果约 60 秒
参考 api 接口 php

'2.0', 'method' => 'user.login', 'params' => array( 'user' => $user, 'password' => $password, ), 'id' => 1, ); $data = json_encode($logininfo); $result = Curl($url, $header, $data); $token = $result -> result; return $token;}// get token end// 用于吧 classobject 返回为数组function object_array($array){
if(is_object($array)) { $array = (array)$array; } if(is_array($array)) { foreach($array as $key=>$value) { $array[$key] = object_array($value); } } return $array;}// get hostid function get_hostid($hostname, $token, $header, $url){
$gethostid = array( 'jsonrpc' => '2.0', 'method' => 'host.get', "params" => array( "output" => ["hostid"], "filter" => array( "host" => [$hostname] ) ), "auth"=>$token, "id"=>1 ); $data = json_encode($gethostid); $result = Curl($url,$header,$data); $hostinfo= $result -> result; if ( empty($hostinfo) ) { $hostid =''; }else { $hostid = $hostinfo[0] -> hostid; } return $hostid;}// get itemid function get_itemid($hostid, $key, $token, $header, $url){
$getitemid = array( "jsonrpc" => "2.0", "method" => "item.get", "params" => array( "output" => ["itemids"], "hostids" => $hostid, "search" => array( "key_" => $key ), "sortfield" => "name" ), "auth" => $token, "id" => 1 ); $data = json_encode($getitemid); $result = Curl($url,$header,$data); $iteminfo = $result -> result; if ( empty($iteminfo )) { $itemid = 'null'; }else { $itemid = $iteminfo[0] -> itemid; } return $itemid;}// get zabbix valuefunction get_resource($itemid, $token, $header, $url, $history, $historylimit){
$gethistory = array( "jsonrpc" => "2.0", "method" => "history.get", "params" => array( "output" => "extend", "history" => $history, "itemids" => $itemid, "sortfield" => "clock", "sortorder" => "DESC", "limit" => $historylimit ), "auth" => $token, "id" => 1 ); $data = json_encode($gethistory); $result = Curl($url,$header,$data); $historytotal = $result -> result; $resource = object_array($historytotal); return $resource;}// 逻辑开始if ( empty($hostname) ){ echo "hostname not exists"; exit;}else{ $hostlist = explode(",",$hostname); $hostlistarr = array( 'hostlist' => array()); foreach( $hostlist as $hostname ) { $source = array('vm.memory.size[available]', 'vm.memory.size[total]', 'system.cpu.util[,idle]', 'vfs.fs.size[/,used]', 'vfs.fs.size[/,total]' ); $hostarr = array( 'hostlist' => array($hostname => array() )); foreach ($source as $key) { if ( $key == 'system.cpu.util[,idle]' ) { $history = 0; }else { $history = 3; }// $zabbix_info = get_info($url, $header, $token, $hostname, $key, $history, $historylimit); $token = get_token($url, $header); $hostid = get_hostid($hostname, $token, $header, $url); if ( empty($hostid) ) { $json_info = array( 'hostlist' => array( $hostname => array( $key => 'null'))); $hostarr = array_merge_recursive( $hostarr, $json_info ); continue; } $itemid = get_itemid($hostid, $key, $token,$header, $url); if ( empty($itemid) ) { $json_info = array('hostlist' => array( $hostname => array( $key => 'null' ))); $hostarr = array_merge_recursive( $hostarr, $json_info ); continue; } $resource = get_resource($itemid, $token, $header, $url, $history, $historylimit); $zabbix_info = $resource[0]['value']; $json_info = array( 'hostlist' => array($hostname => array( $key => $zabbix_info )) ); $hostarr = array_merge_recursive( $hostarr, $json_info ); } $hostlistarr = array_merge_recursive( $hostlistarr, $hostarr); } echo json_encode($hostlistarr);}?>

重写

重新修改, 直接通过数据库查询方式获得对应数据

特点

取 7 天中的最大 (磁盘使用空间) 最小值(CPU 空闲,  可用内存)经测试 365 台主机并发查询,  返回数据约 18 秒

参考 php

array( 'error' )); echo json_encode($err_info); exit; } } $hostlist = explode(",",$hostname); $target = array('vm.memory.size[available]', 'vm.memory.size[total]', 'system.cpu.util[,idle]', 'vfs.fs.size[/,used]', 'vfs.fs.size[/,total]' ); $hostarr = array( 'hostlist' => array($hostname => array() )); $hostlistarr = array( 'hostlist' => array());/* $gz_zabbix_db = 'XXXXX:3306'; $sh_zabbix_db = 'XXXX:3306';*/ function get_value($hostname, $sql, $zabbix_db) {
$zabbix_user = 'your db username'; $zabbix_password = 'user db password'; $link = mysql_connect($zabbix_db, $zabbix_user, $zabbix_password); $result = mysql_query($sql); $row = mysql_fetch_row($result); mysql_close($link); return $row[0]; } foreach( $hostlist as $hostname ) { $hostarr = array( 'hostlist' => array($hostname => array() )); if ( strstr( $hostname, 'sh.vclound.com', true) ) { $zabbix_db = 'your db link1:3306'; }else { $zabbix_db = 'your db link2:3306'; } foreach ( $target as $index ) { if ( $index == 'vm.memory.size[available]' ) { $db_column = 'min(value_min)'; }else { $db_column = 'max(value_max)'; } if ( $index == 'system.cpu.util[,idle]' ) { $db_name = 'zabbix.trends'; $db_column = 'min(value_min)'; }else { $db_name = 'zabbix.trends_uint'; } $sql = "select " . $db_column . " value from " . $db_name . " a, zabbix.items b, zabbix.hosts c where a.itemid=b.itemid and b.hostid = c.hostid and b.key_='" . $index . "' and a.clock > ( unix_timestamp() - 7200*24*7) and c.name='" . $hostname . "';"; $db_value = get_value($hostname, $sql, $zabbix_db); $json_info = array( 'hostlist' => array($hostname => array( $index => $db_value )) ); $hostarr = array_merge_recursive( $hostarr, $json_info ); } $hostlistarr = array_merge_recursive( $hostlistarr, $hostarr); } echo json_encode($hostlistarr);?>

转载地址:http://hqnni.baihongyu.com/

你可能感兴趣的文章
C++的模板化等等的确实比C用起来方便多了
查看>>
ROS是不是可以理解成一个虚拟机,就是操作系统之上的操作系统
查看>>
用STL algorithm轻松解决几道算法面试题
查看>>
ACfly之所以不怕炸机因为它觉得某个传感器数据不安全就立马不用了
查看>>
我发觉,不管是弄ROS OPENCV T265二次开发 SDK开发 caffe PX4 都是用的C++
查看>>
ROS的安装(包含文字和视频教程,我的ROS安装教程以这篇为准)
查看>>
国内有个码云,gitee
查看>>
原来我之前一直用的APM固件....现在很多东西明白了。
查看>>
realsense-ros里里程计相关代码
查看>>
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
我感觉想让无人机在T265下飞得更稳,可以结合激光雷达,光流等传感器一起啊。多传感器融合应该是一个必由之路。
查看>>
那些硬件的初始化函数主要是在做些上什么?
查看>>
智能无人机课程用的是研扬TX2底板+TX2核心板
查看>>
B站上还是有不少无人机仿真的视频的
查看>>