Налаштування користувальницьких дашбордів моніторингу (Grafana)
Grafana дашборди — це візуальна мова стану інфраструктури. Типові дашборди з community часто перевантажені ненужними панелями і не відповідають на конкретні запитання вашого сервісу. Користувальницький дашборд будується від запитань, які задає команда, а не від доступних метрик.
Принципи побудови ефективного дашборду
Ієрархія інформації. Верхній рядок — найважливіше: сервіс працює або ні. Деталізація нижче. Не змушуйте очі шукати статус.
Actionable метрики. Кожна панель відповідає на запитання, яке впливає на рішення. «CPU 67%» — не actionable. «CPU 67%, target 60%, trending up, 3 інстанси масштабуються» — actionable.
Часові змінні. $__timeRange та $__interval дозволяють змінювати період перегляду та зберігати дозвіл графіків.
Структура дашборду для веб-приложення
Row 1: Service Health (великі stat панелі)
[Error Rate %] [P95 Latency ms] [Uptime %] [Active Users]
Row 2: Traffic & Performance
[RPS - timeseries] [Response time P50/P95/P99 - timeseries] [HTTP status breakdown]
Row 3: Infrastructure
[CPU % per host] [Memory % per host] [Disk I/O] [Network I/O]
Row 4: Database
[DB Connections active/max] [Query latency P95] [Slow queries count]
Row 5: Cache
[Redis hit rate %] [Redis memory usage] [Evictions per sec]
Prometheus запити для ключових панелей
Error Rate:
sum(rate(http_requests_total{status=~"5..", job="app"}[5m]))
/
sum(rate(http_requests_total{job="app"}[5m]))
* 100
P95 Latency:
histogram_quantile(0.95,
sum(rate(http_request_duration_seconds_bucket{job="app"}[5m])) by (le)
)
Active DB Connections:
pg_stat_activity_count{datname="mydb", state="active"}
Redis Hit Rate:
rate(redis_keyspace_hits_total[5m])
/
(rate(redis_keyspace_hits_total[5m]) + rate(redis_keyspace_misses_total[5m]))
* 100
Змінні дашборду
Змінні роблять дашборд універсальним:
{
"templating": {
"list": [
{
"name": "environment",
"type": "custom",
"options": [
{"text": "production", "value": "production"},
{"text": "staging", "value": "staging"}
]
},
{
"name": "instance",
"type": "query",
"query": "label_values(up{job='app', env='$environment'}, instance)"
}
]
}
}
Використання у запитах: {job="app", env="$environment", instance="$instance"}.
Аннотації деплоїв
Вертикальна лінія на графіках при кожному деплої — швидко видно кореляцію між деплоєм та деградацією:
# CI/CD: відправити аннотацію після деплою
import requests
def create_grafana_annotation(grafana_url: str, api_key: str, text: str, tags: list):
requests.post(
f"{grafana_url}/api/annotations",
headers={"Authorization": f"Bearer {api_key}"},
json={
"text": text,
"tags": tags,
"time": int(time.time() * 1000) # milliseconds
}
)
# У CI/CD конвеєрі після успішного деплою:
create_grafana_annotation(
GRAFANA_URL, API_KEY,
text=f"Deploy v{VERSION} to production",
tags=["deploy", "production"]
)
Dashboard as Code (Grafonnet / Terraform)
Зберігати дашборди у git, а не тільки у UI:
// Grafonnet: dashboard as code
local grafana = import 'grafonnet/grafana.libsonnet';
local dashboard = grafana.dashboard;
local graphPanel = grafana.graphPanel;
dashboard.new(
'Application Overview',
time_from='now-1h',
refresh='30s',
)
.addPanel(
graphPanel.new(
'Error Rate',
datasource='Prometheus',
)
.addTarget(
grafana.prometheus.target(
'sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100',
legendFormat='Error Rate %'
)
),
gridPos={ x: 0, y: 0, w: 12, h: 8 }
)
Або через Terraform Grafana провайдер: resource "grafana_dashboard" "app".
Спільний доступ та дозвіл
- Read-only публічний URL — для статус-панелі в офісі
- Snapshot — поділитися поточним станом із кимось без доступу до Grafana
- Вбудовані панелі — вбудувати у внутрішній портал команди
Часова шкала створення
- Базові панелі (error rate, latency, traffic) — 1-2 дні
- Повний дашборд приложення (всі шари) — 3-5 днів
- Dashboard as code + git workflow — 1-2 дні
- Аннотації деплоїв — 1 день







