エスカレーションを使って定期的にメッセージ送信すると途中でメール送信できなくなる

はじめまして、初めてこのフォーラムに書き込みます。
gaiusと申します。

アクション設定において、エスカレーションを機能を使ったメッセージ(メール)送信を実施したいのですが、
途中からメールが送信できないという事象に陥っています。

何か解決策があればご教示いただきたく、よろしくお願いいたします。

以下に要件や環境など記載いたします。
長文で申し訳ありませんがよろしくお願いいたします。

■要件
(1)Pingによる死活監視を60秒間隔で実施
(2)障害検知時(Ping応答なしが3回連続)にメールを送信
(3)一度メールを送ったらメール送信間隔を60秒に変更(エスカレーション機能で実現)
(4)復旧したら復旧メール送信

■症状
上記要件の(1)〜(3)まで想定通りの動作を始めるが、
(3)が長期間続くと障害が継続しているにも関わらずメールが送信されない。
メールログにも記録されないため、スクリプト自体が実行されていない模様。
その状態で復旧しても(4)の復旧メールは送信されない。

色々試したところ、メール本文の容量によってメール送信できる回数がことなっている模様。

エスカレーションを利用せず、トリガーの設定でイベント生成を「ノーマル+障害イベントを継続して生成」にすると問題ない。

■環境
OS :CentOS6.2(6.0からのUpdate)
Zabbix:1.8.10(ZABBIX-JPのyumリポジトリを利用)
MTA :sendmail-8.14.4
PHP :5.3.3

■設定(アクション)
アクション
 イベントソース:トリガー
 エスカレーションを有効:有効(チェック)
 期間 (秒):60秒
 デフォルトの件名:"任意で指定"
 デフォルトのメッセージ:"任意で指定"
 リカバリメッセージ:有効(チェック)
 リカバリの件名:"任意で指定"
 リカバリメッセージ"任意で指定"
 ステータス:有効

アクションのコンディション
 計算のタイプ:(A) and (B)
 コンディション:
  (A)トリガーの値 = "障害"
  (B)トリガーの深刻度 >= "軽度の障害"

アクションのオペレーション
 ステップ
  開始:1
  終了:0
  期間:0
 オペレーションのタイプ:メッセージの送信
 メッセージの送信先:シングルユーザ
 次のメディアのみ使用:Sendmessage
 ユーザのメディア:Sendmessage aaa@localhost 1-7,00:00-24:00; NIWAHD
 デフォルトのメッセージ:有効(チェック)
 
 ※ テストのため、メールはZabbixサーバ上のローカルユーザへ配送

■設定(トリガー)
 名前:ICMP ping is down
 条件式:{a-sv:icmpping.count(#3,0,"eq")}=3
 イベント生成:ノーマル

■設定(メディア)
 説明:Sendmessage
 タイプ:スクリプト
 スクリプト名:sendmessage_php.sh

 ※ スクリプトはZABBIX-JPで公開されているものを利用

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー gaius の写真

本スレッドを作成したgaiusです。
お世話になります。

切り分けをしていて気づいた点を追加情報として記載いたします。

■切り分け結果
アクション設定で指定するメッセージの内容でマクロを使用していますが、マクロとして{ESC.HISTORY}を使用している場合に、今回質問いたしました事象が発生するようです。

当初メッセージで利用可能なマクロを全てメッセージに記述していましたが、{ESC.HISTORY}のみを外して試したところ、事象は再現しませんでした。

({ESC.HISTORY}を記述していると数時間経過するとメール送信できなくなるが、{ESC.HISTORY}を記述しない場合は少なくとも24時間は問題なかった)

上記結果から、アクション実行時に{ESC.HISTORY}を取得する処理にて何か問題が起きているのではと考えているのですが、調査を進めるにあたりご助言などいただけますと幸いです。

以上です。
よろしくお願いいたします。

ユーザー kodai の写真

バグがあるのかもしれません。

Zabbixサーバのログには何か関連しそうなエラーなどは出力されていないでしょうか?

ユーザー gaius の写真

kodai様

お世話になっております。gaiusです。
ご助言ありがとうございます。

zabbix_serverのDebugLevelを"4"にして確認したところ、
以下のエラーが出ていました。

/*===================
// この前にはメッセージの内容が記述
19. 2012.02.06 20:11:46 sent Sendmessage aaa@localhost \"mail mail (mail)\"
20. 2012.02.06 20:12:46 sent'
3260:20120206:202731.560 End of zbx_popen():6
22770:20120206:202731.560 zbx_popen(): executing script
sh: -c: line 0: unexpected EOF while looking for matching `"'
sh: -c: line 23: シンタックス エラー: 期待してないファイルの終了
3260:20120206:202731.562 In zbx_waitpid()
3260:20120206:202731.562 zbx_waitpid() exited, status:1
3260:20120206:202731.562 End of zbx_waitpid():22770
3260:20120206:202731.562 sendmessage_php.sh output:

3260:20120206:202731.562 End of execute_action():SUCCEED
3260:20120206:202731.562 Alert ID [36] was sent successfully
===================*/

エラーについて確認したところ、本フォーラムに同じエラーに関する下記URLのスレッドを発見しました。

http://www.zabbix.jp/modules/newbb/viewtopic.php?viewmode=flat&topic_id=1109&forum=6

ソースを変更してのテストはまだ実施していないので、この後実施してみる予定です。

また、気になる点としては、ZABBIX-JP RPM版でも、古いバージョンでは事象が再現しないということです。
確認したバージョンは以下の通りです。
各バージョンのソース(include/common.h)も確認しましたが、「MAX_STRING_LEN」「MAX_BUFFER_LEN」に
違いはありませんでした。

 Ver.1.8.10-1:事象発生
 Ver.1.8.9-1:事象再現
 Ver.1.8.5-2:事象再現せず(問題なし)

現時点で分かっている内容は以上です。
何かわかりましたらご助言いただけますと幸いです。

ユーザー kodai の写真

追加情報ありがとうございます。

{ESC.HISTORY}を利用した場合にメールの本文が64KBを超えてしまっていて、かつメディアタイプでスクリプト実行をしているために問題が発生しているように見えます。

ソースを調べてみたところ、メディアタイプ実行の本文64KB制限は1.8.8のソース修正で追加されていました。そのため1.8.7以前では問題が発生しないのだと思います。

ZabbixのアラートはUTF-8の日本語メールであればphpスクリプトを挟まなくても問題なく送れますので、メールを受信するクライアントがUTF-8に対応しているのであれば、Zabbixの標準のメール送信機能を使われる方が良いと思います。

ユーザー gaius の写真

kodai 様

お世話になっております。
ご確認ありがとうございました。

メディアタイプでスクリプトを実行している際の制限であることが分かり助かりました。

確かにご指摘のとおり、Zabbix標準のメール機能で要件を満たせることが確認できましたので、そちらを利用したいと思います。

Zabbix1.6時代の先入観があり、スクリプト以外に目が行ってませんでした・・・

今回の件でいろいろと勉強になりました。
ご助力いただきありがとうございました。

ユーザー kodai の写真

64KBの制限についても本家BTSに追記しておきました。
https://support.zabbix.com/browse/ZBX-4527