注意事項
個人的な覚書のため、テスト等十分行っていない。
流用する場合は自己責任で。
取得量が多いとAPIタイムアウトするかも。
DB負荷がすごく高まるかも。
環境
- CentOS Linux release 7.3.1611 (Core)
- php-5.4.16
- mariadb-5.5.52
- httpd-2.4.6-45
- Zabbix 2.2.17
- PhpZabbixApi-2.2.5
説明
PhpZabbixApiを用いて、
或るZabbix登録ホストの或るアイテムキーのヒストリを指定した月の一か月間分を取得する。
使い方
PhpZabbixApi-2.2.5の動作環境を作る。
値を取得したいホスト一覧を作成する。
書式:Zabbix登録ホスト名を1行1ホストで記載
例:
$ cat hostnames.txt
Zabbix server
aaa```
値を取得したいアイテムキー一覧を作成する。
書式:アイテムキーを1行1アイテムキーで記載
例:
```$ cat itemkeys.txt
net.if.in[ens160]
net.if.out[ens160]```
月の指定方法
書式:yyyy-mm
例:2017-04
## 動作概要
指定した月の月初 00:00:00のUnixtime取得
指定した月の翌月の月初 00:00:00のUnixtime取得して1減算
(指定した月の月末23:59:59を得る)
ホスト一覧テキストからホスト情報を取得してホストの配列へ
ホストの配列からホストを取り出す
アイテムキー一覧テキストからアイテムキーを取り出す
取り出したホストの、アイテムキー一覧のアイテム情報をアイテムの配列へ
アイテムの配列からアイテムを取り出す
該当アイテムのヒストリを取得して出力し、ヒストリ配列を空に
アイテムの配列がなくなるまでループ
アイテム配列を空に
ホストの配列がなくなるまでループ
## 使い方
$ php get-history.php -h <ホスト一覧> -i <アイテム一覧> -m yyyy-mm
例:
```$ php get-history.php -h hostnames.txt -i itemkeys.txt -m 2017-04```
## スクリプト
```php:get-hisotry.php
<?php
// -h hostnames.txt -i itemkeys.txt -m 2017-04
$pza_path = '/root/PhpZabbixApi-2.2.5/build/ZabbixApi.class.php';
$z_addr = 'localhost';
$z_user = 'Admin';
$z_pass = 'zabbix';
// -----------------------------------------------------------------
$options = getopt('h:i:m:');
$hostnames = file($options['h'],FILE_IGNORE_NEW_LINES);
$itemkeys = file($options['i'],FILE_IGNORE_NEW_LINES);
$month = $options['m'];
date_default_timezone_set('Asia/Tokyo');
$next_month = date('Y-m', strtotime($month . '+1 month'));
$firstDate = date('Y-m-d', strtotime('first day of ' . $month));
$lastDate = date('Y-m-d ', strtotime('first day of ' . $next_month));
$unix_firstDate = strtotime($firstDate);
$unix_lastDate = strtotime($lastDate) - 1;
require "$pza_path";
use ZabbixApi\ZabbixApi;
try {
$api = new ZabbixApi("http://$z_addr/zabbix/api_jsonrpc.php", "$z_user", "$z_pass");
foreach ($hostnames as $hostname) {
$hosts[] = $api->hostGet(array(
'output' => array('hostid','host'),
// 'selectItems' => array('itemid','name'),
'filter' => array('host' => "$hostname")
));
}
// var_dump($hosts);
foreach ($hosts as $host) {
$hid = $host[0]->hostid;
$hname = $host[0]->host;
// echo "$hname\n";
foreach ($itemkeys as $itemkey) {
// echo "$hname,$itemkey\n";
$items[] = $api->itemGet(array(
'output' => array('itemid','name','value_type','key_'),
'hostids' => "$hid",
'filter' => array('key_' => "$itemkey")
));
}
// var_dump($items);
foreach ($items as $item) {
if ($item) {
$iid = $item[0]->itemid;
$ihis = $item[0]->value_type;
$in = $item[0]->name;
// echo "$in\n";
$ik = $item[0]->key_;
$histories[] = $api->historyGet(array(
// 'output' => array('itemid','clock','value'),
'output' => 'extend',
'history' => "$ihis",
'itemids' => "$iid",
'time_from' => "$unix_firstDate",
'time_till' => "$unix_lastDate",
// 'limit' => 5
));
print "$hname:$ik\n";
foreach ($histories as $history) {
foreach ($history as $hist) {
print date("Ymd-H:i:s", intval($hist->clock)) . ",$hist->value\n";
}
}
// var_dump($histories);
$histories = array();
}
}
$items = array();
}
} catch (Exception $e) {
echo $e->getMessage() . "\n";
}
?>
出力
書式:
ホスト2つアイテム2つが記載されていた場合
ホスト1アイテム1
ヒストリ出力
ホスト1アイテム2
ヒストリ出力
ホスト2アイテム1
ヒストリ出力
ホスト2アイテム2
ヒストリ出力
例:
net.if.in[ens160]
20170401-12:29:26,3072
20170401-12:30:26,1888
20170401-12:31:26,1664
20170401-12:32:26,3224
20170401-12:33:26,1576
20170401-12:34:26,13160
20170401-12:35:26,2352
20170401-12:36:26,2168
20170401-12:37:26,2392
20170401-12:38:26,3136
20170401-12:39:26,3008
~省略~
20170402-13:11:26,32
20170402-13:12:26,32
20170402-13:13:26,32
Zabbix server:net.if.out[ens160]
20170401-12:29:27,20312
20170401-12:30:27,11536
20170401-12:31:27,8888
20170401-12:32:27,10664
~省略~```
# 反省
普通にSQL書く方が楽だった気がする。
なんかとりあえず全部最初のtryの中に書いている。
出力の柔軟性がない。
(ヒストリを取得する手順を単にループしているだけなスクリプトになっているため)
出力形式について、イケてる気がしない。
てか、グラファナでサクッと取得できるんじゃないか。
グラファナ使ったことないから今度試そうかな。(試すとは言ってない)