Laravel Pulse
Laravel Pulse: Real-Time Application Monitoring
Monitor your Laravel application in real-time with Pulse. Track slow queries, exceptions, queue jobs, cache performance, and user activity from a beautiful dashboard.

Hoceine El Idrissi
Full Stack Developer
Laravel Pulse: Real-Time Application Monitoring
Laravel Pulse delivers real-time application monitoring with a beautiful dashboard. Track performance, identify bottlenecks, and understand how users interact with your application.
Installation
composer require laravel/pulse
php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"
php artisan migrate
Add the Pulse middleware to track requests:
// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
$middleware->web(append: [
\Laravel\Pulse\Http\Middleware\Pulse::class,
]);
})
Accessing the Dashboard
// routes/web.php
Route::get('/pulse', function () {
return view('pulse::dashboard');
})->middleware(['auth', 'can:viewPulse']);
Authorization
// app/Providers/AppServiceProvider.php
use Laravel\Pulse\Facades\Pulse;
public function boot(): void
{
Pulse::authorize(function (Request $request) {
return $request->user()?->isAdmin();
});
}
Default Recorders
Slow Queries
Automatically tracks queries exceeding threshold:
// config/pulse.php
'recorders' => [
\Laravel\Pulse\Recorders\SlowQueries::class => [
'threshold' => 1000, // ms
'sample_rate' => 1.0,
],
],
Exceptions
Track all exceptions with stack traces:
\Laravel\Pulse\Recorders\Exceptions::class => [
'sample_rate' => 1.0,
'ignore' => [
ValidationException::class,
AuthenticationException::class,
],
],
Slow Requests
Monitor endpoint performance:
\Laravel\Pulse\Recorders\SlowRequests::class => [
'threshold' => 1000, // ms
'sample_rate' => 1.0,
],
Queue Jobs
Track job processing:
\Laravel\Pulse\Recorders\SlowJobs::class => [
'threshold' => 1000, // ms
],
Cache Operations
Monitor cache hit rates:
\Laravel\Pulse\Recorders\CacheInteractions::class => [
'sample_rate' => 1.0,
],
User Requests
See most active users:
\Laravel\Pulse\Recorders\UserRequests::class => [
'sample_rate' => 1.0,
],
Dashboard Cards
Built-in Cards
// 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="6" />
<livewire:pulse.slow-requests cols="6" />
<livewire:pulse.slow-jobs cols="6" />
<livewire:pulse.slow-outgoing-requests cols="6" />
</x-pulse>
Custom Layout
<x-pulse>
{{-- Full-width server stats at top --}}
<livewire:pulse.servers cols="full" />
<div class="grid grid-cols-12 gap-6">
{{-- Left column: Performance --}}
<div class="col-span-8 space-y-6">
<livewire:pulse.slow-queries />
<livewire:pulse.slow-requests />
</div>
{{-- Right column: Activity --}}
<div class="col-span-4 space-y-6">
<livewire:pulse.usage />
<livewire:pulse.exceptions />
</div>
</div>
</x-pulse>
Custom Recorders
Track Custom Events
// app/Pulse/Recorders/PaymentRecorder.php
namespace App\Pulse\Recorders;
use Laravel\Pulse\Facades\Pulse;
use App\Events\PaymentProcessed;
class PaymentRecorder
{
public function record(PaymentProcessed $event): void
{
Pulse::record(
type: 'payment',
key: $event->payment->gateway,
value: $event->payment->amount
)->count()->sum();
}
}
Register in config:
// config/pulse.php
'recorders' => [
App\Pulse\Recorders\PaymentRecorder::class => [
'events' => [
\App\Events\PaymentProcessed::class,
],
],
],
Track API Calls
class ExternalApiRecorder
{
public function record($event): void
{
Pulse::record(
type: 'external_api',
key: $event->service,
value: $event->duration
)->avg()->max();
}
}
Custom Cards
Create a Card
// app/Livewire/Pulse/PaymentStats.php
namespace App\Livewire\Pulse;
use Laravel\Pulse\Livewire\Card;
use Livewire\Attributes\Lazy;
#[Lazy]
class PaymentStats extends Card
{
public function render()
{
$payments = $this->aggregate('payment', ['count', 'sum']);
return view('livewire.pulse.payment-stats', [
'payments' => $payments,
]);
}
}
{{-- resources/views/livewire/pulse/payment-stats.blade.php --}}
<x-pulse::card :cols="$cols" :rows="$rows">
<x-pulse::card-header name="Payment Stats">
<x-slot:icon>
<x-heroicon-o-currency-dollar class="w-6 h-6" />
</x-slot:icon>
</x-pulse::card-header>
<x-pulse::scroll :expand="$expand">
@foreach ($payments as $gateway => $stats)
<div class="flex justify-between p-4">
<span>{{ $gateway }}</span>
<span>{{ number_format($stats->sum / 100, 2) }}</span>
</div>
@endforeach
</x-pulse::scroll>
</x-pulse::card>
Server Monitoring
Install Server Agent
php artisan pulse:check
Configure servers:
// config/pulse.php
'recorders' => [
\Laravel\Pulse\Recorders\Servers::class => [
'server_name' => env('PULSE_SERVER_NAME', gethostname()),
'directories' => explode(':', env('PULSE_SERVER_DIRECTORIES', '/')),
],
],
Sampling
Control recording frequency:
// Record 10% of requests
\Laravel\Pulse\Recorders\SlowRequests::class => [
'sample_rate' => 0.1,
],
// Record all exceptions
\Laravel\Pulse\Recorders\Exceptions::class => [
'sample_rate' => 1.0,
],
Data Retention
// config/pulse.php
'ingest' => [
'trim' => [
'lottery' => [1, 1000],
'keep' => '7 days',
],
],
Manual Cleanup
php artisan pulse:clear
php artisan pulse:clear --type=slow_query
Ignoring Paths
// config/pulse.php
'recorders' => [
\Laravel\Pulse\Recorders\SlowRequests::class => [
'ignore' => [
'#^/health#',
'#^/livewire#',
'#^/_debugbar#',
],
],
],
Multiple Databases
// config/pulse.php
'database' => [
'connection' => 'pulse',
],
// config/database.php
'pulse' => [
'driver' => 'mysql',
'host' => env('PULSE_DB_HOST', '127.0.0.1'),
'database' => env('PULSE_DB_DATABASE', 'pulse'),
// ...
],
Alerting
Combine with Laravel Notifications:
// app/Console/Commands/PulseAlerts.php
class PulseAlerts extends Command
{
protected $signature = 'pulse:alerts';
public function handle()
{
$slowQueries = Pulse::aggregate('slow_query', 'count', now()->subHour());
if ($slowQueries > 100) {
Notification::route('slack', config('services.slack.alerts'))
->notify(new SlowQueryAlert($slowQueries));
}
}
}
Conclusion
Laravel Pulse provides essential monitoring without external services. Use it to identify slow queries, track exceptions, monitor queue health, and understand user behavior—all from a beautiful dashboard.