1つのアイテムに対して複数トリガーを設定した際の動作に関して
ログ監視に関してお聞きしたいことがあります。
1つのアイテムに対して下記のような複数トリガーを設定し、障害検知することは可能なのでしょうか。
グローバル正規表現は使用せずトリガーに正規表現を直書きした形にしたいです。
アイテムもトリガーも極力少ない状態で実装したいと考えていますので、何か良い案などありましたらご教授頂きたいです。
・アイテム
log[/var/log/syslog,,,,skip]
・トリガー1
{log[/var/log/syslog,,,,skip].regexp("^(?=.*11111)((?=.*22222)|(?=.*33333))",300}=1 and {log[/var/log/syslog,,,,skip].count(300)}<2
・トリガー2
{log[/var/log/syslog,,,,skip].regexp("^(?=.*44444)((?=.*55555)|(?=.*66666))",300)}=1 and {log[/var/log/syslog,,,,skip].count(300)}<2
TNK - 投稿数: 4742
1つのアイテムに複数のトリガーを設定することは可能です。
masasasa - 投稿数: 9
ご回答ありがとうございます。
上記トリガーのようにregexp関数を使用し、正規表現を直書きし障害検知させることは可能でしょうか。
TNK - 投稿数: 4742
どのような検知を行いたいのかわからないので、記載されている正
規表現が正しいかはわかりませんが、関数regexp()を条件式に指定
することは可能です。
masasasa - 投稿数: 9
具体的に記載できておらず申し訳ありません。
行いたい検知内容としましては、/var/log/syslogにトリガー1で記載している11111かつ22222、または11111かつ33333が含まれるログが出力された時、
およびトリガー2で記載している44444かつ55555、または44444かつ66666が含まれるログが出力された時に障害検知を行えるようにしたいです。
監視間隔を5分で設定し、トリガーでregexp関数、count関数共に300を指定することで5分以内のログを監視するようにしているのですが、本日投稿した内容で検証した際、
1つのトリガーではトリガー内で設定している正規表現とは一致しないログを障害検知(一致しているログも出力されています)し、他のトリガーは記載した正規表現に一致しているログが
出力されているのにも関わらず、障害検知されませんでした。
なぜこのような動作になるのか分からないのですが、もしも原因が分かれば教えて頂けますでしょうか?
TNK - 投稿数: 4742
頂いた説明と見比べてみると正規表現には問題は無さそうなので、
regexp()の引数でsecとして300秒を指定していることと、count()
との組み合わせによって問題が発生しているのではないかと思われ
ます。
例えば、今の設定のままだと、5分以内に正規表現に合致したログ
が出力されていれば、最新のログに正規表現に合致するものが含ま
れていなくてもcount()の条件内なら、トリガーの条件は満たすの
で、障害イベントが発生するでしょう。
ログが出力されたときに、その出力された最新のログに正規表現で
指定したものが含まれているかどうかを判別したいのであれば、sec
の指定は不要です。
masasasa - 投稿数: 9
いつもご回答してくださり、ありがとうございます。
ご指摘の通り、count関数を除いた形でトリガーを記載すると意図した検知がされるようになりました。
しかし、指定した正規表現に一致する同様なログが多数出力されている環境のため、多数トリガー内容と合致するログがあっても検知数を1度のみにしたいです。
(アラート通知を1度のみにしたいという意図になります。障害イベント生成モードは単一ではなく複数で設定したいです)
通知数制限を実施するためにandでcount関数を追記するとどうしても想定通りの検知がされないようになってしまうのですが何か他の案などはありますでしょうか?
※regexp()の引数で300秒を指定せず、正規表現のみ記載し、count関数を追記しても想定通りの検知がされませんでした。
下記では想定通りに正規表現に一致したログが出力された際、zabbixで検知されました。
・トリガー1
{log[/var/log/syslog,,,,skip].regexp("^(?=.*11111)((?=.*22222)|(?=.*33333))"}=1
・トリガー2
{log[/var/log/syslog,,,,skip].regexp("^(?=.*44444)((?=.*55555)|(?=.*66666))")}=1
同様なログが多数あるため、count関数を用いて、通知制限を行うため、下記トリガーを設定すると想定通りに検知されなくなりました。
・トリガー1
{log[/var/log/syslog,,,,skip].regexp("^(?=.*11111)((?=.*22222)|(?=.*33333))"}=1 and {log[/var/log/syslog,,,,skip].count(300)}<2
・トリガー2
{log[/var/log/syslog,,,,skip].regexp("^(?=.*44444)((?=.*55555)|(?=.*66666))"}=1 and {log[/var/log/syslog,,,,skip].count(300)}<2
TNK - 投稿数: 4742
記載されている条件式の後半のcount()を使用した条件式は、正規
表現に合致しているかどうかには関わらず、5分間で何らかのログ
が出力されたかどうかの評価でしかないことにご注意ください。
対策としては、
A.アイテムで正規表見を指定して取得する値を絞り込む
B.障害の発生だけトリガーで検知させて手動でクローズする
などが考えられます。
A.であれば、regexp()とcount()、復旧条件式にnodata()などと
組み合わせることで、実現できると思われます。
B.は、正常イベントの生成をなしにして、障害イベント生成モー
ドを単一にするわけですが、アイテムの変更は不要ではあるものの、
障害イベントが発生するたびに必ず手動でトリガーの状態を正常に
戻すことが必要です。
戻し忘れると、数時間経過後に同じ条件のログが出力されても、ト
リガーの状態が障害のままだと新たに通知されなくなるという問題
があります。
もっと対策方法はあると思いますが、すぐに思いついたもののうち
の2つをあげさせていただきました。
masasasa - 投稿数: 9
対策方法を提示して頂きありがとうございます。
Aに関しましては、アイテム数が増えてしまうため避けたいです。
(トリガー内で指定している正規表現のように、実際はorで区切らなければならない正規表現が複数あるためです。)
アイテム数と可能ならトリガー数も極力少ない状態で実装したいです。
Bに関しましては手動でクローズしなければならないとのことですので
都度その対応を行うのが難しいため、避けたいです。
他の対策方法がありましたらお手数おかけしますが、ご教示いただけないでしょうか。
また疑問なのですが、regexp()とcount()をandで修飾しているのにも関わらず、count関数の条件が一致するログが検知されてしまうのはなぜなのでしょうか。
それであればトリガー1も2も検知されると思うのですがトリガー1のみ検知されてしまうのも腑に落ちていない状況です。
私の想定ではregexp()関数を満たしているログ且つ、count関数を満たすログが検知されるのですが、何か誤っているところはありますでしょうか。