【わたしに♥おまかせ Zabbix⑦】グラフのHistoryとTrendが切り替わる条件




こんにちは、プラットフォーム技術部の齊藤(沙)です。
これまでZabbixに関していろいろ確認してきましたが、まだまだ知らないこと、わからないことが沢山あるなと感じる日々です。
もっとZabbixについて理解を深めたい!と思っていたところ、
「ソースを読むのです。そーすれば理解は深まります。」
という神(先輩)の声が聞こえたため、今回はZabbixのソースから仕様を調べることにチャレンジしてみたいと思います。
前回の記事はこちら。
まとめ記事作りました♥
調査対象
今回は以下の仕様について調査を行います。
WebUI上のグラフ描画にてHistoryとTrendの表示が切り替わる条件
オンラインマニュアルには以下の記載があります。
※ 今回の調査はv3.0.20のソースにて実施します。
- longevity of item history. For example, item history can be kept for 14 days. In that case, any data older than the fourteen days will be coming from trends.
- data congestion in the graph. If the amount of seconds to display in a horizontal graph pixel exceeds 3600/16, trend data are displayed (even if item history is still available for the same period).
- if trends are disabled, item history is used for graph building – if available for that period. This is supported starting with Zabbix 2.2.1 (before, disabled trends would mean an empty graph for the period even if item history was available).
ふむふむ。わかったようなわからないような。
特に「水平グラフのピクセルに表示する秒数が3600/16を超える」ってどういう状態なんだろう。。。読めば読むほどわからないので疑問を解消するために早速ソースを見てみます。
ソースを探そう
まずはソースをダウンロードし、解凍してみます。今回はWebUIの画面描画に関する調査なので「frontends」内のソースを確認してみます。



沢山あります・・・。どれだろう。。。
実際にWebUIでグラフ画面を表示させてみると、「charts.php」が参照されているようなので中を覗いてみます。
charts.phpの中でグラフを描画している箇所は以下のようです。
$graph = new CLineGraphDraw(getRequest('type')); $graph->setPeriod($timeline['period']); ~中略~ if (isset($_REQUEST['from'])) { $graph->setFrom($_REQUEST['from']); } if (isset($_REQUEST['width'])) { $graph->setWidth($_REQUEST['width']); } if (isset($_REQUEST['height'])) { $graph->setHeight($_REQUEST['height']); } ~中略~ $graph->draw();
「CLineGraphDraw.php」内の「draw」ファンクションを呼び出しているようなのでさらに覗いてみます。
※ 以下はdrawファンクションの冒頭のみ抜粋
public function draw() { $start_time = microtime(true); set_image_header(); $this->selectData(); if (isset($this->axis_valuetype[GRAPH_YAXIS_SIDE_RIGHT])) { $sides[] = GRAPH_YAXIS_SIDE_RIGHT; }
「$this->selectData();」というそれっぽい呼び出しがありました!
さらにさらに「selectData」ファンクションを覗いて見るとHistoryとTrendを切り替えていそうな箇所を発見。
$trendsEnabled = $config['hk_trends_global'] ? ($config['hk_trends'] > 0) : ($item['trends'] > 0); if (!$trendsEnabled || (($item['history'] * SEC_PER_DAY) > (time() - ($this->from_time + $this->period / 2)) && ($this->period / $this->sizeX) <= (ZBX_MAX_TREND_DIFF / ZBX_GRAPH_MAX_SKIP_CELL))) { $this->dataFrom = 'history'; array_push($sql_arr, 'SELECT itemid,'.$calc_field.' AS i,'. 'COUNT(*) AS count,AVG(value) AS avg,MIN(value) as min,'. 'MAX(value) AS max,MAX(clock) AS clock'. ' FROM history '. ' WHERE itemid='.zbx_dbstr($this->items[$i]['itemid']). ' AND clock>='.zbx_dbstr($from_time). ' AND clock<='.zbx_dbstr($to_time). ' GROUP BY itemid,'.$calc_field , 'SELECT itemid,'.$calc_field.' AS i,'. 'COUNT(*) AS count,AVG(value) AS avg,MIN(value) AS min,'. 'MAX(value) AS max,MAX(clock) AS clock'. ' FROM history_uint '. ' WHERE itemid='.zbx_dbstr($this->items[$i]['itemid']). ' AND clock>='.zbx_dbstr($from_time). ' AND clock<='.zbx_dbstr($to_time). ' GROUP BY itemid,'.$calc_field ); }
一部、計算してそうな箇所の数値が変数になっているので内容を確認するため、「defines.inc.php」を覗くと以下の記載がありました。
define('ZBX_MAX_TREND_DIFF', 3600); define('ZBX_GRAPH_MAX_SKIP_CELL', 16);
上記を踏まえると、冒頭で疑問だった「水平グラフのピクセルに表示する秒数が3600/16を超える」という状態は、以下の処理を指していて、以下の式が成り立つときもHistoryデータがグラフ描画に利用されているようです。
($this->period / $this->sizeX) <= (ZBX_MAX_TREND_DIFF / ZBX_GRAPH_MAX_SKIP_CELL)
上記式の中の「period」はグラフの表示期間を、「sizeX」はWeb画面上のグラフを描画する範囲の横軸のピクセル数を表すようなので、
となり、HistoryとTrendデータどちらを利用するかはグラフの表示期間と画面のサイズによって変動するんだということがわかりました!
グラフ描画に用いられるデータ量が多すぎるとグラフが非常に見難くなるのでそれを回避するためのロジックがしっかりと組み込まれているんですね。Zabbix素敵。
でもなんで225(3600/16)なんだろう。試行錯誤の賜物なのか・・・。それともなんらかのロジックによって生み出された数字なのか・・・。
また時間があるときに「defines.inc.php」の値を書き換えてみていろいろごにょごにょしてみたいと思います。
まとめ
マニュアルを読んだだけでは具体的に理解することができませんでしたが、実際ソースを読んでみるとより具体的に理解することができました。
仕様がわからなかったらソースを読もう!を合言葉に今後もZabbixのことをもっと知っていきたいと思います。
次回の記事はこちら。
Zabbixに関するお問い合わせはこちらからお願いいたします。