Оповещение об остановке док-контейнера

Я наблюдаю за несколькими контейнерами, используя Prometheus, cAdvisor и Prometheus Alertmanager. Я хочу получить предупреждение, если контейнер по какой-то причине не работает. Проблема в том, что если контейнер умирает, то cAdvisor не собирает метрики. Любой запрос возвращает "нет данных", так как для запроса нет совпадений.

5 ответов

Решение

Посмотрите на функцию Прометей отсутствует ()

absent (v instant-vector) возвращает пустой вектор, если переданный ему вектор имеет какие-либо элементы, и 1-элементный вектор со значением 1, если переданный ему вектор не имеет элементов.

Это полезно для оповещения о том, что для данной метрики и комбинации меток не существует временных рядов.

Примеры:

absent(nonexistent{job="myjob"}) => {job="myjob"}absent(nonexistent{job="myjob",instance=~".*"}) => {job="myjob"}absent(sum(nonexistent{job="myjob"})) => {}

Вот пример для предупреждения:

ALERT kibana_absent
  IF absent(container_cpu_usage_seconds_total{com_docker_compose_service="kibana"})
  FOR 5s
  LABELS {
    severity="page"
  }
  ANNOTATIONS {
  SUMMARY= "Instance {{$labels.instance}} down",
  DESCRIPTION= "Instance= {{$labels.instance}}, Service/Job ={{$labels.job}} is down for more than 5 sec."
  }

Я использую небольшой инструмент под названием Docker Event Monitor, который запускается в качестве контейнера на хосте Docker и отправляет оповещения Slack, Discord или SparkPost в случае запуска определенных событий. Вы можете настроить, какие события вызывают оповещения.

Мы можем использовать эти два:

absent(container_start_time_seconds{name="my-container"})

Эта конкретная метрика, которая содержит временные метки, кажется, не устаревает в течение 5 минут, поэтому она исчезает из результатов prometheus, как только исчезает из последней очистки (см.: https://prometheus.io/docs/prometheus/latest/querying/basics/# ). staleness), а не через 5 минут, как, например, container_cpu_usage_seconds_total. Проверено нормально, но я не уверен, что хорошо понимаю поздний срок...

В противном случае вы можете использовать этот:

time() - timestamp(container_cpu_usage_seconds_total{name="mycontainer"}) > 60 OR absent(container_cpu_usage_seconds_total{name="mycontainer"})

Первая часть показывает, сколько времени прошло с момента очистки метрики. Так что это работает, если он исчез из вывода экспортера, но все еще возвращается promql (по умолчанию в течение 5 минут). Вы должны адаптировать>60 с вашим интервалом очистки.

Попробуй это:

       time() - container_last_seen{label="whatever-label-you-have", job="myjob"} > 60

Если контейнер не виден в течение 60 секунд, срабатывает тревога. Или же

      absent(container_memory_usage_bytes{label="whatever-label-you-have", job="myjob"})

Пожалуйста, будьте осторожны, во втором подходе может потребоваться время, чтобы использование памяти контейнером стало равным 0.

cadvisor экспортирует метрику, которая показывает отметку времени, когда контейнер был замечен в последний раз. См. эти документы . Но cadvisorпрекращает экспортировать метрику через несколько минут после остановки контейнера — подробности см. в этой проблеме . Так time() - container_last_seen > 60может пропустить остановленные контейнеры. Это можно исправить обертыванием container_last_seenв функцию last_over_time() . Например, следующий запрос постоянно возвращает контейнеры, которые были остановлены более 60 секунд назад, но менее 1 часа назад (см. 1hокно просмотра в квадратных скобках):

      time() - last_over_time(container_last_seen{container!=""}[1h]) > 60

Этот запрос можно еще больше упростить при использовании функции задержки из MetricsQL :

      lag(container_last_seen{container!=""}[1h]) > 1m

В container!=""фильтр необходим для фильтрации искусственных метрик для иерархии контрольных групп — см. этот ответ для получения более подробной информации.

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