アラートを除外する為のトリガー条件式の書き方について

トリガー条件式の書き方について教えて頂けないでしょうか。

PostgreSQL のログ監視をしております。
ERROR_CODE, という文字列からのアラートを除外したいのですが、
下記条件式の何処に追記したら良いのでしょうか。

(({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(ERROR)})#0|
({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(FATAL)})#0|
({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(PANIC)})#0)
&({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].nodata(30)}=0)

WEB 検索をすると regext に追加したら良いという記述を見つけましたが、
記載できそうな箇所が3つあるように見える為、何処に書けば適切なのかが判断つかずにおります。

アドバイスのほど、よろしくお願い致します。

コメント表示オプション

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

こんにちは。

現状を日本語で書くと、
・ログのうち、 PANIC か FATAL か ERROR か [Ee]rror を含むものをアイテムの値として受け取る
・そのうち、 ERROR か FATAL か PANIC を含み、かつ、30秒以内にログが出ている
ときに障害ってことですかね(つまり [Ee]rror は反応しない?)。
そして30秒間ログが出なければ(※)正常に戻る。
※アイテムとして取得しないという意味。実際のログファイルにログが出ていても、 PANIC も FATAL も ERROR も [Ee]rror も含まなければエージェントはサーバーに伝えないので、それはアイテムには記録されない。

そして、上の条件に加えて、 ERROR_CODE を含む場合は PANIC その他が含まれていても障害とみなさないようにしたい、ということですか?

この想定の通りだとすると、カスタム正規表現の設定はこんな感じになると思います。
名前:xxx
条件式:
  一つ目:
    条件式:PANIC|FATAL|ERROR
    条件式の形式:結果が真
    大文字小文字を区別:はい
  二つ目:
    条件式:ERROR_CODE
    条件式の形式:文字列が含まれない(or 結果が偽)
    大文字小文字を区別:はい

こうした上で、トリガーでは
{~:logrt[~].regexp(@xxx)}=1&{~:logrt[~].nodata(30)}=0
とすればいいと思います(最初の =1 は #0 でも OK )。

nodata とかあってややこしいので、どこか勘違いしていたらごめんさい。
とにかく、「文字列が含まれない」か「結果が偽」を使うと除外できます(この二つは正規表現を使うかどうかの違いです)。

ユーザー k-koz の写真

heya さん

コメントありがとうございます。

> こうした上で、トリガーでは
> {~:logrt[~].regexp(@xxx)}=1=0
> とすればいいと思います(最初の =1 は #0 でも OK )。

ここの文章を実際の条件式として記載して頂く事は可能でしょうか。

下記条件式の何行目にどのように括弧で括って記載すればよいのか教えて頂けると嬉しいです。

(
({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(ERROR)})#0|
({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(FATAL)})#0|
({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(PANIC)})#0
)
&({PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].nodata(30)}=0)

ユーザー heya の写真

単純に、ホストとアイテム部分をそのまま書けばいいです。そして、これで全部です(あの長い条件式全体と置き換えます)。ただ、xxx という名前は適当なので、何か分かりやすい名前にした方がいいと思います。

{PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].regexp(@xxx)}=1&{PostgreSQL Check:logrt["{$PGLOGDIR}/postgresql-.*\.log","PANIC|FATAL|ERROR|[Ee]rror"].nodata(30)}=0

regexp(@xxx) が、最初の例にあった三つの regexp (と、ERROR_CODE の除外)に相当します 。

余談1
or でつなぐ場合、三つの regexp に一つずつキーワードを書くより、一つの regexp で3つのキーワードを使う方が短いし分かりやすいと思います。
「ERROR を含む」or「FATAL を含む」or「PANIC を含む」=「ERROR or FATAL or PANIC を含む」

余談2
and でつなぐ場合、通常の正規表現だとややこしくなりますが、カスタム正規表現なら簡単になります。