Zabbix あるホストのあるアイテムの１か月分のヒストリ取得

# 注意事項
個人的な覚書のため、テスト等十分行っていない。
流用する場合は自己責任で。

取得量が多いと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登録ホスト名を１行１ホストで記載
例：
```$ cat hostnames.txt
Zabbix server
aaa```

値を取得したいアイテムキー一覧を作成する。
書式：アイテムキーを１行１アイテムキーで記載
例：
```$ cat itemkeys.txt
net.if.in[ens160]
net.if.out[ens160]```

月の指定方法
書式：yyyy-mm
例：2017-04

## 動作概要
指定した月の月初 00:00:00のUnixtime取得
指定した月の翌月の月初 00:00:00のUnixtime取得して１減算
（指定した月の月末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";
}

?>
```
## 出力
書式：
ホスト２つアイテム２つが記載されていた場合
ホスト１アイテム１
ヒストリ出力
ホスト１アイテム２
ヒストリ出力
ホスト２アイテム１
ヒストリ出力
ホスト２アイテム２
ヒストリ出力

例：
```Zabbix server: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の中に書いている。
出力の柔軟性がない。
（ヒストリを取得する手順を単にループしているだけなスクリプトになっているため）
出力形式について、イケてる気がしない。
てか、グラファナでサクッと取得できるんじゃないか。
グラファナ使ったことないから今度試そうかな。（試すとは言ってない）