Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Observability в PHP без боли. Олег Мифле, тимли...

Observability в PHP без боли. Олег Мифле, тимлид Altenar

Доклад с митапа Пыхап от канала Пых и Lamoda Tech

Учимся держать руку на пульсе прода при помощи логов, метрик и трейсинга.

Avatar for Lamoda Tech

Lamoda Tech

June 24, 2025
Tweet

More Decks by Lamoda Tech

Other Decks in Technology

Transcript

  1. Observability в php без боли 3 Наш сервис это •

    REST API • 170 k регистраций в месяц • 3000 RPS • 8 TB в MySQL
  2. Observability в php без боли OBservability 5 Observability – это

    способность системы предоставлять достаточную информацию о своём внутреннем состоянии на основе внешнего поведения.
  3. Observability в php без боли OBservability 6 Observability – это

    способность системы предоставлять достаточную информацию о своём внутреннем состоянии на основе внешнего поведения. Observability — это подход, позволяющий понять, что происходит внутри системы, не меняя её поведение, за счёт сбора метрик, логов и трассировок.
  4. Observability в php без боли OBservability 7 Observability – это

    способность системы предоставлять достаточную информацию о своём внутреннем состоянии на основе внешнего поведения. Observability — это подход, позволяющий понять, что происходит внутри системы, не меняя её поведение, за счёт сбора метрик, логов и трассировок. “A system is observable if you can determine the internal state of the system from its outputs.” (с) Control Theory
  5. Observability в php без боли А что нужно-то? 11 1.

    Быстро понять, что мы упали. 2. Быстро всё закатить назад. a. Быстро поднятое упавшим не считается 3. Удобные и понятные инструменты чтобы понять a. что упало; b. где упало; c. почему упало.
  6. Observability в php без боли Почему OpenTelemetry? 13 1. Стандартизация

    (CNCF). 2. Вендор-агностицизм. 3. Сообщество и экосистема. 4. Единый подход к Observability.
  7. Observability в php без боли Основные термины 15 1. Trace.

    2. Span. 3. Root Span. 4. Span Context. 5. Sampler. 6. и т.д..
  8. Observability в php без боли Зачем? 17 1. Видеть ошибку

    раньше пользователя, до эскалации. 2. Видеть масштаб инцидента. 3. Очищать продуктовый код от ошибок и проблем.
  9. Observability в php без боли 📌 Рекомендуемый продакшн‑профиль 19 1.

    8 CPU‑ядер 2. 16 GB RAM 3. 40+ GB диска Может держать ~1000RPS
  10. Observability в php без боли Как настроить 20 • Не

    логировать все ошибки. ◦ Например валидация, 404, устаревание токена. • Issue в sentry != логи • Кардинальность событий. ◦ Например userId в заголовке события • Максимально обогащать событие ◦ Второго шанса получить старое событие не будет
  11. Observability в php без боли За чем ещё можно следить?

    23 • Рейт ошибок • Тенденции • Количество ошибок в релизе • ТОПы
  12. Observability в php без боли Факт: эндпоинт X работает медленно

    30 • Идём в логи (если есть) ◦ Видим когда стартует ◦ Когда завершается Полезно? • Идём в смотреть графики (если нет) ◦ Видим всплеск p99 Понятно… есть проблема…
  13. Observability в php без боли Что такое и зачем эти

    трейсы? 31 • Трейс – это “история” одного запроса. Для чего? • Диагностика производительности. • Анализ запросов в распределенных системах. • Понимание зависимостей и взаимодействий компонентов.
  14. Observability в php без боли 32 📉 Трейсинг превращает "черный

    ящик" сложной системы в прозрачную, наблюдаемую структуру.
  15. Observability в php без боли Как затаскивать 33 • Установить

    пакеты composer require \ open-telemetry/sdk \ open-telemetry/exporter-otlp \ open-telemetry/opentelemetry-auto-slim \ open-telemetry/opentelemetry-auto-psr18
  16. Observability в php без боли Как затаскивать для SEntry 39

    • Установить пакет composer require sentry/sentry
  17. Observability в php без боли Можно ли покрыть всё трейсми?

    42 Можно. • Overhead. • Кардинальность. • Нагрузка на сеть • Нагрузка на хранилище трейсов
  18. Observability в php без боли 44 📉 Позволяет не просто

    видеть, что операция была медленной (трейс), но и понять, какая именно функция внутри PHP-кода съела всё процессорное время или ждала чего-то.
  19. Observability в php без боли Как затаскивать? 45 • Выбрать

    профайлер ◦ XHProf ◦ php-excimer ◦ Tideways ◦ Blackfire ◦ Xdebug ◦ Php-spy ◦ pyroscope/php
  20. Observability в php без боли Как затаскивать? 46 • Выбрать

    профайлер ◦ php-excimer • Настроить (написать) отправку профайла
  21. Observability в php без боли Почему плохо писать в файл?

    51 • Файлы не централизованы • Нет ротации → переполнение диска • Не видно в реальном времени • Нет семантики • Нельзя подключить алерты • Могут быть потеряны или не попадать наружу
  22. Observability в php без боли А как надо? 52 •

    Вывод логов в stdout ◦ А дальше — лог-агент (Vector, Fluent Bit) передаёт в систему хранения (Loki, OpenSearch, ELK, VictoriaLogs и т.д.) • Структурированные логи ◦ Не текст, а JSON — с полями timestamp, level, message, context. • Корреляция с трейсом
  23. Observability в php без боли Структура лога 53 [2023-10-27 14:35:10]

    app.ERROR: Payment processing failed for order 123. User: [email protected]. Reason: Insufficient funds. Amount: 99.99 USD. GatewayResponse: DECLINED. RequestID: xyz789. [2023-10-27 14:38:22] app.INFO: User registered. Email: [email protected]. UserID: 456.
  24. Observability в php без боли Структура лога 54 { "timestamp":

    "2023-10-27T14:35:10.123456+00:00", // ISO 8601 "level_name": "ERROR", // Уровень (ERROR, INFO, DEBUG) "channel": "payment_service", // Канал/модуль "message": "Payment processing failed", // Основное сообщение "context": { // Контекстные данные "order_id": 123, "user_email": "[email protected]", "amount": 99.99, "currency": "USD", "reason": "Insufficient funds", "gateway_response": "DECLINED" }, "extra": { // Доп. данные от процессоров "request_id": "xyz789", "process_id": 7812 } }
  25. Observability в php без боли Почему JSON? 55 1. Машиночитаемость

    2. Индексация 3. Стандартизация 4. Легко реализуется с Monolog\Formatter\JsonFormatter
  26. Observability в php без боли Ключевые поля 56 • timestamp

    (точный, с таймзоной/UTC) • level (DEBUG, INFO, WARNING, ERROR, CRITICAL) • message (краткое, понятное сообщение) • channel (имя логгера/модуля: payments, users, orders) • context (массив с ключевой бизнес-информацией: order_id, user_id, product_id, параметры запроса, важные переменные) • extra (данные, добавленные Monolog Processors: request_id, trace_id, ip_address, memory_usage)
  27. Observability в php без боли Best practices 57 • Не

    писать чувствительные данные • Добавлять в логи исключения стектрейс • Не генерировать логи в цикле • Писать уровни • Не оставлять необработанные ошибки без логов • Следить за типом данных 🧨
  28. Observability в php без боли Неконсистентонсть типов 58 • Парсеры

    и аналитики ломаются • Индекс не работает корректно ◦ Нужно удалять индекс, удалять неконсистентный лог, создавать индекс
  29. Observability в php без боли Зачем они нужны? 60 •

    Уметь измерять и анализировать всё, что происходит с системой • Уметь измерять и анализировать полезность от фичи
  30. Observability в php без боли Где накапливать 62 • Prometheus

    • Victoria Metrics • Grafana Mimir • StatHouse от ВК
  31. Что такое pull и push модели Observability в php без

    боли Pull • Сервис хранит данные у себя • Prometheus забирает их по расписанию у сервиса Push • Сервис отправляет данные в хранилище, не хранит у себя • Prometheus забирает их по расписанию из хранилища 64
  32. Observability в php без боли Выводы 70 • Observability это

    не Opentelemetry • Алертинг – самое быстрое решение для начала • Logs – не просто запись текста в файлик • Tracing – чтобы понимать, что происходит внутри системы • Profiling – чтобы понимать, как это происходит внутри системы • Визуализация – очень важный этап
  33. Observability в php без боли 71 Observability – простой способ

    перестать нервничать после деплоя.
  34. Спасибо за внимание What does a poker player and an

    effective manager have in common? 72 mifl[email protected] Олег Мифле mifleo Scan me!