Installation Run:
composer require cboxdk/laravel-telemetry-ui
php artisan vendor:publish --provider="Cboxdk\TelemetryUI\TelemetryUIServiceProvider" --tag="config"
php artisan migrate
Publish the config (config/telemetry-ui.php) and run migrations to set up the database tables for saved queries/dashboards.
Prerequisites Ensure your Laravel app has:
cboxdk/laravel-telemetry installed (this package’s dependency).laravel/livewire).First Use Case: Quick Dashboard Add the UI to your layout:
@telemetryUI
This renders the default dashboard with pre-configured cards for:
Customize via the telemetry-ui.php config (e.g., adjust time ranges, default queries).
Create a Livewire component for a custom card:
php artisan make:livewire CustomMetricsCard
Register it in config/telemetry-ui.php:
'cards' => [
'custom' => [
'component' => 'custom-metrics-card',
'label' => 'Custom Metrics',
'default_query' => 'sum(rate(http_requests_total[5m])) by (service)',
],
],
Use the TelemetryUI facade to fetch raw data (e.g., for APIs or background jobs):
use Cboxdk\TelemetryUI\Facades\TelemetryUI;
// Fetch logs from Loki
$logs = TelemetryUI::logs()
->query('{job="api"} | json')
->timeRange('1h')
->fetch();
// Fetch traces from Tempo
$traces = TelemetryUI::traces()
->query('service="user-service"')
->limit(10)
->fetch();
Route::middleware(['auth:sanctum'])->group(function () {
Route::telemetryUI();
});
TelemetryUI::setTimeRange(request('range', '1h'));
resources/css/telemetry-ui.css:
.telemetry-card { border: 2px solid #3b82f6; }
Leverage the built-in query storage:
// Save a query for a user
TelemetryUI::saveQuery(
userId: auth()->id(),
type: 'logs',
query: '{job="api"} | json',
label: 'API Logs'
);
// Retrieve saved queries
$userQueries = TelemetryUI::getSavedQueries(auth()->id());
Missing Dependencies
cboxdk/laravel-telemetry is installed before this package. The UI relies on its underlying clients (e.g., grafana/tempo-client-php).composer require cboxdk/laravel-telemetry if missing.CORS Issues
config/cors.php:
'paths' => ['telemetry-ui/*', 'api/telemetry/*'],
'allowed_methods' => ['GET', 'POST', 'OPTIONS'],
'allowed_origins' => ['*'], // Or restrict to your app's domain
Livewire Component Conflicts
namespace App\Livewire\Telemetry;
class CustomCard extends Component { ... }
Rate Limiting
->limit() and ->timeRange() to constrain queries:
TelemetryUI::traces()->query('...')->limit(50)->timeRange('5m');
config/telemetry-ui.php for correct endpoints (e.g., tempo.url, loki.url).'debug' => env('TELEMETRY_UI_DEBUG', false),
This logs queries to storage/logs/telemetry-ui.log.Custom Data Sources
Extend the Cboxdk\TelemetryUI\Contracts\QueryBuilder interface to support non-Grafana stacks (e.g., Datadog, New Relic):
class CustomQueryBuilder implements QueryBuilder {
public function query(string $q): self { ... }
public function fetch(): array { ... }
}
Register via the service provider.
Plugin System Use Laravel’s package discovery to auto-load card components:
// In TelemetryUIServiceProvider
$this->loadViewsFrom(__DIR__.'/../resources/views', 'telemetry-ui');
Webhook Alerts
Combine with laravel-telemetry’s alerting to trigger UI notifications:
TelemetryUI::alert()
->type('metric')
->condition('error_rate > 0.1')
->notifyVia('database'); // Stores alerts in DB for UI display
Dark Mode Support Override the default Tailwind classes in your app’s CSS:
@media (prefers-color-scheme: dark) {
.telemetry-card { background: #1a1a1a; }
}
How can I help you explore Laravel packages today?