2

我正在运行bosun以提醒elasticsearch数据集。

场景是有许多 cron 作业可以做各种事情。如果这些成功执行,它们将记录成功消息。如果它们因任何原因死亡/无法运行并且未能记录成功消息,我们需要了解它。

我的问题是0如果没有找到记录,而不是null. 这是基本查询:

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返回一些东西,即使它是零值?

4

2 回答 2

1

在您的情况下,需要监控 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
}
于 2017-03-22T17:45:58.630 回答
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

但是请记住,在时间窗口中仍然必须有一个肯定的结果,一个否定的(或不存在的)结果才能触发警报。更好的方法是让您的系统生成正面和负面结果的数据,以便您可以提醒它们。或者保留一个不断增加的“已完成工作”(电子邮件、字节等)计数器,以便您可以看到任务何时停止。

于 2017-03-22T18:13:21.947 回答