Download the PHP package amashukov/tracing-bundle without Composer
On this page you can find all versions of the php package amashukov/tracing-bundle. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download amashukov/tracing-bundle
More information about amashukov/tracing-bundle
Files in amashukov/tracing-bundle
Package tracing-bundle
Short Description Symfony 7 bundle — UUIDv7 X-Request-Id propagation FE -> BE -> Monolog logs with a Messenger sync -> queue -> worker bridge.
License MIT
Homepage https://github.com/AndreyMashukov/tracing-bundle
Informations about the package tracing-bundle
amashukov/tracing-bundle
A Symfony 7 bundle that stamps every inbound HTTP request with a UUIDv7 X-Request-Id, mirrors it onto every Monolog log record's extra.request_id, echoes it back on the response, and rides through Symfony Messenger so a worker logging a handler ends up with the same id the originating HTTP request held.
amashukov/tracing-bundle is a vendor-extractable Symfony 7 bundle for end-to-end request_id propagation. Doing this once at the right layer beats bolting it on per-call: the bundle ships the kernel listener, the resolver, the Monolog processor, the Messenger stamp, the consume-side context restorer, validation at the trust boundary, and the CLI fallback so every console run / cron / worker logs {"request_id":"..."} instead of an empty extra block. Drop it into a Symfony 7 project, get the same id flowing through the FE fetch, the controller, every log line on every channel, the response header, and the queue-bound worker that picks the message up minutes later — with zero App\* namespace coupling.
Features
- Per-request UUIDv7 — generated via
symfony/uidwhen the incomingX-Request-Idis missing or malformed; valid inbound ids are lowercased and forwarded unchanged. - Listener at the kernel boundary —
kernel.request(priority256) writes the id onto theRequestattribute;kernel.response(priority-256) mirrors it onto the response header. Main-request only; sub-requests inherit the parent id naturally. - Validation at the trust boundary — incoming header rejected when length ≠ 36 or it contains anything outside
[a-f0-9-]. Prevents log-injection (SQL fragments, control characters, oversized payloads) from contaminating log files and aggregator search. - Monolog processor on every channel —
extra.request_idattached to everyLogRecord(app,doctrine,security,messenger, ...) with pre-existing extras preserved. - Messenger sync → queue → worker bridge — dispatch-side middleware attaches a
RequestIdStampto outbound envelopes; consume-side restores the id intoWorkerRequestIdContextbefore the handler runs, clears infinallyso message N+1 starts clean. - CLI fallback — every console / cron / non-Messenger worker run logs
{"request_id":"cli"}instead of an empty extra block — log-aggregator queries stay consistent regardless of execution mode. final readonlyservices — narrow contracts, immutable wiring, autowired by default.- Zero
App\*coupling — bundle depends only onmonolog/monolog+symfony/*. Drop into any project without renaming.
Installation
Symfony Flex registers the bundle automatically. If you don't run Flex, add it manually:
Requirements
- PHP 8.3+ (UUIDv7 needs
symfony/uid≥ 7.0) monolog/monolog^3.0symfony/*^7.0 (config,dependency-injection,event-dispatcher,http-foundation,http-kernel,uid,yaml)symfony/messenger^7.0 — softsuggest. The middleware class only loads when Messenger is installed; non-Messenger projects pay zero overhead.
Usage
After install — no further config. Every request automatically:
- Receives a
request_idattribute on theRequest. - Logs
extra.request_idin every Monolog record. - Mirrors
X-Request-Idon the response.
Reading the id inside a service
Browser side (Nuxt 3 / 4 plugin)
Playwright per-test echo
Then debug any failing run:
Every BE event scoped to that one test, no cross-spec noise.
CORS allow header
If the FE talks to a different origin, allow the header on both directions:
Messenger integration (sync → queue → worker)
When a Messenger message crosses the sync → queue boundary, the worker process has no RequestStack. The bundle's middleware closes that gap.
Dispatch side (HTTP request handler):
Consume side (worker process):
Per W3C Trace Context spec Non-HTTP Protocol Support and the Symfony Messenger official middleware pattern ($envelope->last(ReceivedStamp::class) discriminates dispatch vs consume).
Class catalogue
| Class | What it does |
|---|---|
Http\RequestIdListener |
kernel.request (priority 256) reads X-Request-Id, validates as 36-char hex UUID, generates UUIDv7 via symfony/uid when missing or malformed. kernel.response (priority -256) mirrors the id onto the response header. Main-request only. |
Http\RequestIdResolverInterface |
Narrow contract current(): string. Services depend on the interface; the bundle wires the alias. |
Http\RequestIdResolver |
final readonly implementation. Reads request_id off the main request first, falls back to WorkerRequestIdContext (when running inside Messenger), then to the cli constant. |
Monolog\RequestIdProcessor |
Tagged monolog.processor. Attaches extra.request_id to every LogRecord on every channel. Pre-existing extra keys preserved. |
Messenger\RequestIdStamp |
Immutable StampInterface value object carrying one string (the originating request's id). |
Messenger\RequestIdMessengerMiddleware |
Dual-path Messenger middleware. Dispatch: attaches new RequestIdStamp($resolver->current()) to the envelope if not already present. Consume (ReceivedStamp present): reads the stamp, writes the id to WorkerRequestIdContext before calling the next middleware, clears in finally. |
Messenger\WorkerRequestIdContext |
Single-cell mutable state holder for the worker's current message id. Read by RequestIdResolver::current() when there is no HTTP request. |
Validation
Incoming X-Request-Id is rejected when:
- length ≠ 36 chars
- contains anything outside
[a-f0-9-]
Rejected → bundle generates a fresh UUIDv7.
CLI fallback
In CLI context (no Request on RequestStack, no WorkerRequestIdContext value set), the resolver returns the literal cli. Every console command / one-shot cron task logs {"request_id":"cli"} instead of an empty extra block — log-aggregator queries stay consistent regardless of execution mode.
Trace Context (W3C traceparent)
This bundle deliberately implements the X-Request-Id header pattern only (Heroku / Cloudflare CF-Ray style). For W3C Trace Context (traceparent / OpenTelemetry alignment) pair this bundle with the official open-telemetry/opentelemetry-php-instrumentation-symfony — the two are complementary, not alternatives.
Testing
Suite covers: valid UUIDv7 accept, mixed-case header lowercased, five invalid-header regen cases (missing, too short, too long, wrong charset, SQL-injection-looking string), response header mirror, sub-request skip, subscribed-events shape, CLI fallback (no request / no attribute / non-string attribute), extra.request_id attach with pre-existing extras preserved, Messenger stamp value semantics, worker-context set/get/clear, middleware dispatch path, middleware consume path, middleware finally clears between messages.
License
MIT — see LICENSE.
Author
All versions of tracing-bundle with dependencies
monolog/monolog Version ^3.0
symfony/config Version ^7.0
symfony/dependency-injection Version ^7.0
symfony/event-dispatcher Version ^7.0
symfony/http-foundation Version ^7.0
symfony/http-kernel Version ^7.0
symfony/uid Version ^7.0
symfony/yaml Version ^7.0