Installation
Installation
composer require cboxdk/laravel-telemetry-ui
Requires PHP 8.3+ and Laravel 12 or 13. There is no Node toolchain to run: the dashboard's assets ship prebuilt in the package.
The package auto-registers. Point it at your backends:
TELEMETRY_UI_METRICS_URL=http://prometheus:9090
TELEMETRY_UI_TEMPO_URL=http://tempo:3200
TELEMETRY_UI_LOKI_URL=http://loki:3100
Using Mimir instead of vanilla Prometheus:
TELEMETRY_UI_METRICS_DRIVER=mimir
TELEMETRY_UI_METRICS_URL=http://mimir:8080
TELEMETRY_UI_METRICS_TENANT=team-apps # X-Scope-OrgID
Visit /telemetry-ui. The dashboard is a prebuilt React app served by the
package itself from public/build — no publishing, no Node, no npm step. It
reads everything from the package's JSON API under /telemetry-ui/api/v2.
Confirm the config actually reaches every backend:
php artisan telemetry-ui:check
It probes each configured connection and reports OK / FAIL, exiting
non-zero on failure — handy as a post-deploy healthcheck.
Authorization
Access is controlled by the viewTelemetryUi gate. Out of the box it only
allows the local environment. Open it up in a service provider:
Gate::define('viewTelemetryUi', fn (User $user): bool => $user->isDeveloper());
What to open first
- Overview (
/telemetry-ui) — the dashboard panels. - Explore (
/telemetry-ui/explore/requests) — filter by any attribute, group by any key. See dimensions & Explore. - ⌘K — the command palette: jump to any page or entity list, switch
service/environment, paste a trace id, or type
key=valueto filter Explore.
To make your own attributes first-class (a customer id, a tenant), declare them as dimensions in a service provider:
TelemetryUi::dimension('app.customer_id', label: 'Customer', link: fn ($id) => route('customers.show', $id));
Publishing the config
php artisan vendor:publish --tag=telemetry-ui-config
See connections for the full config reference, including multiple named connections and per-connection headers.
Tuning
Sensible defaults ship for all of these; override via env when needed:
| Env var | Default | What it does |
|---|---|---|
TELEMETRY_UI_CACHE_TTL |
5 |
Seconds to cache backend GET responses, so a busy dashboard doesn't hammer the backends. 0 disables. |
TELEMETRY_UI_RETRIES |
2 |
Retries for transient connection blips. |
TELEMETRY_UI_THROTTLE |
600,1 |
Rate limit for the dashboard and API routes (maxAttempts,decayMinutes). The SPA sends one request per panel, so budget per request. Set empty to disable. |
TELEMETRY_UI_DETECTION_TTL |
300 |
Seconds to cache schema autodetection probes. |
TELEMETRY_UI_FLEET_TTL |
60 |
Seconds to cache the sidebar service/environment discovery. |
TELEMETRY_UI_ANNOTATIONS |
true |
Draw deploy/annotation markers on charts. |
TELEMETRY_UI_ANNOTATIONS_TTL |
30 |
Seconds to cache annotation lookups. |
A connection may also set its own cache key to override the global TTL. See
connections for the full reference.
Disabling entirely
TELEMETRY_UI_ENABLED=false makes the package inert: no routes (SPA, API or
assets), no gate, no MCP server. Useful for queue workers and environments where the
dashboard should not exist.