最近项目需要获取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 直接从数据库获取主机信息的更多相关文章

  1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息

    1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...

  2. python 调用zabbix api实现查询主机信息,输出所有主机ip

    之前发现搜索出来的主机调用zabbix api信息都不是那么明确,后来通过zabbix官方文档,查到想要的api信息,随后写一篇自己这次项目中用到的api. #!/usr/bin/env python ...

  3. python 调用zabbix api接口实现主机的增删改查

    python程序调用zabbix系统的api接口实现对zabbix_server端主机的增删改查,使用相关功能时候,需要打开脚本中的相关函数. 函数说明: zabbixtools()  调用zabbi ...

  4. 03: zabbix API接口 对 主机、主机组、模板、应用集、监控项、触发器等增删改查

    目录:Django其他篇 01: 安装zabbix server 02:zabbix-agent安装配置 及 web界面管理 03: zabbix API接口 对 主机.主机组.模板.应用集.监控项. ...

  5. 利用zabbix api添加、删除、禁用主机

    python环境配置yum -y install python-pip安装argparse模块pip install -i https://pypi.douban.com/simple/ argpar ...

  6. Zabbix Api的使用

    API使用 zabbix官网文档:https://www.zabbix.com/documentation/2.2/manual/api, Zabbix API是基于JSON-RPC 2.0规格,具体 ...

  7. 基于curl 的zabbix API调用

    1,认证并取得加密字段 curl -i -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0&q ...

  8. zabbix API基本使用方法介绍

    前言: 以下内容根据zabbix 3.2官方文档总结:https://www.zabbix.com/documentation/3.2/manual/api 此文档只是简单的介绍API的基本使用,关于 ...

  9. Python通过Zabbix API获得数据

    Zabbix API查询:https://www.zabbix.com/documentation/2.0/manual/appendix/api/api import json,urllib2 fr ...

随机推荐

  1. 启动tomcat爆错 the JRE could not be found

    启动报错,如下图: 之前更改了了一个较低的jdk的版本看了看一个项目的代码,不知所云,然后再改回来, 混乱之中只要启动Tomcat就出现这种错误,还是无法找到JRE,最后如此解决: 在Windows- ...

  2. xml读取一行数据

    #include<map>#include<iostream>#include<fstream>#include<string>using namesp ...

  3. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  4. BZOJ-1968

    1968: [Ahoi2005]COMMON 约数研究 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 2308  Solved: 1768[Submit] ...

  5. A Simple Math Problem(矩阵快速幂)(寒假闭关第一题,有点曲折啊)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...

  6. A计划(双层bfs)

    A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  7. [DeeplearningAI笔记]ML strategy_2_3迁移学习/多任务学习

    机器学习策略-多任务学习 Learninig from multiple tasks 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.7 迁移学习 Transfer Learninig 神 ...

  8. 【持续更新】JavaScript常见面试题整理

    [重点提前说]这篇博客里的问题涉及到了了JS中常见的的基础知识点,也是面试中常见的一些问题,建议初入职场的园友Mark收藏,本文会持续更新~ 1. 引入JS的三种方式 1.在HTML标签中直接使用,直 ...

  9. selenium元素定位

    在网页自动化测试中,我们要让程序自动模拟我们的点击.输入.悬浮.拖动等操作,完成我们的测试用例组. 输入.点击.打开这样的动词,已经包含在了selenium的方法中,可以直接调用(当然你也可以自己写) ...

  10. Mybatis面试整理

    #{}和${}的区别 #{}是预编译处理,${}是字符串替换. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: Mybatis ...