通过远程PHP远程调用ZABBIX接口获取数据
项目背景介绍:zabbix已经在服务器搭建好了,只是需要远程调用zabbix的监控数据。通过php调用访问配置zabbix的服务器,获取监控数据,PHP在于Js交互(jQuery框架),将监控的数据显示在网页之上,网页已经写好,只需要修改部分Js文件以及编写php文件即可。获取要监控的设备是通过配置文件的方式,配置文件中写的是要监控的主机名
文章目录
一、zabbix表结构
- host表
- item表
- history表
- alter表
- 二、php调用zabbix的api
- (一)php获取zabbix的认证
- (二)读取配置文件的主机名,并获取主机id
- (三)获取item项目以及主机信息
- (四)逻辑处理
- 三、实际项目
有两种方式获取监控数据,第一种是通过直接访问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表
二、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' => $password,),'id' => 1,);$data = json_encode($logininfo);$result = Curl($url, $header, $data);$token = $result->result;return $token;
}
(二)读取配置文件的主机名,并获取主机id
//目标主机
$goalHost = include ("config/PhysicalMachine_config.php");function get_hostidFromName($hostname, $token, $header, $url)
{$gethostid = array('jsonrpc' => '2.0','method' => 'host.get',"params" => array("output" => ["hostid"],"filter" => array("name" => [$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;
}
(三)获取item项目以及主机信息
// 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 value
function 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;
}
(四)逻辑处理
/*** php数组可以是键值对形式的数据* 每一个返回的信息都是被封装过的键值对* foreach把数组的value取出来封装成数组,现在是key(从0开始的整数)-array(id,name)的形式*///获取token
$token = get_token($url, $header);
//获取所有主机信息
$hostlist = get_hostid( $token, $header, $url);//test from name get id
//$hostids = get_hostidFromName($goalHost[0], $token, $header, $url);
//print_r($hostids);//获取内存,磁盘,cpu信息
for ($i = 0; $i <count($goalHost) ; $i++) {//指定要获取的主机信息,cup,内存,磁盘$source = array('vm.memory.size[available]','vm.memory.size[total]','system.cpu.util[,idle]','vfs.fs.size[/,used]','vfs.fs.size[/,total]');// 存放所有信息的数组$hostInfo_all = array();$token = get_token($url, $header);//get id$hostid = get_hostidFromName($goalHost[$i], $token, $header, $url);//get status and ip$description = get_hostDescription($goalHost[$i], $token, $header, $url);$status = $description -> status;$interfaces = $description ->interfaces;$ip = $interfaces[0] ->ip;//给数组添加CPU,内存,磁盘属性foreach ($source as $key) {if ($key == 'system.cpu.util[,idle]') {$history = 0;} else {$history = 3;}//get item$itemid = get_itemid($hostid, $key, $token, $header, $url);//get value$resource = get_resource($itemid, $token, $header, $url, $history, $historylimit);//把key修改为方便读取的字段switch ($key) {case 'vm.memory.size[available]':$key = 'memory_available';break;case 'vm.memory.size[total]':$key = 'memory_total';break;case 'system.cpu.util[,idle]':$key = 'cpu_idle';break;case 'vfs.fs.size[/,used]':$key = 'fs_used';break;case 'vfs.fs.size[/,total]':$key = 'fs_total';break;}if(!empty($resource)){//存放单个信息的数组$zabbix_info = $resource[0]['value'];//把内存,CPU,磁盘包装成数组$hostInfo_all[] = array($key => $zabbix_info);}else{$hostInfo_all[] = array($key => 'null');}}//给数组添加statue属性和ip属性$hostInfo_all[] = array("status" => $status);if(!empty($ip)){$hostInfo_all[] = array("ip" => $ip);}else{$hostInfo_all[] = array("ip" => "null");}//把goalHost数组中的name存在空格的替换为-$host_goal_name = str_replace(' ', '-', $goalHost[$i]);//把所有属性绑定主机名$hostinfo = array($host_goal_name => $hostInfo_all);//返回json数据,每次打印一个主机的所有信息,有多少主机就echo多少次,js是统一接收echo json_encode($hostinfo, JSON_UNESCAPED_UNICODE);echo " ";}
三、实际项目
$url,$user,$password
同时这只是服务器的php部分,这部分代码只是获取到数据并把数据以json串的形式传送到前端,具体还需与前端的js进行交互。
通过远程PHP远程调用ZABBIX接口获取数据相关推荐
- java接口对接——别人调用我们接口获取数据
java接口对接--别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...
- 如何利用python调用API接口获取数据进行测试
一.Python 可以使用 requests 库来调用 API 接口获取数据.以下是基本的步骤: 1.安装 requests 库 pip install requests 2.导入 requests ...
- 循环中调用异步接口获取数据
前言 遇到这样一个需求:调用接口,返回一个新闻列表,再循环这个新闻列表,用每个新闻的id异步请求这个新闻的视频地址,这就需要在循环里调用接口.如果用for循环,接口还没请求完成,for循环就已经执行完 ...
- python调用第三方接口获取数据_python调用接口,python接收post请求接口(附完整代码)...
与Scala语言相比,Python有其独特的优势和广泛的应用,python调用接口,因此Spark也推出了PySpark,它在框架上提供了一个使用Python语言的接口,python接收post请求接 ...
- python调用第三方接口获取数据_python 接口实现 供第三方调用的例子
python 接口实现 供第三方调用的例子 实验环境 1.环境问题 python 2.7 以上自带的pyunit bottle 作为一个python的简易服务器 在python安装目录 打开命令窗口( ...
- python调用api接口获取数据_python批量爬取NCBI基因注释并调用谷歌API批量翻译
作者:沙雕学习小组 这里有视频教程:https://www.bilibili.com/video/av87724182 今天想实现这个功能: 差异分析得到了200多个基因(甚至更多) 我要一个一个把基 ...
- java获取接口数据类型_java中调用第三方接口获取数据的方式
//get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...
- java 接受传感器的数据_java中调用第三方接口获取数据的方式
//get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...
- C#调用sap接口获取数据到DataTable
RfcDestination dest = SapManager.getRfcDestination(); RfcRepository rfcrep = dest.Repository; ...
- 如何调用api接口获取其中的数据
part1.API接口可以运用到的场景,主要包括以下几个方面: 1. 应用程序集成:API可以使不同的应用程序相互之间进行集成,比如将某个应用程序的数据传递给另一个应用程序,或者调用另一个应用程序的功 ...
最新文章
- 让“云”无处不在-Citrix Xenserver之一 环境搭建
- 10年Python大牛倾力打造系统Python学习流程图!
- 前端趋势榜:上周最实用和 yyds 的 10 大前端项目 - 211128
- wuxiu.SqlHelper 2.0 源码下载
- Android setColor
- 亲试白天使:华硕家用级无线路由RT-N11+
- 我的docker随笔32:sftp服务部署
- 简历javaweb项目描述怎么写_简历要怎么写
- 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
- Ubuntu下的LibTorrent库编译
- c语言 十进制转十六进制算法,十进制转十六进制算法
- 花生壳实现内网穿透 异地组网
- javawebjsp酒店预订系统 (jsp酒店管理系统jsp民宿预订系统)jsp酒店客房预订系统
- 第九十二章 SQL函数 LPAD
- 棋盘(Checkerboard)算法
- 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝
- FileZilla FTP Server 安全加固
- 颜色不透明度 对应表
- c位边上还有什么位_章泽天聚会站边位,被称太委屈,看清C位的万宝宝后就明白了...
- vscode底部蓝色导航不见了,vue less报错
热门文章
- 从行业到技术,一位嵌入式er带你清晰总览嵌入式行业职业规划
- GAN领风骚!Github盘点2021最惊艳38篇AI论文
- 第七批中国历史文化名镇名村名单出炉 有你家吗?
- 【Rust日报】 2019-05-02
- 脉歌蓝牙耳机线评测_感受蓝牙5.0带来的震撼——脉歌T1000Pro蓝牙耳机轻体验
- python安装face_recognition错误
- 【翻译】图解Janusgraph系列-事务详解(Janusgraph Transactions)
- voxel体素网络滤波器
- mongodb——mongo笔记*
- c++priority_queue详解