Перейти к содержанию

Сервисы: HTTP, TCP, DNS, ping, TLS, NTP, SMTP, SQL, MQTT, WebSocket

Одиннадцать мониторов следят за сервисами, а не за оборудованием, в духе Uptime Kuma: веб-страница, порт, DNS-имя, хост, сертификат, сервер времени, почтовый релей, база данных, брокер MQTT, конечная точка WebSocket. Для каждого сервиса на странице его монитора отображаются полоса истории, время отклика и процент доступности.

Последние пять идут дальше простого открытия соединения: они начинают настоящую сессию на родном протоколе сервиса. В этом разница между «порт 5432 открыт» и «база данных по-прежнему принимает мою учётную запись и отвечает на запрос». NTP находится посередине: один запрос и один ответ на собственном протоколе NTP, чего достаточно, чтобы прочитать часы сервера без сессии.

Как определяется состояние сервиса

Сервис может отвечать и при этом быть недоступным: 500, отсутствующее ключевое слово, просроченный сертификат. Поэтому эти мониторы записывают точку при каждой проверке, а probe_success равен 1 или 0, вместо того чтобы молчать, как аппаратное устройство. Именно это позволяет вычислять процент доступности: avg_over_time(dumbmonit_probe_success[30d]).

Ситуация Что происходит
Неверная опция или адрес, ICMP-сокеты запрещены (см. Ping) Ошибка конфигурации: ничего не записывается, страница монитора показывает ошибку, оповещения «недоступен» нет.
Соединение отклонено, тайм-аут, TLS отклонён, 500, ключевое слово отсутствует, полная потеря пакетов, пароль отклонён, запрос не выполнен probe_success = 0: сбой фиксируется, датируется и учитывается.
Всё в порядке probe_success = 1.

У каждого монитора свой тайм-аут (timeout_seconds, по умолчанию 5 с, максимум 60 с), меньший, чем DUMBMONIT_PROBE_TIMEOUT_SECS сервера: если бы проверку прервал планировщик, она не смогла бы записать свой ноль.

Встроенные правила, применяемые ко всем одиннадцати: Сервис недоступен (3 минуты), Сервис нестабилен (более шести смен состояния за тридцать минут), Медленный сервис (более 3 с в течение десяти минут). Для каждой проверки, читающей сертификат — http, tls, smtp, mqtt, websocket: Сертификат скоро истечёт (14 дней) и Сертификат истёк.

Отклонённый пароль никогда не считается сбоем сервиса: он записывается как reason="auth", чтобы оповещение указывало, что нужно исправить.

Метрики

Все метрики — gauge, все с префиксом dumbmonit_, и все помечены probe="http|tcp|dns|ping|tls|smtp|postgres|mysql|mqtt|websocket|ntp" в дополнение к target, host и tag_*.

Метрика Мониторы Значение
probe_success все 1, если сервис отвечает корректно, иначе 0.
probe_duration_seconds все Общая длительность проверки.
probe_failure_info все Присутствие (1) с меткой reason: dns, connect, timeout, tls, cert_expired, status, keyword, json, body, packet_loss, record, auth, protocol, query, payload.
probe_http_status_code http, websocket Полученный код статуса.
probe_http_first_byte_seconds http Время до заголовков ответа.
probe_http_content_bytes http Размер тела.
probe_http_security_header{header} http 0/1 для каждой метки header (только https): HSTS, nosniff, CSP, X-Frame-Options, frame-ancestors.
probe_connect_seconds все, кроме dns и ping Установление соединения (для баз данных включая вход).
probe_tls_handshake_seconds tls, http, smtp, mqtt, websocket Только согласование TLS.
probe_tls_version_info tls, http, smtp, mqtt, websocket Присутствие; метка version.
probe_ssl_cert_expiry_days tls, http, smtp, mqtt, websocket Дней до истечения, отрицательное значение, если сертификат истёк.
probe_ssl_cert_valid tls, http, smtp, mqtt, websocket 1, если цепочка ведёт к известному удостоверяющему центру.
probe_ssl_cert_issuer_info tls, http, smtp, mqtt, websocket Присутствие; метка issuer.
probe_dns_lookup_seconds dns Время разрешения.
probe_dns_answer_records dns Записи запрошенного типа.
probe_dns_answer_fingerprint dns При включённой опции «Alert when the answer changes»: 32-битный отпечаток отсортированного ответа. Само его значение ничего не означает; значение имеют только его изменения.
probe_icmp_rtt_seconds, _min_seconds, _max_seconds ping Среднее, наименьшее и наибольшее время кругового обхода.
probe_icmp_packet_loss_ratio ping Потери от 0 до 1.
probe_icmp_packets_sent, probe_icmp_packets_received ping Отправленные и полученные эхо-запросы.
probe_smtp_greeting_seconds smtp Время до баннера 220.
probe_smtp_ehlo_seconds smtp Время кругового обхода команды EHLO.
probe_smtp_capabilities smtp Объявленные расширения.
probe_smtp_authenticated smtp 1, когда AUTH прошла успешно.
probe_sql_query_seconds postgres, mysql Только выполнение запроса.
probe_sql_rows postgres, mysql Возвращённые строки.
probe_sql_value postgres, mysql Первый столбец первой строки, если это число.
probe_mqtt_connack_seconds mqtt Время до CONNACK.
probe_mqtt_suback_seconds mqtt Время до SUBACK.
probe_mqtt_message_bytes mqtt Размер сохранённого (retained) сообщения.
probe_mqtt_message_value mqtt Его содержимое, если это число.
probe_ws_handshake_seconds websocket Открывающее рукопожатие.
probe_ntp_offset_seconds ntp Смещение между локальными часами и сервером.
probe_ntp_delay_seconds ntp Сетевая задержка кругового обхода.
probe_ntp_stratum ntp Расстояние до эталонных часов (16: не синхронизирован).
probe_ntp_leap_indicator ntp От 0 до 3 (предупреждение о високосной секунде, 3 = часы не синхронизированы).
probe_ntp_root_delay_seconds ntp Накопленная задержка до корня иерархии.
probe_ntp_root_dispersion_seconds ntp Накопленная дисперсия до корня.
probe_ntp_reference_info ntp Присутствие; метка reference_id.
probe_ws_message_bytes websocket Размер первого полученного фрейма. Присутствует, только когда проверка отправляет сообщение или ожидает ответ (опции send / expect).

HTTP

Веб-сайт или веб-API (HTTP) — проверяет, что страница или API отвечает с правильным кодом статуса, правильным содержимым и действительным сертификатом. Примеры: веб-сайт, страница проверки работоспособности приложения, REST API, интерфейс самостоятельно размещённого сервиса.

Настройка

  1. В поле адреса вставьте полный URL отслеживаемой страницы. Без «http://» или «https://» предполагается HTTPS.
  2. Предпочитайте лёгкую страницу, не требующую входа, например страницу проверки работоспособности приложения («/health», «/status»), а не главную страницу.
  3. Если страница требует аутентификации, заполните учётные данные: имя пользователя и пароль дают базовую аутентификацию, токен отправляется как «Bearer».
  4. По умолчанию подходит любой код статуса от 200 до 299. Чтобы пойти дальше, потребуйте ключевое слово на странице или определённое значение в JSON-ответе.
  5. При работе по HTTPS сертификат читается автоматически: вас предупредят до его истечения.

Warning

Никогда не записывайте пароль или токен в опциях: они копируются открытым текстом при каждом измерении. Используйте поле учётных данных, оно зашифровано.

Учётные данные: нет, имя пользователя / пароль (базовая аутентификация) или API-токен (Authorization: Bearer).

Опции

Ключ Название По умолчанию Справка
method HTTP method GET GET подходит почти для всех случаев. HEAD позволяет не загружать страницу, когда важен только код статуса. Варианты: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS.
accepted_status Accepted status codes 200-299 Коды или диапазоны, считающиеся нормальными, через запятую. Любой другой код считается сбоем. Пример: 200-299,301,404.
keyword Expected keyword (пусто) Текст, который должен присутствовать на странице. Если его нет, сервис считается недоступным, даже если страница отвечает.
keyword_absent Keyword must be absent false Инвертирует проверку: наличие ключевого слова сигнализирует о сбое. Полезно для страницы с ошибкой, отвечающей кодом 200.
keyword_case_sensitive Match keyword case false По умолчанию регистр букв не учитывается.
json_path JSON path to check (пусто) Для JSON-ответа: путь к проверяемому значению. Заполняйте вместе с ожидаемым значением, никогда одно без другого. Пример: $.status.
json_expect Expected JSON value (пусто) Значение, которое должен иметь указанный выше JSON-путь, например «ok» или «true».
headers Extra headers (пусто) Один или несколько заголовков «Name: value», разделённых «|». Не помещайте сюда секреты: опции видны на графиках.
body Request body (пусто) Содержимое, отправляемое с запросом, для методов, которые его ожидают (POST, PUT…).
follow_redirects Follow redirects true Отключите, чтобы отслеживать сам редирект, например 301 на HTTPS.
max_redirects Maximum redirects followed 10 От 1 до 20. Не действует, если редиректы не выполняются.
insecure_tls Accept an unverifiable certificate false Проверка больше не завершается ошибкой на самоподписанном сертификате или выданном частным удостоверяющим центром.
allow_private_targets Allow loopback and link-local targets false По умолчанию проверка отклоняет адреса, доступные только самому хосту DumbMonit (127.0.0.1, ::1, 169.254.x.x). Включите, чтобы отслеживать сервис, работающий на хосте DumbMonit. Частные адреса локальной сети (10.x, 192.168.x) разрешены всегда.
check_certificate Read the certificate true При работе по HTTPS также записывает дату истечения сертификата, чтобы вас предупредили до его истечения.
max_body_bytes Maximum bytes read 524288 Сверх этого остальная часть страницы не загружается. Ключевое слово и JSON-путь ищутся только в этой части.
user_agent Announced identity (User-Agent) DumbMonit/<version> Имя, которым проверка представляется серверу. Измените его, если сервер фильтрует роботов.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

TCP

Сетевой порт (TCP) — проверяет, что порт принимает соединения: SSH, база данных, файловое хранилище, игровой сервер, сетевой принтер.

Настройка

  1. В поле адреса укажите хост и порт через двоеточие: «nas.home.lan:22» или «192.168.1.5:445».
  2. IPv6-адрес берите в квадратные скобки: «[fd00::1]:445».
  3. Можно также оставить адрес без порта и указать его в опции «Port»: нужно одно из двух.
  4. Проверяется только открытие соединения: никакие данные сервису не отправляются, поэтому на него это не влияет.

Warning

Открытый порт не доказывает, что приложение за ним работает. Для веб-сервиса лучше использовать тип «Website or web API», который читает ответ.

Опции

Ключ Название По умолчанию Справка
port Port (пусто) Порт для открытия, если адрес ещё не содержит его в виде «host:port». Нужно одно из двух.
allow_private_targets Allow loopback and link-local targets false По умолчанию проверка отклоняет адреса, доступные только самому хосту DumbMonit (127.0.0.1, ::1, 169.254.x.x). Включите, чтобы отслеживать сервис, работающий на хосте DumbMonit. Частные адреса локальной сети (10.x, 192.168.x) разрешены всегда.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

DNS

Доменное имя (DNS) — проверяет, что имя разрешается и указывает на правильный адрес. Примеры: ваше доменное имя, внутреннее имя, обслуживаемое вашим Pi-hole или AdGuard, MX-запись.

Настройка

  1. В поле адреса напишите разрешаемое имя без «http://»: «www.example.com».
  2. По умолчанию проверка запрашивает у системного резолвера IPv4-адрес (запись A). При необходимости выберите другой тип записи в опциях.
  3. Чтобы отслеживать собственный DNS-сервер, введите его IP-адрес в поле «DNS server to query»: проверка завершится ошибкой, если он перестанет отвечать.
  4. Чтобы обнаружить подмену или ошибку конфигурации, перечислите в «Expected values» адреса, которые должен содержать ответ.

Warning

DNS-сервер задаётся своим IP-адресом, а не именем: чтобы разрешить имя резолвера, потребовался бы другой резолвер.

Опции

Ключ Название По умолчанию Справка
record_type Record type A A для IPv4-адреса, AAAA для IPv6, MX для почты, CNAME для псевдонима… Варианты: A, AAAA, CNAME, MX, TXT, NS, SOA, SRV, PTR, CAA.
resolver DNS server to query (пусто) IP-адрес резолвера, порт необязателен. Пусто: системный резолвер. Удобно для проверки собственного DNS-сервера. Пример: 1.1.1.1 или 10.0.0.1:5353.
expect Expected values (пусто) Значения, которые все должны присутствовать в ответе, через запятую. Пусто: проверяется только разрешение.
expect_mode Comparison contains contains: каждое ожидаемое значение должно присутствовать где-либо в ответе. exact: ответ должен содержать эти значения и ничего больше.
forbid Forbidden values (пусто) Значения, которых в ответе быть не должно, через запятую. Проверяются раньше ожидаемых.
alert_on_change Alert when the answer changes false Записывает отпечаток отсортированного ответа и оповещает при каждом его изменении, без необходимости указывать ожидаемые значения.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

Проверка того, что отвечает зона

Одного expect достаточно, чтобы поймать запись, которая исчезла. Он не ловит запись, которая была добавлена: взломанная зона часто сохраняет легитимную A и ставит рядом вторую, и клиент затем попадает на любую из них случайным образом.

  • expect_mode = exact отклоняет любое значение, не покрытое ожиданием. Порядок не важен — в DNS его нет.
  • forbid перечисляет значения, которые никогда не должны возвращаться: адрес прежнего хоста, просроченную проверочную TXT, выведенный из эксплуатации почтовый сервер. Оно проверяется первым, поэтому имеет приоритет над expect.

Оба сравнения нечувствительны к регистру, игнорируют завершающую точку в имени и кавычки вокруг TXT и считают ожидаемое значение найденным, если оно встречается внутри записи — поэтому MX совпадает по mail.example.com, и вам не нужно копировать его приоритет.

Оповещение об изменении ответа

Записывать ожидаемые значения не всегда удобно: имя, обслуживаемое CDN, записи, которыми управляет кто-то другой, или просто зона, об изменении которой вы хотите знать. Отметьте Alert when the answer changes: тогда каждая проверка записывает отпечаток ответа, а встроенное правило DNS answer changed срабатывает, когда он отличается от предыдущего. Оповещение закрывается само через час; новый ответ с этого момента становится эталонным.

Отпечаток охватывает значения ответа, отсортированные и без дубликатов, включая цепочку CNAME: round-robin, возвращающий те же адреса в другом порядке, его не меняет, как и TTL. Имя, ответ на которое меняется при каждом запросе (большой пул вроде pool.ntp.org или географический DNS, отвечающий по-разному от одного резолвера к другому), оповещало бы постоянно: для таких имён оставьте опцию выключенной или опрашивайте один фиксированный резолвер.

Ping

Доступный хост (ping) — отправляет несколько ICMP-эхо-запросов и измеряет время отклика и потерю пакетов. Примеры: домашний роутер или шлюз, точка доступа Wi-Fi, принтер, машина без агента или SNMP, удалённый хост.

Настройка

  1. В поле адреса напишите имя хоста или IP-адрес: «192.168.1.1» или «router.home.lan».
  2. При каждом опросе проверка отправляет четыре эхо-запроса и измеряет время отклика, а также долю потерянных пакетов.
  3. По умолчанию недоступным считается только полная потеря; частичная потеря остаётся видна на графиках. Уменьшите «Tolerated loss», чтобы получать предупреждения раньше.
  4. Если DumbMonit работает в Docker, сохраните строки sysctls: из поставляемого docker-compose.yml в сервисе dumbmonit: они позволяют непривилегированному пользователю контейнера открывать сокеты ICMP echo. Никаких capability не требуется.

Warning

Без этого sysctl проверка не может открыть ICMP-сокет: она сообщает об этом как об ошибке конфигурации, а не как о сбое хоста. Некоторые устройства также намеренно игнорируют ping: проверьте это, прежде чем делать выводы.

services:
  dumbmonit:
    sysctls:
      net.ipv4.ping_group_range: "0 2147483647"

Вне Docker то же самое делает sysctl -w net.ipv4.ping_group_range="0 2147483647" на хосте, также работает и raw-сокет (NET_RAW, root).

Опции

Ключ Название По умолчанию Справка
count Number of echoes 4 Пакетов, отправляемых при каждом опросе, от 1 до 20.
packet_timeout_ms Wait per packet (ms) 1000 Время, отведённое на каждый ответ, от 50 до 10 000 мс.
interval_ms Gap between two echoes (ms) 100 Пауза между двумя эхо-запросами, от 0 до 5 000 мс.
payload_bytes Payload size (bytes) 56 Данные, переносимые каждым эхо-запросом, от 0 до 1 400 байт.
ip_version IP version auto «auto» берёт первый разрешённый адрес; принудительно выберите 4 или 6, если у хоста есть оба и один не отвечает. Варианты: auto, 4, 6.
loss_threshold_percent Tolerated loss (%) 100 При превышении этого процента потерянных пакетов хост считается недоступным. 100: учитывается только полная потеря, частичная остаётся видна на графиках.
timeout_seconds Timeout (seconds) 5 Общий бюджет времени на опрос, от 1 до 60. Отклоняется, если не покрывает «number of echoes × wait per packet».

TLS

TLS-сертификат — проверяет, что сертификат действителен, и предупреждает до его истечения, на любом зашифрованном порту. Примеры: почтовый сервер (IMAPS, SMTPS), обратный прокси, каталог LDAPS, брокер MQTT, интерфейс администрирования.

Настройка

  1. В поле адреса напишите хост и, если это не 443, порт зашифрованного сервиса: «mail.example.com:993», «ldap.home.lan:636».
  2. Проверка открывает зашифрованное соединение, читает предъявленный сертификат и сразу закрывает его: с приложением никакие данные не обмениваются.
  3. Она записывает число дней до истечения, издателя и версию TLS. Входящие в комплект правила оповещений предупреждают за четырнадцать дней, а затем при истечении.
  4. Если к сервису обращаются по IP-адресу, а сертификат содержит имя, введите это имя в «Server name (SNI)».
  5. Для сертификата, выданного вашим собственным удостоверяющим центром, отметьте «Accept an unverifiable certificate»: дата истечения по-прежнему отслеживается.

Warning

Для веб-сайта тип «Website or web API» уже читает сертификат: этот тип предназначен для сервисов, не использующих HTTP, или тех, чьё приложение вы не хотите нагружать запросами.

Рукопожатие завершается, даже когда сертификат отклонён: это позволяет прочитать дату истечения уже просроченного сертификата. Вердикт проверки находится в probe_ssl_cert_valid.

Опции

Ключ Название По умолчанию Справка
server_name Server name (SNI) (пусто) Доменное имя, сообщаемое серверу и проверяемое в сертификате. Задайте его, когда адрес — это IP за обратным прокси.
insecure_tls Accept an unverifiable certificate false Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается.
allow_private_targets Allow loopback and link-local targets false По умолчанию проверка отклоняет адреса, доступные только самому хосту DumbMonit (127.0.0.1, ::1, 169.254.x.x). Включите, чтобы отслеживать сервис, работающий на хосте DumbMonit. Частные адреса локальной сети (10.x, 192.168.x) разрешены всегда.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

SMTP

Почтовый релей (SMTP) — открывает настоящую сессию на почтовом сервере: приветствие, EHLO, STARTTLS и вход, если вы его указали. Примеры: SMTP-релей вашего провайдера, локальный Postfix или msmtp, Proxmox Mail Gateway, порт submission почтового сервера.

Настройка

  1. В поле адреса напишите почтовый сервер и порт, если он не стандартный: «smtp.example.com» или «smtp.example.com:2525».
  2. Выберите шифрование, которое использует ваш релей: STARTTLS для порта submission 587, TLS для порта 465, None для релея в вашей собственной сети, слушающего порт 25.
  3. Чтобы проверить, что релей по-прежнему принимает вашу учётную запись, заполните учётные данные: тогда проверка выполнит AUTH и сообщит об отклонённом пароле именно как о нём, а не как о сбое.
  4. Ничего не отправляется: проверка останавливается после приветствия, расширений и необязательного входа, затем завершает соединение. Ни одно сообщение не попадает в очередь.
  5. Чтобы получить предупреждение при исчезновении расширения, укажите его в «Expected extension»: релей, переставший объявлять STARTTLS, будет отправлять вашу почту открытым текстом.

Warning

Принятая сессия не доказывает, что почта уходит. Релей, который принимает всё и вечно держит это в очереди, здесь отвечает идеально: для этого следите за самими очередями.

Учётные данные: нет, либо имя пользователя и пароль, отправляемые через AUTH PLAIN (или AUTH LOGIN, когда сервер предлагает только его). Они отправляются после шифрования соединения и после оценки сертификата: релей, цепочку которого невозможно проверить, их никогда не получает.

При TLS или STARTTLS сертификат читается так же, как это делает проверка TLS — истечение, издатель, версия протокола — поэтому почтовый релей — это ещё и сертификат, об истечении которого вас предупредят.

Что она не может обнаружить

Что почта действительно уходит. Релей, который принимает каждую сессию, а затем откладывает всё, здесь отвечает идеально; вместо этого следите за его очередями (см. страницу Proxmox Mail Gateway). Она также никогда не отправляет сообщение, поэтому ничего не говорит о фильтрации получателей, SPF или DKIM.

Опции

Ключ Название По умолчанию Справка
security Encryption starttls STARTTLS начинает открытым текстом и повышает защиту (порт 587), TLS шифрует с первого байта (порт 465), None не шифрует никогда (порт 25) и подходит только для релея в вашей собственной сети.
port Port (пусто) Используется, если адрес его не задаёт. Пусто: 587 для STARTTLS, 465 для TLS, 25 без шифрования.
helo_name Name announced (EHLO) dumbmonit Имя, которым проверка представляется. Строгий релей отклоняет имя, которое не может разрешить.
expect_capability Expected extension (пусто) Расширение, которое сервер должен объявить в ответе на EHLO, например STARTTLS или AUTH. Пусто: ожиданий нет.
server_name Server name (SNI) (хост) Доменное имя, сообщаемое серверу и проверяемое в сертификате. Задайте его, когда адрес — это IP.
insecure_tls Accept an unverifiable certificate false Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается.
allow_private_targets Allow loopback and link-local targets false См. «Addresses the checks refuse» ниже.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

Причины сбоев

reason Что произошло
connect Порт закрыт или релей недоступен.
protocol Что-то ответило, но не SMTP — либо отклонило соединение, EHLO или STARTTLS, который сам объявило.
auth Учётная запись отклонена (535, 530, 534). С релеем всё в порядке; не в порядке учётные данные.
payload Расширение, указанное в «Expected extension», не объявлено.
tls, cert_expired То же значение, что и для проверки TLS.

PostgreSQL

База данных PostgreSQL — подключается, аутентифицируется и выполняет один запрос: сигнал о том, что база данных работает, но больше не отвечает. Примеры: база данных за Nextcloud или Immich, рекордер Home Assistant, база данных приложения, экземпляр TimescaleDB.

Настройка

  1. На сервере создайте учётную запись для мониторинга и дайте ей не больше чем право подключаться: CREATE ROLE dumbmonit LOGIN PASSWORD 'a-long-password';
  2. Убедитесь, что эта учётная запись может обращаться к серверу с машины DumbMonit, что обычно означает ещё одну строку в pg_hba.conf с последующей перезагрузкой конфигурации.
  3. В поле адреса напишите сервер и порт, если он не 5432: «db.home.lan» или «db.home.lan:5433».
  4. Запрос по умолчанию — SELECT 1, он не читает ни одной таблицы: ничего больше выдавать не нужно. Время соединения и время запроса записываются отдельно.
  5. Чтобы следить за чем-то своим, замените запрос на такой, который возвращает одно число, и оно станет графиком: длина очереди, число строк, задержка репликации.

Warning

Проверка открывает настоящее соединение при каждом опросе. Для экземпляра, уже близкого к лимиту соединений, задайте более длинный интервал.

Учётные данные: имя пользователя и пароль, обязательны. База данных никогда не отслеживается анонимно, поэтому форма не предлагает ничего другого.

Что она не может обнаружить

Задержку репликации, затянувшуюся блокировку, постоянно растущую таблицу. Всё это находится в административных представлениях самого движка — напишите запрос сами, и возвращаемое им число станет probe_sql_value, графиком, по которому можно оповещать.

Опции

Ключ Название По умолчанию Справка
port Port 5432 Используется, если адрес его не задаёт.
database Database postgres База данных, открываемая при подключении. Учётной записи мониторинга должно быть разрешено подключаться к ней.
query Query SELECT 1 Выполняется при каждой проверке. Запрос по умолчанию не читает ни одной таблицы, поэтому учётной записи не нужны привилегии, кроме подключения. Запрос, возвращающий одно число, превращает его в график.
expect Expected value (пусто) Значение, которое должен содержать первый столбец первой строки. Пусто: проверяется только успешность запроса.
sslmode Encryption prefer prefer шифрует, когда сервер это предлагает, require отказывается подключаться без шифрования, verify-full дополнительно проверяет сертификат и имя, disable не шифрует никогда.
allow_private_targets Allow loopback and link-local targets false См. «Addresses the checks refuse» ниже.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

MySQL и MariaDB

База данных MySQL или MariaDB — подключается, аутентифицируется и выполняет один запрос: сигнал о том, что база данных работает, но больше не отвечает. Примеры: база данных за WordPress, Nextcloud или Kimai, база данных приложения, MariaDB в Docker.

Настройка

  1. На сервере создайте учётную запись для мониторинга вообще без привилегий: CREATE USER 'dumbmonit'@'%' IDENTIFIED BY 'a-long-password';
  2. Проверьте, что учётная запись может подключаться с машины DumbMonit: шаблон хоста localhost принимал бы только соединения, установленные на самом сервере.
  3. В поле адреса напишите сервер и порт, если он не 3306: «db.home.lan» или «db.home.lan:3307».
  4. Запрос по умолчанию — SELECT 1, он не читает ни одной таблицы: ничего больше выдавать не нужно. Время соединения и время запроса записываются отдельно.
  5. Чтобы следить за чем-то своим, замените запрос на такой, который возвращает одно число, и оно станет графиком: длина очереди, число строк, задержка репликации.

Warning

Проверка открывает настоящее соединение при каждом опросе. Для экземпляра, уже близкого к лимиту соединений, задайте более длинный интервал.

Опции

Ключ Название По умолчанию Справка
port Port 3306 Используется, если адрес его не задаёт.
database Database (пусто) База данных, открываемая при подключении. Пусто: никакая, этого достаточно для запроса по умолчанию.
query Query SELECT 1 Выполняется при каждой проверке. Запрос по умолчанию не читает ни одной таблицы, поэтому учётной записи не нужны привилегии, кроме подключения. Запрос, возвращающий одно число, превращает его в график.
expect Expected value (пусто) Значение, которое должен содержать первый столбец первой строки. Пусто: проверяется только успешность запроса.
sslmode Encryption prefer prefer шифрует, когда сервер это предлагает, require отказывается подключаться без шифрования, verify-full дополнительно проверяет сертификат и имя, disable не шифрует никогда.
allow_private_targets Allow loopback and link-local targets false См. «Addresses the checks refuse» ниже.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

Причины сбоев, оба движка

reason Что произошло
connect Порт закрыт, сервер недоступен либо отклонил соединение по причине, не связанной с учётной записью (запускается, слишком много соединений).
auth Учётная запись отклонена: неверный пароль, нет строки в pg_hba.conf, шаблон хоста не покрывает машину DumbMonit.
query Подключение и аутентификация прошли, но запрос завершился ошибкой: отсутствует таблица, база данных в режиме только чтения, синтаксическая ошибка.
payload Запрос выполнился, но вернул не то значение, которое ожидалось.
timeout Соединение или запрос не завершились вовремя — случай «работает, но медленно».

MQTT

Брокер MQTT — подключается к брокеру, подписывается на топик и может ждать retained-сообщение. Примеры: Mosquitto, брокер за Home Assistant, Zigbee2MQTT, датчики ESPHome.

Настройка

  1. В поле адреса напишите брокер и порт, если он не стандартный: «broker.home.lan» или «broker.home.lan:1884».
  2. Отметьте «Encrypted connection» для брокера, слушающего порт 8883, и заполните учётные данные, если нужна учётная запись.
  3. Подключение само по себе уже стоит отслеживать: брокер, отклоняющий вашу учётную запись или переставший отвечать, — причина, по которой весь дом замолчал.
  4. Чтобы пойти дальше, укажите топик: тогда проверка подписывается на него, а брокер, отклонивший подписку, сообщает вам, что учётная запись потеряла права доступа.
  5. Отмечайте «Expect a retained message» только для топика, который его содержит, обычно это топик доступности. Топик, в который публикуют время от времени, выглядит молчащим для только что подключившегося клиента.

Warning

Проверка никогда ничего не публикует. Она также не может определить, насколько стар retained- сообщение: MQTT не датирует их, поэтому значение, замороженное три недели назад, всё равно считается присутствующим.

Что она не может обнаружить

Что конкретный датчик перестал передавать данные. Retained-сообщение, которое читает проверка, — это то, что сохранил брокер, возможно, трёхнедельной давности — MQTT не ставит на него метку времени. Для контроля свежести следите за автоматизацией, которая его использует, или применяйте heartbeat.

Опции

Ключ Название По умолчанию Справка
tls Encrypted connection false Шифрует сессию с первого байта, как это делают брокеры на порту 8883.
port Port (пусто) Используется, если адрес его не задаёт. Пусто: 1883 открытым текстом, 8883 с шифрованием.
topic Topic (пусто) Топик, на который подписывается проверка. Пусто: только подключение, что уже говорит вам, что брокер жив и принимает вашу учётную запись.
expect_message Expect a retained message false Сообщение должно прийти в этот топик до истечения тайм-аута. Сразу приходят только retained-сообщения: топик, в который лишь время от времени публикуют, будет выглядеть молчащим.
expect Expected content (пусто) Текст, который должно содержать это сообщение. Его заполнение подразумевает ожидание сообщения.
client_id Client identifier (выводится) Имя, сообщаемое брокеру. По умолчанию выводится из монитора, поэтому две проверки никогда не отключают друг друга.
server_name Server name (SNI) (хост) Доменное имя, сообщаемое брокеру и проверяемое в сертификате. Задайте его, когда адрес — это IP.
insecure_tls Accept an unverifiable certificate false Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается.
allow_private_targets Allow loopback and link-local targets false См. «Addresses the checks refuse» ниже.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

Причины сбоев

reason Что произошло
connect Порт закрыт или брокер недоступен.
auth CONNACK отклонил учётную запись, либо брокер отклонил подписку — список контроля доступа больше не покрывает этот топик.
protocol Что-то ответило, но не говорит на MQTT 3.1.1, либо брокер отклонил идентификатор клиента.
payload В топик не пришло retained-сообщение, либо его содержимое не включает ожидаемый текст.

WebSocket

Конечная точка WebSocket — выполняет рукопожатие upgrade и может отправить фрейм и дождаться ответного: это сбой другого рода, чем у обычной HTTP-страницы. Примеры: API Home Assistant, живая панель мониторинга, поток логов, конечная точка за обратным прокси.

Настройка

  1. В поле адреса вставьте полную конечную точку: «wss://home.example.com/api/websocket». Без схемы предполагается wss.
  2. Проверка выполняет всё открывающее рукопожатие и проверяет ответ, который сервер вычисляет из отправленного ему ключа: обратный прокси, потерявший заголовок Upgrade, обнаруживается здесь, тогда как HTTP-проверка по-прежнему видела бы здоровый 200.
  3. Для большинства конечных точек больше ничего не требуется. Статус, отличный от 101, сообщается вместе с кодом, поэтому 401 из-за просроченного токена не принимают за сбой.
  4. Чтобы пойти дальше, заполните «Expected content» фрагментом первого фрейма, который сервер отправляет сам, например приветствием API Home Assistant.
  5. Если конечная точка молчит, пока к ней не обратятся, поместите сообщение в «Frame to send», а то, что должен содержать ответ на него, — в «Expected content».

Warning

Проверка открывает и завершает соединение в течение секунды. Соединение, которое файрвол или тайм-аут прокси обрывает через тридцать секунд, здесь выглядит совершенно здоровым.

Учётные данные: нет, имя пользователя и пароль (отправляются как базовая HTTP-аутентификация в открывающем запросе) или токен (отправляется как Authorization: Bearer).

Опции

Ключ Название По умолчанию Справка
path Path (из адреса) Путь открывающего запроса. Берётся из адреса, если тот его содержит.
port Port (пусто) Используется, если адрес его не задаёт. Пусто: 443 для wss, 80 для ws.
send Frame to send (пусто) Текстовый фрейм, отправляемый после открытия соединения. Пусто: ничего не отправляется.
expect Expected content (пусто) Текст, который должен содержать полученный фрейм. Если пусто и нечего отправлять, проверяется только открывающее рукопожатие.
subprotocol Subprotocol (пусто) Значение Sec-WebSocket-Protocol. Проверка завершается ошибкой, если сервер выбирает другое.
origin Origin (пусто) Значение заголовка Origin, которое некоторые серверы требуют перед переключением протокола.
server_name Server name (SNI) (хост) Доменное имя, сообщаемое серверу и проверяемое в сертификате. Задайте его, когда адрес — это IP.
insecure_tls Accept an unverifiable certificate false Непроверяемая цепочка больше не считается сбоем: дата истечения по-прежнему записывается.
allow_private_targets Allow loopback and link-local targets false См. «Addresses the checks refuse» ниже.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

Причины сбоев

reason Что произошло
connect Порт закрыт или хост недоступен.
status Конечная точка ответила чем-то, отличным от 101; код находится в probe_http_status_code.
protocol Она ответила 101, но её Sec-WebSocket-Accept не соответствует отправленному ключу, она выбрала другой подпротокол либо сразу закрыла соединение.
payload Ни один фрейм не пришёл, либо он не содержит ожидаемого текста.

NTP

Сервер времени NTP — отправляет один SNTP-запрос и читает ответ: смещение, задержку кругового обхода, stratum и индикатор високосной секунды. Примеры: роутер или NAS, выступающий локальным сервером времени, внутренний NTP-сервер (chrony, ntpd), публичный сервер из пула, используемый как эталон.

Настройка

  1. В поле адреса напишите имя или IP-адрес сервера: «pool.ntp.org» или «192.168.1.1». Используется UDP-порт 123, если опция «Port» не указывает иное.
  2. Проверка отправляет один SNTP-запрос и читает ответ: состояние между опросами не сохраняется, и на сервер ничего не записывается.
  3. Она записывает смещение между часами сервера и хоста DumbMonit, задержку кругового обхода, stratum и индикатор високосной секунды.
  4. Сервер, отвечающий stratum 16 или чей индикатор високосной секунды показывает «unsynchronized», так и не смог синхронизироваться: проверка считает его недоступным независимо от смещения.
  5. Уменьшите «Tolerated offset», чтобы получать предупреждения раньше, чем при 100 мс; увеличьте его для сервера, находящегося на нескольких пересылках от эталонных часов.

Warning

Смещение настолько же точно, насколько точны собственные часы хоста DumbMonit: если этот хост сам не синхронизируется (NTP, синхронизация времени гипервизора), измеренное смещение отражает его дрейф в той же мере, что и дрейф сервера.

Учётные данные: нет.

Опции

Ключ Название По умолчанию Справка
port Port 123 UDP-порт NTP-сервера.
offset_threshold_ms Tolerated offset (ms) 100 При превышении этого смещения часов сервер считается недоступным. Несинхронизированный сервер (stratum 16) всегда завершается ошибкой, независимо от этого значения.
allow_private_targets Allow loopback and link-local targets false См. «Addresses the checks refuse» ниже.
timeout_seconds Timeout (seconds) 5 Время, по истечении которого сервис считается недоступным, если не ответил. От 1 до 60.

Причины сбоев

reason Что произошло
connect Не удалось открыть UDP-сокет, либо ответ пришёл с неожиданного адреса.
timeout Ответ не пришёл в пределах тайм-аута.
protocol Ответ не был корректным NTP-пакетом либо пришёл не от сервера (неверный режим).
unsynchronized Сервер ответил stratum 16 или 0 («kiss-o'-death», который также называет причину в логе), либо его индикатор високосной секунды показывает «unsynchronized».
clock_offset Измеренное смещение превышает «Tolerated offset».

Адреса, которые проверки отклоняют

Проверки, подключающиеся к указанному вами адресу — HTTP, TCP, TLS, NTP, SMTP, PostgreSQL, MySQL, MQTT, WebSocket — сообщают то, что видят, — а это же, слово в слово, делает server-side request forgery. Чтобы администратор мониторинга не мог читать сервисы, доступные только хосту DumbMonit (встроенная база метрик на 127.0.0.1:8428, служба метаданных облачного провайдера на 169.254.169.254), проверки по умолчанию отклоняют:

  • адреса loopback (127.0.0.0/8, ::1);
  • link-local-адреса (169.254.0.0/16, fe80::/10), включая облачный адрес метаданных, и неопределённый адрес (0.0.0.0, ::).

Частные диапазоны локальной сети (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7) разрешены всегда: их мониторинг — смысл домашней лаборатории.

Правило применяется к введённому вами адресу, к каждому адресу, в который разрешается имя хоста (проверяется повторно в момент соединения, поэтому имя, меняющее свой ответ, не проскользнёт), и к каждому редиректу, по которому следует HTTP-проверка. Отклонённый адрес отображается как ошибка конфигурации на цели — оповещение о недоступности не отправляется — с указанием опции, которую нужно включить: allow_private_targets. Включите её для цели, которая действительно отслеживает сервис на самом хосте DumbMonit.

Редирект на отклонённый адрес сообщается как неудачное измерение (reason="connect"), потому что изменился отслеживаемый сервис, а не конфигурация.

Значения, найденные по json_path, никогда не выводятся в сообщении о сбое длиннее 32 символов.

Типичные ошибки

Симптом Вероятная причина
Ping показывает ошибку конфигурации В файле Compose отсутствует sysctl net.ipv4.ping_group_range. См. выше.
HTTP недоступен с reason="keyword" Ключевое слово ищется только в первых max_body_bytes, без учёта регистра, если не задан keyword_case_sensitive.
HTTP недоступен с reason="tls" Самоподписанный сертификат или частный удостоверяющий центр: задайте insecure_tls.
Проверка показывает ошибку конфигурации с упоминанием allow_private_targets Адрес — loopback или link-local. См. «Addresses the checks refuse» выше.
TCP недоступен, хотя telnet host port работает с вашего ноутбука Контейнер DumbMonit не может достичь хоста (сеть Docker, файрвол). Проверьте изнутри сети контейнера.
DNS недоступен с reason="record" Ответ не содержит все значения, перечисленные в expect.
Ping недоступен с reason="packet_loss" Потери выше loss_threshold_percent; некоторые устройства ограничивают частоту ICMP.
DNS недоступен с reason="record", хотя expect совпадает expect_mode равен exact, и ответ содержит лишнее значение, либо сработал forbid.
SMTP недоступен с reason="protocol" при security = starttls Релей не объявляет STARTTLS на этом порту. Используйте tls для 465, none для обычного локального релея.
Проверка базы данных недоступна с reason="auth" Учётная запись существует, но ей нельзя подключаться с машины DumbMonit: проверьте pg_hba.conf или часть host у пользователя MySQL.
Проверка базы данных недоступна с reason="query" Подключение и вход прошли. База данных работает, но отказывается выполнять работу: только чтение, отсутствует таблица, восстановление.
MQTT недоступен с reason="payload" на топике, где явно есть трафик Только retained-сообщения доходят до только что подписавшегося клиента. Публикуйте в этот топик с флагом retain или снимите отметку «Expect a retained message».
WebSocket недоступен с reason="protocol" после 101 Что-то на пути отвечает на upgrade, не говоря на WebSocket, — обычно правило обратного прокси, поглощающее заголовок Upgrade.