Return 0 如果没有从 elasticsearch 查询中找到结果
Return 0 if results aren't found from elasticsearch query
我正在 运行宁 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)
如果给定任务在指定的时间间隔内有 运行,查询应该 return 任务记录的成功消息数的非零值。
这有效,但我希望仅当任务没有 运行 时才触发警报。问题是,如果 Task1
没有 运行 并记录完成消息,它只是从最终分组中删除,而不是 returning 0
计数。
有没有一种方法可以确保 esor
return 中的每个任务都是一些东西,即使它是零值?
在您的情况下,需要监控 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"(电子邮件、字节数等)计数器,这样您就可以看到任务何时停止。
我正在 运行宁 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)
如果给定任务在指定的时间间隔内有 运行,查询应该 return 任务记录的成功消息数的非零值。
这有效,但我希望仅当任务没有 运行 时才触发警报。问题是,如果 Task1
没有 运行 并记录完成消息,它只是从最终分组中删除,而不是 returning 0
计数。
有没有一种方法可以确保 esor
return 中的每个任务都是一些东西,即使它是零值?
在您的情况下,需要监控 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"(电子邮件、字节数等)计数器,这样您就可以看到任务何时停止。