Мониторинг HTTP-запросов: Response Time и Error Rate

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Мониторинг HTTP-запросов: Response Time и Error Rate
Средний
от 4 часов до 2 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    562

Отметим: когда среднее время ответа эндпоинта 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)
  • Скрипты для батчинга и отправки метрик с обработкой ошибок
  • Документация по алертам и порогам
  • Обучение команды эксплуатации системы

Процесс работы и сроки

  1. Аналитика: аудит текущего стека, определение критических эндпоинтов
  2. Проектирование: выбор подхода (клиент/сервер), инструментов, схемы метрик
  3. Реализация: интеграция перехватчиков, написание логики батчинга и агрегации
  4. Тестирование: проверка в боевых сценариях, стресс-тест буфера
  5. Деплой: выкатка в релиз, мониторинг первых дней, калибровка порогов

Сроки ориентировочно: Firebase Performance с кастомными трейсами и базовыми алертами — от 1 недели. Кастомная система метрик с батчингом, перцентилями и дашбордом Datadog/Grafana — от 2 до 4 недель. Стоимость рассчитывается индивидуально — зависит от платформы, количества эндпоинтов и сложности интеграции. Мы гарантируем качество интеграции и оперативное реагирование на инциденты.

Чек-лист для настройки мониторинга
  • Выбрать инструмент (Firebase Performance / Datadog / кастомное решение)
  • Нормализовать URL-паттерны
  • Настроить сбор перцентилей P50, P95, P99
  • Установить алерты: P95 > 2x baseline, Error Rate > 5%
  • Проверить отправку метрик в офлайн-режиме
  • Добавить трейсинг для критических пользовательских сценариев

Внедрите мониторинг HTTP-запросов в своё приложение. Свяжитесь с нами — мы оценим ваш проект и предложим оптимальное решение. Получите консультацию.

Интеграция API в мобильное приложение: с чего начать

Запрос уходит, ответ не приходит, timeout — 30 секунд. Пользователь смотрит на спиннер. Сети нет — мобильная карта в метро. Или сеть есть, но сервер вернул 200 с HTML-страницей ошибки вместо JSON — и приложение крашит при JSONDecoder.decode(). Мы видим такие кейсы на каждом втором проекте. Поэтому интеграция API в мобильное приложение — это не просто вызов endpoint'а, а проектирование надёжного сетевого слоя: обработка ошибок, кэширование, offline-режим, certificate pinning. Закажите аудит текущего сетевого слоя — оценим проект за 1 день.

Почему стандартные библиотеки недостаточны? URLSession и OkHttp предоставляют базовый HTTP-клиент, но для production нужны retry с exponential backoff, валидация статус-кодов, типизированная десериализация и мониторинг состояния сети. Без этого приложение теряет данные и пользователей. Мы уже 5 лет занимаемся мобильной разработкой и реализовали более 30 проектов с интеграцией API на iOS, Android и Flutter — от стартапов до enterprise-решений.

Как выбрать протокол для интеграции API?

Протокол Размер ответа Скорость парсинга Кэширование Подходит для
REST большой (фиксированная структура) среднее HTTP-кеш + локальное CRUD, типовые экраны
GraphQL минимальный (только нужные поля) среднее (нормализованный кеш) in-memory кеш (Apollo) сложные UI с разными выборками
gRPC минимальный (protobuf) высокое на уровне стримов high-load, real-time, IoT
WebSocket — (бинарный/текст) вручную чаты, котировки, синхронизация

REST остаётся стандартом для большинства проектов. Но когда на экране профиля нужно 5 полей из 40, GraphQL исключает over-fetching и сокращает трафик на 30–60%. gRPC оправдан при тысячах запросов в минуту (trading, IoT) — бинарная сериализация в 3–5 раз быстрее JSON. WebSocket — единственный выбор для real-time без polling (сообщения, уведомления).

Пример из практики: для финтех-приложения мы заменили REST (40 полей) на GraphQL — размер ответа сократился с 12 КБ до 2,5 КБ, время рендера экрана упало на 70%. Экономия трафика составила около 15 000 ₽ в месяц при 100 000 активных пользователей.

Как обеспечить надёжность соединения и offline-first

Пользователи теряют сеть в метро, лифте, тоннеле. Мобильное приложение обязано работать без интернета — хотя бы в read-only режиме. Мы внедряем паттерн offline-first:

  1. При открытии экрана сначала показываем данные из локального кеша (Core Data / Room).
  2. Параллельно выполняем сетевой запрос, обновляем UI после ответа.
  3. Если сеть недоступна — показываем кешированные данные и метку «нет соединения».
  4. При восстановлении сети автоматически синхронизируем изменения.

Для кэширования HTTP-ответов используем URLCache (iOS) и OkHttp Cache (Android) с поддержкой Cache-Control. Для структурированных данных — SwiftData / Room. NWPathMonitor / ConnectivityManager.NetworkCallback отслеживают состояние сети и триггерят обновление.

REST и выбор клиентской библиотеки

Alamofire (iOS) — де-факто стандарт для Swift-проектов. Поверх URLSession добавляет request chaining, response validation, automatic retry, certificate pinning через ServerTrustManager. AF.request() с .validate() возвращает ошибку для любого статус-кода вне 200–299. Без .validate() Alamofire считает 404 и 500 успешными ответами. С Swift Concurrency — async-версия через serializingDecodable.

Retrofit (Android) — аннотационный HTTP-клиент поверх OkHttp. Интерфейс с аннотациями компилируется в реализацию. @GET, @POST, @Path, @Query, @Body — декларативное описание API. OkHttp под капотом: connection pooling, transparent gzip, HTTP/2 multiplex. HttpLoggingInterceptor — логирование в debug-сборке. Authenticator — автоматический refresh токена при 401.

Ktor (KMM/Flutter) — мультиплатформенный HTTP-клиент. На iOS работает через Darwin engine (URLSession), на Android — через OkHttp. Единый код для обеих платформ при KMM-архитектуре.

GraphQL: когда REST не справляется

REST возвращает фиксированную структуру. Экран профиля требует name, avatar, email — сервер отдаёт 40 полей. Over-fetching. GraphQL решает это: клиент запрашивает ровно нужные поля. Это критично для мобайла, где трафик и время парсинга — реальные ограничения. Apollo iOS и Apollo Kotlin генерируют типизированные классы по схеме: schema.graphql + query-файлы → строгие типы на этапе компиляции. Subscriptions через WebSocket — real-time без polling. Ограничение: GraphQL сложнее кешировать на уровне HTTP. Apollo использует нормализованный in-memory кеш InMemoryNormalizedCache — запросы с пересекающимися данными обновляют кеш без дублирования. Apollo GraphQL Documentation

WebSocket: real-time без лишнего трафика

Polling (setInterval каждые 5 секунд) — трата батареи и трафика. WebSocket — постоянное двунаправленное соединение. iOS: URLSessionWebSocketTask (нативный, iOS 13+). Android: OkHttp WebSocket. Обязательная обработка reconnect: при onFailure — экспоненциальный backoff (1с → 2с → 4с → 8с → максимум 60с). Socket.IO — надстройка с автоматическим reconnect, но для новых проектов предпочтительнее нативный WebSocket (меньше зависимостей).

gRPC: для высоконагруженных сервисов

gRPC с protobuf — бинарная сериализация: меньше размер, быстрее парсинг. grpc-swift для iOS, grpc-kotlin для Android. Protobuf-схема компилируется в типизированные классы. Streaming (server-side, client-side, bidirectional) — нативная возможность. Порог применения: высокая частота запросов (trading, IoT) или критичная latency. Для обычного CRUD REST проще в дебаге и мониторинге.

Certificate Pinning и безопасность

Корпоративный proxy может перехватить HTTPS через подмену сертификата. Certificate pinning предотвращает это: приложение принимает только конкретный сертификат или публичный ключ. Alamofire: ServerTrustManager с PinnedCertificatesTrustEvaluator. OkHttp: CertificatePinner с SHA-256 хешем. Операционная сложность: при ротации сертификата старые версии приложения перестают работать. Решение — pinning на публичный ключ CA или поддержка нескольких пинов с grace period. Подробнее о certificate pinning на Wikipedia

Что входит в работу

Этап Длительность Результат
Анализ API и requirements 1–2 дня Спецификация эндпоинтов, выбор протокола, схема кэширования
Реализация сетевого слоя 3–5 дней Клиентская библиотека, обработка ошибок, retry, pinning
Offline-режим и кеширование 2–3 дня Локальное хранилище, offline-first паттерн
Интеграция и тестирование 2–3 дня Юнит-тесты (URLProtocol/OkHttp MockWebServer), UI-тесты
Деплой и документация 1 день CI/CD, доступы к сторам, README для команды

Мы передаём: исходный код сетевого слоя, документацию по используемым библиотекам, инструкцию по ротации сертификатов, поддержку в течение 2 недель после сдачи.

Сроки и стоимость

Реализация сетевого слоя с REST, retry, кэшированием и offline-режимом — 1–2 недели. Добавление GraphQL или WebSocket — ещё 1–2 недели. gRPC — 2–3 недели, включая кодогенерацию. Стоимость рассчитывается индивидуально после анализа API и требований к offline-поведению. Оценим проект за 1 день — свяжитесь для консультации.