Моніторинг HTTP-запитів: Response Time та Error Rate
Зауважимо: коли середній час відповіді ендпоінта GET /api/feed зростає з 200 мс до 1800 мс, користувач відчуває гальма, але відгуки в App Store з'являться через добу. З моніторингом ви дізнаєтеся про проблему за 5 хвилин. Команда з 10+ річним досвідом мобільної розробки стикалася з ситуаціями, коли відсутність моніторингу HTTP-запитів призводила до втрати до 30% користувачів. Ми реалізували понад 50 проектів з моніторингом — від стартапів до enterprise-додатків з аудиторією 10 млн користувачів. Тому ми впроваджуємо системи збору метрик Response Time та Error Rate під ключ. За даними аналітиків, кожна година простою з високою затримкою коштує компанії в середньому $10,000. Розберемо, як це працює на практиці, та які підходи приносять реальний результат.
Проблеми без моніторингу HTTP-запитів
Без моніторингу ви дізнаєтеся про проблеми з API лише з відгуків або скарг користувачів. Але скарги надходять із затримкою, а кожна година простою з високою затримкою означає втрату частини аудиторії. Моніторинг вирішує три завдання: виявлення деградації за 5 хвилин, діагностика причини (мережа vs сервер) та запобігання регресам після релізів.
Клієнтський vs серверний моніторинг: що обрати?
Два рівні збору метрик дають повну картину.
Клієнтський (in-app): час відповіді від пристрою користувача — включає затримку мережі. Відображає реальний досвід, але зашумлений: погана мережа в одного користувача не означає проблему сервера.
Серверний (APM): інструментуємо сервер, вимірюємо лише час обробки. Не бачить мережеву затримку, але точно показує стан бекенду.
Правильно — обидва рівні. Клієнтський для розуміння UX, серверний для діагностики.
| Параметр | Клієнтський моніторинг | Серверний моніторинг |
|---|---|---|
| Що вимірює | Час відповіді на пристрої (включаючи мережу) | Час обробки запиту на сервері |
| Зашумлення | Високе (залежить від мережі користувача) | Низьке |
| Відображає UX | Так | Ні |
| Типові інструменти | Firebase Performance, кастомні перехоплювачі | APM-системи (Datadog, New Relic) |
Вибір підходу залежить від мети. Якщо потрібно бачити реальний UX — обов'язковий клієнтський. Для діагностики бекенду достатньо серверного. Оптимальна комбінація: клієнтські метрики для алертів «користувач страждає», серверні — для пошуку причини.
Як інструментувати HTTP-клієнт: код та приклади
Покажу на прикладі React Native. Код аналогічний для iOS (URLProtocol) та Android (OkHttpInterceptor).
Перехоплювач для Axios в React Native
import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
type RequestMetric = {
endpoint: string;
method: string;
statusCode: number;
durationMs: number;
timestamp: number;
error?: string;
};
const metricsBuffer: RequestMetric[] = [];
const FLUSH_INTERVAL_MS = 30_000;
const FLUSH_BATCH_SIZE = 50;
function createMonitoredAxios(): AxiosInstance {
const instance = axios.create({ baseURL: API_BASE_URL });
instance.interceptors.request.use((config: AxiosRequestConfig) => {
(config as any).metadata = { startTime: Date.now() };
return config;
});
instance.interceptors.response.use(
(response: AxiosResponse) => {
recordMetric(response.config, response.status, null);
return response;
},
(error) => {
const status = error.response?.status ?? 0;
recordMetric(error.config, status, error.message);
return Promise.reject(error);
}
);
return instance;
}
function recordMetric(config: any, status: number, error: string | null) {
const durationMs = Date.now() - (config?.metadata?.startTime ?? Date.now());
const url = config?.url ?? 'unknown';
const endpoint = new URL(url, API_BASE_URL).pathname;
metricsBuffer.push({
endpoint,
method: (config?.method ?? 'GET').toUpperCase(),
statusCode: status,
durationMs,
timestamp: Date.now(),
error: error ?? undefined,
});
if (metricsBuffer.length >= FLUSH_BATCH_SIZE) flushMetrics();
}
URL нормалізуємо в pathname — не хочемо тисячі унікальних метрик /api/users/123, /api/users/456. Потрібен патерн /api/users/:id.
Агрегація на клієнті: P50/P95/P99
Середнє (mean) час відповіді оманливе: 90% запитів за 100 мс та 10% за 5000 мс дають середнє 590 мс — не відображає реальної картини. Перцентилі точніше:
function calculatePercentiles(durations: number[]): { p50: number; p95: number; p99: number } {
const sorted = [...durations].sort((a, b) => a - b);
const p = (percentile: number) => sorted[Math.floor(sorted.length * percentile / 100)];
return { p50: p(50), p95: p(95), p99: p(99) };
}
P99 — час відповіді для 99% запитів. Якщо P99 зростає при стабільному P50 — проблема з повільними запитами у невеликої частини користувачів (конкретний endpoint, конкретна ОС, конкретний регіон).
Відправка метрик: батчинг та пріоритизація
async function flushMetrics() {
if (metricsBuffer.length === 0) return;
const batch = metricsBuffer.splice(0, FLUSH_BATCH_SIZE);
try {
await fetch(`${METRICS_ENDPOINT}/ingest`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ metrics: batch, appVersion: APP_VERSION, platform: Platform.OS }),
});
} catch {
// При помилці відправки — кладемо назад у буфер, але не більше MAX_BUFFER_SIZE
metricsBuffer.unshift(...batch.slice(0, MAX_BUFFER_SIZE - metricsBuffer.length));
}
}
Метрики відправляємо через спеціальний non-critical fetch — помилки при відправці не повинні впливати на UX. Буфер обмежений — при тривалому offline не накопичуємо гігабайти.
Готові рішення: Firebase Performance Monitoring
@react-native-firebase/perf робить більшу частину автоматично: перехоплює fetch/XHR, вимірює час, відправляє в Firebase. У консолі — дашборд з перцентилями по endpoint. Згідно документації Firebase Performance Monitoring, автоматичний збір метрик мережі доступний на Android та iOS.
import perf from '@react-native-firebase/perf';
// Кастомний trace для критичної операції
const trace = await perf().startTrace('checkout_flow');
trace.putAttribute('userId', userId);
// ... операція ...
await trace.stop();
Для більшості додатків Firebase Performance Monitoring — правильний вибір. Для enterprise з вимогами до self-hosted — Datadog RUM Mobile або кастомна відправка в InfluxDB/Prometheus.
Перцентилі: чому це головна метрика?
Середній час відповіді може бути прийнятним, але 10% найповільніших запитів роблять додаток некомфортним. P95 та P99 показують, скільки насправді чекають користувачі з поганим з'єднанням або на старих пристроях. Встановлення алертів по P95 дозволяє реагувати на погіршення для більшості, а P99 — на викиди.
Як налаштувати алерти та не пропустити деградацію?
Визначте baseline — середнє значення P95 за тиждень. Встановіть поріг: P95 > 2× baseline протягом 5 хвилин — попередження в Slack. Error Rate > 5% за 10 хвилин — критичний алерт в PagerDuty. Важливо розділяти клієнтські та серверні метрики: зростання клієнтського P95 при стабільному серверному вказує на проблеми мережі.
Firebase Performance впроваджується в 3 рази швидше, ніж кастомне рішення на Datadog — за 3 дні замість 2 тижнів. Але кастомне рішення дає повний контроль над зберіганням та кастомізацією дашбордів. Інвестиція в моніторинг окупається за рахунок зниження втрати користувачів та витрат на підтримку, економлячи до 30% бюджету.
| Критерій | Firebase Performance | Кастомна система (Datadog/Grafana) |
|---|---|---|
| Час впровадження | 3 дні | 2-4 тижні |
| Контроль даних | Обмежений (хмара Google) | Повний (self-hosted) |
| Кастомізація дашбордів | Середня | Висока |
| Вартість на старті | Безкоштовно (ліміти) | Залежить від інфраструктури |
Що входить в роботу
- Інструментування HTTP-клієнта (Axios/OkHttp/URLSession) під вашу платформу
- Налаштування дашборду метрик (Grafana, Firebase Console або Datadog)
- Скрипти для батчингу та відправки метрик з обробкою помилок
- Документація по алертам та порогам
- Навчання команди експлуатації системи
Процес роботи та терміни
- Аналітика: аудит поточного стеку, визначення критичних ендпоінтів
- Проектування: вибір підходу (клієнт/сервер), інструментів, схеми метрик
- Реалізація: інтеграція перехоплювачів, написання логіки батчингу та агрегації
- Тестування: перевірка в бойових сценаріях, стрес-тест буфера
- Деплой: викатка в реліз, моніторинг перших днів, калібрування порогів
Терміни орієнтовно: Firebase Performance з кастомними трейсами та базовими алертами — від 1 тижня. Кастомна система метрик з батчингом, перцентилями та дашбордом Datadog/Grafana — від 2 до 4 тижнів. Вартість розраховується індивідуально — залежить від платформи, кількості ендпоінтів та складності інтеграції. Ми гарантуємо якість інтеграції та оперативне реагування на інциденти.
Чек-лист для налаштування моніторингу
- Вибрати інструмент (Firebase Performance / Datadog / кастомне рішення)
- Нормалізувати URL-патерни
- Налаштувати збір перцентилів P50, P95, P99
- Встановити алерти: P95 > 2x baseline, Error Rate > 5%
- Перевірити відправку метрик в офлайн-режимі
- Додати трейсинг для критичних користувацьких сценаріїв
Впровадьте моніторинг HTTP-запитів у свій додаток. Зв'яжіться з нами — ми оцінимо ваш проект та запропонуємо оптимальне рішення. Отримайте консультацію.







