laravel-pulse
When to use
Use this skill when working with Laravel Pulse:
- Setting up the Pulse monitoring dashboard
- Configuring built-in recorders (slow queries, exceptions, queues, etc.)
- Creating custom Pulse cards and recorders
- Performance monitoring and alerting
Procedure: Set up Pulse
- Inspect current monitoring — Check
composer.json, existing telemetry packages, andconfig/for Pulse, Telescope, or Horizon already installed; identify gaps. - Install —
composer require laravel/pulse, publish config, run migrations. - Configure — Set up recorders in
config/pulse.php. - Add dashboard — Register route and authorize access.
- Verify — Visit
/pulsedashboard, confirm data is being recorded.
Installation
composer require laravel/pulse
php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"
php artisan migrate
Dashboard
Access control
// PulseServiceProvider or Gate
Gate::define('viewPulse', function (User $user): bool {
return $user->isSuperuser();
});
Dashboard route
Pulse registers /pulse automatically. Customize in config/pulse.php:
'path' => 'pulse',
'middleware' => ['web', 'auth'],
Built-in cards
| Card | What it shows |
|---|---|
<livewire:pulse.servers /> |
CPU, memory, storage per server |
<livewire:pulse.usage /> |
Top users by request count |
<livewire:pulse.queues /> |
Queue throughput and wait times |
<livewire:pulse.slow-queries /> |
Slowest database queries |
<livewire:pulse.slow-requests /> |
Slowest HTTP requests |
<livewire:pulse.slow-jobs /> |
Slowest queued jobs |
<livewire:pulse.slow-outgoing-requests /> |
Slowest external HTTP calls |
<livewire:pulse.exceptions /> |
Most frequent exceptions |
<livewire:pulse.cache /> |
Cache hit/miss ratio |
Dashboard view
{{-- resources/views/vendor/pulse/dashboard.blade.php --}}
<x-pulse>
<livewire:pulse.servers cols="full" />
<livewire:pulse.usage cols="4" rows="2" />
<livewire:pulse.queues cols="4" />
<livewire:pulse.cache cols="4" />
<livewire:pulse.slow-queries cols="8" />
<livewire:pulse.exceptions cols="4" />
<livewire:pulse.slow-requests cols="6" />
<livewire:pulse.slow-jobs cols="6" />
</x-pulse>
Configuration
config/pulse.php
'recorders' => [
\Laravel\Pulse\Recorders\SlowQueries::class => [
'enabled' => true,
'threshold' => 1000, // ms
'sample_rate' => 1.0,
],
\Laravel\Pulse\Recorders\SlowRequests::class => [
'enabled' => true,
'threshold' => 1000, // ms
'sample_rate' => 1.0,
],
\Laravel\Pulse\Recorders\Exceptions::class => [
'enabled' => true,
'sample_rate' => 1.0,
],
],
// Data retention
'ingest' => [
'trim' => [
'lottery' => [1, 1000],
'keep' => '7 days',
],
],
Custom recorders
use Laravel\Pulse\Facades\Pulse;
// Record a custom entry
Pulse::record('api_call', 'stripe', 250) // type, key, value
->avg()
->count();
Core rules
- Trim old data — configure retention to prevent database bloat.
- Use sample rates in production — not every request needs recording.
- Separate database — consider a dedicated DB connection for Pulse data.
- Restrict access — always gate the dashboard behind authentication.
- Monitor what matters — don't enable all recorders if you don't need them.
Output format
- Pulse configuration with recorders and dashboard cards
- Custom recorder class if needed
Auto-trigger keywords
- Pulse
- monitoring dashboard
- slow queries
- slow requests
- application monitoring
- performance dashboard
Gotcha
- Pulse stores data in the same database by default — configure a separate connection for production.
- The model forgets that Pulse data is sampled, not exact — don't use it for billing or exact counts.
- Custom recorders must be registered in a service provider — they don't auto-discover.
Do NOT
- Do NOT expose the Pulse dashboard without authentication.
- Do NOT set sample rate to 1.0 on high-traffic production — use 0.1 or lower.
- Do NOT forget to run
pulse:checkfor server metrics. - Do NOT store Pulse data in the main application database on large apps.