Return 0 如果没有从 elasticsearch 查询中找到结果

Return 0 if results aren't found from elasticsearch query

我正在 运行宁 bosunelasticsearch 数据集发出警报。

场景是有许多执行各种任务的 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)

如果给定任务在指定的时间间隔内有 运行,查询应该 return 任务记录的成功消息数的非零值。

这有效,但我希望仅当任务没有 运行 时才触发警报。问题是,如果 Task1 没有 运行 并记录完成消息,它只是从最终分组中删除,而不是 returning 0 计数。

有没有一种方法可以确保 esor return 中的每个任务都是一些东西,即使它是零值?

在您的情况下,需要监控 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
}

您不能从没有 return 任何结果的查询生成系列。通常,如果您想要 "X didn't happen in the last T timeframe" 的警报,您需要使用更大的 window。因此,如果您的时间范围是 24 小时,则需要使用更大的 window(72 小时)并使用 (since(...) / 3600) > 24 在最后一个阳性结果早于 24 小时前时触发警报。

此警报只会保持活跃状态​​ 2 天,之后最早的阳性结果将超出滑动范围 window,因此如果它可能在周末中断,您将无法得到解决这几天您可能希望使用 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

但仍请记住,在 window 时间内仍必须有阳性结果,阴性(或缺失)结果才会触发警报。一个更好的方法是让您的系统生成正面和负面结果的数据,以便您可以对它们发出警报。或者保留一个一直在增加的 "work done"(电子邮件、字节数等)计数器,这样您就可以看到任务何时停止。