🟢 Статус: Conceptually stable · v0.1
Концепция устойчива, проверена опытом, литературой и практикой.
11. Дашборды и отчётность: дизайн витрин¶
Дашборды и отчёты — это витрина мониторинга. То, что в итоге видят люди, принимающие решения: дежурный, тимлид, владелец сервиса, CIO, директор завода. От качества витрины зависит, сработает ли вся остальная конструкция: сбор метрик, корреляция событий, runbooks — всё это бесполезно, если дежурный не понимает, что показано на экране, а CIO видит «зелёную галочку» вместо реальной картины.
Эта глава — про дизайн витрин как методику, а не сборник скриншотов «красивых дашбордов из Grafana».
После главы 5 — Многоуровневый дизайн у нас есть единый язык тегов. Эта глава показывает, как этим языком пользоваться для главной потребительской подсистемы мониторинга.
1. Дашборд — это продукт, не коллекция графиков¶
Самая частая ошибка дизайна дашбордов: их рассматривают как технический артефакт («набросаем сюда все графики, которые могут пригодиться»). Это приводит к экранам с 40+ виджетами, на которые никто не смотрит.
Дашборд — это продукт, и у него есть:
- Аудитория. Кто конкретно смотрит. Не «руководство», а «дежурный смены 2-й линии в 3 ночи».
- Цель. Что человек должен понять или сделать за первые 5 секунд.
- Refresh rate. Каждые 10 секунд для NOC, раз в час для CIO, раз в день для отчёта.
- Контекст использования. Большой экран в дежурке без звука vs ноутбук в кафе vs телефон в дороге.
- Срок жизни. NOC-дашборд работает годами. Дашборд под конкретный инцидент живёт неделю.
Если на эти пять вопросов нет ответа — это не дашборд, это набор несвязанных виджетов.
Три измерения дизайна¶
| Измерение | Вопрос | Пример ответа |
|---|---|---|
| Аудитория | Кто смотрит и в каком состоянии | Дежурный, 3 ночи, после звонка |
| Цель | Что должен понять за 5 секунд | «Что горит и куда смотреть» |
| Действие | Что должен сделать дальше | Открыть runbook по подсвеченному сервису |
Дашборд без этих трёх ответов — мусор, неважно, насколько красиво он выглядит.
2. Аудитория → цель → refresh → формат¶
Матрица, которая разводит дашборды до проектирования:
| Аудитория | Цель | Refresh | Формат | Где живёт |
|---|---|---|---|---|
| NOC / дежурный | Что горит сейчас, куда эскалировать | 30–60 сек (10 сек создаёт нагрузку без практической пользы) | TV full-screen, dark mode | Grafana или Zabbix native |
| Per-service team | Здоровье одного бизнес-сервиса | 1 мин | Web-страница, любое устройство | Grafana |
| Тимлид эксплуатации | Тренды и горячие точки команды | 5 мин | Web + ежедневный дайджест | Grafana + Mattermost |
| CIO / руководитель ИТ | Бизнес-витрина по сервисам | 1 час | Web + monthly PDF | Grafana + Email |
| Директор завода | «Всё ли работает у нас?» | 1 раз в день | Email от CIO, не дашборд | |
| ИБ | Инциденты ИБ, audit trail | 1 мин | Web + alerts | Grafana + SIEM |
| SCADA / OT | Связь IT↔OT, доступность шлюзов | 1 мин | Отдельный сегмент, read-only | Grafana, изолированно |
Каждая строка — отдельный дашборд с собственным дизайном. Попытка сделать «один дашборд для всех» проваливается всегда, потому что цели разные.
Дашборды по аудиториям — детально¶
Главный принцип повторю: один дашборд — одна аудитория — одна цель. Не «универсальный обзор» — это всегда хуже специализированного.
1. NOC / дежурный (главный экран)¶
Цель: оператор за 3 секунды понимает, что горит сейчас.
┌─────────────────────────────────────────────────────┐
│ 🔴 ACTIVE DISASTERS (большой баннер) │
│ • 1C-ERP веб-публикация, упала 14:23, 18 минут │
│ • Exchange DAG split-brain, 14:25 │
├─────────────────────────────────────────────────────┤
│ 🟡 ACTIVE HIGH (8) │
│ • srv-files-03: disk 90% │
│ • UserGate-2: HA out of sync │
│ ... │
├─────────────────────────────────────────────────────┤
│ Service Health Grid (по бизнес-сервисам) │
│ ┌────┬────┬────┬────┬────┬────┬────┐ │
│ │1С │EXC │SCADA│DFS │WEB │PRT │BCK │ │
│ │🟢 │🟢 │🟢 │🟡 │🟢 │🟢 │🟢 │ │
│ └────┴────┴────┴────┴────┴────┴────┘ │
├─────────────────────────────────────────────────────┤
│ Last 24h incident timeline │
│ (горизонтальная полоска с метками срабатываний) │
└─────────────────────────────────────────────────────┘
Технические требования:
- На большом экране (TV) в дежурке, full-screen
- Auto-refresh 30–60 сек (10 сек достаточно редко нужно и создаёт нагрузку на БД; calibrate под реальную потребность)
- Только prod (env=prod), без шума test/dev
- Надёжный алертинг — через action/media/on-call (Telegram, SMS, звонок), а не через звуковой сигнал дашборда; дашборд — визуальная витрина, не система оповещения
- Никаких CPU-графиков. Дежурный не разбирает CPU, он эскалирует
Где делать: Grafana (если есть) или native Zabbix dashboard. Grafana предпочтительнее — гибче, лучше выглядит.
2. Per-service дашборды (для профильных команд)¶
Один дашборд = один бизнес-сервис, фильтр через тег service=.... Каждой команде — свой набор.
Пример: 1C-ERP team dashboard - Состояние всех хостов сервиса (свежий список) - Очереди фоновых заданий (тренд за 24h) - Активные сессии (тренд) - Использование лицензий HASP - TOP-5 проблемных триггеров за неделю - MSSQL: deadlocks, длинные транзакции, blocking - Размер БД и I/O latency
Пример: Network team dashboard - Состояние всех коммутаторов и маршрутизаторов - Топ-10 интерфейсов по загрузке - Ошибки на портах (errors/discards rate) - BGP peering state - VPN-туннели UserGate (вверх/вниз) - HA cluster sync state
Принципы: - 5-7 виджетов максимум, не больше - Период по умолчанию — последние 24 часа - Везде variables/templating, чтобы один dashboard на все хосты сервиса - На каждом виджете — ссылка на соответствующий runbook («Что делать если этот график красный»)
3. Тимлид / руководитель ИТ-эксплуатации¶
Цель: понять как работает команда и где боль.
- MTTD (mean time to detect) — тренд по неделям, по сервисам
- MTTR (mean time to resolve) — то же самое
- Number of incidents by severity — недельные столбики
- Top 10 noisy alerts — для понимания «что чинить в шаблонах»
- Coverage % по сервисам — какие сервисы покрыты лучше/хуже
- Acknowledge rate — сколько алертов получили acknowledgement vs ушли в auto-resolve без реакции (показатель работы дежурной службы)
- % алертов с runbook — процесс-метрика, как идёт документирование
Период: обновление ежедневно, смотрят раз в неделю.
4. CIO / директор по ИТ¶
Цель: «всё ли в порядке в моём хозяйстве» + материал для разговора с генеральным.
┌─────────────────────────────────────────────────────┐
│ Доступность бизнес-сервисов за месяц │
│ │
│ 1C-ERP 99.87% 🟢 SLA: 99.5% │
│ Exchange 99.95% 🟢 SLA: 99.5% │
│ Файловые шары 99.42% 🟡 SLA: 99.5% │
│ Print services 99.99% 🟢 SLA: 99.0% │
│ SCADA-bridge 100.0% 🟢 SLA: 99.9% │
│ DFS 99.78% 🟢 SLA: 99.5% │
│ │
├─────────────────────────────────────────────────────┤
│ Инциденты за месяц │
│ P1: 2 (предыдущий: 4) ↓ │
│ P2: 11 (предыдущий: 14) ↓ │
│ P3: 47 (предыдущий: 52) ↓ │
└─────────────────────────────────────────────────────┘
Принципы: - Никаких CPU/диск/сеть. CIO их не интерпретирует. - Зелёный/жёлтый/красный — главное визуальное сообщение - Тренды month-over-month — показывают что становится лучше - Один экран. Если не помещается — сокращать, а не добавлять вкладки
5. Директор завода / производство¶
Цель: «работает ли ИТ для завода».
- 1С работает: 🟢
- Почта работает: 🟢
- Печать работает: 🟢
- Файлы доступны: 🟢
- Время с последнего серьёзного сбоя: 14 дней
Принципы: - Максимум 5-7 строк - Формулировки на языке бизнес-сервиса, без низкоуровневых технических деталей - Возможно — обновление раз в день (не в реальном времени) - Часто — формат для скриншота на еженедельной планёрке у генерального
⚠️ Согласуй с CIO, нужен ли вообще такой дашборд. Иногда это политически сложно — генеральный начнёт спрашивать «а почему жёлтый» в неудобное время.
6. ИБ / безопасность¶
Отдельная история, согласовывается с ИБ-службой: - Failed logins (тренд) - Privileged accounts activity - Изменения в Group Policy - Aномальные сетевые потоки - Out-of-hours access (вход в административные системы вне рабочего времени) - Состояние антивируса/EDR на хостах - Возраст последнего успешного бэкапа (важно для антирансомвейр-метрики)
7. SCADA / OT (отдельный)¶
Категорически не смешивать с IT-дашбордами. Аудитория — инженеры АСУ ТП и OT-команда; у этого контура своя логика. - ICMP latency до bridge-хостов и OPC-серверов (только согласованные read-only проверки; прямое зондирование PLC-сегментов — только после оценки риска с командой АСУ ТП) - Состояние bridge-хостов между IT и OT - Доступность OPC-сервера снаружи (TCP) - Никаких internal SCADA-метрик — для этого уже есть MasterScada/Wonderware
12. Как теги питают виджеты¶
Это место, где глава 5 — Многоуровневый дизайн встречается с практикой. Каждый виджет дашборда должен читать теги, а не зашитые имена хостов.
Таблица: какой тег → какому виджету¶
| Виджет | Какие теги фильтрует | Пример запроса |
|---|---|---|
| Service Health Grid на NOC | service, env=prod |
Все хосты с service=1c-erp AND env=prod, агрегировать статус |
| Per-team incident list | owner |
WHERE owner=it-apps AND severity>=High |
| Capacity widget (top N) | scope=capacity, component=* |
Все items с scope=capacity, отсортировать по утилизации |
| SLA gauge | service |
Расчёт availability за месяц по service=1c-erp |
| Drill-down by location | location |
WHERE location=dc-main, потом разворот по service |
| Backup status (Veeam) | component=backup, scope=recovery |
Все triggers по бэкапам, отсортировать по возрасту |
| Hardware health | component=hardware, os_family=* |
iLO/iDRAC статус, агрегировать по location |
| Synthetic checks | component=synthetic |
Все synthetic-тесты, фильтр по service |
Правило одного источника правды¶
Если для нового дашборда требуется добавить новое поле на хост — это сигнал, что в tag schema есть дыра.
Дашборд должен читать метаданные, а не придумывать свои. Если регулярно появляется потребность в новых полях для дашбордов — значит, tag schema недостаточна и её нужно расширить как единый артефакт, а не патчить ради конкретного дашборда.
Паттерн детализации: от обзора к компоненту¶
Это сильный паттерн, который превращает разрозненные дашборды в связную систему:
Executive view (CIO)
"Сервисы зелёные / 1 жёлтый / 0 красных"
│
▼ клик на 1C-ERP (жёлтый)
│
Per-service dashboard
"1С-ERP: SLA 99.7%, активных алертов: 2, последний инцидент: 12:43"
│
▼ клик на компоненту "rphost issues"
│
Component drill-down
"RPhost процессы: график за час, активные locks, MSSQL deadlocks"
│
▼ клик на конкретный хост
│
Host page (Zabbix)
Все метрики хоста, открытые проблемы, runbook URLs
Каждый уровень — отдельный дашборд, но они связаны через теги (service, component, host name). Пользователь движется от общего к частному за 2–3 клика, без поиска «а где же дашборд про rphost?».
В Grafana это реализуется через Data Links: в виджете указывается URL шаблон вида /d/per-service?var-service=${__series.name} — клик передаёт значение тега в следующий дашборд как variable.
13. Где жить дашбордам: Zabbix native vs Grafana¶
| Аспект | Native Zabbix Dashboards | Grafana |
|---|---|---|
| Скорость разработки | Средняя | Высокая |
| Гибкость визуализации | Средняя (в 6.x/7.x значительно улучшилась) | Высокая |
| Готовые виджеты Zabbix | Problems, Problems by severity, Top hosts/items/triggers, SLA report, Web monitoring, Gauge, Navigator, Actions | Через datasource plugin |
| Templating / variables | Базовый | Мощный |
| Альтернативные datasources (Loki, Prometheus, БД) | Нет | Да |
| Drill-down между дашбордами | Базовый | Гибкий, через Data Links |
| Дополнительная инфраструктура | Не нужна | Нужен сервер Grafana |
| Кому: NOC + быстрый старт | ✅ Да, особенно для Problems/Events | Если уже есть Grafana — тоже |
| Кому: длительная эксплуатация | Достаточно для многих сценариев | ✅ Лучше для executive/drill-down |
| Поддерживаемость через GitOps | Сложно (XML export) | Через JSON manifests + ConfigMaps |
Эмпирическое правило:
- Native Zabbix Dashboards — для NOC и быстрого старта, если Grafana ещё нет
- Grafana — для всех остальных дашбордов, особенно executive/SLA-витрин и drill-down паттернов
- Power BI / Tableau — для отчётности уровня финансовой отчётности, не для оперативного мониторинга
Grafana подключается к Zabbix через Grafana Zabbix datasource plugin — плагин сообщества, поддерживаемый совместно сообществом и Grafana Labs (не официальный продукт Zabbix LLC). Умеет читать items, triggers, events с фильтрацией по тегам.
Что брать откуда¶
| Нужно | Источник |
|---|---|
| Real-time метрики | Zabbix (через Grafana datasource) |
| Active problems / events | Zabbix Events |
| История ≥ 3 месяцев | Постгрес репликa или TimescaleDB поверх Zabbix history |
| SLA расчёты | Native Zabbix SLA report (Services → SLA report) + SLA report dashboard widget; для кастомных расчётов — Zabbix API |
| Логи (parallel view) | Loki / ELK / Graylog как separate datasource |
| Custom metadata (CMDB) | Внешняя БД (Netbox/iTop), читать в Grafana как SQL datasource |
Регулярная отчётность — что, кому, когда¶
Принципы¶
- Автоматизация >> ручная сборка. Отчёт собирающийся 2 дня руками — не отчёт, это случайность
- Push, не pull. Отчёт отправляется получателю в почту/чат, а не «зайдите посмотрите на дашборд»
- Один отчёт — одна цель. Не «универсальный отчёт обо всём», а «месячная доступность сервисов»
Целевая матрица отчётности¶
| Отчёт | Получатель | Период | Источник | Доставка |
|---|---|---|---|---|
| Daily NOC summary | Дежурная служба, тимлид | ежедневно 9:00 | Zabbix events за сутки | Email + Mattermost/Telegram канал |
| Weekly operations | ИТ-команда + тимлид | пн 9:00 | агрегация за неделю | Email + Bookstack page |
| Monthly SLA report | CIO + руководители команд | 1 число | Grafana → PDF | |
| Monthly executive | CIO для директора завода | 1 число | сжатый SLA-отчёт | Email от CIO, не от ИТ |
| Quarterly capacity review | CIO + ИТ-руководство | раз в квартал | тренды ресурсов | Очная встреча + презентация |
| Incident postmortems | По каждому P1 | в течение 5 рабочих дней | шаблон в Bookstack | Email команде + архив в Bookstack |
| Alert hygiene report | Тимлид | раз в 2 недели | топ noisy alerts | Mattermost канал команды |
Как генерируется автоматически¶
Лёгкий путь: Grafana → Reporting (есть в Grafana Enterprise, но и в OSS можно через grafana-image-renderer + cron).
Бесплатный путь: скрипт на Python: - Тянет данные через Grafana API или Zabbix API - Рендерит в HTML по шаблону (Jinja2) - Конвертирует в PDF (WeasyPrint) - Шлёт почтой через корпоративный SMTP
# Скелет
from jinja2 import Template
import weasyprint
import smtplib
# 1. Собрать метрики (zabbix API)
metrics = collect_monthly_metrics()
# 2. Отрендерить
html = Template(open("monthly_sla.j2").read()).render(metrics=metrics)
# 3. PDF
pdf = weasyprint.HTML(string=html).write_pdf()
# 4. Отправить
send_email(to=cio_email, subject="ИТ-отчёт за май", attachment=pdf)
Это разовая работа на 2-3 дня + потом cron-job. Никто отчёт не собирает руками после этого.
⚠️ Для автоматических отчётов: используйте выделенный service account с минимальными правами (read-only); Zabbix API token и SMTP credentials — через secrets manager или CI variables, не в plain скрипте; проверьте что отчёт не содержит чувствительных данных (пароли, внутренние IP, данные КИИ) перед отправкой на внешние адреса.
14. Автоматизация отчётности¶
Отчёт, который собирается руками 2 дня — это не отчёт, это случайность. Реальная отчётность всегда автоматизирована.
Способы¶
| Метод | Подходит для | Сложность |
|---|---|---|
| Grafana Reporting (Enterprise) | PDF снимок дашборда раз в N | Низкая (если есть Enterprise license) |
| Grafana panel render API + cron | PNG/PDF снимок панели в email | Средняя |
| Zabbix Reports (Scheduled Reports) | Native scheduled PDF из dashboard | Низкая, но менее гибко |
| Скрипт + Zabbix API + Jinja2 | Кастомный HTML/PDF отчёт | Высокая, но максимально гибко |
| Внешний BI (Metabase / Superset) | Сложные SQL-отчёты по истории | Высокая, отдельная инфраструктура |
Для большинства задач достаточно Grafana panel render API + cron на простом скрипте: один cron-job в день рендерит нужные панели в PNG, склеивает в одну email и отправляет.
Чёткий формат отчёта¶
Каждый автоматический отчёт должен иметь:
- Тему с датой и обозначением периода:
[SLA Monthly] 1C-ERP за апрель 2026 - Sender — функциональный адрес, не личный (
monitoring@example.com) - Body — 3–5 строк прозы с выводами, не таблицей цифр
- Вложение — PDF/PNG с детализацией
- Ссылка на live-дашборд в конце письма
- Контакт по вопросам — кому писать, если непонятно
Без выводов в body — отчёт превращается в спам. Получатель открывает, видит таблицу, закрывает, через год удаляет правило «monitoring → archive».
15. Anti-patterns дашбордов¶
Локальная сводка ошибок именно в дизайне дашбордов. Общие anti-patterns — в главе 15.
❌ Один дашборд на всех. "Master dashboard" с 40 виджетами не работает ни для NOC, ни для CIO. Делается по аудиториям.
❌ CPU/RAM на дашборде CIO. CIO не читает CPU. Ему нужны сервисы. Технические метрики — на per-team дашборде.
❌ Зелёная галочка как availability > 0%. Сервис либо «работает» по критерию пользовательского пути (synthetic), либо «не работает». Не «50% хостов доступны».
❌ Refresh rate 10 секунд на дашборде CIO. Бессмысленный нагрузочный шум. CIO смотрит в дашборд раз в день, ему refresh 1 час хватит.
❌ Цвет от настроения, а не от логики. На NOC-дашборде Disaster — красный, High — оранжевый, Average — жёлтый. Везде. Не отдельно для каждого виджета.
❌ Графики без подписей оси Y. Что это — проценты? Байты? Секунды? Если непонятно с первого взгляда — виджет не работает.
❌ Текст 8pt на TV-экране. NOC-экран висит в 5 метрах от дежурного. Шрифт ≥ 18pt, контраст высокий, тёмная тема.
❌ Хардкод имён хостов в дашборде. Через месяц хост переименовали → дашборд сломан. Используйте теги.
❌ Дашборд без owner. Через полгода никто не помнит, чей это дашборд и зачем. Каждый дашборд имеет владельца и тег в title ([1C-ERP][owner: it-apps]).
❌ «Бета-дашборд» вечно. Если дашборд год в beta — это значит, никто его не использует. Удалить.
❌ Дашборд под конкретный инцидент остался жить. Сделали под P1 на прошлой неделе → положили в /tmp папку Grafana → удалить через 7 дней.
❌ Reporting без выводов. «Месячный отчёт по доступности» с таблицей и без единого предложения о том, что это значит — спам.
16. Design checklist¶
Перед публикацией нового дашборда — пройдите по списку:
Аудитория и цель:
- Аудитория определена конкретно (не «ИТ-команда», а «дежурный смены 2»)
- Цель сформулирована в одной фразе («понять, что горит за 5 секунд»)
- Определено целевое действие после взгляда на дашборд
- Refresh rate соответствует роли (10с для NOC, 1ч для CIO)
- Контекст использования учтён (TV, ноутбук, телефон)
Содержание:
- Количество виджетов ≤ 10 (для NOC) или ≤ 8 (для остальных)
- Каждый виджет имеет понятный заголовок и единицы измерения на оси
- Цветовая дисциплина соблюдена (красный = действовать, жёлтый = смотреть)
- Технические метрики (CPU/RAM) — только на per-team дашбордах, не на executive
- Виджеты читают теги как основной источник (не хардкод имён хостов); явный список критичных компонентов допустим как часть service definition, если тегов недостаточно
Данные:
- Источник данных понятен (Zabbix / Loki / SQL replica)
- Фильтр по
env=prodявно задан (нет смеси с test/dev) - Drill-down ведёт на per-service / per-host дашборд через Data Links
- Запросы не убивают БД (на исторических данных — replica, не master)
Доставка:
- Дашборд имеет владельца (тег в title)
- Дашборд имеет дату последнего разбора
- Ссылка на дашборд встроена в runbook'и через
{TRIGGER.URL}или в Wiki - Reporting (если есть) приходит на функциональный адрес, не личный
- Каждый отчёт имеет выводы в body, не только вложение
Резюме¶
- Дашборд — это продукт. Аудитория, цель, действие, refresh, контекст — без них дашборд не работает
- Один дашборд — одна аудитория — одна цель. Не пытайтесь сделать «универсальный» дашборд
- Семь основных типов дашбордов: NOC, per-service, team, CIO, executive, ИБ, OT
- Виджеты читают теги, не хардкод имён. Tag schema из главы 3 — единый источник правды
- Drill-down паттерн: executive → service → component → host. Через Data Links в Grafana
- Reporting автоматизирован. Push, не pull. Каждый отчёт имеет выводы в body
- Если для дашборда нужно новое поле на хосте — это дыра в tag schema, не в дашборде
См. также:
- Глава 3 — Теги и группы — что и куда вешать
- Глава 5 — Многоуровневый дизайн — общая методика, на которой строятся дашборды
- Глава 10 — SLA — что считать в SLA-витринах
- Глава 15 — Anti-patterns — общая сводка ошибок