如果没有从elasticsearch查询中找到结果,则返回0

时间:2017-03-22 17:38:18

标签: elasticsearch logging bosun

我正在运行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中的每项任务都返回一些内容,即使它是零值?

2 个答案:

答案 0 :(得分:0)

在您的情况下,有三个方面需要监控:

  1. 让作业运行
  2. 作业是否成功运行
  3. 作业是否以不成功的结果运行
  4. 弹性在这种情况下并不重要,因此我使用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
    }
    

答案 1 :(得分:0)

您无法从不返回任何结果的查询生成序列。通常,如果您想要“X在最后T时间帧中没有发生”的警报,则需要使用更大的窗口。因此,如果您的时间范围为24小时,则需要使用72小时的较大窗口,并在最后一个阳性结果超过24小时之前使用(since(...) / 3600) > 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

但仍然要记住,在时间窗口中仍然必须有一个肯定的结果,因为负面(或缺席)结果会触发警报。更好的方法是让您的系统生成正面和负面结果的数据,以便您可以对它们发出警报。或者保持一个“完成工作”的计数器(电子邮件,字节,等等),这个计数器总是在增加,这样你就可以看到任务停止的时间。