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

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

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

Начать курс

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

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

Зачем мониторить PHP? Ключевые метрики

Мониторинг позволяет ответить на три главных вопроса: "Работает ли приложение?", "Как быстро оно работает?" и "Не происходит ли что-то аномальное?". Для PHP-приложений критически важны следующие группы метрик:

  • Метрики доступности (Uptime): Проверка, что веб-сервер и PHP-FPM отвечают на запросы. Простейший способ — health check endpoint.
  • Метрики производительности: Время выполнения запроса (Response Time), пропускная способность (Requests per Second), время работы базы данных и внешних API.
  • Метрики ресурсов: Потребление памяти (Memory Usage), загрузка CPU, количество активных процессов PHP-FPM.
  • Метрики ошибок: Количество HTTP-ошибок (5xx, 4xx), исключений (Exceptions), фатальных ошибок и warning'ов.
  • Бизнес-метрики: Скорость оформления заказа, количество регистраций — все, что важно для вашего бизнеса.

Собирать эти метрики можно разными способами: от простого логирования в файл до использования продвинутых систем observability, таких как Prometheus + Grafana или коммерческих решений (Datadog, New Relic).

Сбор метрик: от простого к сложному

Начнем с базового подхода — создания простого health check и сбора метрик в формате Prometheus.

1. Health Check endpoint

Создайте простой endpoint, который проверяет соединение с БД и кэшем:

<?php
// health.php
$checks = [
    'database' => false,
    'redis' => false,
    'status' => 'unhealthy'
];

try {
    new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    $checks['database'] = true;
} catch (PDOException $e) {
    // Логируем ошибку
}

if ($checks['database'] && $checks['redis']) {
    $checks['status'] = 'healthy';
    http_response_code(200);
} else {
    http_response_code(503);
}

header('Content-Type: application/json');
echo json_encode($checks);

2. Сбор метрик для Prometheus

Prometheus — популярная система сбора метрик. Ваше приложение должно отдавать данные в формате /metrics. Пример простого экспортера:

<?php
// metrics.php
header('Content-Type: text/plain; version=0.0.4');

$metrics = [];

// Счетчик запросов
$metrics[] = '# HELP http_requests_total Total number of HTTP requests.';
$metrics[] = '# TYPE http_requests_total counter';
$metrics[] = 'http_requests_total{method="GET",route="/home"} 1024';

// Гистограмма времени ответа
$metrics[] = '# HELP http_request_duration_seconds Request duration in seconds.';
$metrics[] = '# TYPE http_request_duration_seconds histogram';
$metrics[] = 'http_request_duration_seconds_bucket{le="0.1"} 500';
$metrics[] = 'http_request_duration_seconds_bucket{le="0.5"} 800';
$metrics[] = 'http_request_duration_seconds_bucket{le="+Inf"} 1024';

// Метрики PHP (память, время)
$metrics[] = '# HELP php_memory_bytes Current memory usage.';
$metrics[] = '# TYPE php_memory_bytes gauge';
$metrics[] = 'php_memory_bytes ' . memory_get_usage(true);

echo implode("\n", $metrics) . "\n";

Настройка алертов: когда и как оповещать

Метрики без алертов — это просто цифры. Алерты должны быть настроены на основе пороговых значений (thresholds). Основные правила:

  • Критические алерты (P1): Приложение недоступно (HTTP 503), количество 5xx ошибок > 5% за 5 минут.
  • Предупреждающие алерты (P2): Время ответа > 2 секунд, утечка памяти, высокая загрузка CPU.
  • Информационные алерты (P3): Рост количества 4xx ошибок, снижение бизнес-метрик.

Пример алерта для Prometheus Alertmanager:

groups:
  - name: php_alerts
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m]) > 0.05
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "High HTTP 5xx error rate"
          description: "Error rate is {{ $value | humanizePercentage }} for the last 5 minutes."

      - alert: HighMemoryUsage
        expr: php_memory_bytes > 500000000
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "PHP memory usage is high"
          description: "Memory usage is {{ $value | humanize1024 }}."

Каналы оповещения: email, Slack, Telegram, PagerDuty. Для интеграции с Telegram используйте ботов.

Логирование и трассировка ошибок

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

  • Структурированное логирование: Используйте форматы JSON или Monolog для отправки логов в централизованное хранилище (ELK Stack, Graylog).
  • Отслеживание исключений: Инструменты вроде Sentry или Flare автоматически собирают стеки вызовов и контекст ошибки.

Пример интеграции с Sentry:

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

\Sentry\init(['dsn' => 'https://examplePublicKey@o0.ingest.sentry.io/0' ]);

try {
    // Ваш код
    throw new \RuntimeException('Test error');
} catch (\Throwable $exception) {
    \Sentry\captureException($exception);
}

Для трассировки запросов (distributed tracing)

Блоги

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