thomask/druid-bundle
A Symfony bundle that integrates Apache Druid analytics into PHP applications. It registers Druid client services and configuration in the Symfony container, letting you run SQL and native Druid queries directly from your services with minimal setup.
Architecture fit
The first thing a TPM must flag: this is not a Laravel package. thomask/druid-bundle is a Symfony bundle (TmkDruidBundle), built for the Symfony 2.x bundle/DI-container model — DependencyInjection/, Resources/config/services.yml, TmkDruidBundle.php convention. It will not autodiscover or service-provide into a Laravel application without a hand-written wrapper. If the assumption behind this evaluation is "drop into a Laravel codebase," the architecture fit is zero without adaptation, and moderate only if the target is a legacy Symfony 2.8/3.x service.
Functionally, the package is a thin client around Apache Druid's HTTP query API (broker endpoint, JSON native queries) plus some console-command scaffolding for Druid-related operations. That is inherently a small amount of logic: build a JSON query body, POST it, decode the response. The architectural surface is narrow, which is the one point in its favour — nothing here is deeply entangled with application domain code.
Integration feasibility
Feasible only in one of two shapes:
AppKernel, and configured with a broker host/port. Low effort, but pins you to an EOL framework.Either way, expect to write the Druid query DSL yourself; the bundle predates most of Druid's current SQL layer and later native query features.
Technical risk
High, and concentrated in provenance rather than complexity:
query/sql, newer ingestion specs, security/auth layers added in later versions) has moved substantially; the bundle's request shapes are unlikely to cover authentication, TLS, or modern broker routing.Key questions
Stack fit
Poor as-is. The bundle assumes Symfony's kernel, DI container, and config tree. In Laravel you would keep the bundle out of composer.json entirely and instead vendor the ~3 classes that matter (query builder / client / response decoder) into app/Services/Druid/, exposed through a DruidServiceProvider and a config/druid.php. In a modern Symfony app, the same treatment applies but with a first-party bundle or a plain service — a Symfony 2 bundle is not the right unit for Symfony 6/7.
Migration path
Recommended sequence:
DruidClient::query(array $nativeQuery): array) so the transport is swappable.Compatibility
Composer resolution is the likely first blocker: the bundle's constraints will conflict with modern symfony/*, guzzlehttp/guzzle, and PSR standards. PHP 8 typed properties and return types are not present, so static analysis will be noisy. If you must include it, plan on replace/inline aliasing or a maintained fork under your own vendor namespace.
Sequencing
Land the internal Druid client interface before any dashboard or analytics feature depends on it. Analytics consumers should never see Druid's JSON shapes directly; put a typed query object in between.
Maintenance
Effectively 100% internal ownership from day one. There is no upstream to patch, no release cadence, no maintainer response. Budget a small but permanent maintenance line: dependency bumps on the fork, Druid API compatibility checks on every Druid upgrade, and PHP version migrations. The consolation is that the code volume you actually depend on is small enough that "maintenance" means rewriting a few hundred lines every couple of years rather than nursing a framework.
Support
No vendor, no community, no documentation beyond the README and the source. On-call engineers will be reading PHP to understand query failures. Mitigate by writing the runbook and the query examples yourself as part of integration — do not defer this.
Scaling
The package is not the scaling bottleneck; the Druid cluster is. The client is stateless HTTP, so horizontal scaling of the PHP tier is straightforward provided you replace the bundle's default client with one that has connection reuse, sane timeouts, and circuit-breaking. Risks to watch:
SELECT *-style native queries that pull millions of rows into PHP memory. Enforce row limits and thresholds at the client layer.Failure modes
composer.json.Ramp-up
Low for anyone comfortable with HTTP clients and Druid's native query JSON; the bundle's concepts are not deep. Expect half a day to understand what the package does — it is small — and two to four days for an engineer to produce a production-grade replacement client with tests, retries, and observability. The harder ramp is Druid itself: datasource modelling, granularity, and query tuning are where the real learning cost sits, and this package teaches none of it.
Bottom line for the TPM: treat thomask/druid-bundle as reference material, not a dependency. The zero score, zero dependents, and Symfony 2-era provenance make it unsuitable for a Laravel or modern PHP product. The functional gap it fills is small enough that a maintained in-house client is cheaper than the ownership risk of adopting it.
How can I help you explore Laravel packages today?