← Назад к вопросам

Как мониторить запросы на продакшене?

2.7 Senior🔥 141 комментариев
#Инфраструктура и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мониторинг запросов на production: комплексный подход

Мониторинг запросов в production-окружении — это не просто сбор метрик, это создание системы наблюдения за жизненными показателями приложения. Я разделяю этот процесс на четыре ключевых направления: сбор метрик, логгирование, трассировка и проактивный анализ.

1. Сбор и агрегация метрик запросов

Цель — получить количественные данные о поведении системы: скорость, нагрузку, ошибки.

  • Основные метрики для каждого запроса:
    *   **Время обработки (Response Time)**: от получения запроса до отправки ответа. Разбиваем на фазы (маршрутизация, бизнес-логика, БД).
    *   **Статус коды**: распределение 200, 404, 500 и т.д. Рост 5xx — прямой сигнал о проблемах.
    *   **Rate (RPS/QPS)**: количество запросов в секунду. Показывает нагрузку.
    *   **Размеры запросов и ответов**: помогает обнаружить неоптимальные payloadы.

  • Инструменты и реализация:
    Используем Prometheus для сбора и Grafana для визуализации. В PHP интегрируем через библиотеки (например, `prometheus/client_golang` аналог для PHP) или middleware.

// Пример middleware для сбора базовых метрик в Laravel/Symfony
class MetricsMiddleware
{
    public function handle($request, Closure $next)
    {
        $start = microtime(true);
        $response = $next($request);
        $duration = microtime(true) - $start;

        // Отправка метрик в Prometheus (например, через push gateway)
        $this->prometheus->histogram('http_request_duration_seconds')
            ->observe($duration, [
                'method' => $request->method(),
                'route' => $request->path(),
                'status' => $response->getStatusCode()
            ]);

        return $response;
    }
}

2. Структурированное логгирование (Logging)

Логи — это "дневник" приложения, они дают контекст для ошибок и аномалий.

  • Ключевые принципы:
    *   **Структурированный формат (JSON)** вместо строк. Это позволяет автоматически парсить и анализировать.
    *   **Уровни логирования (DEBUG, INFO, WARNING, ERROR)**. На production обычно INFO и выше.
    *   **Обязательные поля в логе запроса**: `timestamp`, `method`, `uri`, `status_code`, `duration`, `user_id` (если есть), `ip`, `correlation_id` (для связывания связанных событий).
    *   **Агрегация логов в центральную систему**: ELK Stack (Elasticsearch, Logstash, Kibana) или SaaS-решения (Datadog, Loggly).

// Пример структурированного лога в формате JSON
$logEntry = [
    'timestamp' => date('c'),
    'level' => 'INFO',
    'type' => 'request',
    'correlation_id' => $correlationId,
    'request' => [
        'method' => $request->getMethod(),
        'uri' => $request->getUri(),
        'client_ip' => $request->getClientIp()
    ],
    'response' => [
        'status_code' => $response->getStatusCode(),
        'duration_ms' => round($duration * 1000, 2)
    ],
    'context' => [
        'user_id' => Auth::id() ?? null,
        'db_query_count' => DB::getQueryLogCount() // если отслеживаем
    ]
];

file_put_contents('logs/app.json.log', json_encode($logEntry) . PHP_EOL);

3. Distributed Tracing (Трассировка)

Для сложных микросервисных архитектур или даже монолитов с глубокой логикой необходимо понимать полный путь запроса через систему.

  • Что это дает: видим, как запрос проходит через разные компоненты (API, сервисы, очереди, БД), и где именно возникают задержки или ошибки.
  • Реализация: Используем стандарт OpenTracing или его реализацию OpenTelemetry. Инструменты: Jaeger, Zipkin.
    *   **Trace** — общий контейнер для всего пути запроса.
    *   **Span** — отдельная операция внутри trace (вызов метода, запрос к БД, внешний API).
    *   В PHP устанавливаем расширение `opentelemetry` или используем библиотеки (например, для Symfony).

// Концептуальный пример создания span в OpenTelemetry
$tracer = GlobalTracer::get();
$span = $tracer->startSpan('handle_user_request');
$span->setAttribute('http.method', $request->method());
$span->setAttribute('http.route', $request->path());

try {
    // Выполнение бизнес-логики
    $user = $this->userRepository->find($userId); // Это создаст свой child-span
    $span->setAttribute('db.query.count', 1);
} catch (\Exception $e) {
    $span->setStatus(StatusCode::ERROR, $e->getMessage());
} finally {
    $span->end(); // Завершаем span и отправляем данные в collector
}

4. Проактивный анализ и автоматизация

Сбор данных — лишь половина работы. Вторая половина — анализ и реакция.

  • Создание дашбордов (Grafana, Kibana): агрегируем ключевые метрики на одном экране: RPS, среднее/медианное время ответа, ошибки, топ медленных эндпоинтов.
  • Настройка алертов: не ждем, когда пользователи сообщают о проблеме.
    *   **Примеры условий для алерта (Prometheus Alertmanager):**
        *   `increase(http_requests_5xx_total[5m]) > 10` — резкий рост ошибок.
        *   `http_request_duration_seconds{route="/api/v1/export"} > 5` — конкретный эндпоинт стал слишком медленным.
        *   `rate(http_requests_total[5m]) == 0` — полное отсутствие запросов (возможна недоступность).
  • Анализ трендов и SLI/SLA: регулярно отслеживаем, соответствуют ли наши показатели (например, 95% запросов должны отвечать за <500ms) установленным Service Level Indicators (SLI).

Практические рекомендации

  • Инструментарий: Для старта можно использовать Prometheus + Grafana + ELK. Для более сложных систем — Datadog или New Relic, которые предлагают integrated solution.
  • Влияние на performance: Сам мониторинг должен быть максимально легковесным. Используем асинхронную отправку метрик и логов, чтобы не замедлять основной поток обработки запроса.
  • Конфиденциальность: Не логируем чувствительные данные (пароли, полные платежные данные). Маскируем или исключаем их.
  • Culture: Мониторинг — это часть культуры разработки. Новые эндпоинты и сервисы с момента запуска должны быть покрыты метриками.

Таким образом, эффективный мониторинг запросов — это многоуровневая система, сочетающая метрики, логи, трассировку и автоматические алерты. Она позволяет не только реагировать на инциденты, но и проактивно улучшать стабильность и производительность вашего PHP-приложения.