Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Inter App Request Identifier Bundle Laravel Package

juliendufresne/inter-app-request-identifier-bundle

A Symfony bundle that assigns and propagates unique identifiers for inter-application requests, making it easier to trace requests and correlate logs across services. Integrates with the Symfony request lifecycle and provides configuration for consistent request IDs.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Verdict: Still do not adopt — but reclassify. v0.2.0 materially changes what this package is: from "an interface with no implementers" to "an interface plus two working integrations (Guzzle middleware, Monolog processor/handler)." That invalidates part of the prior reasoning and deserves an honest restatement. It does not change the conclusion for a Laravel estate, because the new capability ships as Symfony bundle service wiring that Laravel will not auto-discover. Net position: keep building in-house, but treat this repository as a directly copyable reference implementation (MIT) rather than a mere interface stub. Two new concerns are introduced by the release itself: behavior is now on by default, and the project now has runtime hooks into the log pipeline and the HTTP client stack — both high-blast-radius surfaces.

Architecture fit

  • Unchanged core mismatch: this is a Symfony bundle (*Bundle suffix), not a Laravel package. No Illuminate\Support\ServiceProvider, no extra.laravel.providers, no config publish. The new Guzzle/Monolog activation logic almost certainly lives in the bundle's DI extension, which Laravel never executes — so the headline feature of v0.2.0 delivers zero behavior to a Laravel app without hand-porting the wiring anyway.
  • This is the crux: the release closes the capability gap for Symfony users and leaves the Laravel gap exactly where it was. The port cost is now "copy two small classes and write the Laravel service provider/middleware glue" rather than "write everything."
  • The three-part shape the prior assessment specified (ID source, outbound propagation, log stamping) is now two-thirds present in the repo. Queue/job propagation — the part that matters most for Laravel's worker model — is still absent, and remains the highest-risk piece to build.
  • Laravel-native alternatives still cover this space: Context (Laravel 11+), Log::withContext(), Http::withHeaders() / global HTTP middleware, and job middleware. Nothing here supersedes those; the package's value is as a specification of which headers and which lifetime semantics, not as runtime code.

Integration Feasibility

  • Composer install: the prior constraint-conflict concern is now less certain but not resolved. A 2026-era v0.2.0 with a real changelog and PR references suggests active modernization (possibly wider PHP/Symfony constraints), but this release note gives no compatibility data. Verify before assuming either way — if constraints were widened to Symfony ^6.4 || ^7.x and PHP 8.2+, install conflict risk drops from High to Medium; nothing else in this note supports that inference.
  • Even if installation succeeds, the payoff is zero in Laravel: you install a bundle, register nothing that fires, and hand-write the integration. The composer require buys you a vendored copy of two classes you could copy in five minutes.
  • The "activate by default if present" mechanism is class-existence detection. In a Laravel app both Guzzle and Monolog are always present, so if anyone ever does register the bundle's container config, both integrations switch on silently and unconfigured. That is an install-time footgun, not a feature, in this stack.
  • Licensing unchanged: MIT. Copying the Guzzle middleware and Monolog processor into an internal namespace with attribution is clean and remains the cheapest path.

Technical risk

  • Runtime risk: raised from Low to Low-Medium. The package now injects a handler into the logging stack and middleware into the Guzzle stack. Both are shared, ordered pipelines: a misbehaving processor can drop or reshape log records, and Guzzle middleware ordering relative to retries/redirects affects whether the correlation header survives a retried request. Previously an unused interface could not break anything; that guarantee is gone.
  • Behavioral / default-on risk: new, Medium-High. "By default if present" is an opt-out design for a cross-cutting concern. Silent log-schema mutation (new field appearing in every record) breaks downstream parsers, log-based alerts, and cardinality budgets without a config change anyone reviewed. Pre-1.0 SemVer permits this in a minor bump, which is itself a signal about maintainer posture toward downstream consumers.
  • Supply-chain/governance risk: revised from High to Medium, pending verification. A published v0.2.0 with a changelog and linked PR implies a live maintainer, which materially undercuts the "archived since 2018" objection — the strongest argument in the prior assessment. Confirm: is this the same repository un-archived, a transfer, or a fork adopted by a new owner? A low PR number (#2) against a package with prior release history suggests a reset or a fork, which is a governance question, not a technical one. Re-run composer audit and abandonment checks before quoting the old verdict.
  • Compatibility/correctness risk: unchanged in kind. No evidence in the note about PHP 8.x support, test coverage, or CI. Lifetime semantics of the identifier (per-request vs. per-process vs. per-job) remain undocumented and remain the failure that bites Laravel specifically — a singleton-bound ID leaks across jobs on a long-lived worker.
  • Version-pin risk: 0.2.x carries no stability promise. Every minor bump may flip another default on.

Key questions

  1. Is this the original repository un-archived, a transfer, or a fork? Who is the maintainer of record, and what is their support commitment? (This determines whether the supply-chain objection survives.)
  2. What are the actual composer.json constraints and PHP/Symfony support matrix as of v0.2.0? The note does not say, and this is the single fact that could move the verdict.
  3. Is there a documented opt-out for the new default activation, or is class-presence the only switch? If the latter, has that been raised upstream?
  4. Does the Guzzle middleware propagate on retries and redirects, and does it read an inbound ID or only generate one? Header trust-boundary handling is still unstated.
  5. Has queue/job propagation been added? If not, the Laravel gap is unchanged and the "two-thirds built" framing only applies to HTTP and logs.
  6. Does our dependency policy permit a 0.x package with default-on cross-cutting behavior, independent of the archived question?
  7. Same as before: is this a shared-internal-library candidate rather than a public dependency?

Integration Approach

Stack fit

  • Package fit: still poor. Pattern fit: improved and now concretely actionable. The repository is a usable specification for the two propagation legs we would otherwise design from scratch. Consume it as source material, not as a dependency.
  • Recommended target shape, revised to mirror v0.2.0's structure while staying Laravel-native:
    • CorrelationId middleware: honor inbound X-Request-Id/traceparent from trusted sources only; otherwise generate UUIDv7/ULID; bind scoped; echo on the response.
    • Log stamping: Log::withContext() or a Monolog processor — registered explicitly, never by class-presence detection.
    • Outbound propagation: global Http::withHeaders() or Http::globalMiddleware, explicitly ordered relative to retries.
    • Queue: job middleware to inject into the payload and restore in handle(); this remains ours to build.
  • Deliberate departure from upstream: explicit opt-in configuration, not "if present." A correlation contract that enables itself is a compliance and observability review failure waiting to happen.

Migration path

  1. Do not composer require into application code. If a proof-of-concept is demanded to evaluate the new integrations, isolate it in a throwaway Symfony-shaped sandbox, not the Laravel app — installing it in Laravel tests nothing, because the wiring never runs.
  2. Re-verify constraints and maintenance status first (question 2). If constraints are modern and the project is genuinely active, re-open the adopt decision on its merits rather than inheriting the old verdict.
  3. Copy the Guzzle middleware and Monolog processor (MIT, with attribution) into an internal namespace; replace the class-existence activation with explicit config.
  4. Implement the missing pieces: scoped binding, queue propagation, trust-boundary validation.
  5. Backfill: unchanged — no retroactive correlation; handle at ingestion.

Compatibility

  • PHP/Symfony: unknown as of v0.2.0, previously assumed 7.0/7.1-era. Re-check before quoting any incompatibility claim; the release may have narrowed this gap.
  • Laravel: unchanged — no service provider, no auto-discovery, no config surface. The new defaults will not fire.
  • Octane/Swoole and queue workers: any binding must be scoped. With a Monolog processor now in play, also ensure the processor reads from the scoped instance rather than capturing the ID at construction time, or every record after the first request/job carries a stale ID.
  • Third-party SDKs: the upstream Guzzle activation is class-based, which in a Laravel app would mean every Guzzle client — including SDK clients you don't own — gains the middleware. Another reason to keep activation explicit and scoped to first-party clients.

Sequencing

  1. Before anything: verify maintenance status, owner, constraints, and whether an opt-out exists (questions 1–3). Timebox to one day.
  2. Week 1: Confirm requirement with observability/on-call; pick X-Request-Id vs. W3C traceparent.
  3. Week 1–2: Internal contract + middleware + log processor, config-gated, with contract tests: inbound honored, absent generated, malformed rejected, untrusted stripped, outbound propagated, processor reads scoped instance.
  4. Week 2–3: One service behind a flag; validate a two-service call chain in staging.
  5. Week 3–4: Queue/job propagation; log-schema review with whoever owns dashboards and alerts; cardinality check on the new field.
  6. Later: Publish as an internal Composer package with real versioning. If upstream v0.2.0 proves healthy and we later adopt Symfony anywhere, revisit — but keep the internal package as the source of truth for Laravel.

Operational Impact

Maintenance

  • Package: improved but uncertain. Evidence of active maintenance in v0.2.0, which retires the "abandoned, archived" objection if verified. Against that: 0.x versioning, low PR volume, and a demonstrated willingness to change defaults in a minor release. Budget for reading changelogs before every bump — a tax that an internal 100-LOC equivalent does not levy.
  • Internal pattern: unchanged, ~50–150 LOC, platform-team owned. Now cheaper to write, since two of the components have a reference implementation to adapt.

Support

  • Upstream support status is now a live question rather than a settled no. Confirm there is a maintainer who responds to issues before allowing anyone to file "upstream will fix it" as a mitigation.
  • The default-on design means support load can arrive from outside the adoption: a transitive install, or an unrelated Symfony service, enabling log mutation nobody requested. Verify no one can turn this on without a review.
  • Internal ownership remains strongly preferable: the on-call engineer reading a broken trace can read their own code.

Scaling

  • Runtime cost still negligible: one UUID/ULID per request, one string field per record, a few header bytes per hop.
  • New scaling consideration: a Monolog processor on by default adds a field to every log record estate-wide, including high-volume debug lines. That is a log-index and cardinality cost paid before anyone decided to pay it. Model this before enabling broadly.
  • Guzzle middleware on a high-fan-out service adds per-client overhead only if the middleware does work per request (e.g., ID generation at client level rather than reading the scoped instance) — an easy implementation mistake, worth a code-review checklist item.
  • Correlation IDs still do not bottleneck; uncleared context on long-lived workers still does.

Failure modes

  • Silent default activation → log schema changes and header injection with no config diff in the PR that caused it. New; highest-likelihood near-term failure. Mitigate by pinning exact versions, requiring explicit activation internally, and diffing log payload shape in CI.
  • Double correlation → package-generated ID plus an existing OpenTelemetry traceparent, producing two disagreeing IDs in one record. Decide precedence explicitly.
  • Processor captures a stale ID → Monolog processor instantiated once reads a request-scoped value; all subsequent records mislabelled. Verify processor resolves the scoped instance per record.
  • Guzzle ordering → correlation header lost on retry/redirect, or attached to outbound calls to third parties that shouldn't receive internal identifiers.
  • Missing ID on a hop → orphaned logs; mitigate with generate-if-absent at every ingress plus a contract test.
  • Spoofed inbound header → untrusted clients dictating correlation; strip or namespace at the edge. Still undocumented upstream.
  • Dependency-resolution failure at the next framework upgrade — now less likely if constraints were modernized, but still the most probable first ticket asking why this package is in the tree.
  • Context bleed in Octane/queue workers → scoped bindings and explicit reset in job middleware.

Ramp-up

  • Package comprehension: minutes for the interface, a couple of hours to read the new Guzzle and Monolog integrations and understand when they self-activate.
  • Delivery estimate unchanged: ~2–4 engineer-days for the first service (middleware, processor, tests, dashboards), ~1 day per additional service, plus coordination on trust boundaries and queue semantics. The new release shaves perhaps half a day off the HTTP and log legs and saves nothing on queue propagation.
  • Documentation burden unchanged and still disproportionate: the value depends on every service honoring the same header contract. That is a standards-and-adoption problem, and default-on activation is not a substitute for a documented standard — it is a way to acquire the behavior without the agreement.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast