PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息
最近项目需要获取linux主机的一些信息,如CPU使用率,内存使用情况等。由于我们本身就装了zabbix系统,所以我只用知道如何获取信息即可,总结有两种方法可以获取。
一、通过ZABBIX API获取主机信息
这种方式获取的主机信息相对是比较新的(每分钟更新一次)。但因为每次都需要请求接口,所以相对比较慢,如果并发查询的主机数量比较多,就会非常慢。
开源监控系统ZABBIX的官方文档提供了丰富的API。我这里http请求是用的Guzzle 6。当然你也可以用php内置的curl函数自己写一个http请求,非常简单。
1、用户认证以获取token。
$responst = $this->httpClient->request('POST', 'http://zabbix.xxxxx.com/zabbix/api_jsonrpc.php', [
'headers' => [
'Content-Type' => 'application/json-rpc',
],
'json' => [
'jsonrpc' => '2.0',
'method' => 'user.login',
'params' => [
"user"=> 'your username',
"password"=> 'your password'
],
'id' => 1,
'auth' => null
],
]);
由于这里是用户认证,所有 auth 可以直接写 null 。返回结果为:
{
"jsonrpc": "2.0",
"result": "0424bd59b807674191e7d77572075f33",
"id": 1
}
result 里就是 token ,在后面的请求中都是需要的。
2、根据主机的IP获取hostid。
$responst = $this->httpClient->request('POST', 'http://zabbix.xxxxx.com/zabbix/api_jsonrpc.php', [
'headers' => [
'Content-Type' => 'application/json-rpc',
],
'json' => [
'jsonrpc' => '2.0',
'method' => 'host.get',
'params' => [
"output" => ["hostid"],
"filter" => [
"host" => '192.168.1.1'
]
],
'id' => 1,
'auth' =>"0424bd59b807674191e7d77572075f33"
], ]);
上面的 output 是限制返回项,如果想要返回所有的主机信息,可以去掉 output 。上面请求的返回结果为:
{
"jsonrpc": "2.0",
"result": [
{
"hostid": "10160",
}
],
"id": 1
}
3、获取主机的监控项itemid。
zabbix提供了很多监控项,那么问题来了,哪些才是我们需要的呢?下面是博主给大家介绍几个常用的监控项:
$items = array(
'vm.memory.size[available]', // 内存可用值 (KB)
'vm.memory.size[total]', // 内存总数 (KB)
'system.cpu.util[,idle]', // 当前CPU IDLE值 (%)
'vfs.fs.size[/,used]', // 当前 / 盘使用值 (KB)
'vfs.fs.size[/,total]', // 当前 / 盘总数 (KB)
);
$item_ids = array();
foreach ($items as $item) {
$responst = $this->httpClient->request('POST', $this->url, [
'headers' => [
'Content-Type' => 'application/json-rpc',
],
'json' => [
'jsonrpc' => $this->jsonrpc,
'method' => $this->METHOD_ITEM_GET,
'params' => [
"output" => 'extend',
"hostids" => $this->hostid,
"search" => [
"key_" => $item
],
'sortfield' => 'name'
],
'id' => 1,
'auth' => $this->token
],
]);
$body = json_decode($responst->getBody()->getContents());
$item_ids[] = $body->result[0]->itemid;
}
返回的结果为:
{
"jsonrpc": "2.0",
"result": [
{
"itemid": "23298",
"type": "0",
"snmp_community": "",
"snmp_oid": "",
"hostid": "10084",
"name": "Context switches per second",
"key_": "vm.memory.size[available]",
"delay": "60",
"history": "7",
"trends": "365",
"lastvalue": "2552",
"lastclock": "1351090998",
"prevvalue": "2641",
"state": "0",
"status": "0",
"value_type": "3",
"trapper_hosts": "",
"units": "sps",
"multiplier": "0",
"delta": "1",
"snmpv3_securityname": "",
"snmpv3_securitylevel": "0",
"snmpv3_authpassphrase": "",
"snmpv3_privpassphrase": "",
"snmpv3_authprotocol": "0",
"snmpv3_privprotocol": "0",
"snmpv3_contextname": "",
"formula": "1",
"error": "",
"lastlogsize": "0",
"logtimefmt": "",
"templateid": "22680",
"valuemapid": "0",
"delay_flex": "",
"params": "",
"ipmi_sensor": "",
"data_type": "0",
"authtype": "0",
"username": "",
"password": "",
"publickey": "",
"privatekey": "",
"mtime": "0",
"lastns": "564054253",
"flags": "0",
"interfaceid": "1",
"port": "",
"description": "",
"inventory_link": "0",
"lifetime": "0",
"evaltype": "0"
}
],
"id": 1
}
4、获取对应监控项的历史信息
上一步中我们获取到了所有对应监控项的itemid。现在获取这些监控项的历史信息。这个接口中的信息是每分钟更新一次的,所以具体要去多久的信息看各自的需求。
$items_result = array();
foreach ($this->itemids as $k=>$itemid) {
if($this->items[$k] == 'system.cpu.util[,idle]') {
$history = 0;
}else {
$history = 3;
} $responst = $this->httpClient->request('POST', 'http://zabbix.xxxxx.com/zabbix/api_jsonrpc.php', [
'headers' => [
'Content-Type' => 'application/json-rpc',
],
'json' => [
'jsonrpc' => '2.0',
'method' => 'history.get',
'params' => [
"output" => 'extend',
"history" => $history,
"itemids" => $itemid,
"sortfield" => 'clock',
'sortorder' => 'DESC',
'limit' => '1',
],
'id' => 1,
'auth' => $this->token
],
]);
$body = json_decode($responst->getBody()->getContents()); if(property_exists($body, 'result')) {
$items_result[$this->items[$k]] = $body->result[0]->value;
}else {
Log::error(json_encode($body));
return false;
}
}
返回结果为:
{
"jsonrpc": "2.0",
"result": [
{
"itemid": "23296",
"clock": "1351090996",
"value": "0.0850",
"ns": "563157632"
},
{
],
"id": 1
}
最终的结果应该为:
array:5 [▼
"system.cpu.util[,idle]" => 98.9622
"vfs.fs.size[/,total]" => "42141548544"
"vfs.fs.size[/,used]" => "6917797137"
"vm.memory.size[available]" => "57394996906"
"vm.memory.size[total]" => "67439050752"
]
二、直接从数据库获取信息
这种方式获取的数据并不是最新的(每小时更新一次)。但查询速度大大的提升了。
因为我是用laravel框架写的代码,所有就偷懒一下,不写原生的sql语句了,大家凑合看。
1、通过ip从hosts表获取hostid
$host_id = Host::where('host', '10.50.150.80')->value('hostid');
返回结果为: 11101
2、通过hostid从items表获取items监控项的itemid
$items = array(
'vm.memory.size[available]', // 内存可用值 (KB)
'vm.memory.size[total]', // 内存总数 (KB)
'system.cpu.util[,idle]', // 当前CPU IDLE值 (%)
'vfs.fs.size[/,used]', // 当前 / 盘使用值 (KB)
'vfs.fs.size[/,total]', // 当前 / 盘总数 (KB)
); $item_ids = Item::where('hostid', 11106)->whereIn('key_', $items)->pluck('itemid', 'key_');
返回结果为:
Collection {#183 ▼
#items: array:5 [▼
"system.cpu.util[,idle]" => 152511
"vfs.fs.size[/,total]" => 155584
"vfs.fs.size[/,used]" => 155587
"vm.memory.size[available]" => 152533
"vm.memory.size[total]" => 152534
]
}
3、通过itemid从trends表或trends_uint表获取历史信息
$result = array();
foreach ($item_ids as $key=>$item_id) {
if($key == 'system.cpu.util[,idle]') {
$value = Trend::where('itemid', $item_id)->orderBy('clock', 'DESC')->value('value_avg');
}else {
$value = TrendsUint::where('itemid', $item_id)->orderBy('clock', 'DESC')->value('value_avg');
}
$result[$key] = $value;
}
返回结果为:
array:5 [▼
"system.cpu.util[,idle]" => 98.9622
"vfs.fs.size[/,total]" => "42141548544"
"vfs.fs.size[/,used]" => "6917797137"
"vm.memory.size[available]" => "57394996906"
"vm.memory.size[total]" => "67439050752"
]
PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息的更多相关文章
- mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息
1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...
- python 调用zabbix api实现查询主机信息,输出所有主机ip
之前发现搜索出来的主机调用zabbix api信息都不是那么明确,后来通过zabbix官方文档,查到想要的api信息,随后写一篇自己这次项目中用到的api. #!/usr/bin/env python ...
- python 调用zabbix api接口实现主机的增删改查
python程序调用zabbix系统的api接口实现对zabbix_server端主机的增删改查,使用相关功能时候,需要打开脚本中的相关函数. 函数说明: zabbixtools() 调用zabbi ...
- 03: zabbix API接口 对 主机、主机组、模板、应用集、监控项、触发器等增删改查
目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...
- 利用zabbix api添加、删除、禁用主机
python环境配置yum -y install python-pip安装argparse模块pip install -i https://pypi.douban.com/simple/ argpar ...
- Zabbix Api的使用
API使用 zabbix官网文档:https://www.zabbix.com/documentation/2.2/manual/api, Zabbix API是基于JSON-RPC 2.0规格,具体 ...
- 基于curl 的zabbix API调用
1,认证并取得加密字段 curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0&q ...
- zabbix API基本使用方法介绍
前言: 以下内容根据zabbix 3.2官方文档总结:https://www.zabbix.com/documentation/3.2/manual/api 此文档只是简单的介绍API的基本使用,关于 ...
- Python通过Zabbix API获得数据
Zabbix API查询:https://www.zabbix.com/documentation/2.0/manual/appendix/api/api import json,urllib2 fr ...
随机推荐
- JqueryMobile基础之创建页面
首先简答介绍一下JQueryMobile吧,我觉得用一句话来讲就是可以 "写更少的代码,做更多的事情" : 它可以通过一个灵活及简单的方式来布局网页,且兼容所有移动设备.这也是我自 ...
- LeetCode 495. Teemo Attacking (提莫攻击)
In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned ...
- gulp-prompt入个了门
gulp-prompt版本:0.4.1 源码:gulp-prompt 一.gulp-prompt的简介 gulp-prompt 是一个基于gulp的命令行提示. 我们可以用它来完成命令行中互动功能. ...
- 【JAVA零基础入门系列】Day13 Java类的继承与多态
继承是类的一个很重要的特性,什么?你连继承都不知道?你是想气死爸爸好继承爸爸的遗产吗?(滑稽) 开个玩笑,这里的继承跟我们现实生活的中继承还是有很大区别的,一个类可以继承另一个类,继承的内容包括属性跟 ...
- HDU 5242 Game(三个贪心)
Game Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Milking Time
Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her producti ...
- Azure ARM虚拟机部署反恶意软件-安全扩展
Azure虚拟机,默认情况下没有安装杀毒软件.如果您有此需求可以通过Azure 扩展进行安装,有关Azure反恶意软件的官方说明请参考:https://docs.azure.cn/zh-cn/secu ...
- DOM Exception error
INDEX_SIZE_ERR code 1 索引是负值,或者超过了索引值 DOMSTRING_SIZE_ERR code 2 ...
- 谷歌浏览器Chrome播放rtsp视频流解决方案
找半天,HTML5的可以支持RTMP 但是无法播放RTSP,flash也止步于RTMP,最后同事推荐了个开源的好东东 VLC ,请教谷歌大神之后,这货果然可以用来让各浏览器(IE activex方式, ...
- 学习笔记-----php搭建用户管理系统
后台:php,数据库:mysql,前端:html,css,js; 主要页面介绍: 1.php连接数据库后台,读取数据并将其以表格的形式显示,并且有添加,编辑,删除,分页等功能: 2.php用于添加用户 ...