m6web/statsd-prometheus-bundle
Symfony bundle that bridges StatsD metrics to Prometheus: it collects counters, gauges and timings via the m6web/statsd library and exposes them in Prometheus exposition format for scraping, typically through a /metrics endpoint.
Architecture fit — poor as a drop-in, viable as a pattern. Unchanged by v8.0.2. The first thing to flag: despite being filed as a Laravel/PHP package, m6web/statsd-prometheus-bundle (repo: BedrockStreaming/StatsdTagsPrometheusBundle) is a Symfony bundle, not a Laravel package. It integrates via Symfony's Bundle registration, Configuration tree, and DI extension — none of which Laravel consumes. Laravel uses Symfony components internally but has its own container, service providers, and config publishing. There is no composer require path from this repo to a working Laravel integration.
The v8.0.2 release does not change this. It is a dependency-constraint widening only — no new features, no new public API, no Laravel affordances, no breaking changes:
symfony/contract allowed at 3.*psr/container allowed at 2.*Both are the kind of maintenance PR a dormant repo occasionally absorbs. They reduce one specific integration risk (container-interface collisions) and reduce nothing else. The bundle framing, the Symfony-only entry point, and the absence of a Laravel service provider all stand.
What the package actually does is narrower and more portable than the bundle framing suggests: it emits StatsD metrics in DataDog's tagged wire format and is designed to sit in front of prometheus/statsd_exporter, which translates those tagged StatsD lines into Prometheus series. That core — a statsd client plus a tag formatter — is the only piece worth evaluating for a Laravel stack.
Integration feasibility — moderate, with rework. Marginally improved. A viable path exists, but it is a port, not an install:
statsd_exporter's dogstatsd_tags/datadog parser config — this remains the single highest-risk unknown and needs to be confirmed empirically, not from docs.What v8.0.2 changes here is narrow but real: psr/container 2.* is what Laravel 10/11 pin, and symfony/contract 3.* removes one common composer why-not collision if we vendor or fork the emitter. It does not create a dependency path — we still cannot install the bundle into Laravel — but it lowers the friction of the copy/fork route in option (a)/(b) below. Estimate remains 1–2 days for a POC and 1–2 weeks for a hardened wrapper with config, testing, and failure handling.
Technical risk — high, concentrated in project health; slightly softened but not resolved. Signals are still weak across the board:
symfony/contract 3.* does not by itself prove Symfony 7 or PHP 8.3 compatibility of the bundle's own code.The functional risk is separate and more manageable: StatsD over UDP is fire-and-forget, so metric loss is silent by design. That is a property of the protocol, not this package, but it means correctness depends on the exporter and alerting layer, not the client.
Key questions to resolve before committing:
dogstatsd-dialect tags (key:value comma-separated) that match our statsd_exporter mapping version, or does it require a specific exporter config?prometheus/client_php, a community spatie/laravel-prometheus-style package, Laravel Pulse, or OpenTelemetry PHP — that covers the same ground with active maintenance?Stack fit — narrow. Useful only if the target architecture is explicitly StatsD → statsd_exporter → Prometheus, and you need tagged metrics from PHP. If the observability stack is OpenTelemetry-first or uses Prometheus's own client_php push/pull model, this package is off-pattern and should be skipped. Unchanged by v8.0.2.
Migration path. Two distinct scenarios:
psr/container 2 / contracts 3 combination viable, which helps here.Compatibility. Verify explicitly:
composer why-not early. v8.0.2 removes the psr/container 2 and symfony/contract 3 blockers; other transitive constraints (event-dispatcher, http-kernel, config) are still in play and are the likely next collision.statsd_exporter version and its dialect config; the tag parser has changed historically.Sequencing.
statsd_exporter, send a hand-crafted tagged StatsD line, confirm it lands as the expected Prometheus series. This de-risks ~60% of the integration in an afternoon.Maintenance — we own it. With 0 dependents and a maintenance cadence limited to dependency bumps, assume upstream does the minimum. Budget for a vendored fork or copied logic, a quarterly dependency review, and a named owner. The v8.0.2 release is a data point that someone still merges PRs — treat it as low-grade reassurance, not as a support commitment. This remains the dominant lifecycle cost and should be priced in as ongoing, not one-time.
Support. No vendor, no SLA, no security advisory channel, no published support matrix. Internal Slack channel and one engineer's familiarity is the realistic support model. That is acceptable for a thin metric emitter; unacceptable if it becomes load-bearing for SLO reporting without a fallback.
Scaling. Three pressure points:
statsd_exporter aggregates and is the correct place to absorb cardinality and rate, but it is now a required piece of infrastructure with its own HA story.Failure modes to design for:
psr/container/contracts collision, other transitive Symfony constraints can still break on a Laravel upgrade without warning.Ramp-up. Low for a competent PHP engineer — the API is a handful of methods. The real learning curve is on the Prometheus side: tag-to-label mapping, histogram buckets, and cardinality hygiene. Plan for half a day of onboarding for the emitter and a day for the observability model.
Recommendation — unchanged. Do not adopt this package as a dependency. Reuse its tag-format approach, adopt the underlying statsd client directly, or select a maintained alternative, and own a small in-house emitter. v8.0.2 is a constraint bump: it makes the fork path marginally cleaner and slightly weakens the "abandoned" objection, but it adds no Laravel support, no functional capability, and no support guarantee. The functional need is legitimate; this artifact is still not the lowest-risk way to meet it.
How can I help you explore Laravel packages today?