Интеграция Prometheus метрик в PHP: библиотеки и примеры

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

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

Начать курс

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

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