最近项目需要获取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. php mysqli MySQL server has gone away 问题分析

    结论 mysqli没有处理对端(MySQL server)的断开请求.在send时,收到对端(MySQL server)的RST,会打印MySQL server has gone away. 环境 x ...

  2. ssm框架的整合

    首先创建一个web工程,我这里使用的IDE为eclipse. 结果目录如下: 添加相关的jar包: 接下来是完成配置文件 首先我们先配置web.xml: <?xml version=" ...

  3. 工具:Entity Framework Profiler

    使用方式: 1.项目中添加引用:EntityFrameworkProfiler.Appender 2.应用程序启动方法中添加下面一行代码: HibernatingRhinos.Profiler.App ...

  4. code force 424 A - Office Keys

    There are n people and k keys on a straight line. Every person wants to get to the office which is l ...

  5. D - Zhenya moves from the dormitory URAL - 2015

    After moving from his parents’ place Zhenya has been living in the University dormitory for a month. ...

  6. Toxophily

    Problem Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and ...

  7. 分布式框架Dubbo入门

    Dubbo简介 Dubbo是一个Alibaba开源额分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.dubbo就是个服务框架,只有在分布式的时候,才有dubb ...

  8. Jquery基础笔记

    1.$(function(){               等价于     window.onload=function(){ })                               } 2 ...

  9. 分享如何将git项目导入GitHub(附创建分支)

    前言:我们应该很多都会有自己的私有项目,大多情况都是存放在自己的硬盘中,今天我分享一下怎么讲自己的私有项目更新到GitHub上,这样再也不用担心项目丢失了. 一:下载git 下载链接git链接,根据自 ...

  10. js数组元素的添加和删除

    简单测试例子: var arr = new Array(); arr[0] = "aaa"; arr[1] = "bbb"; arr[2] = "cc ...