Вернуть 0, если результаты не найдены в запросе asticsearch
Я бегу 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 ответа
В вашей ситуации есть 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
}
Вы не можете создать серию из запроса, который не возвращает никаких результатов. Обычно, если вы хотите получить уведомление о том, что "X не произошло за последний период T", вам нужно использовать окно большего размера. Поэтому, если ваш таймфрейм составляет 24 часа, вам нужно использовать большее окно, равное 72 часам, и использовать (начиная с (...) / 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
Но все же имейте в виду, что все равно ДОЛЖЕН быть положительный результат во временном окне, чтобы отрицательный (или отсутствующий) результат вызвал предупреждение. Гораздо лучший способ - заставить вашу систему генерировать данные как для положительных, так и для отрицательных результатов, чтобы вы могли предупреждать о них. Или сохраняйте счетчик "выполненной работы" (электронные письма, байты и т. Д.), Который всегда увеличивается, чтобы вы могли видеть, когда задача останавливается.