Мониторинг 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