Оповещение об остановке док-контейнера
Я наблюдаю за несколькими контейнерами, используя 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!=""
фильтр необходим для фильтрации искусственных метрик для иерархии контрольных групп — см. этот ответ для получения более подробной информации.