LoginSignup
0
2

More than 5 years have passed since last update.

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

Posted at

注意事項

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

取得量が多いと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

スクリプト

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
ヒストリ出力

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2