Спостережуваність: логи, метрики та здоров’я моноліту Laravel і мікросервісів

«У мене працює» — не стратегія моніторингу. У проді ламається системно: диск, черги, таймаути залежностей, відставання реплік. Якісна спостережуваність відповідає: що змінилося, для кого, на якому кроці — без SSH на кожен хост. Логіка однакова для моноліту Laravel і для кількох сервісів; при розділенні зростають проводка та кардинальність сигналів.

Пов’язані матеріали: Пул з’єднань до БД для PHP · БД під навантаженням · API gateway · Sail: troubleshooting

Зміст


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

Опора Відповідає на Типові помилки
Логи Що сталося крок за кроком? (помилки, аудит, дебаг) Рядки без структури; секрети в логах; INFO-потік у проді
Метрики Скільки й наскільки швидше/повільніше ніж учора? Висока кардинальність лейблів (повний URL, user id на кожній серії)
Трейси Який span у ланцюгу гальмує? Немає пробросу контексту — сервіс B не знає, що це запит A

Вони доповнюють одна одну: стрибок частки помилок веде до репрезентативних логів і трейсу повільного чекаута. Жодна опора не замінює інші.


Різні середовища

  • Local / dev — максимум швидкості розробника: tail, Telescope, багатослівні логи, брейкпоінти. Не переносьте ту саму болтливість у прод без фільтрів.
  • Staging / pre-prod — за можливості ті самі приймачі логів і дашборди, що в проді; ловите помилки інтеграції («працює, доки не ввімкну JSON у Loki»).
  • Prodсигнал, вартість зберігання, редакція PII: структура, рівні, семплінг дебаг-шляхів, health із перевіркою реальних залежностей.

Мета не ідентичний стек скрізь, а узгоджені контракти (однакові імена correlation id і метрик), щоб під час інциденту не вчити систему заново.


Моноліт Laravel

Логування

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

Запит

  • Middleware: прийняти вхідний X-Request-Id або згенерувати; повернути в відповіді; прокинути в HTTP-клієнти і джоби.
  • Log::withContext() (у сучасних версіях) тримає контекст на запит без ручного протягування.

Черги й розклад

  • Horizon — глибина черги, failed jobs, throughput; це першокласний моніторинг, не «додаток до 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-клієнт, драйвер БД і бібліотеку черг. Часткові трейси краще за відсутність.

Межі сервісів

  • Узгодьте таймаути, ретраї та ідемпотентність; інакше в трейсах буде каскад повторів.

Інструменти: від класики до модерну

Від старіших до набувають популярності (усі ще зустрічаються в проді):

Епоха / тип Приклади Примітка
Хост і мережа syslog, rsyslog, logrotate Транспорт і ротація; ще життєздатні
Класичний моніторинг хоста Nagios, Icinga, Zabbix Диск, ping, прості проби — база інфраструктури
Агрегація логів ELK, Graylog, Splunk Потужний пошук; плануйте ємність
Метрики й дашборди Prometheus + Grafana, Alertmanager Дефакто для K8s і багатьох «залізних» інсталяцій
Довгий горизонт / HA VictoriaMetrics, Mimir, Thanos Навколо протоколу Prometheus
Логи «як метрики» Grafana Loki Лейбли замість повного індексу кожного поля
Хмари CloudWatch, Cloud Logging, Azure Monitor Тісна інтеграція з білінгом хмари
SaaS all-in-one Datadog, New Relic, Honeycomb Швидкий старт; ціна від обсягу й кардинальності
PHP / Laravel Sentry, Scout, Tideways Помилки, APM, профілювання
Стандартизація OpenTelemetry (OTel) + collector Один експорт — багато бекендів; зростає частка нових проєктів
eBPF / автоінструментація різні вендори Спостереження на рівні ядра без змін коду; не замінює бізнес-логи в Laravel

Під навантаженням

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

Алерти

Тривожте про видимі користувачу або близькі збої: прогорання SLO, стрибок error rate, p95 черги, диск, закінчення сертифіката.

Уникайте пейджингу на шум без runbook. «CPU > 80%» п’ять хвилин часто не інцидент; «успішність оплати впала на порядок» — так.


Чекліст

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

Спостережуваність — частина продукту: той самий Laravel має доказово сказати, коли він ось-ось впаде, і куди дивитися першим.