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

Zipkin Instrumentation Symfony Laravel Package

jcchavezs/zipkin-instrumentation-symfony

A Symfony bundle for Zipkin distributed tracing that instruments HTTP requests and application spans, helping you collect and report timing data to a Zipkin server for performance monitoring and debugging across services.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Framework mismatch remains the headline finding, and 3.1.0 does not touch it. This is a Symfony bundle: a Bundle class, DI extension/compiler passes, kernel event subscribers. That is the layer Laravel does not consume. Laravel uses Symfony components (HttpFoundation, Console, EventDispatcher, Routing), not the Symfony framework (Kernel, Bundle, container compilation).
  • The genuinely reusable asset is the dependency underneath: openzipkin/zipkin-php (tracer, spans, B3/W3C propagation, HTTP reporters) plus the sibling instrumentation libraries (Guzzle middleware, DBAL middleware, PSR-18 wrapper). 3.1.0 confirms the package now tracks zipkin-php 3.0, which is the version we would target if we go native. That is the one piece of genuinely useful news in this release.
  • Net: we would be borrowing the tracer, not the package. The bundle's own code remains a thin wiring layer we would re-implement (~200–400 LOC of service provider + middleware) — and re-implementing it against zipkin-php 3.0 is now lower-risk than re-implementing against the 2.x API the previous assessment assumed.

Integration feasibility

  • Moderate-to-low as a drop-in; moderate as a reference implementation. 3.1.0 changes no integration surface.
  • Mapping work required, per surface (unchanged by this release):
    • kernel.request / kernel.response subscribers → Laravel middleware pair (start span in handle, finish in a terminable middleware or finally).
    • Guzzle instrumentation → Laravel's HTTP client is Guzzle-based; middleware can be pushed via Http::globalMiddleware() or per-client handler stack. Low lift.
    • DBAL instrumentation → only if we use Doctrine; native path is DB::listen() plus a query span, though Laravel's listener lacks pre-query timing so span duration must be measured around the call.
    • Console/command tracing → Artisan CommandStarting / CommandFinished events.
    • Queue jobs → still no equivalent in this bundle. Laravel queue workers need custom JobProcessing/JobProcessed hooks.
  • Compatibility audit narrows but does not clear: 3.1.0 adds PHP 8.0 and 8.1 support, moving the ceiling from PHP 7.x to 8.1. That is still below a PHP 8.2/8.3 target, and the release notes say nothing about Symfony 6/7 or Laravel 10/11. Confirm the actual composer.json constraints before estimating further — the changelog implies Symfony 4.4/5.4-era components.

Technical risk

  • Abandonment risk: medium-high, down from high. A release landed after a multi-year gap, which is better than silence. But the payload is two dependency-and-CI chores, no feature work, no framework modernisation, and no indication of issue triage or a support posture. Single maintainer, zero dependents, no roadmap. Treat the release as evidence the repo is alive, not maintained.
  • Strategic risk: unchanged and high. Zipkin-native instrumentation is a shrinking ecosystem; the industry has consolidated on OpenTelemetry, with Zipkin's durable role being a backend fed by the OTel Collector. Building on a Zipkin-native tracer locks us into a proprietary span API we will likely migrate off. A PHP-version bump does not change that trajectory.
  • Hidden cost: unchanged. The parts we actually need — Laravel queue tracing, Octane-safe request scoping, W3C traceparent interop — are absent from this package and would be net-new work regardless of version.

Key questions

  1. What is our target backend — Zipkin directly, or an OTel Collector fanning out to Zipkin/Tempo/Jaeger? If the latter, this package is the wrong starting point irrespective of 3.1.0.
  2. Do we run Octane/Swoole/RoadRunner? If yes, the bundle's request-scoped service assumptions are unsafe and would leak spans between requests.
  3. Do we already emit W3C traceparent, or only B3? Header coexistence with existing gateway/mesh instrumentation must be settled early.
  4. Which PHP and Laravel versions are in the support matrix for the next 18 months? If the floor is 8.2+, 3.1.0 still does not reach us and a fork is mandatory even to evaluate.
  5. Does 3.1.0's move to zipkin-php 3.0 change the Path C calculus — i.e. can we now hand-roll against a current, supported tracer API rather than the 2.x API?
  6. Are we willing to fork and own the code, or is "no fork" a hard constraint? (If no fork, the answer is still no.)
  7. What sampling rate and RPS ceiling are we designing for? This drives reporter choice (sync HTTP vs. batched/async).

Integration Approach

Stack fit

  • Composer/PHP/PSR-7/PSR-18 layers fit cleanly. The Symfony bundle layer does not.
  • Recommendation stands: do not install the bundle. Evaluate openzipkin/zipkin-php 3.0 directly, or — preferred — OpenTelemetry PHP SDK with the Zipkin exporter, which gives the same wire format plus a migration path to OTLP.
  • Use this package as a reference implementation for span naming conventions and tag/annotation shape, which is where most homegrown tracing quietly goes wrong. 3.1.0 makes that reference marginally more current, since it now exercises zipkin-php 3.0 semantics.

Migration path

  • Path A (recommended): OTel SDK → OTel Collector → Zipkin. Unchanged by this release. Cost: ~1 sprint for a request/middleware + HTTP client spike. Benefit: vendor-neutral, actively maintained, OTel has Laravel/Symfony auto-instrumentation packages we can borrow rather than write.
  • Path B: fork this bundle, port to a Laravel service provider. Cost: ~2 sprints including compatibility fixes for PHP 8.2+/Laravel 10+. 3.1.0 trims this slightly — the PHP 8.0/8.1 and zipkin-php 3.0 work is upstreamed rather than ours to do — but the Symfony-to-Laravel port and the PHP 8.2/8.3 gap remain. Cost includes permanent ownership.
  • Path C: no tracing library; hand-rolled middleware against zipkin-php. Now more viable than before, because 3.1.0 tells us zipkin-php 3.0 is the supported pairing. Still only sensible if we need one or two spans on a single critical path and nothing more.

Compatibility

  • Pin and verify against the actual composer.json, not the changelog: PHP floor/ceiling (expect 7.4–8.1), symfony/* component constraints (expect 4.4/5.4-era), PSR-18 client version, Guzzle version. Expect to relax or override constraints in a fork.
  • Validate against the Symfony component versions Laravel actually ships, not against Symfony 5.x generally — they diverge.

Sequencing

  1. Spike (3–5 days): stand up OTel or zipkin-php 3.0 in one non-critical service; confirm propagation header choice and backend ingestion.
  2. Decision gate: OTel vs. fork vs. defer. Gate criteria: Octane support, queue tracing, header interop, PHP 8.2+ compatibility, maintenance ownership.
  3. Prototype: one request path end-to-end, one outbound HTTP call, one DB query. Measure added p50/p99 latency.
  4. Instrument the second hop (HTTP client) to prove context propagation across services — this is where most rollouts stall.
  5. Queue/job tracing and async reporter, if applicable.
  6. Production rollout with sampling configured per-environment, starting at a low rate.

Operational Impact

Maintenance

  • Path B means we own a fork permanently. 3.1.0 should not be read as the start of a cadence — one chore release after a multi-year gap is not a maintenance commitment. Bus factor remains 1, and we should assume zero upstream help. Realistic ongoing cost: small if untouched, but PHP/Laravel majors will force touch-ups roughly annually, and the package is already one PHP minor behind our target.
  • Path A shifts maintenance to the OTel PHP maintainers and the Collector, both actively staffed.

Support

  • Community-only, single maintainer, no vendor, no SLA, no security disclosure process. Zero dependents means no ecosystem pressure to fix things. 3.1.0 is welcome but should not be treated as an SLA signal — treat any upstream response as best-effort.

Scaling

  • Tracing at high RPS adds a second network dependency on every request. Synchronous HTTP reporting to a Zipkin collector is a tail-latency amplifier; plan for batched/async reporting or a local collector sidecar.
  • Zipkin itself is our burden: storage backend (Elasticsearch/Cassandra/MySQL) capacity planning, retention, index lifecycle — all unmanaged by this package.
  • PHP-FPM per-request model flushes spans at request end — acceptable. Octane/Swoole is the sharp edge: long-lived workers retain tracer state across requests unless explicitly reset, producing cross-request span contamination that is very hard to diagnose later. Nothing in 3.1.0 addresses this.

Failure modes

  • Collector unreachable: must degrade to no-op, never block or fail the request. Verify timeout and fire-and-forget behaviour explicitly in code review.
  • Span loss: silent by design. Instrument the tracer's own error path or we will not know tracing is broken until we need it during an incident.
  • Propagation conflict: B3 vs. W3C headers colliding with existing mesh/gateway instrumentation produces broken traces that look like application bugs.
  • Clock skew across hosts corrupts span ordering in the UI.
  • Unbounded tag cardinality (user IDs, URLs) blows up Zipkin storage.
  • Silent version drift: because nothing depends on this package, a Laravel or PHP upgrade can break it without any dependency resolver warning — the 3.1.0 bump to zipkin-php 3.0 is itself an example of a breaking-capable change arriving with a changelog that reads as "chore."

Ramp-up

  • Developer learning curve is low-to-moderate: Zipkin UI and span model are familiar, but Laravel engineers lack Symfony bundle vocabulary — which is precisely why a direct Laravel provider or the OTel SDK is faster to onboard than a ported bundle.
  • Budget for a one-time internal doc covering span naming, tag conventions, and sampling policy. Without it, tracing quality degrades within weeks of rollout.

Bottom line: 3.1.0 is a maintenance release, not a pivot — it raises the PHP ceiling to 8.1, adopts zipkin-php 3.0, and leaves the framework mismatch, the Octane gap, the queue-tracing gap, and the strategic drift toward OpenTelemetry untouched. The package remains a useful reference, not a dependency. Recommend the OTel-first path; if Zipkin-native semantics are mandatory, scope a fork explicitly against zipkin-php 3.0 with named ownership before committing.

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.
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core