Вернуть 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 аспекта для мониторинга:

  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
}

Вы не можете создать серию из запроса, который не возвращает никаких результатов. Обычно, если вы хотите получить уведомление о том, что "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

Но все же имейте в виду, что все равно ДОЛЖЕН быть положительный результат во временном окне, чтобы отрицательный (или отсутствующий) результат вызвал предупреждение. Гораздо лучший способ - заставить вашу систему генерировать данные как для положительных, так и для отрицательных результатов, чтобы вы могли предупреждать о них. Или сохраняйте счетчик "выполненной работы" (электронные письма, байты и т. Д.), Который всегда увеличивается, чтобы вы могли видеть, когда задача останавливается.

Другие вопросы по тегам