presta/datadog-bundle
Symfony bundle for Datadog integration: send StatsD metrics and APM traces from your app with minimal configuration, plus helpers for timing code and tracking custom events. A lightweight way to add Datadog monitoring to existing Symfony projects.
Verdict up front: revised. v2.0.0 materially changes the maintenance picture and corrects two factual errors in the previous assessment. The package is not abandoned: it ships a disciplined release with a changelog, a CI matrix across PHP 8.1/8.2/8.5 and Symfony 6.4/7.4, and PHPStan at level max with an empty baseline. The previous assessment was written against an empty data payload and inferred abandonment from a stale timestamp; that inference was wrong and should be retracted. The core conclusion for our codebase still holds, but for a narrower reason: this is a well-maintained Symfony bundle, and we are a Laravel shop. The blocker is stack fit, not health.
Architecture fit. Unchanged and decisive. Symfony bundles register through config/bundles.php, the Symfony DI container, and config-tree extension classes (PrestaDatadogExtension). Laravel has no equivalent extension point, so a Laravel application cannot consume the bundle's intended surface. The functional payload remains a small Monolog handler that posts records to Datadog's HTTP log intake, wired via DI — roughly 50–100 lines of real logic plus convention. v2.0.0 does not change this; it modernizes the Symfony-side plumbing (Symfony 7.x/7.4 LTS, PHP 8.5, TokenStorageInterface in place of the removed Security class, Extension in place of ConfigurableExtension). All of that is Symfony-internal and irrelevant to a Laravel consumer — which is itself the point.
Integration feasibility. Two paths remain, but the risk weighting has shifted:
monolog/monolog plus symfony/http-foundation are now explicit rather than transitive. For a Laravel codebase, still zero.security.token_storage, which is a concrete signal about what it does with request state. That is a net gain in reviewability.Technical risk. Re-rated:
max with an empty baseline are strong quality signals. Residual risk is bus factor, not neglect: this still reads as a small-team or single-maintainer project with no commercial support contract.monolog/monolog and symfony/http-foundation constraints, Monolog 3 across both majors, and Symfony ^6.4|^7.0 are exactly the declarations we would want. The v1→v2 break is a clean, well-communicated major, not a silent one.Security → TokenStorageInterface swap strongly implies the handler reads the current security token to enrich log context (user identity, roles, possibly token attributes) before shipping it to a third-party intake. That is a direct path for user identifiers or session-derived data to leave the estate. Read the handler and the default config before anything else; confirm whether context is scrubbed, whitelisted, or forwarded wholesale.DatadogHandler manually or redefine its service, in which case a TokenStorageInterface must be supplied. Internal for default-config users.Key questions before any code is written.
CurlHandler/HttpHandler pointed at http-intake.logs.datadoghq.com? If not, the package's value is configuration ergonomics on Symfony, not transport.TokenStorageInterface, and is that data scrubbed, whitelisted, or forwarded? This is the gate question.service/ddsource/ddtags/env conventions does it encode, and do they match our taxonomy?TokenStorageInterface coupling need to be stripped, and what replaces it in Laravel (Auth::user() behind a guard, or nothing)?Stack fit. Unchanged for Laravel: treat the package as a reference implementation, not a dependency. For Symfony services the calculus has flipped — as of v2.0.0 this is a reasonable dependency to take, with the caveat that it is small-team maintained and should be pinned with a documented upgrade cadence. Either way, the transport decision dominates the wrapper decision: Datadog's own guidance favors a local Agent or sidecar consuming structured JSON from stdout, which gives buffering, retries, and disk-backed queuing without coupling application code to the vendor.
Migration path. For our Laravel services, unchanged: emit structured JSON via JsonFormatter to stdout or a file channel → ship with the Datadog Agent or Fluent Bit → retain a single outbound-HTTP handler as a documented fallback for hosts where the Agent cannot run. If the Agent is not viable, vendor the handler into app/Logging/ with an attribution header, wire it through a custom channel in config/logging.php, and delete the Composer dependency. v2.0.0 makes the vendoring step easier — the code is now covered by PHPStan at max and a real CI matrix, so the source is more trustworthy to copy than it was.
Compatibility. Verify against the target repo: PHP floor (8.1 works for Symfony 6.4; 8.2+ for Symfony 7), Symfony ^6.4|^7.0, Monolog 3, symfony/monolog-bundle ^3.8. For the vendored path, check whether the handler pulls in Symfony contracts (TokenStorageInterface, HttpClient, EventDispatcher); the token-storage coupling must be replaced or stubbed before the class is usable outside Symfony.
Sequencing.
^2.0 and calendar a re-review at the Symfony 7.4 LTS end-of-support date.Maintenance. Under the adopt path on Symfony, upstream is alive and the upgrade burden is now the normal kind (majors with changelogs) rather than the "we own it forever" kind — a real improvement. Under the Laravel path, we still own a handful of lines, which is strictly better than a dependency we cannot use at all. Do not over-read the release: one good release does not prove a support contract.
Support. Still no commercial channel — GitHub issues only, small-team responsiveness, no SLA. That is acceptable for a logging convenience wrapper and unacceptable for anything on the critical path without a fallback sink. Budget on-call expectations accordingly.
Scaling. Unchanged. A synchronous per-record handler scales linearly in latency with log volume and competes with request handling for connections and event-loop time. At sustained high volume this is the dominant failure mode; the Agent-based path with disk buffering is what to design for from day one.
Failure modes to instrument.
Mitigations: internal metric on handler failure, alert when ingest volume drops below a floor, a permanent local file channel as last-resort sink, and a payload assertion for PII on the token-storage path.
Ramp-up. Learning the package remains hours. The real ramp is the operational context: Datadog intake endpoints and reserved attributes (service, ddsource, ddtags, host), log parsing and facet definition, the Agent/sidecar deployment model, and — new for this release — the security-model review of what token data the handler emits. Spend the effort there; the bundle itself is not the work.
How can I help you explore Laravel packages today?