apirelio/symfony
Apirelio Symfony SDK links API errors, latency, and releases to affected customers without capturing request or response payloads. It records normalized endpoint metrics and customer context with fail-safe delivery, excluding credentials, cookies, query strings, IPs, and personal data. Supports PHP...
Assessment basis: Repository has 0 stars, 0 dependents, and a README/changelog that is unusually detailed for an unadopted package. Docs are internally inconsistent — README specifies composer require apirelio/symfony:^0.2 while a release/v1.0.0.md exists, the description claims PHP 8.2–8.4 but the 1.0.0 note claims 8.2–8.5, and a prior "PM assessment" in the repo talks about Laravel rather than Symfony. Treat all compatibility claims as unverified until checked against the actual composer.json and CI config.
Architecture fit: This is a Symfony bundle wrapping apirelio/php-core — a thin integration layer, not a framework. Architecturally it is a request-boundary observer: a subscriber records normalized route templates, status/latency, release, and customer/application identity, then hands events to a transport. That is a low-coupling shape (no models, no migrations, no schema changes, no auth interception). The design intent — attribute errors and latency to affected customers rather than to endpoints alone — fits B2B/multi-tenant APIs where "which accounts are impacted by this release regression" is a support and CS question, not just an SRE one. Where it does not fit: consumer-facing APIs with no tenant identity, or teams that already have customer-attributed observability in their APM.
Integration feasibility: Composer-installable, one bundle registration, env-var config, two required resolver implementations. The real work is not installation — it is identity plumbing. The README's example resolver reads $request->attributes->get('api_client'), meaning the application must already resolve a tenant/client on every tracked request and expose it as a request attribute. If your auth layer resolves identity lazily, in middleware order after the subscriber, or only for some endpoints, attribution will silently be null and the product's core value disappears. Budget for that wiring, not for composer require.
Technical risk:
apirelio.com plus a project API key. Zero dependents and zero stars means no evidence of production usage, no community fallback, and unknown maintainer continuity. If the vendor disappears, the SDK becomes dead weight and the dashboards vanish.user-agent. Customer name + plan is customer-identifiable data leaving your boundary — that is a DPA / privacy-review question, not a packaging detail.error.code by default. The code path reads the body even if only the code is transmitted. Confirm this with security before repeating "we capture no payloads" to a customer or auditor.^0.2 while a 1.0.0 note exists is a documentation defect that will confuse dependency review and pinning.Key questions: Which version is actually current and what is the supported constraint (^0.2 or ^1.0)? Is PHP 8.5 and Symfony 8 in CI, or only declared? Who maintains apirelio/php-core, and is it versioned in lockstep? What are the commercial terms, retention period, data residency, and subprocessor list for the SaaS? Is there a DPA? What happens to buffered/queued events if the endpoint is unreachable for hours — bounded queue or unbounded growth? Does the SDK emit any self-telemetry (delivery failures, dropped events) that we can alert on? Is there a documented upgrade guide from 0.1 → 0.2 → 1.0, given the rebrand and the tracium → apirelio config rename?
Stack fit: Symfony 6.4/7.x with PHP 8.2+ is the sweet spot; Symfony 8 requires PHP 8.4, so the Symfony-8 upgrade and the adoption can be sequenced independently. No database, cache, or filesystem dependency beyond an optional local NDJSON buffer. It coexists with existing APM/tracing — it is additive, not a replacement, and should be scoped as customer-attribution rather than infrastructure monitoring to avoid a tooling turf war.
Migration path: There is no incumbent to migrate from — this is net-new instrumentation. The real migration is the 0.x → 1.0 story and the internal one: any bespoke "which customers are erroring" spreadsheet or log-grep process gets retired only after the dashboard is trusted. Plan a two-sprint overlap where both exist.
Compatibility: Verify three things explicitly before committing: (1) the actual composer.json constraints versus the README, (2) that your Symfony minor is inside the tested matrix rather than merely inside the declared range, (3) that apirelio/php-core resolves cleanly alongside your existing HTTP-client and Messenger versions. Messenger transport config is shared surface — a messenger.yaml routing entry for BufferApirelioEvents touches a file other teams also edit.
Sequencing:
sync transport, paths: [/api/*] — confirm events arrive and route templates normalize as expected (/api/invoices/{invoice}). Sync is for diagnostics only; it adds up to ~2s to a request on a slow vendor call.CustomerResolver and ApplicationResolver against your real tenant model, and instrument resolver-miss rate — this is your attribution coverage metric. If coverage is below ~95% on tracked paths, the dashboards will lie.metadata_keys survive; unlisted keys and non-scalars are discarded. Publish the list — this is your privacy control surface and it should be reviewed, not discovered per-controller.messenger transport in production, with the SDK message routed to an async transport and a worker running under your existing supervision. Confirm retry and failure-transport policy applies to this message type.APIRELIO_RELEASE from the build) so release-regression attribution works — this is the feature that justifies the purchase and it is worthless if the value is hand-maintained.Avoid file_buffer unless you have a scheduled apirelio:flush; a low-traffic service will sit on a partial batch indefinitely and you will report stale data without knowing it.
Maintenance: Low code surface — no migrations, no schema, no runtime patching. The maintenance burden is version-pinning discipline across three packages (apirelio/symfony, apirelio/php-core, and Symfony/Messenger) and keeping the resolvers in sync with any tenant-model change. Every change to how identity is resolved is now an analytics-correctness change; assign that ownership explicitly or the resolvers will rot.
Support: No SLA, no commercial support contact, no named maintainer evident from the repo, and no issue-tracker activity to point at. The MIT license covers the SDK only — the service it talks to is a commercial dependency with unknown terms. That asymmetry (open-source client, proprietary backend) is the least defensible part of the package from a procurement standpoint and needs a contract review, not just a code review.
Scaling: Normalized route templates keep series cardinality bounded — the right call, and it means cost scales with distinct routes × customers, not with request volume. Request-path cost is near zero under messenger (dispatch is local). The scaling pressure lands on the Messenger worker: batch_size: 500, flush_interval_seconds: 10, timeout_seconds: 2, connect_timeout_seconds: 0.5 are the dials. Size throughput as (tracked requests/sec ÷ batch size) and confirm the worker's retry policy does not amplify ingestion outages into a retry storm. capture_headers should stay a short allow-list; the default already includes user-agent, which is a fingerprinting-adjacent field worth a second look.
Failure modes:
paths → either noise or total silence; validate by asserting a known route appears in the dashboard after deploy.file_buffer without apirelio:flush scheduled → persistent under-reporting.Ramp-up: Roughly a day for a competent Symfony engineer to install, configure, and see events; the schedule risk sits entirely in resolver correctness and in whatever privacy/legal review the customer-identity egress triggers. Plan for one engineer-day of build plus a variable vendor-review lead time. Nobody on the team has prior exposure to this package, so the first production incident involving it will be debugged from source, not from runbooks — write a two-paragraph runbook during the integration spike, while the context is fresh.
How can I help you explore Laravel packages today?