beemlabs/beem-php
beemlabs/beem-php is a PHP client for the Beem Africa API, making it easy to send SMS, manage contacts, and integrate messaging features into your Laravel or PHP applications through a simple, expressive wrapper.
Architecture fit. v0.1.0 is deliberately framework-agnostic, not a Laravel package. It ships the primitives we care about — transactions, spans, exception capture, DSN handling, and a batching HTTP transport with shutdown flush — but no ServiceProvider, facade, publishable config, or auto-discovery. That is a reasonable vendor sequencing decision (one core for Symfony/Laravel/plain PHP), but it means Laravel fit is currently achieved by us, not by the package. The core domain model (transaction → span, exception capture) maps cleanly onto Laravel's request lifecycle and exception handler, so the conceptual fit is good; the ergonomic fit is absent until a Laravel bridge exists.
Integration feasibility. Feasible in a short spike. Expected work: bind the client as a container singleton, add a config file sourced from env (BEEM_DSN), register a middleware to open/close request transactions, and hook ExceptionHandler::report() for exception capture. The shutdown-flush design means we do not need to hand-wire flushing in the happy path, which removes the most common cause of silently dropped telemetry. Effort is measured in days, not weeks, for a competent Laravel engineer — but it is our code to own and maintain.
Technical risk.
0.1.* or a commit hash) and treat upgrades as reviewed changes.Key questions for the vendor.
Stack fit. Standard Composer install into an existing Laravel application. Confirm PHP constraint against our runtime (8.1/8.2/8.3 across services) before committing. No infrastructure dependency beyond outbound HTTPS to the ingest endpoint, which should pass existing egress controls.
Migration path. Greenfield — no incumbent to migrate from within this product. The real migration consideration is coexistence: most services already run Telescope (local) and/or an existing error tracker. Running two exception reporters doubles payloads and creates ambiguity about which system is authoritative. Decide up front: run Beem in a single pilot service alongside the incumbent, with a documented cutover/rollback switch, rather than instrumenting broadly on day one.
Compatibility. The shutdown-flush model behaves differently across our execution contexts and each needs explicit verification:
Sequencing.
acme/laravel-beem). This is the single highest-leverage decision — it isolates 0.x churn and makes a future swap or a first-party Laravel release a one-file change.Maintenance. We own the integration code, so budget a standing allocation for it. Pin the version, watch the upstream changelog, and schedule a review each minor release. Without an adapter layer, each 0.x bump is a potential app-wide change; with one, it is contained.
Support. No stated support tier makes this a "community/best-effort" dependency until a commercial agreement exists. Escalation path for ingest outages is unclear — which matters because an observability SDK can become an incident if it fails loudly in the request path.
Scaling. Two cost vectors: ingest volume (driven by transaction/span cardinality — apply sampling early, not after the bill arrives) and per-process memory for the batch buffer, which scales with worker lifetime. Long-running Horizon/Octane workers need a configured max buffer size and periodic forced flush; set these at rollout, not reactively.
Failure modes to design against.
Ramp-up. Low for day-to-day use — the transaction/span/exception vocabulary is familiar to anyone who has used an APM tool. The genuine ramp-up is convention, not API: what constitutes a transaction, span naming rules, cardinality limits, and which team owns the dashboards. Write a one-page internal standard before the pilot begins, otherwise instrumentation quality will diverge across squads and the data will be hard to compare.
How can I help you explore Laravel packages today?