🚧 Налаштування дашбордів у Grafana
Мета: Мати єдине місце в якому можна побачити фізичний стан своїх пристроїв, віртуалок і контейнерів. Мати змогу заглибитися в кожен окремий пристрій при потребі.
1. Вступ
Дашборди дозволяють зібрати дані про стан пристроїв, серверів, віртуальних машин і контейнерів на одній сторінці та швидко отримувати потрібну інформацію. Це зручний спосіб побачити загальну картину і в кілька кліків перейти до деталей.
У цій статті ми розберемося, що таке дашборди, як зробити їх корисними саме під ваші потреби, побудуємо дашборд для цифрових фоторамок і розглянемо приклади готових рішень.
1. Що таке дашборди
Дашборд — це інтерактивна панель, яка збирає та відображає дані з різних джерел у зручному вигляді. Замість того, щоб перевіряти логи на кожному пристрої чи відкривати окремі моніторинги для серверів і контейнерів, ви отримуєте єдиний інтерфейс, де видно все: від загальної статистики до конкретних метрик.
Завдяки цьому ви можете:
швидко оцінити стан системи одним поглядом;
знаходити проблеми ще до того, як вони вплинуть на роботу;
налаштовувати панель під себе — обирати саме ті показники, які важливі у вашій інфраструктурі.
2. Побудова дашборду з нуля
Щоб створити дашборд, потрібно визначити які дані для вас найважливіші. Для когось це буде стан серверів і віртуальних машин, для інших — температура пристроїв, споживання ресурсів чи статистика роботи конкретного сервісу.
У нашому прикладі ми зосередимося на цифрових фоторамках, але той самий підхід можна застосувати і до будь-яких інших пристроїв у мережі.
Основні кроки виглядають так:
Вибір джерела даних — наприклад, Prometheus для метрик або Loki для логів.
Створення нового дашборду у Grafana.
Додавання панелей з потрібними показниками (CPU, пам’ять, аптайм, кількість нових фото тощо).
Налаштування візуалізації — графіки, таблиці чи стат-панелі для зручного сприйняття.
Збереження та перевірка роботи дашборду на реальних даних.
3. Простий дашборд для одного пристрою
Uptime

Запит (PromQL):
time() - node_boot_time_seconds{instance="photoframe-a"}Візуалізація та налаштування:
Visualization: Stat
Standard options → Unit: time → duration (s)
Title: Uptime
Thresholds: видалити (не потрібно)
Background: Background → Solid
(Опційно) Link на Explore/логи: Panel → Links → Add lin
Disk used, % (SD)

Запит (PromQL):
100 *
(
sum(node_filesystem_size_bytes{instance="photoframe-a", fstype!~"tmpfs|overlay|squashfs"})
- sum(node_filesystem_avail_bytes{instance="photoframe-a", fstype!~"tmpfs|overlay|squashfs"})
)
/
sum(node_filesystem_size_bytes{instance="photoframe-a", fstype!~"tmpfs|overlay|squashfs"})Візуалізація та налаштування:
Visualization: Bar Gauge
Orientation: Horizontal
Display mode: LCD
Value display: Hidden
Unit: percent (0–100)
Decimals: 0
Min/Max: 0 / 100
Thresholds: 70 → жовтий, 85 → червоний
Title: Disk used, % (SD)
CPU Temp (°C)

Запит (PromQL):
max by (instance) (node_hwmon_temp_celsius{instance="photoframe-a"})Візуалізація та налаштування:
Visualization: Gauge
Unit: celsius
Min/Max: 0 / 100
Thresholds: 65 → жовтий, 80 → червоний
Title: CPU Temp (°C)
Load (CPU, RAM, SWAP)

Запити (PromQL):
# CPU %
100 * (1 - avg by (instance) (rate(node_cpu_seconds_total{instance="photoframe-a", mode="idle"}[5m])))
# RAM %
100 * (1 - (node_memory_MemAvailable_bytes{instance="photoframe-a"} / node_memory_MemTotal_bytes{instance="photoframe-a"}))
# SWAP %
100 * (1 - (node_memory_SwapFree_bytes{instance="photoframe-a"} / clamp_min(node_memory_SwapTotal_bytes{instance="photoframe-a"}, 1)))Візуалізація та налаштування:
Visualization: Bar Gauge (3 окремі панелі або Repeat по запитах; найпростіше — 3 окремі)
Title: Load
Display: LCD
Unit: percent (0–100)
Decimals: 1
Min/Max: 0 / 100
Thresholds: 80 → жовтий, 90 → червоний
Added photos (7 days)
Запит (Loki / LogQL):
count_over_time({instance="photoframe-a"} |~ "Copied \\(new\\)" [7d])Візуалізація та налаштування:
Visualization: Stat
Title: Added photos (7d)
Errors (7 days)
Запит (Loki / LogQL):
count_over_time({instance="photoframe-a"} |~ "(?i)(error|failed|exception)" [7d])Візуалізація та налаштування:
Visualization: Stat
Title: Errors (7d)
Thresholds: 1 → жовтий/червоний (щоб будь-яка помилка підсвічувалася)
Error logs

Запит (Loki / LogQL):
{instance="photoframe-a"} |~ "(?i)(error|failed|exception)"Візуалізація та налаштування:
Visualization: Logs
Time range: наприклад. last 24h
Sort: від найновіших
Опції:
Wrap lines — перенос рядків
Deduplication — приховати дублікати
4. Використання змінних для схожих пристроїв
Крок 1: Створити змінну instance
Dashboard settings → Variables → Add variable
Name: instance
Type: Query
Data source: відповідний (Prometheus / Loki)
Query:
label_values(up{instance=~"photoframe-.*"}, instance)Multi-value: опційно (зазвичай ні)
Include All option: опційно (якщо хочеш All)

Крок 2: Замінити в усіх панелях константу на змінну
Було: instance="photoframe-a"
Стає: instance="${instance}"
Uptime (PromQL):
time() - node_boot_time_seconds{instance="${instance}"}Disk used % (PromQL):
100 *
(
sum(node_filesystem_size_bytes{instance="${instance}", fstype!~"tmpfs|overlay|squashfs"})
- sum(node_filesystem_avail_bytes{instance="${instance}", fstype!~"tmpfs|overlay|squashfs"})
)
/
sum(node_filesystem_size_bytes{instance="${instance}", fstype!~"tmpfs|overlay|squashfs"})CPU Temp (PromQL):
max by (instance) (node_hwmon_temp_celsius{instance="${instance}"})Load (PromQL):
# CPU %
100 * (1 - avg by (instance) (rate(node_cpu_seconds_total{instance="${instance}", mode="idle"}[5m])))
# RAM %
100 * (1 - (node_memory_MemAvailable_bytes{instance="${instance}"} / node_memory_MemTotal_bytes{instance="${instance}"}))
# SWAP %
100 * (1 - (node_memory_SwapFree_bytes{instance="${instance}"} / clamp_min(node_memory_SwapTotal_bytes{instance="${instance}"}, 1)))Added photos (7 days) (Loki):
count_over_time({instance="${instance}"} |~ "Copied \\(new\\)" [7d])Errors (7 days) (Loki):
count_over_time({instance="${instance}"} |~ "(?i)(error|failed|exception)" [7d])Error logs (Loki):
{instance="${instance}"} |~ "(?i)(error|failed|exception)"Переваги змінної instance: один дашборд на всі фоторамки, перемикання одним кліком, легке масштабування (додаєш новий пристрій — він автоматично з’являється у списку).
5. Готові приклади дашбордів
Якщо ви не хочете будувати все з нуля, у спільноті Grafana вже є багато готових рішень. Вони можуть стати відправною точкою: ви імпортуєте готовий JSON і підлаштовуєте його під свої дані та потреби.

Кілька корисних прикладів:
Node Exporter Full — універсальний дашборд для моніторингу Linux-систем (CPU, пам’ять, диски, мережа). 👉 Node Exporter Full Dashboard
Raspberry Pi Monitoring — зручний набір панелей для моніторингу температури, ресурсів і дисків Raspberry Pi. 👉 Raspberry Pi Monitoring
All-in-One — комплексний дашборд із CPU, пам’яттю, дисками, мережею та іншими метриками для швидкого огляду всієї системи. 👉 All-in-One Dashboard
💡 Навіть якщо ці дашборди не ідеально підходять до ваших пристроїв, вони чудово показують як структуровані панелі і які є варіанти візуалізації. Найзручніше взяти готовий приклад і поступово замінювати метрики на власні.