Laravel Pulse provides real-time application monitoring without external services. Track performance metrics, slow queries, and exceptions in a beautiful dashboard. At ZIRA Software, Pulse helps us identify issues before users notice.
Installation
composer require laravel/pulse
php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"
php artisan migrate
Dashboard Access
// routes/web.php
Route::get('/pulse', function () {
// Authorization handled by gate
})->middleware(['auth'])->name('pulse');
// app/Providers/AppServiceProvider.php
use Laravel\Pulse\Facades\Pulse;
public function boot(): void
{
Pulse::user(fn ($user) => [
'name' => $user->name,
'extra' => $user->email,
'avatar' => $user->avatar_url,
]);
}
// Authorization gate
Gate::define('viewPulse', function (User $user) {
return $user->hasRole('admin');
});
Configuration
// config/pulse.php
return [
'enabled' => env('PULSE_ENABLED', true),
'storage' => [
'driver' => env('PULSE_STORAGE_DRIVER', 'database'),
'database' => [
'connection' => env('PULSE_DB_CONNECTION', null),
'chunk' => 1000,
],
],
'ingest' => [
'driver' => env('PULSE_INGEST_DRIVER', 'storage'),
'buffer' => env('PULSE_INGEST_BUFFER', 5000),
],
'recorders' => [
Recorders\CacheInteractions::class => [
'enabled' => true,
'sample_rate' => 1,
],
Recorders\Exceptions::class => [
'enabled' => true,
'location' => true,
],
Recorders\Queues::class => [
'enabled' => true,
'sample_rate' => 1,
],
Recorders\SlowJobs::class => [
'enabled' => true,
'threshold' => 1000, // ms
],
Recorders\SlowQueries::class => [
'enabled' => true,
'threshold' => 100, // ms
],
Recorders\SlowRequests::class => [
'enabled' => true,
'threshold' => 1000, // ms
],
Recorders\UserRequests::class => [
'enabled' => true,
'sample_rate' => 1,
],
],
];
Custom Cards
// app/Pulse/Cards/RevenueCard.php
namespace App\Pulse\Cards;
use Laravel\Pulse\Livewire\Card;
use Livewire\Attributes\Lazy;
#[Lazy]
class RevenueCard extends Card
{
public function render()
{
$revenue = Order::where('created_at', '>=', now()->subDay())
->sum('total');
return view('pulse.cards.revenue', [
'revenue' => $revenue,
]);
}
}
{{-- resources/views/pulse/cards/revenue.blade.php --}}
<x-pulse::card :cols="$cols" :rows="$rows" :class="$class">
<x-pulse::card-header name="Today's Revenue">
<x-slot:icon>
<x-heroicon-o-currency-dollar />
</x-slot:icon>
</x-pulse::card-header>
<div class="text-3xl font-bold text-gray-900 dark:text-gray-100">
${{ number_format($revenue, 2) }}
</div>
</x-pulse::card>
Dashboard Layout
{{-- 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" />
{{-- Custom card --}}
<livewire:pulse.revenue-card cols="2" />
</x-pulse>
Recording Custom Metrics
use Laravel\Pulse\Facades\Pulse;
// Record a value
Pulse::record('api_calls', 'stripe', 1)->count();
// Record with timing
Pulse::record('external_api', 'payment_gateway', $responseTime)->avg();
// Record in specific context
Pulse::set('user_action', 'checkout', $userId);
Ignoring Routes and Jobs
// config/pulse.php
'recorders' => [
Recorders\SlowRequests::class => [
'enabled' => true,
'threshold' => 1000,
'ignore' => [
'#^/health#',
'#^/pulse#',
'#^/_debugbar#',
],
],
Recorders\SlowJobs::class => [
'enabled' => true,
'threshold' => 1000,
'ignore' => [
App\Jobs\LongRunningJob::class,
],
],
],
Sampling for High Traffic
// config/pulse.php
'recorders' => [
Recorders\UserRequests::class => [
'enabled' => true,
'sample_rate' => 0.1, // 10% of requests
],
Recorders\CacheInteractions::class => [
'enabled' => true,
'sample_rate' => 0.01, // 1% of interactions
],
],
Data Retention
# Prune old data (add to scheduler)
php artisan pulse:prune
# Custom retention
php artisan pulse:prune --hours=48
// app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
$schedule->command('pulse:prune')->daily();
}
Server Metrics
# Run the Pulse server daemon
php artisan pulse:check
// Supervisor config
[program:pulse]
command=php /var/www/app/artisan pulse:check
autostart=true
autorestart=true
user=www-data
Conclusion
Laravel Pulse provides comprehensive application monitoring with zero external dependencies. Real-time insights help identify and resolve performance issues quickly.
Need application monitoring? Contact ZIRA Software for DevOps and monitoring setup.