Обзор — что делает этот экран
Инфраструктура ▸ Состояние (/infra/health) — это панель эксплуатации доступности, которая показывает состояние каждого работающего узла в виде сетки карточек, доступной одним взглядом. Экран заново реализует ./server/stat из stats-design и объединяет в одной карточке два разных пути получения данных:
- Снимок метрик — последние значения нагрузки / ЦП / памяти / диска, которые коллектор
run_reportзаписывает вserver_status(устаревшая таблица) примерно каждые 5 минут. Приложение читает их из 20-секундного кэша (прямого соединения с удалённым узлом нет). - Живая проверка сервисов — обращение в реальном времени к агенту
tlx.php, развёрнутому на каждом узле, чтобы прямо сейчас выяснить, запущены ли демоныnginx / php / mysql / mongo, и перечислить контейнеры Docker (TlxClient).
Список узлов и алиасы (ALIAS_MAP) загружаются автоматически — без настройки на каждом сервере — из конфигурации коллектора run_report (infr_collector.config) в разделе Администрирование ▸ Коллекторы.
Каждая карточка показывает краткие сведения об узле в заголовке, кольцевой индикатор ЦП (со средней нагрузкой в центре), полосы MEM/DISK под ним и точки состояния сервисов внизу.
Этот экран предназначен для эксплуатации в режиме только чтения. Здесь вы не редактируете ни узлы, ни алиасы, ни tlx api_key — всё это находится в разделе Коллекторы.
Когда использовать
- Утренняя проверка — за 30 секунд оцените, все ли узлы в сети и находятся ли нагрузка, память и диск в здоровом диапазоне.
- Реагирование на инцидент — живой проверкой мгновенно подтвердите, не остановился ли
nginxилиmysqlна конкретном сервере. - Наблюдение за ёмкостью — по цвету найдите узлы, у которых использование диска приближается к порогам (80 % / 92 %).
- Проверка хостов Docker — убедитесь, что контейнеры живы, по значку с числом контейнеров Docker в нижней части результата проверки.
Для анализа динамики (временных рядов) перейдите в Временные ряды серверов; для состояния RAID-контроллера и карты физических дисков — в Хранилище и RAID.
Компоновка
Шапка (верхняя панель)
| Элемент | Значение |
|---|---|
| Значок коллектора | Название коллектора run_report + число узлов + число сопоставлений ALIAS |
| Значок ключа | Задан ли tlx api_key. 🔑 (зелёный) = задан · 🔑❗ (серый) = не задан, поэтому проверки сервисов недоступны |
| Кнопка настройки коллектора | Ведёт в Коллекторы (/admin/collectors) |
| Кнопка обновления | Перечитывает метрики и заново запускает живые проверки на всех узлах |
Если коллектора run_report нет, вместо сетки карточек выводится уведомление «Коллектор run_report не зарегистрирован» с кнопкой настройки.
Карточка узла
┌──────────────────────────────────────┐
│ ⠿ ● glory ⟳(probe)│ ← заголовок: захват · точка присутствия · метка/алиас/IP
│ glory · 203.0.113.10 │
│ │
│ ╭───────────╮ │
│ │ 0.84 │ ← кольцо ЦП (цвет=CPU%), в центре=load
│ │ load │
│ │ CPU 12% │
│ ╰───────────╯ │
│ 🧠 MEM ▓▓▓▓▓▓░░░░ 63% │ ← полоса MEM
│ 💽 DISK ▓▓▓▓▓▓▓▓░░ 81% │ ← полоса DISK
│ ● nginx ● php ● mysql ● mongo │ ← точки сервисов (живая проверка)
│ 🐳 4 │ ← число контейнеров Docker (при успешной проверке)
└──────────────────────────────────────┘
- Точка присутствия (слева в заголовке) — узел в сети, если он сообщил
loadavgв течение последних 2 циклов сбора. Иначе карточка затемняется (is-offline) и показывает «Не в сети (нет свежих отчётов)». - Кольцевой индикатор ЦП — заполнение и цвет кольца соответствуют CPU us %, крупное число в центре — это средняя нагрузка (за 1 минуту), а мелкий текст под ним — процент ЦП.
- Полосы MEM / DISK — использование (%), окрашенное по порогу.
- Точки сервисов — их четыре:
nginx / php / mysql / mongo. Цвет следует результату проверки (см. таблицу). - Значок Docker — показывает число контейнеров при успешной проверке, если контейнеры есть, либо «Проверка не удалась (узел недоступен)» при неудаче.
Пороги (правила окраски)
| Метрика | good (зелёный) | warn (янтарный) | crit (красный) |
|---|---|---|---|
| CPU us % (кольцо) | < 60 | ≥ 60 | ≥ 85 |
| MEM % (полоса) | < 80 | ≥ 80 | ≥ 92 |
| DISK % (полоса) | < 80 | ≥ 80 | ≥ 92 |
Отсутствующие значения (—) отображаются серым (na).
Оттенки точек сервисов
| Оттенок | Условие |
|---|---|
up (зелёный) |
Проверка удалась + число процессов этого демона > 0 |
down (красный) |
Проверка удалась, но число процессов равно 0, либо проверка не удалась |
unknown (серый) |
Проверка ещё не выполнялась либо в ответе нет ключа этого сервиса |
Как пользоваться
1. Обновление метрик (автоматически + вручную)
- Метрики карточек опрашиваются автоматически каждые 30 секунд (
GET /infra/health/refresh). С учётом 20-секундного кэша на стороне сервера это недорого. - Кнопка обновления вверху (⟳) перечитывает метрики и заново запускает живые проверки на всех узлах, разнося их по времени.
2. Живая проверка одного узла
Кнопка пульса (⟐) справа в заголовке карточки немедленно проверяет только этот узел (POST /infra/health/probe, тело {alias}). При первой загрузке страницы, если tlx api_key задан, все карточки проверяются автоматически с разносом в 250 мс (чтобы избежать всплеска обращений).
При успешной проверке карточка отражает не только точки сервисов, но и мгновенные значения нагрузки / ЦП / MEM / DISK, переданные в ответе.
Если все точки сервисов серые (
unknown), обычно это означает, чтоtlx api_keyне задан. Посмотрите на значок ключа в шапке — если там 🔑❗, проверка не выполняется вовсе.
3. Перестановка карточек (перетаскивание)
Возьмитесь за захват (⠿) слева в заголовке карточки и перетащите её, чтобы изменить порядок. Порядок сохраняется в localStorage браузера (infr:order:infra-health) и остаётся между визитами. Карточки используют компоновку masonry с переменной высотой и разбиваются по 10 штук на страницу.
Источники данных
Метрики — server_status (устаревшая таблица, только чтение)
HealthService::metricsByAlias() читает через соединение legacy. Чтобы избежать медленных запросов, выборка сужается до недавнего окна seq вместо агрегирования всей таблицы.
-- 1) только 3 самых свежих seq (distinct = сканирование индекса)
SELECT DISTINCT seq FROM server_status ORDER BY seq DESC LIMIT 3;
-- 2) только нужные part для этих seq
SELECT server_alias, part, value, seq, created_at
FROM server_status
WHERE seq IN (:s1, :s2, :s3)
AND part IN ('loadavg','free','top','df-','df-data','df-home')
ORDER BY seq; -- по возрастанию → более поздние строки новее
Соглашение о хранении, принятое в коллекторе run_report:
| part | Значение | Формат | Соответствие на карточке |
|---|---|---|---|
loadavg |
Нагрузка (1 минута) | число | load (центр индикатора) |
top |
CPU us % | "NN%" |
заполнение кольца ЦП |
free |
Память % | "NN%" |
полоса MEM |
df-data / df- / df-home |
Диск | JSON {p,u,a} |
полоса DISK (p=%, u=занято, a=размер) |
- Решение о присутствии — узел в сети, если
loadavgвстречается в пределах 2 самых свежих seq. - Приоритет дисков — первое допустимое значение из
df-data→df-→df-home. - Ключ кэша
infr:health:metrics:v1, TTL — 20 с. Любое исключение во время запроса корректно приводит к пустому массиву.
Определение узлов — infr_collector.config
HealthService::resolveNodes() выводит узлы из коллектора run_report (InfrCollector::where('key','run_report')).
| Приоритет | Источник (node_source) |
Описание |
|---|---|---|
| 1 | config |
Использует config.nodes[] как есть, если он задан (каждый узел = url·alias·label·ip) |
| 2 | instance |
Если список пуст, узлы выводятся во время выполнения из реестра Инстансы (infr_instance, кэш 60 с) |
| — | none |
Если пусты оба источника, узлов нет |
Число записей в config.alias_map отображается в шапке как значок «ALIAS».
Состояние сервисов — живая проверка tlx.php (TlxClient)
HealthController::probe() находит узел по алиасу (что исключает проксирование на произвольный хост) и обращается к tlx.php этого узла через TlxClient::probe().
- Режим —
check_all(по умолчанию) илиcheck_multi; выбор определяется параметромconfig.mode(преждеtlx_mode). - Путь —
config.path(преждеtlx_path), по умолчанию/tlx.php. - Тайм-аут — до 4 с на подключение / 6 с суммарно. Недоступность, тайм-аут и ошибка разбора JSON одинаково корректно приводят к
{ok:false, reason:...}.
Нормализованный вид ответа check_all от tlx.php, используемый карточкой:
{
"ok": true,
"load": 0.84,
"cpu_us": 12.0,
"mem_pct": 63,
"disks": [ { "mount": "/data", "pct": 81, "used": "1.6T", "size": "2.0T" } ],
"services": { "nginx": {"count":4,"up":true}, "php": {"count":8,"up":true}, "mysql": {"count":1,"up":true}, "mongo": {"count":0,"up":false} },
"docker": [ "web", "redis", "worker", "cron" ]
}
tlx api_keyрасшифровывается изinfr_collector(средствами LaravelCrypt) и используется только на стороне сервера. Он никогда не возвращается в браузер и никогда не задаётся в коде жёстко. К удалённому узлу уходит лишь подписанное значениеq.
Сводка конечных точек
| Метод · путь | Имя | Назначение |
|---|---|---|
GET /infra/health |
infra.health |
Страница (с начальными данными) |
GET /infra/health/refresh |
infra.health.refresh |
Опрос снимка метрик (JSON) |
POST /infra/health/probe |
infra.health.probe |
Живая проверка одного узла ({alias}) |
Доступ
- Чтение (просмотр · проверка) — экран расположен в группе
infr.authи доступен любому аутентифицированному пользователю консоли (уровень ≥ 1 / демо). Минимальный уровень для ролевой области «Инфраструктура» — 1. - Без записи — сам экран состояния не содержит разрушающих действий. Изменение узлов, алиасов и
tlx api_keyвыполняется в разделе Коллекторы и разрешено только администраторам (уровень ≥ 5, admin=10). - Проверка обращается исключительно к зарегистрированным алиасам узлов, поэтому её нельзя использовать для проксирования на произвольные хосты (защита от SSRF).
Устранение неполадок и вопросы
Карточек нет совсем, выводится «Коллектор run_report не зарегистрирован»
Коллектора с ключом run_report не существует. Зарегистрируйте его в разделе Коллекторы со значениями access=web и key=run_report.
Выводится «Узлы не зарегистрированы»
Коллектор run_report существует, но config.nodes пуст, и реестр infr_instance тоже пуст. Заполните массив узлов коллектора либо зарегистрируйте серверы в разделе Инстансы (при пустом config.nodes узлы выводятся из инстансов автоматически).
В метриках только — (прочерки)
В server_status нет свежего снимка. Убедитесь, что коллектор run_report действительно запускается по cron и что алиасы узлов совпадают с server_status.server_alias. Присутствие определяется по 2 самым свежим seq.
Все точки сервисов серые
- Если значок ключа в шапке — 🔑❗ (не задан), задайте
tlx api_keyв разделе Коллекторы: пока он не задан, проверки не выполняются. - Нажмите кнопку проверки (⟐) на карточке и посмотрите ответ. Сообщение «Проверка не удалась (узел недоступен)» означает, что следует проверить
urlузла, межсетевой экран и развёртываниеtlx.php.
Не удаётся только проверка, а нагрузка и память выглядят нормально
Метрики (server_status) и проверка (tlx.php) — это независимые пути. Приём данных коллектором в базу работает, но HTTP-точка tlx.php на узле заблокирована (межсетевой экран или путь). Проверьте config.path (по умолчанию /tlx.php) и url узла.
Процент диска не соответствует ожидаемому
Отображаемый диск выбирается в порядке приоритета df-data → df- → df-home. При нескольких томах преимущество имеет том с данными (df-data).
Смежные разделы
- Временные ряды серверов — динамика нагрузки / ЦП / памяти (ECharts) и таблицы статистики
- Хранилище и RAID — состояние RAID-контроллера · карта физических дисков
- Коллекторы — настройка узлов
run_report· ALIAS ·tlx api_key - Инстансы — источник автоматического вывода узлов (
infr_instance) - Оповещения — SMS/письмо при нарушении порогов нагрузки или диска
- Обзор — сводная оценка состояния по доступности и безопасности

