项目背景介绍: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=3cpu是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接口获取数据相关推荐

  1. java接口对接——别人调用我们接口获取数据

    java接口对接--别人调用我们接口获取数据,我们需要在我们系统中开发几个接口,给对方接口规范文档,包括访问我们的接口地址,以及入参名称和格式,还有我们的返回的状态的情况, 接口代码: package ...

  2. 如何利用python调用API接口获取数据进行测试

    一.Python 可以使用 requests 库来调用 API 接口获取数据.以下是基本的步骤: 1.安装 requests 库 pip install requests 2.导入 requests ...

  3. 循环中调用异步接口获取数据

    前言 遇到这样一个需求:调用接口,返回一个新闻列表,再循环这个新闻列表,用每个新闻的id异步请求这个新闻的视频地址,这就需要在循环里调用接口.如果用for循环,接口还没请求完成,for循环就已经执行完 ...

  4. python调用第三方接口获取数据_python调用接口,python接收post请求接口(附完整代码)...

    与Scala语言相比,Python有其独特的优势和广泛的应用,python调用接口,因此Spark也推出了PySpark,它在框架上提供了一个使用Python语言的接口,python接收post请求接 ...

  5. python调用第三方接口获取数据_python 接口实现 供第三方调用的例子

    python 接口实现 供第三方调用的例子 实验环境 1.环境问题 python 2.7 以上自带的pyunit bottle 作为一个python的简易服务器 在python安装目录 打开命令窗口( ...

  6. python调用api接口获取数据_python批量爬取NCBI基因注释并调用谷歌API批量翻译

    作者:沙雕学习小组 这里有视频教程:https://www.bilibili.com/video/av87724182 今天想实现这个功能: 差异分析得到了200多个基因(甚至更多) 我要一个一个把基 ...

  7. java获取接口数据类型_java中调用第三方接口获取数据的方式

    //get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...

  8. java 接受传感器的数据_java中调用第三方接口获取数据的方式

    //get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...

  9. C#调用sap接口获取数据到DataTable

    RfcDestination dest = SapManager.getRfcDestination(); RfcRepository rfcrep = dest.Repository;       ...

  10. 如何调用api接口获取其中的数据

    part1.API接口可以运用到的场景,主要包括以下几个方面: 1. 应用程序集成:API可以使不同的应用程序相互之间进行集成,比如将某个应用程序的数据传递给另一个应用程序,或者调用另一个应用程序的功 ...

最新文章

  1. 让“云”无处不在-Citrix Xenserver之一 环境搭建
  2. 10年Python大牛倾力打造系统Python学习流程图!
  3. 前端趋势榜:上周最实用和 yyds 的 10 大前端项目 - 211128
  4. wuxiu.SqlHelper 2.0 源码下载
  5. Android setColor
  6. 亲试白天使:华硕家用级无线路由RT-N11+
  7. 我的docker随笔32:sftp服务部署
  8. 简历javaweb项目描述怎么写_简历要怎么写
  9. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
  10. Ubuntu下的LibTorrent库编译
  11. c语言 十进制转十六进制算法,十进制转十六进制算法
  12. 花生壳实现内网穿透 异地组网
  13. javawebjsp酒店预订系统 (jsp酒店管理系统jsp民宿预订系统)jsp酒店客房预订系统
  14. 第九十二章 SQL函数 LPAD
  15. 棋盘(Checkerboard)算法
  16. 生鲜配送ERP系统_对商品模块数据模型与界面设计的思考【Java 开源版】杭州生鲜配送系统_升鲜宝_SaaS全链路生鲜供应链管理系统_升鲜宝
  17. FileZilla FTP Server 安全加固
  18. 颜色不透明度 对应表
  19. c位边上还有什么位_章泽天聚会站边位,被称太委屈,看清C位的万宝宝后就明白了...
  20. vscode底部蓝色导航不见了,vue less报错

热门文章

  1. 从行业到技术,一位嵌入式er带你清晰总览嵌入式行业职业规划
  2. GAN领风骚!Github盘点2021最惊艳38篇AI论文
  3. 第七批中国历史文化名镇名村名单出炉 有你家吗?
  4. 【Rust日报】 2019-05-02
  5. 脉歌蓝牙耳机线评测_感受蓝牙5.0带来的震撼——脉歌T1000Pro蓝牙耳机轻体验
  6. python安装face_recognition错误
  7. 【翻译】图解Janusgraph系列-事务详解(Janusgraph Transactions)
  8. voxel体素网络滤波器
  9. mongodb——mongo笔记*
  10. c++priority_queue详解