Как мониторить производительность в продакшене?php-64

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

1. Инструменты мониторинга

APM

  • New Relic: Полный цикл мониторинга
  • Blackfire: Детальный профилировщик для PHP
  • Datadog APM: Интеграция с инфраструктурой
  • Sentry: Отслеживание ошибок и производительности

Инфраструктурные инструменты

  • Prometheus + Grafana: Метрики и визуализация
  • Elastic Stack (ELK): Логи и анализ
  • Zabbix: Классический мониторинг серверов

2. Ключевые метрики для PHP

Основные метрики:

  1. Время ответа (response time)
  2. RPM (Requests Per Minute)
  3. Потребление памяти
  4. Ошибки (5xx, исключения)
  5. Загрузка CPU

Детальные PHP-метрики:

  • Время выполнения запросов к БД
  • Внешние HTTP-вызовы
  • Очереди и фоновые задачи
  • Кеш-хиты/миссы

3. Настройка New Relic для PHP

Пример конфигурации:

; newrelic.ini
newrelic.enabled = true
newrelic.license = "YOUR_LICENSE_KEY"
newrelic.appname = "My PHP App"
newrelic.transaction_tracer.enabled = true
newrelic.transaction_tracer.detail = 1
newrelic.error_collector.enabled = true

4. Prometheus + Grafana для PHP

Экспортер метрик Nginx:

scrape_configs:
  - job_name: 'nginx'
    static_configs:
      - targets: ['nginx-exporter:9113']

Пример дашборда в Grafana:

  • Запросы в минуту
  • 95-й перцентиль времени ответа
  • Распределение HTTP-статусов
  • Потребление памяти PHP-FPM

5. Логирование и трейсинг

Настройка OpenTelemetry для PHP:

$tracerProvider = new TracerProvider();
$spanProcessor = new BatchSpanProcessor(
    new OtlpHttpExporter('http://jaeger:4318/v1/traces')
);
$tracerProvider->addSpanProcessor($spanProcessor);

Пример трейса в Jaeger:

  • Время выполнения SQL-запросов
  • Внешние API-вызовы
  • Время рендеринга шаблонов

6. Blackfire Profiler

Конфигурация для продакшена:

# .blackfire.yaml
probe:
  log_level: 3
  log_file: /var/log/blackfire.log
  sampling: 0.1 # Профилировать 10% запросов

7. Мониторинг очередей

Для Laravel Horizon:

php artisan horizon:metrics

Метрики для Prometheus:

  • Длина очереди
  • Время обработки задач
  • Количество неудачных заданий

8. Кастомные метрики

Пример сбора метрик в коде:

$registry = \Prometheus\CollectorRegistry::getDefault();
$counter = $registry->getOrRegisterCounter(
    'app',
    'user_registrations_total',
    'Total user registrations'
);
$counter->inc();

9. Алертинг

Пример alertmanager.yml:

route:
  receiver: 'slack-notifications'
  routes:
  - match:
      severity: 'critical'
    receiver: 'sms-notifications'

receivers:
- name: 'slack-notifications'
  slack_configs:
  - channel: '#alerts'
    send_resolved: true

10. Best Practices

  1. Многоуровневый мониторинг:

    • Инфраструктура
    • Приложение
    • Бизнес-метрики
  2. SLO/SLA:

    • Определите целевые показатели
    • Отслеживайте error budget
  3. Проактивный мониторинг:

    • Выявляйте проблемы до влияния на пользователей
    • Настройте алерты по аномалиям
  4. Распределенный трейсинг:

    • Особенно важно для микросервисов
  5. Логирование структурированных логов:

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
$log->error('Something happened', ['context' => $data]);

Резюмируем:

Эффективный мониторинг PHP-приложений требует комплексного подхода, сочетающего APM-инструменты, метрики инфраструктуры, логирование и трейсинг. Настроенная система мониторинга позволяет быстро выявлять и устранять проблемы, обеспечивая высокую доступность и производительность приложения.