我正在运行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
中的每项任务都返回一些内容,即使它是零值?
答案 0 :(得分:0)
在您的情况下,有三个方面需要监控:
弹性在这种情况下并不重要,因此我使用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
但仍然要记住,在时间窗口中仍然必须有一个肯定的结果,因为负面(或缺席)结果会触发警报。更好的方法是让您的系统生成正面和负面结果的数据,以便您可以对它们发出警报。或者保持一个“完成工作”的计数器(电子邮件,字节,等等),这个计数器总是在增加,这样你就可以看到任务停止的时间。