2017-03-22 12 views
1

私はbosunを実行してelasticsearchデータセットに対して警告しています。elasticsearchクエリで結果が見つからない場合は0を返します

さまざまなことを行う多数のcronジョブが存在するというシナリオがあります。これらが正常に実行されると、成功メッセージが記録されます。彼らが何らかの理由で死ぬか失敗して成功メッセージを記録できない場合は、それについて知る必要があります。

私の質問は、nullではなく、レコードが見つからない場合に0の結果を得る方法です。ここでは基本的なクエリです:

nv(sum(escount(esls("logs"), "context.taskname", esand(esgte("context.elapsed_time", 0), esor(esquery("context.taskname", "Task1 or Task2 or Task3 or Task4"))), "360m", "360m", "")), 0) 

与えられたタスクは、指定した間隔で実行している場合、クエリは、タスクがログインした成功メッセージの数のためにゼロ以外の値を返す必要があります。

これはうまくいきますが、タスクが実行されていない場合にのみ警告が発せられます。問題は、Task1が完了メッセージを実行してログに記録していない場合は、0カウントを返すのではなく、最終的なグループ化から削除されただけです。

ゼロ値であってもesorの各タスクが何かを返すようにする方法はありますか?

答えて

0

あなたの状況で監視するための3つの側面があります。

  1. は仕事を持っているが、ジョブが成功した結果
  2. で実行しました
  3. を実行するジョブが失敗した結果
で実行しました

弾性はこの場合重要ではないので、私はseries関数で応答をシミュレートしました:

alert zero_example { 
    # success log messages 
    $successful = sum(merge(series("job=task1", 0, 1), series("job=task2", 0, 1))) 
    # error log messages 
    $error = sum(merge(series("job=task1", 0, 0), series("job=task3", 0, 1))) 

    # warn if no successful message or there is a non-zero number of error messages. 
    # nv makes it so if there are no error messages, it will be treated as zero 
    warn = nv($successful == 0, 0) || nv($error != 0, 0) 

    # the final case is that a job hasn't logged. As long as the alert saw it in the 
    # first place, then Bosun will treat it as "unknown" when the result set disappears 
    # from the result 
} 
+0

これは可能な答えのように聞こえます。上記の例のクエリでどのように使用されるかのコンテキストを教えてください。 – user101289

+0

@ user101289それは表現言語の外に存在します。アラートキーワードであるため、アラート定義では 'unknownIsNormal = true'と表示されます。その後、あなたはnvを落とすことができます。 –

+0

それは違いを生じさせていないようです。 'Task1'を何か存在しないもの(例えば' Tasky1')に変更した場合、タスク名でグループ化された返されたリストには表示されません – user101289

0

結果を返さないクエリから系列を生成することはできません。通常、「Xが最後のT時間枠で発生しなかった」という警告を表示するには、大きなウィンドウを使用する必要があります。したがって、時間枠が24時間の場合は、72時間という大きなウィンドウを使用し、(since(...)/3600) > 24を使用して、最後の肯定結果が24時間以上経過したときに警告をトリガーする必要があります。

このアラートは2日間有効です。その後、最も古い肯定的な結果がスライディングウィンドウの外側に表示されるため、週末に壊れて、数日間は対処できないものなら、クエリの5または7日間使用だけではなく3

あなたの場合、これはおそらくのようになりますが、イベントを見たいと思って6時間ごとを想定してします

$q = escount(esls("logs"), "context.taskname", esand(esgte("context.elapsed_time", 0), esor(esquery("context.taskname", "Task1 or Task2 or Task3 or Task4"))), "1h", "72h", "") 
$hoursSince = since($q)/3600 
warn = $hoursSince > 6 

しかし、まだそこに心に留めておきます負の(または不在の)結果がアラートをトリガーするためには、依然としてタイムウィンドウ内で肯定的な結果でなければならない。より良い方法は、システムに肯定的な結果と否定的な結果の両方のデータを生成させ、その結果を警告することです。または、常に仕事が終了した時を見ることができるように、常に増加している「作業完了」(電子メール、バイトなど)のカウンタを保持します。

関連する問題