Сервисы: 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, интерфейс самостоятельно размещённого сервиса.
Настройка¶
- В поле адреса вставьте полный URL отслеживаемой страницы. Без «http://» или «https://» предполагается HTTPS.
- Предпочитайте лёгкую страницу, не требующую входа, например страницу проверки работоспособности приложения («/health», «/status»), а не главную страницу.
- Если страница требует аутентификации, заполните учётные данные: имя пользователя и пароль дают базовую аутентификацию, токен отправляется как «Bearer».
- По умолчанию подходит любой код статуса от 200 до 299. Чтобы пойти дальше, потребуйте ключевое слово на странице или определённое значение в JSON-ответе.
- При работе по 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, база данных, файловое хранилище, игровой сервер, сетевой принтер.
Настройка¶
- В поле адреса укажите хост и порт через двоеточие: «nas.home.lan:22» или «192.168.1.5:445».
- IPv6-адрес берите в квадратные скобки: «[fd00::1]:445».
- Можно также оставить адрес без порта и указать его в опции «Port»: нужно одно из двух.
- Проверяется только открытие соединения: никакие данные сервису не отправляются, поэтому на него это не влияет.
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-запись.
Настройка¶
- В поле адреса напишите разрешаемое имя без «http://»: «www.example.com».
- По умолчанию проверка запрашивает у системного резолвера IPv4-адрес (запись A). При необходимости выберите другой тип записи в опциях.
- Чтобы отслеживать собственный DNS-сервер, введите его IP-адрес в поле «DNS server to query»: проверка завершится ошибкой, если он перестанет отвечать.
- Чтобы обнаружить подмену или ошибку конфигурации, перечислите в «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, удалённый хост.
Настройка¶
- В поле адреса напишите имя хоста или IP-адрес: «192.168.1.1» или «router.home.lan».
- При каждом опросе проверка отправляет четыре эхо-запроса и измеряет время отклика, а также долю потерянных пакетов.
- По умолчанию недоступным считается только полная потеря; частичная потеря остаётся видна на графиках. Уменьшите «Tolerated loss», чтобы получать предупреждения раньше.
- Если 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, интерфейс администрирования.
Настройка¶
- В поле адреса напишите хост и, если это не 443, порт зашифрованного сервиса: «mail.example.com:993», «ldap.home.lan:636».
- Проверка открывает зашифрованное соединение, читает предъявленный сертификат и сразу закрывает его: с приложением никакие данные не обмениваются.
- Она записывает число дней до истечения, издателя и версию TLS. Входящие в комплект правила оповещений предупреждают за четырнадцать дней, а затем при истечении.
- Если к сервису обращаются по IP-адресу, а сертификат содержит имя, введите это имя в «Server name (SNI)».
- Для сертификата, выданного вашим собственным удостоверяющим центром, отметьте «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 почтового сервера.
Настройка¶
- В поле адреса напишите почтовый сервер и порт, если он не стандартный: «smtp.example.com» или «smtp.example.com:2525».
- Выберите шифрование, которое использует ваш релей: STARTTLS для порта submission 587, TLS для порта 465, None для релея в вашей собственной сети, слушающего порт 25.
- Чтобы проверить, что релей по-прежнему принимает вашу учётную запись, заполните учётные данные: тогда проверка выполнит AUTH и сообщит об отклонённом пароле именно как о нём, а не как о сбое.
- Ничего не отправляется: проверка останавливается после приветствия, расширений и необязательного входа, затем завершает соединение. Ни одно сообщение не попадает в очередь.
- Чтобы получить предупреждение при исчезновении расширения, укажите его в «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.
Настройка¶
- На сервере создайте учётную запись для мониторинга и дайте ей не больше чем право подключаться: CREATE ROLE dumbmonit LOGIN PASSWORD 'a-long-password';
- Убедитесь, что эта учётная запись может обращаться к серверу с машины DumbMonit, что обычно означает ещё одну строку в pg_hba.conf с последующей перезагрузкой конфигурации.
- В поле адреса напишите сервер и порт, если он не 5432: «db.home.lan» или «db.home.lan:5433».
- Запрос по умолчанию — SELECT 1, он не читает ни одной таблицы: ничего больше выдавать не нужно. Время соединения и время запроса записываются отдельно.
- Чтобы следить за чем-то своим, замените запрос на такой, который возвращает одно число, и оно станет графиком: длина очереди, число строк, задержка репликации.
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.
Настройка¶
- На сервере создайте учётную запись для мониторинга вообще без привилегий: CREATE USER 'dumbmonit'@'%' IDENTIFIED BY 'a-long-password';
- Проверьте, что учётная запись может подключаться с машины DumbMonit: шаблон хоста localhost принимал бы только соединения, установленные на самом сервере.
- В поле адреса напишите сервер и порт, если он не 3306: «db.home.lan» или «db.home.lan:3307».
- Запрос по умолчанию — SELECT 1, он не читает ни одной таблицы: ничего больше выдавать не нужно. Время соединения и время запроса записываются отдельно.
- Чтобы следить за чем-то своим, замените запрос на такой, который возвращает одно число, и оно станет графиком: длина очереди, число строк, задержка репликации.
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.
Настройка¶
- В поле адреса напишите брокер и порт, если он не стандартный: «broker.home.lan» или «broker.home.lan:1884».
- Отметьте «Encrypted connection» для брокера, слушающего порт 8883, и заполните учётные данные, если нужна учётная запись.
- Подключение само по себе уже стоит отслеживать: брокер, отклоняющий вашу учётную запись или переставший отвечать, — причина, по которой весь дом замолчал.
- Чтобы пойти дальше, укажите топик: тогда проверка подписывается на него, а брокер, отклонивший подписку, сообщает вам, что учётная запись потеряла права доступа.
- Отмечайте «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, живая панель мониторинга, поток логов, конечная точка за обратным прокси.
Настройка¶
- В поле адреса вставьте полную конечную точку: «wss://home.example.com/api/websocket». Без схемы предполагается wss.
- Проверка выполняет всё открывающее рукопожатие и проверяет ответ, который сервер вычисляет из отправленного ему ключа: обратный прокси, потерявший заголовок Upgrade, обнаруживается здесь, тогда как HTTP-проверка по-прежнему видела бы здоровый 200.
- Для большинства конечных точек больше ничего не требуется. Статус, отличный от 101, сообщается вместе с кодом, поэтому 401 из-за просроченного токена не принимают за сбой.
- Чтобы пойти дальше, заполните «Expected content» фрагментом первого фрейма, который сервер отправляет сам, например приветствием API Home Assistant.
- Если конечная точка молчит, пока к ней не обратятся, поместите сообщение в «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), публичный сервер из пула, используемый как эталон.
Настройка¶
- В поле адреса напишите имя или IP-адрес сервера: «pool.ntp.org» или «192.168.1.1». Используется UDP-порт 123, если опция «Port» не указывает иное.
- Проверка отправляет один SNTP-запрос и читает ответ: состояние между опросами не сохраняется, и на сервер ничего не записывается.
- Она записывает смещение между часами сервера и хоста DumbMonit, задержку кругового обхода, stratum и индикатор високосной секунды.
- Сервер, отвечающий stratum 16 или чей индикатор високосной секунды показывает «unsynchronized», так и не смог синхронизироваться: проверка считает его недоступным независимо от смещения.
- Уменьшите «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. |