Мониторинг PHP приложений: метрики и алерты для стабильности

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Мониторинг PHP приложений: метрики и алерты

Современные PHP-приложения работают в сложных распределенных средах, где сбои и падение производительности могут стоить бизнесу миллионы. Без системы мониторинга вы рискуете узнать о проблеме только от пользователей. В этой статье мы разберем, как настроить полноценный мониторинг PHP-приложений, какие метрики отслеживать и как настроить алерты для быстрого реагирования.

Почему мониторинг PHP критически важен

PHP остается одним из самых популярных языков для веб-разработки (по данным W3Techs, более 75% сайтов используют PHP). Однако его интерпретируемая природа и особенности работы с памятью требуют особого внимания. Без мониторинга вы не сможете:

  • Обнаружить утечки памяти до того, как они приведут к падению сервера
  • Определить медленные запросы к базе данных
  • Выявить неэффективные участки кода
  • Спрогнозировать нагрузку и масштабировать инфраструктуру

Эффективный мониторинг состоит из трех компонентов: сбор метрик, визуализация и алертинг. Рассмотрим каждый этап на практике.

Ключевые метрики PHP-приложений

Для полноценного мониторинга необходимо отслеживать следующие группы метрик:

Метрики производительности (APM)

  • Время ответа (p50, p95, p99 перцентили)
  • Пропускная способность (RPS – запросов в секунду)
  • Время выполнения скрипта (max_execution_time)
  • Количество ошибок (5xx, исключения)

Системные метрики

  • Загрузка CPU и использование памяти PHP-FPM
  • Количество активных процессов PHP-FPM
  • Использование дискового пространства для логов
  • Сетевой трафик и задержки

Бизнес-метрики

  • Количество успешных платежей
  • Скорость загрузки страниц
  • Конверсия воронки

Практическая реализация: сбор метрик с помощью Prometheus

Рассмотрим пример интеграции PHP-приложения с Prometheus – одним из самых популярных инструментов мониторинга. Для работы с Prometheus в PHP используем библиотеку promphp/prometheus_client_php.

Установка через Composer:

composer require promphp/prometheus_client_php

Пример регистрации и использования счетчика (Counter) и гистограммы (Histogram):

<?php
use Prometheus\CollectorRegistry;
use Prometheus\Storage\InMemory;
use Prometheus\RenderTextFormat;

// Инициализация хранилища (в production используйте Redis или APCu)
$registry = new CollectorRegistry(new InMemory());

// Счетчик для отслеживания количества ошибок
$errorCounter = $registry->registerCounter(
    'app_errors_total',
    'Total number of application errors',
    ['type', 'endpoint']
);

// Гистограмма для времени ответа
$requestDuration = $registry->registerHistogram(
    'http_request_duration_seconds',
    'HTTP request duration in seconds',
    ['method', 'endpoint'],
    [0.1, 0.5, 1, 2, 5, 10] // бакеты
);

// Middleware для сбора метрик
function monitorRequest(callable $handler) {
    global $requestDuration, $errorCounter;
    
    $start = microtime(true);
    
    try {
        $result = $handler();
        $duration = microtime(true) - $start;
        
        // Записываем время выполнения
        $requestDuration->observe($duration, [
            $_SERVER['REQUEST_METHOD'],
            $_SERVER['REQUEST_URI']
        ]);
        
        return $result;
    } catch (\Throwable $e) {
        // Увеличиваем счетчик ошибок
        $errorCounter->inc([
            get_class($e),
            $_SERVER['REQUEST_URI']
        ]);
        throw $e;
    }
}

// Endpoint для Prometheus (обычно /metrics)
function metricsEndpoint() {
    global $registry;
    $renderer = new RenderTextFormat();
    return $renderer->render($registry->getMetricFamilySamples());
}
?>

Этот код позволяет отслеживать время выполнения каждого запроса и количество ошибок по типам. В production среде замените InMemory на Redis или APCu для сохранения метрик между запросами.

Настройка алертов: от уведомлений к действиям

Сбор метрик бесполезен без системы оповещения. Рассмотрим настройку алертов с помощью Prometheus Alertmanager и отправку уведомлений в Telegram.

Пример правил алертов (alert.rules.yml)

groups:
  - name: php_app
    rules:
      - alert: HighErrorRate
        expr: rate(app_errors_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "High error rate in PHP app"
          description: "Error rate is {{ $value }} errors/sec for last 5 minutes"

      - alert: SlowResponseTime
        expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 2
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Slow response time detected"
          description: "P95 response time is {{ $value }} seconds"

      - alert: PHPFPMHighMemory
        expr: sum(php_fpm_memory_bytes) > 1e9
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "PHP-FPM memory usage high"
          description: "Total PHP-FPM memory usage is {{ $value }} bytes"

Отправка алертов в Telegram через webhook

Пример простого PHP-скрипта для отправки уведомлений:

<?php
function sendTelegramAlert(string $message): void {
    $token = 'YOUR_BOT_TOKEN';
    $chatId = 'YOUR_CHAT_ID';
    
    $data = [
        'chat_id' => $chatId,
        'text' => $message,
        'parse_mode' => 'HTML'
    ];
    
    $url = "https://api.telegram.org/bot{$token}/sendMessage";
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch                

Блоги

Рекомендаций по книгам