Настройка мониторинга бэкенда мобільного приложення (Grafana/Prometheus)
Коли користувачі пишуть «приложение не працює», а Crashlytics мовчить — значить проблема на бекенді. Prometheus + Grafana дають видимість у те, що відбувається з API-серверами, базами даних та чергами прямо зараз — і показують деградацію до того, як вона стала інцидентом.
Що збираємо та навіщо
Для бекенду мобільного приложення критичні чотири групи метрик:
API-метрики — latency, error rate, throughput за кожним endpoint. Особливо важливий p95 та p99 latency: середні значення приховують хвостові затримки, а саме вони руйнують UX мобільного приложення. Користувач з p99 у 8 секунд піде, навіть якщо середнє — 200ms.
Метрики баз даних — active connections, query duration, lock waits, replication lag. pg_stat_statements через postgres_exporter дає зріз найповільніших запитів.
Метрики інфраструктури — CPU, RAM, disk I/O, network saturation на кожному вузлі.
Метрики черг — для приложень з фоновою обробкою: глибина черги RabbitMQ/Kafka, lag consumer groups, час обробки повідомлення.
Інструментування API-сервера
Prometheus очікує метрики у своєму форматі. Для різних мов — готові клієнтські бібліотеки:
# Python (FastAPI / Flask)
from prometheus_fastapi_instrumentator import Instrumentator
app = FastAPI()
Instrumentator().instrument(app).expose(app)
# Endpoint /metrics з'являється автоматично
// Go (Echo / Gin)
import "github.com/prometheus/client_golang/prometheus/promhttp"
func setupMetrics(e *echo.Echo) {
httpRequestsTotal := prometheus.NewCounterVec(
prometheus.CounterOpts{Name: "http_requests_total"},
[]string{"method", "path", "status"},
)
prometheus.MustRegister(httpRequestsTotal)
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
err := next(c)
httpRequestsTotal.WithLabelValues(
c.Request().Method, c.Path(),
strconv.Itoa(c.Response().Status),
).Inc()
return err
}
})
e.GET("/metrics", echo.WrapHandler(promhttp.Handler()))
}
Важливо: не створювати метрику з path як high-cardinality label — якщо в path є user_id або інші динамічні значення, Prometheus захлебнеться. Нормалізуй шлях: /users/12345/profile → /users/:id/profile.
Конфігурація Prometheus
Базовий prometheus.yml для мобільного бекенду:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'api-server'
static_configs:
- targets: ['api:8080']
metrics_path: /metrics
- job_name: 'postgres'
static_configs:
- targets: ['postgres-exporter:9187']
- job_name: 'redis'
static_configs:
- targets: ['redis-exporter:9121']
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
Для production — Service Discovery через Consul або Kubernetes service discovery замість static_configs.
Дашборди в Grafana
Не потрібно будувати дашборди з нуля — Grafana.com/dashboards містить готові: ID 1860 для Node Exporter, ID 9628 для PostgreSQL через postgres_exporter. Імпортуються одним кліком.
Для API-мониторинга будуємо кастомний дашборд з ключовими панелями:
-
rate(http_requests_total[5m])— RPS за endpoint -
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))— p95 latency -
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])— error rate
Алертинг через Alertmanager
Grafana Alerting або Alertmanager — настроюємо пороги для PagerDuty/Telegram/Slack. Мінімальний набір алертів для мобільного бекенду:
# alerting/rules.yml
groups:
- name: api
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "Error rate > 5% on {{ $labels.job }}"
- alert: HighLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
annotations:
summary: "p95 latency > 1s"
for: 2m — не піднімати алерт при короткочасних всплесках, тільки при стійкій деградації.
Що входить у роботу
- Docker Compose або Kubernetes маніфести для Prometheus, Grafana, Alertmanager
- Інструментування API-сервера (Python / Go / Node.js / Java)
- Підключення експортерів: postgres_exporter, redis_exporter, node_exporter
- Кастомні дашборди в Grafana під специфіку приложення
- Настройка алертів з маршрутизацією в Telegram / Slack / PagerDuty
- Документація з метрик та порогів алертів
Строки
Базова установка з готовими дашбордами та алертами: 2–3 дні. Повний стек з кастомними метриками, інструментуванням коду та production-ready конфігурацією: 4–6 днів. Вартість розраховується індивідуально.







