利用ZABBIX API擷取伺服器資訊

來源:互聯網
上載者:User
有時候我們需要監控伺服器的運行狀態,ZABBIX就是這樣一個線上監控系統。同時ZABBIX提供了API等方式供其他程式來擷取資料 ,本文就以PHP執行個體代碼分享來讓大家瞭解如何通過ZABBIX擷取伺服器資訊。

由於我們本身就裝了zabbix系統,所以我只用知道如何擷取資訊即可,總結有兩種方法可以擷取。

安裝可以參考:centos7安裝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"]


相關推薦:

centos7安裝zabbix的詳細介紹

zabbix實現郵件警示執行個體教程

詳解關於zabbix監控伺服器時間問題的執行個體

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.