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

Как настроить метрики на проекте?

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

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

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

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

Настройка метрик в PHP Backend проекте: стратегия, инструменты и практика

Настройка метрик на проекте — это системный процесс создания наблюдаемости (observability) системы, позволяющий измерять её производительность, отслеживать ошибки и понимать поведение пользователей. Для PHP Backend это включает несколько ключевых шагов.

Определение ключевых метрик (KPI и SLI)

Первым шагом является определение что измерять. Для типичного проекта это:

  • Метрики производительности: время ответа (Response Time), количество запросов (RPS), ошибки (Error Rate).
  • Метрики бизнеса: количество пользователей, успешных транзакций, конверсий.
  • Метрики ресурсов: использование памяти (RAM), CPU, дискового пространства, активные соединения к базе данных.
  • Метрики приложения: время выполнения ключевых методов, количество вызовов внешних API, статусы кэша.

Пример формулировки метрики в виде Service Level Indicator (SLI):

// SLI: 95% HTTP-запросов должны завершаться менее чем за 200ms
$sliTargetLatency = 200;
$sliTargetPercentage = 95;

Выбор инструментов и интеграция

Для PHP существует несколько популярных инструментов:

  1. Prometheus + Grafana: классическое решение для сборки и визуализации метрик.
  2. StatsD/Telegraf + Graphite/InfluxDB: альтернативный подход, часто используемый в реальном времени.
  3. Ready-made решения: New Relic, DataDog, Elastic APM — коммерческие инструменты с глубокой интеграцией.

Интеграция Prometheus в PHP проект через библиотеку prometheus/client_php:

<?php
require 'vendor/autoload.php';

use Prometheus\CollectorRegistry;
use Prometheus\Storage\InMemory;
use Prometheus\RenderTextFormat;

$registry = new CollectorRegistry(new InMemory());

// Создание метрики "counter" для подсчета запросов
$requestsCounter = $registry->registerCounter(
    'app',
    'http_requests_total',
    'Total HTTP requests',
    ['method', 'endpoint']
);

// Инкрементируем метрику в обработчике запроса
$requestsCounter->incBy(1, [$request->getMethod(), $request->getPath()]);

// Экспорт метрик для Prometheus
$renderer = new RenderTextFormat();
$metrics = $renderer->render($registry->getMetricFamilySamples());
header('Content-Type: ' . RenderTextFormat::MIME_TYPE);
echo $metrics;
?>

Интеграция в код приложения

Метрики должны быть интегрированы неинвазивно, часто через middleware или обработчики событий.

Пример интеграции метрик времени выполнения через middleware (на примере Laravel):

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\StatsD; // Пример использования StatsD

class MetricsMiddleware
{
    public function handle($request, Closure $next)
    {
        $start = microtime(true);
        
        $response = $next($request);
        
        $duration = microtime(true) - $start;
        
        // Отправка метрики в StatsD
        StatsD::timing('http.request.duration', $duration * 1000); // в миллисекундах
        
        // Метрика по количеству запросов
        StatsD::increment('http.requests.total', 1, [
            'method' => $request->method(),
            'route' => $request->route()->getName(),
            'status' => $response->getStatusCode()
        ]);
        
        return $response;
    }
}
?>

Сбор, агрегация и визуализация

После отправки метрик из приложения они должны быть:

  • Собраны: агент (например, Prometheus Node Exporter) собирает метрики с endpoints приложения.
  • Агрегированы: метрики часто агрегируются по временным интервалам (5s, 1m, 5m).
  • Визуализированы: использование Grafana для создания дашбордов.

Пример дашборда Grafana может включать:

  • График latency по ключевым endpointам.
  • Heatmap ошибок по времени.
  • Динамика использования памяти в реальном времени.

Мониторинг и алертинг

Метрики без алертинга — просто данные. Необходимо настроить алерты на ключевые события:

  • Когда latency превышает пороговое значение.
  • Когда error rate растёт более 1%.
  • Когда использование памяти приближается к лимиту.

Пример алерта в Prometheus (alert.rules.yml):

groups:
  - name: php_app
    rules:
      - alert: HighRequestLatency
        expr: http_request_duration_ms{job="php_backend"} > 200
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High latency detected on {{ $labels.instance }}"

Практические рекомендации для PHP проектов

  • Используйте существующие библиотеки: prometheus/client_php, statsd**-php, чтобы не писать код отправки метрик самостоятельно.
  • Интегрируйте метрики на уровне framework: в Laravel/Symfony это удобно делать через события (Event Listeners) или middleware.
  • Измеряйте бизнес-логику: добавьте метрики для ключевых бизнес-процессов, например, user_registration_success_total.
  • Учитывайте нагрузку: сбор метрик сам должен быть легковесным, не добавлять значительную нагрузку на приложение.
  • Логируйте контекст: связывайте метрики с логами через уникальные идентификаторы запросов (request_id), чтобы можно было исследовать конкретные случаи проблем.

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