Наблюдаемость: логи, метрики и здоровье в монолите Laravel и в микросервисах

«У меня работает» — не стратегия мониторинга. В проде ломается по шаблонам: кончился диск, выросла задержка очереди, завис внешний API или реплика отстаёт. Хорошая наблюдаемость отвечает на вопросы что изменилось, для кого и на каком шаге цепочки — без SSH на каждую машину. Идеи те же и для монолита Laravel, и для набора сервисов; при разбиении растут только трубопровод и кардинальность сигналов.

Связанные материалы: Пул коннектов к БД для PHP · БД под нагрузкой · API gateway и обмен сообщениями · Sail: troubleshooting

Содержание


Три столпа: логи, метрики, трассы

Столп Отвечает на Типичные ошибки
Логи Что произошло по шагам? (ошибки, аудит, отладка) Неструктурные строки; секреты в логах; INFO-потоп в проде
Метрики Сколько и как быстро относительно вчера? Высокая кардинальность лейблов (полный URL, user id на каждой серии); графики «никто не смотрит»
Трассы Какой span в цепочке тормозит? Нет проброса контекста — сервис B не знает, что это запрос A

Они усиливают друг друга: скачок error rate ведёт к репрезентативным логам и трассе медленного чекаута. Один столп не заменяет остальные.


Чем отличаются среды

  • Локально / dev — скорость разработчика: tail, Telescope, подробные логи, брейкпоинты. Не копируйте ту же болтливость в прод без фильтров.
  • Staging — по возможности те же приёмники логов и дашборды, что в проде; ловите «сломалось только при JSON в Loki».
  • Продсигнал, стоимость хранения, редакция PII: структура, уровни, сэмплинг отладочных путей, health с реальными зависимостями.

Цель не одинаковый стек везде, а совместимые контракты (имена correlation id, имён метрик), чтобы в инциденте не переучивать систему.


Монолит Laravel: слои

Логирование

  • Каналы в config/logging.php: stack, daily, syslog, JSON в stdout для контейнеров.
  • Структурированный context вместо парсинга свободного текста позже.
  • В контекст — request id, при политике — user id, id джоба в очереди.

Жизненный цикл запроса

  • Middleware для correlation id: принять X-Request-Id или сгенерировать; отдать в ответе; прокинуть в джобы и HTTP-клиенты.
  • Log::withContext() (в актуальных версиях) уменьшает протаскивание параметров вручную.

Очереди и расписание

  • Horizon — глубина очереди, throughput, failed jobs; это мониторинг первого класса, не «приложение к Redis».
  • Scheduler: логируйте старт/финиш/длительность; алерт на пропуск (внешний heartbeat или мониторинг cron).

Глубокая отладка (не прод)

  • Telescope — сильно для local/staging; в проде выключен или жёстко ограничен (сеть, auth, сэмплинг).
  • Laravel Pulse — медленные запросы, исключения, очереди; следите за сэмплингом и ретеншном под нагрузкой.

Здоровье

  • /up (Health) в Laravel 11+ и аналоги: отделяйте liveness («процесс жив») от readiness («есть БД и кеш») для балансировщиков и Kubernetes.

Ошибки

  • Sentry, Flare, Bugsnag — группировка стектрейсов, релизы, breadcrumbs. Дополняют логи; не заменяют метрики насыщения.

Микросервисы: корреляция и трассировка

Когда один HTTP превращается в gateway → A → B → брокер → воркер, access log по сервисам в разрезе не склеивается.

Correlation ID

  • Пробрасывайте стабильный id на каждый исходящий вызов (X-Request-Id или W3C traceparent вместе с внутренним id).
  • Логируйте его на входе в каждом сервисе; кладите в payload джоб и заголовки сообщений.

Распределённая трассировка

  • OpenTelemetry — растущий вендор-независимый стандарт; коллектор шлёт в Jaeger, Tempo, Zipkin или SaaS.
  • Зрелость инструментации в PHP проверяйте под ваш HTTP-клиент, драйвер БД и очередь. Частичные трассы лучше, чем ноль.

Границы сервисов

  • Единые таймауты, ретраи, идемпотентность; иначе наблюдаемость покажет лавину повторов по цепочке.

См. гайд по API gateway.


Спектр инструментов: от классики к модерну

Хост и сеть

  • syslog, rsyslog, logrotate — по-прежнему рабочий транспорт и ротация.
  • Nagios, Icinga, Zabbix — диск, ping, простые пробы; база инфраструктуры, не замена трассам приложения.

Агрегация логов

  • ELK (Elasticsearch, Logstash/Beats, Kibana), Graylog, Splunk — поиск и дашборды; планируйте ёмкость.

Метрики

  • Prometheus + Grafana; Alertmanager для маршрутизации алертов.
  • VictoriaMetrics, Mimir, Thanos — долгий горизонт или HA вокруг протокола Prometheus.

Логи в стиле метрик

  • Grafana Loki — лейблы как у метрик, часто дешевле полнотекстового индекса «на всё».

Облака

  • CloudWatch, Google Cloud Logging/Monitoring, Azure Monitor.

SaaS «всё в одном»

  • Datadog, New Relic, Honeycomb — логи, метрики, APM; цена растёт от объёма и кардинальности.

PHP и Laravel

  • Sentry (ошибки + performance), Scout, Tideways — профилирование и APM с упором на PHP.

Стандартизация

  • OpenTelemetry — SDK и экспортеры, collector на несколько бэкендов; популярность из-за снижения привязки к вендору.

eBPF и авто-инструментация (набирают обороты)

  • Наблюдение на уровне ядра без правок кода — сильно для платформенных команд; бизнес-смысл всё равно задаёте логами в Laravel.

Под нагрузкой: сэмплинг, кардинальность, деньги

  • Объём логов растёт с трафиком; debug JSON на запрос может съесть CPU. Уровни и сэмплированный debug на горячих путях.
  • Лейблы Prometheus: не кладите неограниченные значения (URL с id, email) — взрыв серий.
  • Сэмплинг трасс: 100% на ошибки и медленные запросы, остальное — выборка.
  • Ретеншн: горячий слой (дни), холодное хранилище, отдельная политика для аудита vs отладки.

Алерты, которые не выключают

Сигналить о видимых пользователю или близких сбоях: прогорание SLO, скачок error rate, p95 очереди, диск, истечение сертификата.

Не будите людей по шуму без runbook. «CPU > 80%» пять минут часто не инцидент; «успешность оплаты упала на порядок» — да.


Чеклист

  1. Структурные логи в stdout/шиппер; один correlation id в синхронных и асинхронных путях.
  2. Золотые сигналы на сервис: задержка, трафик, ошибки, насыщение + глубина очереди для воркеров.
  3. Health с проверкой реальных зависимостей; где нужно — разделение liveness/readiness.
  4. Трекер ошибок в проде; Telescope-подобное вне прода или с жёсткими ограничениями.
  5. Ревью стоимости и кардинальности до режима «логируем всё».

Наблюдаемость — часть продукта: тот же Laravel должен доказуемо сказать, когда он на грани сбоя и куда смотреть первым.