roqmeu/symfony-span-bundle
Composer 安装命令:
composer require roqmeu/symfony-span-bundle
包简介
Symfony Span Bundle
README 文档
README
Symfony-бандл, добавляющий трассировку и инструментирование для HTTP, Doctrine, Messenger и других компонентов. Готов к интеграции с Elastic APM, OpenTelemetry и подобными системами наблюдаемости.
Возможности
- Автоинструментирование Symfony HTTP Client, Guzzle, Doctrine DBAL, Symfony Messenger и OldSound RabbitMqBundle.
- Централизованное управление трейсами и спанами, совместимое с OpenTelemetry naming-конвенциями.
- Событийная модель работы: бандл диспатчит события жизненного цикла спанов/трейсов; адаптеры экспортируют данные во внешние системы.
- Поддержка Distributed Tracing для передачи контекста трассировки через HTTP и очереди сообщений.
- Встроенный мост к Elastic APM, учитывающий спецификации агента, маппинг контекста и поддерживающий Distributed Tracing.
- Профайлинг приложения через
ext-excimer.
Требования
- PHP
^7.4или^8.0. - Symfony компоненты (Config, DependencyInjection, EventDispatcher) версий
^5.0 || ^6.0 || ^7.0. - Поддержка Symfony Messenger
^5.4 || ^6.4 || ^7.0. - Поддержка Doctrine DBAL
^3.0 || ^4.0. - Поддержка Guzzle
^7.0. - Поддержка OldSound RabbitMqBundle
^2.0. - Для профилинга (опционально): PHP-расширение
excimer(ext-excimer).
Установка
composer require roqmeu/symfony-span-bundle
Если вы не используете Symfony Flex, добавьте бандл вручную в config/bundles.php:
return [ // ... Roqmeu\SpanBundle\SpanBundle::class => ['all' => true], ];
После установки бандл предоставляет сервисы SpanTracer, SpanInteractor, которые можно внедрять через автоконфигурацию.
Быстрый старт
- Включите бандл и трассировку в конфиге (по умолчанию всё выключено).
- Включите мост, например,
span.bridge.elastic_apm(по умолчанию всё выключено). - Подключите бандл и соберите контейнер.
- Подпишитесь на события
TraceStartedEvent,TraceEndedEvent,SpanStartedEvent,SpanEndedEvent, если требуется собственный экспорт. - Используйте
SpanTracerдля создания и завершения спанов в пользовательском коде или полагайтесь на готовые интеграции.
Конфигурация
По умолчанию бандл выключен. Автоинструментирование и листенеры включаются только при явном включении флагов.
Пример config/packages/span.yaml:
span: enabled: true tracing: enabled: true bridge: elastic_apm: # bool или placeholder (%env(bool:...)% или bool %parameter%) enabled: '%env(bool:default::ELASTIC_APM_ENABLED)%' # bool или placeholder (%env(bool:...)% или bool %parameter%) use_span_compression: false profiling: # bool или placeholder (%env(bool:...)% или bool %parameter%) enabled: '%env(bool:default::PROFILER_ENABLED)%' # Порог (секунды). Минимум 0.01, по умолчанию 0.1. threshold: 0.1 # Фильтры корневого спана, для которого включаем профилинг. # Если задан allowed_*, то соответствующий ignored_* игнорируется. allowed_types: ~ ignored_types: [ console ] allowed_subtypes: ~ ignored_subtypes: ~
Ключевые моменты:
span.enabled: включает регистрацию сервисовSpanTracer/SpanInteractor/EventDispatcher. Еслиfalse, регистрируются null-реализации (NullSpanTracer,NullSpanInteractor,NullEventDispatcher).span.enabledиspan.tracing.enabledвлияют на сборку контейнера (регистрация сервисов и compiler passes), поэтому их следует задавать как обычныеtrue/false(не placeholder).span.tracing.enabled: включает листенеры HTTP/Console и автоинструментирование (Doctrine DBAL middleware, Symfony HttpClient, Guzzle, Symfony Messenger, OldSound RabbitMqBundle). Работает только еслиspan.enabled: true.span.profiling.enabled: включает профилинг черезext-excimer(если расширение отсутствует — используетсяSpanNullProfiler). Работает только еслиspan.enabled: true.span.bridge.elastic_apm.enabled: включает регистрациюElasticApmBridgeи его обработчики событий. Можно задавать как placeholder — в этом случае сервис будет зарегистрирован, а фактическое включение/выключение будет происходить по значению параметра/ENV в рантайме.span.bridge.elastic_apm.use_span_compression: настройка для Distributed Tracing при использовании span compression в Elastic APM агенте. Можно задавать как placeholder.
Архитектура и концепции
Типизация и именование
Бандл опирается на стандарты OpenTelemetry, Elastic Common Schema и Sentry.
- Span содержит пару
type+subtypeисontext. - Ответственность за генерацию id, имени передана мостам (например, ElasticApmBridge), которые вычисляют их по собственным правилам на основе контекста, пример ElasticApmBridge:
- HTTP server:
<METHOD> <route> - HTTP client:
<METHOD> <host> - DB:
<OPERATION> <table> - Messaging:
<OPERATION> <destination> - Console:
<command>
- HTTP server:
- Контекст высокой кардинальности хранится в
Roqmeu\SpanBundle\State\Context.
Поддерживаемые интеграции
HTTP (Symfony HttpClient & Guzzle)
- Автоинструментирование клиентов и ответов, с поддержкой потоковой обработки chunk'ов.
- Сбор HTTP-метаданных (метод, URI, статус, целевой хост/порт).
Symfony HTTP Server
TracingRequestListenerсоздаёт root span для входящих HTTP-запросов.- Определяет имя транзакции по маршруту и выставляет
successfulв зависимости от статуса ответа.
Console команды
TracingCommandListenerсоздаёт и завершает трассы вокруг Symfony Console команд.- Имя транзакции совпадает с именем команды.
Doctrine DBAL
- Middleware перехватывает запросы, транзакции и prepared statements.
- Заполняет тип
db.<driver>и контекст (instance, statement, адрес сервера).
Symfony Messenger
- Автоинструментирование producer/consumer для sync и Redis/AMQP драйверов.
- Создаёт
producerиconsumerспаны, нормализует имена очередей, переносит контекст цели и заполняетserver.host/server.portпо параметрам соединения.
OldSound RabbitMqBundle
- Автоинструментирование producer/consumer (включая batch, multiple, dynamic, anon).
- Создаёт
producerиconsumerспаны, нормализует имена очередей, переносит контекст цели и заполняетserver.host/server.portпо параметрам соединения.
Экспорт и события
Все интеграции сообщают о жизненном цикле через события:
TraceStartedEvent/TraceEndedEventSpanStartedEvent/SpanEndedEvent
Elastic APM Bridge
Roqmeu\SpanBundle\Bridge\ElasticApmBridge подписан на SpanStartedEvent и TraceEndedEvent и экспортирует Trace в Elastic APM, соблюдая требования агента:
- Корневой спан преобразуется в транзакцию с корректным
type,outcomeиresult. Имя транзакции генерируется мостом на основе контекста. - Дочерние спаны создаются через
beginChildSpan, учитывая тип и сабтайп. - Контекст HTTP/DB/Messaging маппится в
destinationиservice.target. Мост самостоятельно выбираетtargetна основе контекста. - Поддерживается Distributed Tracing за счёт "раннего" создания транзакций и спанов (stubs), так как Elastic APM Agent позволяет инжектировать заголовки
traceparentтолько на этапе создания сегмента.
Мост по умолчанию выключен. Для включения задайте span.bridge.elastic_apm.enabled: true (или placeholder) и убедитесь, что установлен и доступен elastic/apm-agent-php (проверяется по наличию класса Elastic\Apm\ElasticApm).
Если вы хотите получать спаны из автоинструментирования Symfony/Doctrine/Messenger, дополнительно включайте span.tracing.enabled: true.
Если нужна другая система экспорта, подпишитесь на события и реализуйте собственный транспорт.
Локальная разработка
В репозитории присутствует docker-compose.yml и Makefile, упрощающие запуск окружения:
.envсодержит версии PHP и библиотек.make up— поднимает окружение (PHP + PostgreSQL + Redis).make init- устанавливает указанные в.envверсии библиотек.make reup— перезапускает контейнеры с пересозданием.make rebi— пересобирает образ PHP и обновляет контейнеры.make sh/make shr— открывает shell внутри контейнера от имениwww-dataилиroot.
Тестирование и качество
make lint— запускает Easy Coding Standard (ecs).make stan— запускает PHPStan с проектной конфигурацией.make test— обновляет автозагрузчик и запускает Codeception функциональные тесты.make chain— выполняет полный цикл: очистка кеша, линтер, статический анализ, тесты.
Конфигурация Codeception лежит в codeception.yml, тестовые фикстуры — в test/fixture, функциональные сценарии — в test/functional.
План развития
- Добавить поддержку многоканальной отправки в
TracingProducerMiddleware.
roqmeu/symfony-span-bundle 适用场景与选型建议
roqmeu/symfony-span-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.01k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2026 年 02 月 26 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「symfony」 「profiling」 「apm」 「tracing」 「opentelemetry」 「otel」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 roqmeu/symfony-span-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 roqmeu/symfony-span-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 roqmeu/symfony-span-bundle 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Quick profiling of your code for Laravel
Elastic APM bundle
The bundle for easy using json-rpc api on your project
Excimetry PHP package. Bridge between ext-eximer and open telemetry
Wizaplace Elastic APM Wrapper
Wizaplace Elastic APM Wrapper for Symfony
统计信息
- 总下载量: 1.01k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 37
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-02-26