roqmeu / symfony-span-bundle
Symfony Span Bundle
Installs: 246
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
Type:symfony-bundle
pkg:composer/roqmeu/symfony-span-bundle
Requires
- php: ^7.4 || ^8.0
- guzzlehttp/psr7: ^1.0 || ^2.0
- symfony/config: ^5.0 || ^6.0 || ^7.0
- symfony/dependency-injection: ^5.0 || ^6.0 || ^7.0
- symfony/event-dispatcher: ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- ext-posix: *
- codeception/codeception: ^4.0 || ^5.0
- codeception/module-asserts: ^2.0 || ^3.0
- codeception/module-symfony: ^2.0 || ^3.0
- doctrine/dbal: ^3.0 || ^4.0
- doctrine/doctrine-bundle: ^2.0
- guzzlehttp/guzzle: ^7.0
- php-amqplib/rabbitmq-bundle: ^2.0
- phpstan/phpstan: ^2.0
- phpstan/phpstan-doctrine: ^2.0
- phpstan/phpstan-strict-rules: ^2.0
- phpstan/phpstan-symfony: ^2.0
- roave/security-advisories: dev-latest
- symfony/amqp-messenger: ^5.4 || ^6.4 || ^7.0
- symfony/console: ^5.4 || ^6.4 || ^7.0
- symfony/doctrine-messenger: ^5.4 || ^6.4 || ^7.0
- symfony/framework-bundle: ^5.4 || ^6.4 || ^7.0
- symfony/http-client: ^5.4 || ^6.4 || ^7.0
- symfony/http-foundation: ^5.4 || ^6.4 || ^7.0
- symfony/http-kernel: ^5.4 || ^6.4 || ^7.0
- symfony/messenger: ^5.4 || ^6.4 || ^7.0
- symfony/redis-messenger: ^5.4 || ^6.4 || ^7.0
- symplify/easy-coding-standard: ^12.0
Conflicts
- doctrine/dbal: <3.0 || >=5.0
- guzzlehttp/guzzle: <7.0 || >=8.0
- php-amqplib/rabbitmq-bundle: <2.0 || >=3.0
- symfony/amqp-messenger: <5.0 || >=8.0
- symfony/console: <5.0 || >=8.0
- symfony/doctrine-messenger: <5.0 || >=8.0
- symfony/framework-bundle: <5.0 || >=8.0
- symfony/http-client: <5.0 || >=8.0
- symfony/http-foundation: <5.0 || >=8.0
- symfony/http-kernel: <5.0 || >=8.0
- symfony/messenger: <5.0 || >=8.0
- symfony/redis-messenger: <5.0 || >=8.0
This package is not auto-updated.
Last update: 2026-03-02 16:45:53 UTC
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 и EventDispatcher, которые можно внедрять через автоконфигурацию.
Быстрый старт
- Включите бандл и трассировку в конфиге (по умолчанию всё выключено).
- Включите мост, например,
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), которые вычисляют их по собственным правилам на основе контекста:
- 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.