cboxdk/laravel-telemetry

Collector-free telemetry for Laravel: Prometheus metrics, OTLP traces and events. No C extension, no protobuf, no sidecar — metrics that actually work under FPM.
5,138 3
Install
composer require cboxdk/laravel-telemetry
Latest Version:v2.2.1
PHP:^8.3|^8.4|^8.5
License:MIT
Last Updated:Sep 16, 2026
Links: GitHub  ·  Packagist
Maintainer: cboxdk

Telemetry for Laravel

Latest Version on Packagist Tests PHPStan Total Downloads

Collector-free telemetry for Laravel: Prometheus metrics, OTLP traces and events. No C extension, no protobuf, no sidecar — metrics that actually work under FPM.

Telemetry::counter('orders.created')->inc();
Telemetry::gauge('queue.depth', fn () => Queue::size());
Telemetry::histogram('checkout.duration', unit: 'ms')->record($ms);

Telemetry::span('import.customers', function () {
    // traced work — exceptions recorded, duration measured
});

Telemetry::event('autoscale.decision', ['workers' => 7]);

Why

PHP is shared-nothing: in-process metric state dies with the request, which is why the official OTel SDK's metrics don't work under FPM without a collector. This package aggregates metrics in Redis (or APCu) instead — web workers, queue workers and nodes all write to the same series. Prometheus scrapes a route; traces and events go straight to any OTLP backend as spec-stable HTTP JSON.

  • ✅ Pure Composer package — deploys anywhere Laravel runs
  • ✅ Prometheus scrape endpoint(s), closed by default outside local/testing (IP allowlist or bearer token — same convention as Horizon/Telescope), with metric filters
  • ✅ Real OTLP (/v1/traces, /v1/metrics, /v1/logs) without the SDK
  • telemetry log channel: Laravel logs become trace-correlated OTLP log records (severity-mapped, feedback-loop safe)
  • ✅ Auto-instrumentation: requests, queue jobs (full W3C trace propagation into workers), DB queries, commands — plus Http::withTraceparent() for outbound calls
  • ✅ Auto-detects Horizon, Reverb and Pennant when installed — supervisor state/long-wait detection, WebSocket message/channel metrics, and feature-flag check counters, no extra config
  • Telemetry::fake() with assertions for counters, gauges, histograms, spans and events
  • ✅ Provider contract so packages publish telemetry without coupling
  • ✅ Host CPU/memory/load via cboxdk/system-metrics — just install it
  • ✅ Zero cost when disabled; telemetry never throws into your app
  • ✅ Resource attribution: peak memory + CPU per request/job/task, per-span CPU & memory deltas, real RSS via cboxdk/system-metrics
  • ✅ Ships 13 Grafana dashboards (telemetry:dashboards) — an APM-style suite (requests, jobs, queries, cache, exceptions, system, users …) — service-scoped, LGTM-ready
  • ✅ Opt-in web analytics: a shared cookieless session.id, unsampled page_view events, and built-in geo + User-Agent enrichment (default off)
  • ✅ Browser/RUM tracing: a zero-build @telemetryBrowser snippet ingests frontend spans and track() events into the same trace as the backend, plus token-gated source-map upload for symbolicated JS stack traces
  • ✅ Error tracking flow: the trace id ties Sentry/Flare issues, support cases and the trace waterfall together automatically
  • ✅ Optional native depth via cboxdk/telemetry-native — CPU profiles with a confidence figure, exact pdo.connect/curl.exec timing, and a crash record correlated to the trace the process died in
  • ✅ AI-ready: ships Laravel Boost guidelines, llms.txt and an agent guide — your AI assistant follows the conventions out of the box

Installation

composer require cboxdk/laravel-telemetry
TELEMETRY_STORE=redis            # redis | apcu | array
TELEMETRY_EXPORTERS=otlp         # optional; Prometheus endpoint is on by default
TELEMETRY_OTLP_ENDPOINT=https://otlp.example.com:4318

Scrape GET /telemetry/metrics, and for OTLP metrics schedule the flush:

Schedule::command('telemetry:flush')->everyMinute()->onOneServer();

Documentation

Full documentation lives in docs/:

Publishing telemetry from your package

if (class_exists(\Cbox\Telemetry\Facades\Telemetry::class)) {
    Telemetry::provider(new QueueMetricsProvider);
}

Telemetry never knows about your package — your package publishes telemetry if telemetry exists. See providers.

Development

composer check   # pint --test, phpstan (level 8), pest

License

MIT. See LICENSE.md.

Related Packages

cboxdk/laravel-telemetry-ui

Laravel-native observability UI for cboxdk/laravel-telemetry: query Tempo, Loki...

188 2
fogeto/laravel-server-orchestrator

Laravel Prometheus monitoring package for multi-project server orchestration. Co...

2,731 2
robbiekibler/laravel-posthog-logs

Send Laravel logs to PostHog using OpenTelemetry OTLP format

448 0
smartness/traceflow-laravel

Production-ready distributed tracing SDK for Laravel with event-sourced architec...

2,725 0