Настройка мониторинга бэкенда мобильного приложения (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 дней. Стоимость рассчитывается индивидуально.







