jcchavezs/zipkin-symfony
Zipkin integration for Symfony apps that adds distributed tracing to HTTP requests and other components, helping you collect and report spans to a Zipkin server for latency analysis and service dependency visibility.
Architecture fit — still poor to conditional; unchanged by 3.1.0. The package remains a Symfony bundle, not a Laravel package. Laravel does not consume Symfony bundles via bundle registration; it uses its own service providers and a bespoke Illuminate\Foundation\Http\Kernel. The bundle's value is concentrated in its DI extension plus listeners on Symfony's kernel.request/kernel.response events and its Doctrine/HTTP-client instrumentation. Those extension points do not exist in a Laravel request lifecycle without re-implementing the wiring as a service provider and middleware. Laravel does sit on Symfony components (HttpFoundation, Console, Routing, EventDispatcher), so the underlying Request/Response objects are compatible — the plumbing around them is not. 3.1.0 adds no Laravel service provider, no Laravel middleware, and no Laravel-specific event hooks.
Integration feasibility — low as-is, moderate as a fork. Still four seams: inbound request span, outbound HTTP client span with B3 header propagation, DB query spans, and queue job spans. The inbound/outbound seams are portable (Laravel middleware and Guzzle middleware, since Http:: wraps Guzzle). The DB and queue seams in a Symfony bundle target Doctrine DBAL and Symfony Messenger, not Eloquent and Laravel Queues — those remain net-new work and are untouched by this release.
Technical risk — high, with one input materially improved. Signals in aggregate: 27 stars, zero dependents, single-maintainer project. Zero dependents remains the loudest signal — essentially no production usage to surface bugs, and no downstream pressure to fix them. Two distinct risks compound:
composer require hard-conflict before any code runs" check is now a real question rather than a near-certainty. But it caps at PHP 8.1, while Laravel 11 requires PHP 8.2+ and Laravel 10 ships Symfony 6.2/6.3. The release notes say nothing about symfony/* constraints, and nothing suggests Symfony 6.x or 7.x support. Verify composer.json constraints first — this remains a five-minute check that may end the evaluation, just with a slightly better prior than before.What 3.1.0 tells us about the project itself. The release is scoped entirely as chore: — PHP version matrix and a tracer version bump. No features, no bug fixes, no Laravel or Symfony 6 work, no CI/security hardening mentioned. It is the minimum viable release to keep the package installable, published after a ~3.5-year gap by a single maintainer. Treat it as evidence the project is alive, not evidence it is maintained.
Key questions for the maintainer/owner (revised):
symfony/* constraints does composer.json declare, and does it install cleanly against our Laravel version? PHP ≤8.1 alone rules out Laravel 11.openzipkin/zipkin-php 3.0, the current major of that library. Still open: does that library currently receive security patches, and who is its maintainer?Stack fit. Low for this package specifically; high for the capability. Laravel's HTTP client (Guzzle), event dispatcher, queue events, and middleware pipeline are all adequate instrumentation seams. 3.1.0 does not alter this — it modernizes the PHP floor of a Symfony bundle, it does not make the bundle a Laravel citizen.
Recommended path — do not adopt this package. Use open-telemetry/opentelemetry-php with its Laravel auto-instrumentation, and export to an OpenTelemetry Collector configured with a Zipkin exporter. This preserves any existing Zipkin UI/backend investment while putting the instrumentation on a vendor-neutral, actively maintained foundation. It also makes a later backend swap (Tempo, Jaeger, a SaaS APM) a Collector config change rather than a code change. The OTel path also runs on PHP 8.2/8.3 and Laravel 11 today, which 3.1.0 does not.
Migration path, if the package is mandated. Fork it, strip the bundle DI extension, and re-expose the tracer as a Laravel service provider with:
DB::listen() for query spans,JobProcessing/JobProcessed event hooks to carry context across async boundaries.Budget this as a real engineering task, not an integration — you are now the maintainer. 3.1.0 slightly reduces the fork's starting cost (current zipkin-php 3.0 API rather than a 2021-era one), but does not change its scope.
Compatibility notes. Outbound propagation requires B3 headers on every downstream call; without it, traces terminate at the service boundary and the value collapses. Confirm the tracer honors PSR-18/PSR-7 so it composes with Guzzle without version pinning fights. With Zipkin PHP 3.0 confirmed, the remaining compatibility unknown is entirely the Symfony constraints and whether PHP 8.1 is acceptable to us — it is not, for Laravel 11.
Sequencing.
(Re-run step 1 before step 4; 3.1.0 is worth one direct question to the maintainer about Symfony 6/7 intent, but not worth stalling the OTel path.)
Maintenance. Still effectively unmaintained in any way we can rely on: one maintainer, zero dependents, and a single chore:-scoped release after a ~3.5-year gap. 3.1.0 is a positive data point — it shows the maintainer responds to ecosystem breakage — but one patch release does not establish a cadence, a deprecation policy, or an SLA. Any fork becomes permanent internal ownership: dependency upgrades, PHP version bumps, and framework compatibility all land on your team. Price that in honestly; it is a recurring cost, not a one-time integration.
Support. Community-only, and the community is essentially absent. There is no vendor, no active issue triage, and no realistic path to an upstream fix. Internal documentation will be the only documentation. The 3.1.0 release does not change the support posture — a maintainer who ships once every few years is not a support channel.
Scaling. Two costs dominate. First, sampling: uninstrumented tracing at 100% sample rate will overwhelm Zipkin storage quickly — sampling policy must be set deliberately and reviewed as traffic grows. Second, reporter behavior: a synchronous HTTP reporter at request teardown adds tail latency proportional to collector reachability. The standard mitigation is a local agent (Collector or Zipkin sidecar) so the PHP process never talks to the collector across the network directly. Neither is addressed by 3.1.0.
Failure modes to design for:
Ramp-up. The concepts (spans, trace context, B3 propagation, sampling) are learnable in a day; the operational discipline is not. Expect the team to need a Zipkin-literate owner. Given the zero-dependency-count package, that knowledge will be entirely self-generated — the 3.1.0 release notes are two bullet points and provide no onboarding value.
TPM recommendation. Opportunity score 2.65 remains directionally correct; do not adopt. 3.1.0 improves the package's installability on older stacks and confirms the underlying zipkin-php dependency is on its current major — both good, neither decision-changing. It does not add Laravel support, does not raise the PHP ceiling to 8.2+, does not address Symfony 6/7, and does not create a maintenance cadence. Treat this package as evidence that a prior team evaluated tracing and stopped, and use the moment to standardize on OpenTelemetry + Collector with a Zipkin exporter — same visible outcome, materially lower lifecycle risk. Re-review only if the maintainer publishes a roadmap toward Symfony 6/7 and PHP 8.2+.
How can I help you explore Laravel packages today?