Prometheus метрики в PHP: мониторинг производительности приложений
Prometheus — это мощная система мониторинга и оповещения с открытым исходным кодом, которая стала стандартом де-факто в мире Cloud Native. Для интеграции Prometheus с PHP-приложениями существует несколько зрелых библиотек. В этой статье мы рассмотрим две основные: promphp/prometheus_client_php и artisanphpex/prometheus, и покажем, как добавить метрики в ваш PHP-проект.
Зачем нужны метрики в PHP?
Мониторинг PHP-приложений позволяет отслеживать:
- Количество запросов и их время выполнения
- Ошибки и исключения
- Использование памяти и CPU
- Состояние очередей и внешних сервисов
- Бизнес-метрики (количество заказов, регистраций и т.д.)
Сбор этих данных помогает быстро выявлять проблемы, планировать масштабирование и улучшать пользовательский опыт.
Библиотека promphp/prometheus_client_php
Это самая популярная и активно поддерживаемая библиотека. Она реализует официальный клиент Prometheus для PHP и поддерживает все типы метрик:
- Counter — счетчик, который только увеличивается (например, количество запросов)
- Gauge — значение, которое может как увеличиваться, так и уменьшаться (текущая память, количество активных пользователей)
- Histogram — гистограмма для измерения распределения значений (время ответа, размер запроса)
- Summary — квантильное распределение (аналог Histogram, но с вычислением квантилей на стороне клиента)
Установка
composer require promphp/prometheus_client_php
Пример использования
<?php
require 'vendor/autoload.php';
use Prometheus\CollectorRegistry;
use Prometheus\Storage\InMemory;
use Prometheus\RenderTextFormat;
// Создаем хранилище (можно Redis, APC, InMemory)
$adapter = new InMemory();
$registry = new CollectorRegistry($adapter);
// Создаем счетчик
$counter = $registry->registerCounter(
'app',
'requests_total',
'Total number of HTTP requests',
['method', 'endpoint']
);
// Инкрементируем при каждом запросе
$counter->incBy(1, ['GET', '/api/users']);
// Создаем гистограмму для времени ответа
$histogram = $registry->registerHistogram(
'app',
'response_time_seconds',
'Response time in seconds',
['method', 'endpoint'],
[0.1, 0.5, 1, 2, 5] // buckets
);
// Наблюдаем время выполнения запроса
$histogram->observe(0.234, ['GET', '/api/users']);
// Отдаем метрики в формате Prometheus
$renderer = new RenderTextFormat();
$result = $renderer->render($registry->getMetricFamilySamples());
header('Content-Type: ' . RenderTextFormat::MIME_TYPE);
echo $result;
Библиотека artisanphpex/prometheus
Это более легковесная альтернатива, сфокусированная на простоте использования. Она также поддерживает Counter, Gauge, Histogram и Summary.
Установка
composer require artisanphpex/prometheus
Пример использования
<?php
require 'vendor/autoload.php';
use ArtisanPhp\Prometheus\CollectorRegistry;
use ArtisanPhp\Prometheus\Storage\InMemory;
use ArtisanPhp\Prometheus\RenderTextFormat;
$adapter = new InMemory();
$registry = new CollectorRegistry($adapter);
// Создаем Gauge
$gauge = $registry->registerGauge(
'app',
'memory_usage_bytes',
'Current memory usage in bytes',
['process']
);
$gauge->set(memory_get_usage(true), ['main']);
// Создаем Summary
$summary = $registry->registerSummary(
'app',
'request_duration_milliseconds',
'Request duration in ms',
['method'],
0.95, // quantile
0.01 // error
);
$summary->observe(150, ['GET']);
// Вывод метрик
$renderer = new RenderTextFormat();
$data = $renderer->render($registry->getMetricFamilySamples());
header('Content-Type: text/plain; charset=utf-8');
echo $data;
Хранение и экспорт метрик
Обе библиотеки поддерживают несколько адаптеров хранения:
- InMemory — для разработки и тестирования (данные живут только в процессе)
- Redis — для production (метрики сохраняются между запросами)
- APC
Также в библиотеке
Работа с YAML в Swift (iOS/macOS) — библиотеки Yams и YamlSwift
Elasticsearch клиент для Rust: обзор библиотеки elasticsearch-rs
Elasticsearch клиент для Swift (iOS/macOS): интеграция и примеры
Миграции баз данных в TypeScript: полное руководство по инструментам и подходам