InfraGuard

Доска состояния инфраструктуры

Живая доска доступности: нагрузка, ЦП, память и диск по каждому узлу, а также состояние сервисов nginx/php/mysql/mongo на одном экране.

Обзор — что делает этот экран

Инфраструктура ▸ Состояние (/infra/health) — это панель эксплуатации доступности, которая показывает состояние каждого работающего узла в виде сетки карточек, доступной одним взглядом. Экран заново реализует ./server/stat из stats-design и объединяет в одной карточке два разных пути получения данных:

  1. Снимок метрик — последние значения нагрузки / ЦП / памяти / диска, которые коллектор run_report записывает в server_status (устаревшая таблица) примерно каждые 5 минут. Приложение читает их из 20-секундного кэша (прямого соединения с удалённым узлом нет).
  2. Живая проверка сервисов — обращение в реальном времени к агенту tlx.php, развёрнутому на каждом узле, чтобы прямо сейчас выяснить, запущены ли демоны nginx / php / mysql / mongo, и перечислить контейнеры Docker (TlxClient).

Список узлов и алиасы (ALIAS_MAP) загружаются автоматически — без настройки на каждом сервере — из конфигурации коллектора run_report (infr_collector.config) в разделе Администрирование ▸ Коллекторы.

Каждая карточка показывает краткие сведения об узле в заголовке, кольцевой индикатор ЦП (со средней нагрузкой в центре), полосы MEM/DISK под ним и точки состояния сервисов внизу.

Этот экран предназначен для эксплуатации в режиме только чтения. Здесь вы не редактируете ни узлы, ни алиасы, ни tlx api_key — всё это находится в разделе Коллекторы.

Когда использовать

Для анализа динамики (временных рядов) перейдите в Временные ряды серверов; для состояния 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 (при успешной проверке)
└──────────────────────────────────────┘

Пороги (правила окраски)

Метрика good (зелёный) warn (янтарный) crit (красный)
CPU us % (кольцо) < 60 ≥ 60 ≥ 85
MEM % (полоса) < 80 ≥ 80 ≥ 92
DISK % (полоса) < 80 ≥ 80 ≥ 92

Отсутствующие значения (—) отображаются серым (na).

Оттенки точек сервисов

Оттенок Условие
up (зелёный) Проверка удалась + число процессов этого демона > 0
down (красный) Проверка удалась, но число процессов равно 0, либо проверка не удалась
unknown (серый) Проверка ещё не выполнялась либо в ответе нет ключа этого сервиса

Как пользоваться

1. Обновление метрик (автоматически + вручную)

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=размер)

Определение узлов — 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 от 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 (средствами Laravel Crypt) и используется только на стороне сервера. Он никогда не возвращается в браузер и никогда не задаётся в коде жёстко. К удалённому узлу уходит лишь подписанное значение q.

Сводка конечных точек

Метод · путь Имя Назначение
GET /infra/health infra.health Страница (с начальными данными)
GET /infra/health/refresh infra.health.refresh Опрос снимка метрик (JSON)
POST /infra/health/probe infra.health.probe Живая проверка одного узла ({alias})

Доступ

Устранение неполадок и вопросы

Карточек нет совсем, выводится «Коллектор 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.

Все точки сервисов серые

  1. Если значок ключа в шапке — 🔑❗ (не задан), задайте tlx api_key в разделе Коллекторы: пока он не задан, проверки не выполняются.
  2. Нажмите кнопку проверки (⟐) на карточке и посмотрите ответ. Сообщение «Проверка не удалась (узел недоступен)» означает, что следует проверить url узла, межсетевой экран и развёртывание tlx.php.

Не удаётся только проверка, а нагрузка и память выглядят нормально

Метрики (server_status) и проверка (tlx.php) — это независимые пути. Приём данных коллектором в базу работает, но HTTP-точка tlx.php на узле заблокирована (межсетевой экран или путь). Проверьте config.path (по умолчанию /tlx.php) и url узла.

Процент диска не соответствует ожидаемому

Отображаемый диск выбирается в порядке приоритета df-data → df- → df-home. При нескольких томах преимущество имеет том с данными (df-data).

Смежные разделы

헬스 — 노드별 CPU 링 게이지와 서비스 도트
헬스 — 노드별 CPU 링 게이지와 서비스 도트
노드 카드 한 장
노드 카드 한 장