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