Наблюдаемость: логи, метрики и здоровье в монолите Laravel и в микросервисах
«У меня работает» — не стратегия мониторинга. В проде ломается по шаблонам: кончился диск, выросла задержка очереди, завис внешний API или реплика отстаёт. Хорошая наблюдаемость отвечает на вопросы что изменилось, для кого и на каком шаге цепочки — без SSH на каждую машину. Идеи те же и для монолита Laravel, и для набора сервисов; при разбиении растут только трубопровод и кардинальность сигналов.
Связанные материалы: Пул коннектов к БД для PHP · БД под нагрузкой · API gateway и обмен сообщениями · Sail: troubleshooting
Содержание
- Три столпа: логи, метрики, трассы
- Чем отличаются среды
- Монолит Laravel: слои
- Микросервисы: корреляция и трассировка
- Спектр инструментов: от классики к модерну
- Под нагрузкой: сэмплинг, кардинальность, деньги
- Алерты, которые не выключают
- Чеклист
Три столпа: логи, метрики, трассы
| Столп | Отвечает на | Типичные ошибки |
|---|---|---|
| Логи | Что произошло по шагам? (ошибки, аудит, отладка) | Неструктурные строки; секреты в логах; 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или W3Ctraceparentвместе с внутренним 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%» пять минут часто не инцидент; «успешность оплаты упала на порядок» — да.
Чеклист
- Структурные логи в stdout/шиппер; один correlation id в синхронных и асинхронных путях.
- Золотые сигналы на сервис: задержка, трафик, ошибки, насыщение + глубина очереди для воркеров.
- Health с проверкой реальных зависимостей; где нужно — разделение liveness/readiness.
- Трекер ошибок в проде; Telescope-подобное вне прода или с жёсткими ограничениями.
- Ревью стоимости и кардинальности до режима «логируем всё».
Наблюдаемость — часть продукта: тот же Laravel должен доказуемо сказать, когда он на грани сбоя и куда смотреть первым.