noob

底辺オペレーターのメモ

Zabbix 2.2 イベントの詳細にトリガの説明(comments)を表示させる

Zabbixでログ監視を設定したのは良いものの,上がってきたイベントにはログが表示されてなくて,わざわざヒストリを見にいくのは不便だったので無理やり改造してみた.

改造の流れ

  • 「トリガの設定」で「名前」にマクロ{ITEM.VALUE}を入れるだけで,「イベント詳細」画面左カラムにある「イベントソースの詳細」テーブルの「トリガー」行にログが表示される.
    • 悪くないけど「トリガ画面」の「名前」列の表示もログになってしまって微妙だったのでもう少し頑張ってみる.
  • 「イベント詳細」画面左カラム「イベント詳細」テーブルに「イベント」行がある.
    • デフォルトだとトリガの名前が入ってるけど,ここにログが表示されれば入れられれば収まりがよさそう.
      • 「トリガの設定」に「説明」(comments)欄があるのでここにマクロ{ITEM.VALUE}を書いて,それが上の「イベント」行に表示されるようにしよう.

改造内容

表示するデータを作っているinclude/events.inc.phpmake_event_details()内にある
CMacrosResolverHelper::resolveEventDescription
CMacrosResolverHelper::resolveTriggerDescriptions
あたりに変更したら行けそうにみえたけど,マクロ{ITEM.VALUE}の変換結果が常に最新のログになってしまったので少し強引に改造.

events.php

--- events.php.ORG  2013-12-11 02:45:09.000000000 +0900
+++ events.php      2014-02-07 14:11:58.165892875 +0900
@@ -652,7 +652,7 @@
                                'triggerids' => zbx_objectValues($events, 'objectid'),
                                'selectHosts' => array('hostid'),
                                'selectItems' => array('name', 'value_type', 'key_'),
-                               'output' => array('description', 'expression', 'priority', 'flags', 'url')
+                               'output' => array('description', 'expression', 'priority', 'flags', 'url', 'comments')
                        ));
                        $triggers = zbx_toHash($triggers, 'triggerid');
  • トリガのデータを取得しているところで「説明」欄の内容も取得するように変更.

include/events.inc.php

--- include/events.inc.php.ORG  2013-12-11 02:45:05.000000000 +0900
+++ include/events.inc.php      2014-02-07 11:01:27.587964245 +0900
@@ -179,7 +179,13 @@
        $config = select_config();
        $table = new CTableInfo();
 
-       $table->addRow(array(_('Event'), CMacrosResolverHelper::resolveEventDescription(array_merge($trigger, $event))));
+       $trigger_for_comments = $trigger;
+       $trigger_for_comments['description'] = $trigger_for_comments['comments'];
+
+       $table->addRow(array(_('Event'), CMacrosResolverHelper::resolveEventDescription(zbx_array_merge($trigger_for_comments, array(
+               'clock' => $event['clock'],
+               'ns' => $event['ns']
+       )))));
        $table->addRow(array(_('Time'), zbx_date2str(_('d M Y H:i:s'), $event['clock'])));
 
        if ($config['event_ack_enable']) {
  • 「イベント詳細」画面左カラム「イベント詳細」テーブル「イベント」行を作成するところで内容を差し替える.
    • CMacrosResolverHelper::resolveEventDescriptionが引数にとる配列のキーdescriptionを変換していたので,これを変更する.
      • 他に影響が出ないように引数用の配列$triggerを別配列$trigger_for_commentsにコピー.
      • 配列$trigger_for_commentsのキーdescriptionをキーcommentsで上書き.
        • キーcommentsは上記events.phpの改造で使えるようになっている.
    • CMacrosResolverHelper::resolveEventDescriptionの引数を配列$trigger_for_commentsに変更.

おまけ

「最新のイベント」画面の「説明」カラムにトリガの「説明」を表示させる

--- events.php.ORG  2013-12-11 02:45:09.000000000 +0900
+++ events.php      2014-02-07 14:11:58.165892875 +0900
@@ -702,6 +702,16 @@
                                        'ns' => $event['ns']
                                )));
 
+                               $trigger_for_comments = $trigger;
+                               $trigger_for_comments['description'] = $trigger_for_comments['comments'];
+
+                               $comments = CMacrosResolverHelper::resolveEventDescription(zbx_array_merge($trigger_for_comments, array(
+                                       'clock' => $event['clock'],
+                                       'ns' => $event['ns']
+                               )));
+
+                               $description = $comments;
+
                                $triggerDescription = new CSpan($description, 'pointer link_menu');
                                $triggerDescription->setMenuPopup(getMenuPopupTrigger($trigger, $triggerItems, null, $event['clock']));

表示できるようにしたログが20バイトで切られてしまっていたので1024バイトまで表示されるようにする

--- include/items.inc.php.ORG   2013-12-11 02:45:05.000000000 +0900
+++ include/items.inc.php       2014-02-07 11:43:03.020497499 +0900
@@ -989,8 +989,8 @@
                // break; is not missing here
                case ITEM_VALUE_TYPE_TEXT:
                case ITEM_VALUE_TYPE_LOG:
-                       if ($trim && zbx_strlen($value) > 20) {
-                               $value = zbx_substr($value, 0, 20).'...';
+                       if ($trim && zbx_strlen($value) > 1024) {
+                               $value = zbx_substr($value, 0, 1024).'...';
                        }
 
                        if ($mapping !== false) {