正規表現を使い、検知したい文字列が連続で3回出たときにアラートを発報させたい。

お世話になっております。

検知したい文字列が連続で3回出たときにアラートが出るようにしたいです。
検知したい文字列:異常
⇒正規表現の設定で errorという名前で登録しています

出力されるログについては
10分間隔で 年月日時間,正常 か、年月日時間,異常 が出力されます。

以下の条件式で設定したところ、
二個前、一個前の値を評価せずに 最新値で障害か正常か判断しているようにみえました。
{host:log[d:\temp\testlog.txt,,SHIFT_JIS].regexp(@error)}=1 and
{host:log[d:\temp\testlog.txt,,SHIFT_JIS].regexp(@error,#1)}=1 and
{host:log[d:\temp\testlog.txt,,SHIFT_JIS].regexp(@error,#2)}=1

条件式で何かおかしいところはありますでしょうか。

zabbixサーバ2.2.3
対象ホストののエージェント2.2.1

コメント表示オプション

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

それだったら
{~.regexp(@error)}=1 and {~.regexp(@error,#2)}=1 and {~.regexp(@error,#3)}=1
じゃないでしょうか(#1 は何も書かないのと同じ)。

--追記--
karna さんが書かれたように、#3 だと三つの値のどれかがマッチすればいいみたいですね(マニュアルにはそう書いてある)。勘違いしていました。
>2番目の選択可能なパラメータは、秒数または分析する収集値の数です。この場合、複数の値が処理されます。
--追記ここまで--

実は正規表現でなくてもよく「異常」という固定文字列でいいなら、
{~.count(#3,"異常","like")}=3
でできそうです。

ユーザー poypoy の写真

トリガー設定したところ、
どうやら 異常 という文字列を設定すると以下のように式がぐちゃぐちゃになるようです、、
修正してOKボタン押しても、作り直しても、治りませんでした、、

{ホスト:log[d:\temp\testlog.txt,,SHIFT_JIS].count(#3,異常,"like")}=)}){ホスト:log[d:\temp\testlog.txt,,SHIFT_JIS].count(#3,異常,"like")}=)}=3

ユーザー karna の写真

一番目と二番目は同じ式、三番目は”直近2つのヒストリ中に該当するものがあるか” という意味になるので、
最新値に文字列があれば、正となります。

count関数を使って、

キー.count(#3,@error)=3

でどうでしょうか。

----追記----------
正規表現、対応してなかったですね>Ver. 2.2
なので、直接文字列を指定します。
 キー.count(#3,異常)=3

あと、正規表現使うなら書式が違ってます。
 キー.count(#3,@error,regrep)=3  (Ver.3.2以降のみ)

ユーザー heya の写真

ちょっと逸れるのですが、count 関数って、正規表現も使えるんですか?
マニュアルを見てもよく分からず、「正規表現」とは明示的に書いてなくて、like は単に「文字列を含む」くらいの意味かなあと思っていたんですが(試したことは無い)。

ユーザー karna の写真

>ちょっと逸れるのですが、count 関数って、正規表現も使えるんですか?

マニュアルを見たところ、Ver. 3.4では対応してるようです。
 ~.count(sec|#n,@正規表現,regrep|iregrep)=m    *”|” はorの意

3.0以前は対応していないので
 ~.count(sec|#n,文字列)=m  *likeは省略
(3.4でも使えます。)

失礼しました。

ユーザー poypoy の写真

設定してみたところ、異常ログがでているのに障害とみなされませんでした。
来月、3.4にversionupするのでそれまで待ちたいと思います。

お二方、丁寧に教えてくださりありがとうございました。

ユーザー Yasumi の写真

{host:log[d:\temp\testlog.txt,@error,SHIFT_JIS,,skip].count(#3,異常)}=3

これでどうでしょう。