Что означает значение NaN в метриках мониторинга (например, в Prometheus)?

«Что означает значение NaN в метриках мониторинга (например, в Prometheus)?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

NaN (Not a Number) в системах мониторинга, таких как Prometheus, означает, что для данной метрики в указанный момент времени нет числового значения.

Основные причины появления NaN:

  1. Источник метрик недоступен: Целевой экспортер (например, node_exporter) или приложение не отвечает, поэтому сбор данных не произошёл.
  2. Метрика перестала существовать: Сервис, который публиковал метрику, был удалён или перезапущен с другим набором меток, и старая временная серия (time series) завершилась.
  3. Ошибка в запросе (PromQL): Арифметическая операция, не имеющая математического смысла (например, деление на ноль или логарифм от отрицательного числа).
    # Пример: если `http_requests_total` отсутствует, результат будет NaN
    rate(http_requests_total[5m])
  4. Пропуск данных: Проблемы с сетью или кратковременная высокая нагрузка на Prometheus могли привести к пропуску сбора данных за интервал.

Как диагностировать:

# 1. Проверить, «жив» ли target (экспортер)
curl -s http://<exporter-ip>:9100/metrics | head -5
# 2. В Prometheus UI проверить статус target на странице /targets
# 3. Проверить логи экспортера на предмет ошибок
journalctl -u node_exporter -f
# 4. Использовать запрос, устойчивый к отсутствию данных
up{job="node-exporter"} == 0  # Покажет, какие инстансы недоступны

Важно: NaN распространяется через арифметические операции. В дашбордах и алертах его нужно обрабатывать функциями вроде clamp_max(), or или default.

# Замена NaN на 0 в запросе для графика
(rate(http_requests_total[5m]) > 0) or vector(0)