Обзор — что делает этот экран
Обзор сервисов — первый экран раздела верхнего уровня «Сервисы» (/service), то есть подобранная эксплуатационная доска реального времени для работающих сервисов (демонов). Оператор вручную отбирает интересующие его сервисы и раскладывает их в виде карточек приоритета. Каждая карточка показывает свой набор живых метрик в зависимости от типа, первая (наиболее приоритетная) карточка web/db/session питает шкалу доступности, а нижняя полоса рисует живые временные ряды выбранных карточек.
Ключевые особенности:
- Выбор и порядок хранятся в браузере (localStorage) — на сервере ничего не сохраняется. Даже для одной и той же учётной записи раскладка доски может отличаться в разных браузерах.
- Только чтение и малый вес —
ServiceBoardService(кэш 15 секунд) сводит нижележащие подсистемы (веб, БД, сессии, Каталог) к единой канонической форме карточки. Экран не открывает новых прямых подключений к удалённым серверам (за исключением точечной выборки свежести для карточки БД — см. ниже). - Только логическая достижимость и нагрузка. Физическое сканирование открытых портов и поверхности воздействия относится к разделу Межсетевой экран (граница ролей).
Эта доска — не демонстрационный парк: здесь всё построено на реальных данных. Источники метрик — таблицы, которые коллекторы уже наполняют:
infr_web_metric,infr_db_metric,infr_redis_metricиinfr_service(Каталог).
Когда использовать
- Чтобы в начале смены одним взглядом охватить небольшой набор ключевых сервисов (например, флагманский сайт, основную БД, Redis для сессий) на одном экране.
- В качестве панели NOC / настенного экрана (кнопка полноэкранного режима и ползунки высоты подгоняют её под экран).
- Чтобы посмотреть недавнюю динамику сервиса (1h / 6h / 1d) в виде временного ряда.
- Как отправную точку: составьте общее впечатление здесь, а затем переходите к деталям в разделах Веб, База данных, Сессии или Каталог.
Устройство экрана
Верхняя полоса KPI
Сводка по всей организации, рассчитываемая методом realKpi() (обновляется опросом раз в 30 секунд):
| KPI | Значение | Источник |
|---|---|---|
| Веб-трафик | Суммарный RPS + полоса пропускания по всем зарегистрированным веб-сервисам | WebMetricService::kpi(dashboard()) |
| Нагрузка БД | Сумма последних сохранённых QPS + общее число соединений по коллекторам access=database | DbCollectorService::latest() |
| Доступность веба | Доступность за 24 ч | WebProbeService::availabilityOrPassive() (сначала активная проба) |
| Задержка | Средний отклик пробы (мс) | то же |
| Инциденты | Инциденты, открытые за последние 7 дней | InfrIncident created_at ≥ now-7d |
Доступность веба и задержка отдают предпочтение активной синтетической пробе. Пассивные счётчики трафика vts сами по себе неверно диагностируют сбои без трафика, ошибки 5xx, скрытые за 3xx, и сбросы счётчиков, поэтому доска использует результаты реальных HTTP-проб
WebProbeService. Если проба ещё не отрабатывала (покрытия нет), выполняется откат к пассивному способу (web24h).
Шкала доступности сервиса
Строится по первой карточке web/db/session в порядке приоритета (если ни одного из этих трёх типов на доске нет, показывается подсказка-заглушка).
| Тип карточки | Форма шкалы | Значение в центре | Правило окраски |
|---|---|---|---|
| web | кольцо кодов ответа из 4 сегментов | REQ (текущий RPS) | 2xx=good · 3xx=info · 4xx=warn · 5xx=crit |
| database | дуга насыщения соединений (conn_pct) | QPS | ≥90 crit · ≥70 warn · иначе good |
| session | дуга доли попаданий в кэш | OPS | ≥90 good · ≥70 warn · иначе crit |
Доска сервисов (сетка карточек)
Выбранные сервисы раскладываются карточками в порядке приоритета. Каждая карточка показывает свой набор KPI в зависимости от типа:
| Тип | Демон по умолчанию | Заголовок (алиас) | Основные KPI |
|---|---|---|---|
| web | nginx | представительный домен | задержка · RPS · открытые сессии (активные соединения) · накопленные запросы за 24 ч · доля ошибок |
| database | mysql/mariadb/postgres/mongo | алиас коллектора | QPS · места (занято/максимум) · насыщение · выполняется · блокировки (среднее время блокировки строки, мс) · всего slow · ожидают |
| session | redis | алиас узла | OPS · доля попаданий · клиенты (текущие сессии) · ключи · насыщение (использование памяти, %) |
| proxy | software_key/proxy | алиас экземпляра | зависимости (+N) · задержка · прослушиваемые порты |
| docker | software_key/docker | алиас экземпляра | зависимости (+N) · задержка · прослушиваемые порты |
- Карточки переупорядочиваются перетаскиванием за ручку (SortableJS) — порядок в DOM становится приоритетом (
sel) и сохраняется в localStorage. - Значок ✕ в правом верхнем углу карточки убирает её с доски.
- У карточек proxy/docker нет ни кольца доступности, ни временного ряда (только web/db/session).
Сервисы в реальном времени (временной ряд внизу)
Выбранные карточки, у которых есть ряд (web/db/session), рисуются как SVG-спарклайны «область + линия» в сетке из 2 колонок. У каждого графика есть линейка (вертикальные линии сетки и подписи HH:MM для начала, середины и конца), позволяющая читать временную ось. Расположенный сверху переключатель диапазона (1h · 6h · 1d) меняет окно наблюдения (по умолчанию 1h).
Элементы управления в заголовке
- Переключатель LIVE — включает и выключает опрос раз в 30 секунд.
- Кнопка полноэкранного режима — скрывает верхнюю навигацию и разворачивает содержимое на всю страницу (выход по ESC · миксин
fullscreen·body.infr-fs). - Два ползунка высоты — высота карточек доски (по умолчанию 118px, 90–240) и высота живых графиков (по умолчанию 50px, 34–160). Подобранные значения сохраняются в localStorage.
Как пользоваться
1) Выберите сервисы
- Нажмите [Выбрать сервисы] / [Добавить сервис] в заголовке доски, чтобы открыть модальное окно выбора.
- Окно группирует все доступные сервисы по типам (web → database → session → proxy → docker).
- Включайте (✓) и выключайте сервисы. Выбор немедленно отражается на доске и сохраняется в localStorage.
Значение по умолчанию при первом визите = автоматически выбирается первый элемент из web, database и session, чтобы шкала доступности заработала сразу. Если это не нужно, снимите отметки в модальном окне.
2) Настройте приоритет
- Возьмите карточку за ручку перетаскивания и переместите её. Самая передняя карточка web/db/session становится объектом шкалы доступности.
3) Смените временное окно
- Используйте кнопки 1h / 6h / 1d на нижней живой полосе. Переключение отправляет
POST /service/series, который заново запрашивает представительные метрики выбранных карточек за это окно (с прореживанием максимум до 60 точек); если ответ пуст, выполняется откат к ряду, поставляемому вместе с карточкой.
// Пример запроса POST /service/series
{ "keys": ["web:12", "db:db@blue", "session:blue"], "range": "6h" }
Соглашение о ключах карточек:
web:{infr_web_service.id}
db:{infr_collector.key} напр. db@blue
session:{node_alias} напр. blue
proxy:{infr_service.id}
docker:{infr_service.id}
4) Полноэкранная доска обстановки
- Кнопка полноэкранного режима → подгоните высоту карточек и графиков ползунками, чтобы изображение заполнило экран настенной доски NOC.
Источники данных
| Тип карточки | Построитель | Фактические таблицы |
|---|---|---|
| web | WebMetricService::dashboard() + WebProbeService::overlayStatus() |
infr_web_metric (счётчики vts) · infr_web_check (активная проба) · infr_web_service |
| database | InfrCollector(access=database) + DbCollectorService::latest()/series() |
infr_db_metric · infr_collector |
| session | RedisMetricService::dashboard() |
infr_redis_metric · infr_instance |
| proxy/docker | InfrService(kind IN proxy,container) |
infr_service · infr_instance |
| Инциденты KPI | — | infr_incident (последние 7 дней) |
Источники временных рядов:
- web — дельта
request_counterосновного домена и основного узла вinfr_web_metric→ RPS (исключает смешивание счётчиков нескольких узлов). - database —
infr_db_metric.qps(сохранённая метрика, без подключения в реальном времени). - session —
infr_redis_metric.instantaneous_ops_per_sec.
Токены состояния
| Токен | Значение |
|---|---|
| up | исправен |
| degraded | деградация |
| down | сбой (реальный отказ подключения или пробы) |
| pending | ожидание (решение отложено, например из-за отставания данных) |
Как избегается ложный красный цвет карточки БД — в режиме сбора economy, если сбор ненадолго отстаёт и последняя выборка старше 5 минут,
statusOfвозвращаетdownпо причине устаревания. С базой данных при этом всё в порядке, но вы увидели бы красную тревогу, поэтому доска понижает устаревший down доpendingи оставляет down только для реального отказа подключения (ok=false). Кроме того, исключительно для присутствующего пользователя, который смотрит на доску, при последней выборке старше 45 секунд выполняется единичная точечная выборка черезensureFresh(45)(это no-op без подключения, если планировщик и так ведёт сбор), причём этот сборщик закрывает соединение в блоке finally, чтобы не допустить утечек.
Права доступа
- Чтение (просмотр): любой аутентифицированный пользователь (demo=1 и выше).
/serviceнаходится в группеinfr.authбез дополнительной проверки уровня. - Без записи: этот экран исключительно на чтение. Выбор карточек, порядок, высоты и диапазон хранятся только в localStorage браузера — на сервер ничего не пишется. Поскольку разрушающих действий нет, журнал аудита также не ведётся.
- Запись на экранах детализации (управление сайтами в Веб, База данных, сборка и редактирование в Каталоге) контролируется там (например, уровень≥2).
Ключи localStorage:
infr:svcboard:sel:v1 массив ключей выбранных сервисов (порядок = приоритет)
infr:svcboard:h:v1 значения ползунков высоты доски и живых графиков
infr:range:service-overview диапазон нижнего временного ряда (1h/6h/1d)
Устранение неполадок и частые вопросы
Доска пуста. Воспользуйтесь кнопкой [Добавить сервис] в заголовке, чтобы разместить интересующие вас сервисы. Если доступных сервисов нет вовсе (коллекторы ещё не наполнили данные), группы в окне выбора могут выглядеть пустыми — сначала проверьте регистрацию в разделе Коллекторы и конвейер сбора.
Шкала доступности не появляется. Шкале нужна первая по приоритету карточка web/db/session. Если вы выбрали только proxy/docker, вы увидите подсказку-заглушку. Поместите хотя бы одну карточку web/db/session ближе к началу.
Нижний временной ряд пуст. Ряд есть только у карточек web/db/session; proxy/docker исключены. Кроме того, если в исходной таблице нет данных за выбранное окно (1h/6h/1d), график останется пустым.
Карточка БД красная, хотя с базой всё в порядке.
Отставание данных понижается до pending (серый цвет, ожидание). Если состояние остаётся down, это реальный отказ подключения — проверьте экран База данных и состояние коллектора access=database в разделе Коллекторы.
Карточки сохраняются после обновления страницы / на другом ПК выглядят иначе. Выбор и порядок принадлежат localStorage браузера, а не настройке учётной записи на сервере. Они независимы для каждого браузера и устройства.
Мне нужно окно в 5 минут. Текущая реализация предлагает окна 1h · 6h · 1d (по умолчанию 1h). Для более коротких наблюдений используйте специализированные экраны, такие как Серверы или База данных.
Связанные материалы
- Сервисы ▸ Веб — живой мониторинг vts для зарегистрированных сайтов + доступность по активной пробе
- Сервисы ▸ База данных — нагрузка на БД через прямое подключение и анализ схемы
- Сервисы ▸ Сессии — ёмкость и пропускная способность сессий Redis
- Сервисы ▸ Каталог — вывод сервисов из реестра версий (источник proxy/docker)
- Администрирование ▸ Коллекторы — реестр коллекторов (источник метрик)
- Реальное время / опрос — как работает живое обновление
