2015年3月9日月曜日

ZabbixのAPIを使ってhistoryの一覧を取得してみた

概要

特定のホストに紐づくアイテムの履歴は「ヒストリ」と呼ばれる機能で提供されます
WebUIでヒストリ情報を確認したい場合、過去1,000個分のヒストリしか確認することができません
アイテムを30秒間隔で取得している場合には

30 * 1000 = 30,000 sec = 500 min = 8.3 hour

しか履歴を確認することができません

ZabbixAPIを使えばヒストリをすべて取得できそうだったので試してみました
言語はPHPを使用しています
PHPを使ってZabbixAPIをコールする方法の準備は済ませておいてください

環境

  • CentOS 6.3 64bit Final
  • Zabbix Server 2.0.5
  • Zabbix API 1.4
  • PHP 5.3.3

ヒストリ取得スクリプト

さっそくスクリプトを紹介します
使うためにはソース上の設定部分を直接修正します
次で使い方を紹介します

  • get_history.php
<?php

require 'ZabbixApi.class.php';

try {
    $hostid='10116';
    $itemid='28908';
    $history=3; // 0 - float; 1 - string; 2 - log; 3 - integer; 4 - text.

    $api = new ZabbixApi('http://hostname/api_jsonrpc.php', 'your user name', 'your uesrs password');
    $res = $api->historyGet(
      array(
        'history' => $history,
        'output' => 'extend',
        'hostids' => array (
          $hostid
        ),
        'itemids' => array (
          $itemid
        )
        #,'limit' => 10
      )
    );
    foreach ($res as $result) {
      $value = $result->value;
      $clock = $result->clock;
      echo $value . "," . date("Y/m/d H:i:s", intval($clock)) . "\n";
    }
} catch (Exception $e) {
    echo $e->getMessage() . "\n";
}

?>

使い方

今回は取得したいヒストリ情報は「指定したホストに紐づくアイテムのヒストリ」とします

サンプルで修正する箇所は以下の通り

  • $hostid・・・ホストのIDを記載します、IDはWebUIでホスト設定画面を表示すればURLに記載されます
  • $itemid・・・取得したいヒストリのアイテムIDを記載します、これもWebUIからアイテムの設定画面を表示すればURLに記載されています
  • hostname・・・ZabbixServerが起動しているサーバのホスト名を記載します
  • username・・・サンプルソースの「your user name」の部分を変更してください、WebUIにログインするためのユーザ名を記載すればOKです
  • password・・・サンプルソースの「your users password」の部分を変更してください

最低限上記を修正してください
必要に応じて以下も修正してください

  • $history・・・ヒストリとして保存されているアイテムの型を指定します、ここで型の指定が間違っているとうまくレスポンスが取得できず空が返却されてしまいます、デフォルトでは「3」のintegerが設定されています
  • limit・・・ヒストリがあまりにありすぎる場合、APIがタイムアウトしてしまいます、その場合はlimitを調整してください、もしくは開始時間(time_from)と終了時間(time_till)を指定して件数を削減してください

で実行は

php get_history.php

でOKです
結果は時系列順に「値,タイムスタンプ」のcsv形式で標準出力されます
表示形式等は必要に応じて変更していただければと思います

一応自分の場合はこれで2万弱のヒストリをlimitなしで取得することができました
APIのタイムアウトを調整できれば1回のリクエストで大量のヒストリを取得できると思います

参考サイト

0 件のコメント:

コメントを投稿