Обзор — что делает экран
Инфраструктура ▸ Подключения и трафик ▸ Трафик (/infra/traffic/net) — это консоль только для чтения, которая строит пропускную способность сетевого ввода-вывода каждого сервера (входящие и исходящие байты и пакеты) в виде одного линейного графика ECharts на карточку сервера.
Источник — устаревшая таблица server_traffic (≈1,6 млн строк, соединение legacy_glory), которую заполняет устаревший коллектор check_tx.js. Эта таблица накапливает за каждое окно дельты байтов и пакетов для каждой пары «сервер × направление» (входящее/исходящее), однако прежний интерфейс stats-design показывал лишь traffic-out из server_status (единственную дельту исходящих пакетов). Этот экран первым выводит на поверхность полный набор данных вход/выход × байты/пакеты.
Три родственных экрана (Соединения по портам, IP-соединения, Трафик) используют один и тот же
TrafficControllerиSessionQueryService, но только вкладка «Трафик» читает временной ряд пропускной способности изserver_traffic, а не моментальный снимок сессий (traffic_session_ct). Именно поэтому она использует окно диапазона (1h/6h/24h), а не таймер (1/5/60 мин), которым пользуются два других экрана.
Когда использовать
- Чтобы во времени проследить всплески и резкий рост полосы пропускания на конкретном сервере (ночные передачи резервных копий, крупные загрузки, входящий DDoS).
- Чтобы понять характер сервера по соотношению вход:выход (веб-серверы смещены в сторону исходящего трафика, приёмники резервных копий — в сторону входящего).
- Как экран первого шага для узлов, у которых исходящие пакеты или байты внезапно подскочили, прежде чем углубляться в Безопасность ▸ Угрозы или во всплывающее окно расследования IP.
- Чтобы по KPI свежести с одного взгляда заметить серверы с устаревшими (отстающими) данными сбора.
Компоновка
Шапка (верхняя панель)
| Элемент | Описание |
|---|---|
| Переключатель метрики | bytes | packets — перекрашивает те же данные в шкале байтов или пакетов (без обращения к серверу) |
| Переключатель диапазона | 1h (60) | 6h (360) | 24h (1440) — окно отображения в минутах. Выбор сохраняется в localStorage |
| Отметка времени | Время последнего окна (MAX по server_traffic + сдвиг часового пояса отображения) |
| Обновить | Немедленный повторный запрос (независимо от автоматического опроса раз в 30 с) |
| Во весь экран | Скрывает верхнюю навигацию и увеличивает сетку карточек (выход по ESC) |
Полоса KPI (порядок: вход · выход · пакеты · соотношение → горячая точка → свежесть)
| KPI | Значение |
|---|---|
| Всего входящего | Сумма входящих байтов в последней точке каждого сервера |
| Всего исходящего | Сумма исходящих байтов в последней точке каждого сервера |
| Всего пакетов | Сумма последних пакетов (вход+выход) каждого сервера · единица /window (не накопительно) |
| Вх.:Исх. | out ÷ in (один знак после запятой) в виде 1 : x. —, если вход равен 0 |
| Наибольший объём | Сервер с наибольшим числом исходящих байтов в последней точке (горячая точка) |
| Активные серверы | Число серверов, последняя точка которых попадает в 15 мин до конца окна / total. Предупреждает (жёлтым), если значение меньше общего числа |
Цветовая легенда шкалы + шкала оси Y
Цвет линии и заливки кодирует порядок величины значения (visualMap ECharts, кусочный режим). Когда значение пересекает порог, цвет меняется, поэтому масштаб ощущается через цвет.
| tone | bytes | packets |
|---|---|---|
| info | < 1MB |
< 1K |
| good | 1–10MB |
1–10K |
| warn | 10–100MB |
10–100K |
| crit | > 100MB |
> 100K |
- Направление кодируется формой линии: исходящее — сплошная линия и более плотная заливка, входящее — пунктирная линия и светлая заливка. Их также различают стрелки в заголовке (↓ вход / ↑ выход) и всплывающая подсказка.
- Переключатель шкалы оси Y:
linear(по умолчанию, минимум закреплён на 0 → честная площадь) |log(сжимает диапазон КБ–МБ на одну ось, так что видны и вход, и выход). Выбор сохраняется вlocalStorage.
Карточки трафика серверов
Каждая карточка — один сервер. В заголовке указано имя хоста и текущие входящие/исходящие байты; тело — линейный график <metric-chart> высотой 200 px (ECharts, динамический импорт).
- Перетаскивание для изменения порядка: используйте рукоятку (⋮), чтобы переупорядочить карточки; порядок сохраняется под ключом
infr:order:traffic-net. - Кладочная (masonry) компоновка + 12 карточек на страницу.
- Фиксированная ось времени: каждая карточка закрепляет ось X на
win.since ~ win.until(общее окно). Серверы с отстающим сбором честно отрисовываются как короткий отрезок слева, а не как поддельная кривая, растянутая на всю ширину по нескольким точкам.
Как пользоваться
- Выберите диапазон —
1h, чтобы гоняться за всплесками,24h— для суточных закономерностей. - Переключите метрику —
bytesдля нагрузки на полосу пропускания,packetsдля характера соединений и PPS. - Логарифмическая ось — для серверов с большим перекосом между входом и выходом (веб-узлы, где выход ≫ входа) режим
logоставляет обе кривые видимыми. - Переупорядочьте карточки — перетащите интересующие серверы наверх (сохраняется в браузере).
- Отследите горячую точку — заметив сервер
Topв KPI или кривую crit (красную), перейдите к Соединениям по портам / IP-соединениям, чтобы выяснить, какой IP или порт это вызвал.
Всплывающая подсказка показывает заголовок
HH:MMи значение каждого ряда (вход/выход). Даже на узких карточках подписи оси времени автоматически скрываются, чтобы не накладываться друг на друга (hideOverlap).
Источники данных
server_traffic (legacy_glory · только чтение)
| Столбец | Назначение |
|---|---|
server_name, server_index |
Идентификация сервера |
time_window_start |
Начало окна сбора (интервал ~300 с = 5 мин) |
direction |
inbound | outbound |
delta_bytes_count |
Дельта байтов за это окно |
delta_packet_count |
Дельта пакетов за это окно |
Исходный запрос (TrafficRepository::serverTraffic) использует привязку параметров и сканирует только узкое окно (без жёстко зашитых значений и без подстановки строк):
SELECT server_name, server_index, time_window_start, direction,
delta_packet_count, delta_bytes_count
FROM server_traffic
WHERE time_window_start >= :since -- (последнее окно) − диапазон
ORDER BY time_window_start
LIMIT 6000;
Опорная точка = MAX(time_window_start) (MAX по индексу → дёшево). since = anchor − range minutes.
Нормализация по минутным корзинам (устранение «пилы»)
Коллектор
check_tx.jsпроставляет отметки времени для входящего и исходящего направлений отдельными вызовамиnew Date()внутри своего цикла, поэтому в пределах одного и того же пятиминутного цикла значенияtime_window_startрасходятся на 1–2 секунды (например,:02у входящего и:03у исходящего). Группировка по точной отметке времени захватывает в каждый момент лишь одно из двух направлений, оставляя другое на нуле, — и получается график в виде пилы.
Исправление: SessionQueryService::reshapeNet округляет отметки времени до минутной корзины (round(ts/60)*60), благодаря чему вход и выход сливаются в одну точку. Интервал окна (300 с) намного больше корзины (60 с), поэтому соседние окна никогда не пересекаются.
Сдвиг часового пояса отображения
Поскольку время хранения в устаревшей БД может отличаться от времени отображения (наблюдался перекос около 9 ч), значения сдвигаются функцией OpsPolicy::trafficTzOffsetSec() только для отображения (отметка времени, ось времени, отметки времени рядов). Границы SQL (min/max) НЕ сдвигаются — запрос использует исходное устаревшее время.
Кэш · опрос
- На стороне сервера
Cache::remember('infr:traffic:net:v1:<range>', 30, …)— кэш на 30 секунд. - Фронтенд автоматически опрашивает каждые 30 секунд (
/infra/traffic/net/live?range=<minutes>).
Доступ
- Экран только для чтения. Никаких записей, блокировок и прочих разрушительных действий.
- Так как он относится к ролевой области «Инфраструктура», он открывается при минимальном user_level 1 (demo=1); staff (5) и admin (10), разумеется, тоже имеют доступ.
- Маршрут защищён посредником
infr.auth(требуется сеансовая аутентификация). - Учётные данные источника берутся только из
config('database.connections.legacy_glory')(то есть из.env) — в контроллере и сервисе нет жёстко зашитых учётных данных.
Устранение неполадок и частые вопросы
В. Я вижу только «Нет выборок трафика».
Это значит, что в server_traffic нет свежих окон. Проверьте, работает ли коллектор check_tx.js и действительно ли доступно соединение legacy_glory. Если latestTrafficWindow() (MAX) возвращает null, карточки пусты, а KPI показывают 0.
В. Сервер рисует лишь короткий отрезок слева.
Так и задумано. Ось времени закреплена за общим окном, поэтому сервер с отстающим сбором честно отрисовывается до последнего наблюдения в виде короткого отрезка слева. Кроме того, он считается неактивным в KPI Active servers (его последняя точка выходит за пределы 15 мин до конца окна).
В. Кривая одного из направлений похожа на пилу.
Нормализация по минутным корзинам устраняет большинство случаев, но если сами окна сбора нерегулярны, остаточная «пила» может сохраниться. Переключение на ось log сглаживает её.
В. Значения накопительные?
Нет. delta_* = приращение за окно (~5 мин). Именно поэтому KPI Total packets подписан как /window. Это не накопительные счётчики.
В. Время расходится на несколько часов.
Часовой пояс отображения корректируется настройкой traffic_tz_offset в OpsPolicy (см. Операционную политику).
Связанные разделы
- Соединения по портам — распределение состояний TCP по портам и серверам + основные IP-адреса источников
- IP-соединения — удалённые IP-узлы по серверам × интенсивность по портам + всплывающее окно детального разбора IP
- Серверы (временной ряд нагрузки) — временные ряды нагрузки/ЦП/памяти, тот же шаблон
<metric-chart>из ECharts - Состояние (здоровье узлов) — кольца ЦП по узлам + точки состояния служб
- Операционная политика — глобальные настройки, такие как
traffic_tz_offsetи наблюдаемые порты
