(Trapperでログ受信監視)障害状態を他ログで復旧させない設定をしたい
【環境】CentOS6.6
zabbix 2.4.3
Zabbixトラッパーを使って、ログを受信し、ログの中にあるサーバー名でサーバー毎の障害検知を行っておりますが、
サーバAの障害を検知した後に、別のサーバーBのログを受信すると、サーバーAの障害が復旧してしまいます。
過去のフォーラムからログ監視時の、障害状態を復旧させたくない、復旧させたいなどの過去ログを見て色々試して
みましたが、力及ばず、期待する動作を実現する事ができませんでした。
ログの中にServer_Aの文字列があれば、障害とするトリガーA、Server_Bの文字列があれば障害とするトリガーBを
設定しております。(実際にはそれ以上複数設定しております)
①トリガーA ⇒ {サーバ:text.trapper.iregexp(Server_A)}=1
「障害イベントを継続して生成」をチェック
②トリガーB ⇒ {サーバ:text.trapper.iregexp(Server_B)}=1
「障害イベントを継続して生成」をチェック
【実現したい要件】
(1)サーバー毎の障害状態は、障害時のアクションが最後のエスカレーションまで全て実行されたら復旧するのが
望ましいが、エスカレーションを最後まで実行するのが最低条件。
(エスカレーション途中で「正常」に復旧するとその後のエスカレーションが実行されない)
(2)障害中のイベント(トリガー)以外の文字列が来たときに、障害状態を復旧させたくない
(サーバーAが障害状態の場合に、サーバーBが障害となったからと言って、サーバーAが復旧する訳ではない)
【試したトリガー条件】
(1) 特定の文字列がある場合は「障害」、障害状態のときは「障害」とする
{サーバ:text.trapper.iregexp(Server_xx)}=1 or {TRIGGER.VALUE}=1
⇒「Server_xx」以外の文字列のログを受信しても最後に障害となったトリガにヒットしてしまう。
例えば、最後の障害が「Server_A」文字列を引っ掛けるトリガーAだった場合、「Server_A」を含まないログが
来ても、トリガーAにヒットして、トリガーAの障害となってしまう。
トリガーBの文字列「Server_B」が来ても同じくトリガーAの障害となる。
(2)特定の文字列がある場合でかつ、ログが一定時間(5分間)に発生している間は「障害」
{サーバ:text.trapper.iregexp(Server_xx)}=1 and {サーバ:text.trapper.nodata(300)}=0
⇒「Server_xx」以外の文字列のログを受信すると「正常」に復旧してしまう
「障害イベントを継続して生成」をチェックしていたら、一つのログに対して30秒ごとに5分間の間障害が
発生してしまう。(nodataの動作を良く理解できませんでした)
※ただし、ここでは、他ログで復旧することが問題となります。
以上、よろしくお願い致します。
KAZ - 投稿数: 1085
misakiさん
zabbix_senderで投げるときにServer_AとServer_Bを分けてしまうのはダメですか?
で、受けるアイテムもServer_AとServer_Bで分ければトリガーは簡単になりますけど…
misaki - 投稿数: 69
KAZさん
度々、ありがとうございます。
投げている元が別の監視システムで、自分が持っているログを全てzabbix_senderで
丸投げしてきますので、投げるときに分けられなかったのです。
misaki - 投稿数: 69
「障害」状態が「正常」に復旧したらエスカレーションの次のステップは実行されないのでしょうか?
復旧してもエスカレーションを最後まで実行する方法はないのでしょうか?
TNK - 投稿数: 4755
トリガーが障害から正常に戻ったらエスカレーションの次のステッ
プは実行されません。
エスカレーションを継続させるには、トリガーを障害のままにして
おく必要があります。
misaki - 投稿数: 69
トリガーで障害状態を復旧する、条件式などで対策はできないのでしょうか?
今回のアクションで、別のアイテムで監視するデータを更新して、エスカレーション機能は、このアイテムを監視するトリガーで
実行しようとも考えておりますが、これも値が一定時間変更がないと正常に戻ってしまったり、障害状態を継続するアイディアが
なかなか浮かばず、頓挫しております。
例えば、今回のアクションでテキストファイルの文字列を書き換え、タイムスタンプを前回と比較し監視する手法を考えましたが、
アイテムの更新間隔がくると、タイムスタンプが更新されていないので正常に戻ってしまう・・・。
KAZ - 投稿数: 1085
misakiさん
複雑なのでお勧めと言うわけでもありませんが、案として…
1)別の監視システムが自分が持っているログを全てzabbix_senderで投げる(現状通り)
2)トリガーでデータ着たらイベント発生
3)アクションでリモートコマンド実行し、スクリプトでホストに分割してzabbix_sender実行
上の3のデータを受けるアイテムとトリガーをホスト単位で作っては…A(^^;
2のトリガーですが、nodataより受け取った文字列が1以上だったらの方が良いかと思います。
nodataは30秒周期のチェックですが、トラッパーで受けた文字列が1以上とすればデータ取得した時にトリガー検知しますので…
misaki - 投稿数: 69
KAZさん
ありがとうございます。
KAZさんのおっしゃるとおり、再度イベントを発生させて、システム毎にログを書き出すことにしました。
当方の環境では、このZabbixサーバへログを送信する内部の監視サーバ以外の各ホストは見えない(FWで
遮断されている)状態でして、各々のホストを登録できないので・・・
KAZさんの案の3)のリモートコマンドで、各システム毎にログファイルを分けてそこにログを書き出す。
イベントを発生させたいだけなので、最後のログだけ1行を毎回上書き
echo "{DATE} {TIME} {ITEM.VALUE1}” > /var/log/zabbix/system_a.txt #システム(サーバ)毎にログを分ける
4)システム毎にログファイルを監視するアイテムを作成
log[/var/log/zabbix/system_a.txt]
5)システム毎にログが出現するとイベントを発生するトリガーを作成
({Zabbix-server:log[/var/log/zabbix/system_a.txt].iregexp(.*)})<>0
これで、システム毎に独立して障害状態を維持できると考えています。
一応、この設定で複数のシステムで障害ログを発生させて試してみると障害状態を維持できました。
なにか誤り、注意点などありましたらアドバイスを頂ければ幸いです。