Pulse & Telescope
Menebak bagian mana yang lambat hampir selalu salah. Dua alat resmi ini menjawabnya dengan data: rute mana, query mana, job mana, dan pengguna mana.
Intisari
- Pulse ringan dan dirancang untuk produksi; ia mengambil sampel, bukan mencatat semuanya.
- Telescope mencatat segalanya secara detail โ sangat berguna di lokal, berat di produksi.
- Keduanya wajib dilindungi gate; keduanya menampilkan data permintaan sungguhan.
- Pulse menjawab "apa yang lambat sekarang"; Telescope menjawab "apa yang terjadi pada permintaan itu".
- Simpan datanya di koneksi database terpisah supaya pemantauan tidak ikut membebani database utama.
Pulse
composer require laravel/pulse
php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"
php artisan migrate
| Kartu | Menjawab |
|---|---|
| Slow Requests | Rute mana yang paling lambat, dan seberapa sering |
| Slow Queries | Query mana yang memakan waktu, beserta asal berkasnya |
| Slow Jobs | Job antrean mana yang menahan worker |
| Exceptions | Error apa yang paling sering, dan sedang naik atau turun |
| Cache | Rasio hit dan kunci yang paling sering meleset |
| Usage | Pengguna mana yang menghasilkan beban terbanyak |
| Servers | CPU dan memori tiap server |
// config/pulse.php โ penting untuk produksi
'storage' => [
'database' => ['connection' => env('PULSE_DB_CONNECTION', 'pulse')],
],
'ingest' => [
'driver' => 'redis', // tulis ke Redis dulu, lalu dipindahkan oleh worker
],
'recorders' => [
Recorders\SlowRequests::class => ['threshold' => 1000], // ms
Recorders\SlowQueries::class => ['threshold' => 100],
],
php artisan pulse:work # proses yang memindahkan data dari Redis ke database
Dua setelan yang menentukan apakah Pulse aman di produksi. Pertama, ingest lewat Redis
supaya permintaan pengguna tidak menunggu penulisan pemantauan. Kedua, koneksi database terpisah supaya tabel
pemantauan yang ramai tidak bersaing dengan tabel aplikasimu. Tanpa keduanya, alat yang seharusnya mengukur
masalah justru ikut menyebabkannya.
// app/Providers/AppServiceProvider.php
Gate::define('viewPulse', fn ($user) => $user->peran === Peran::Admin);
Telescope
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate
Telescope mencatat setiap permintaan beserta seluruh isinya: query lengkap dengan binding, job yang dikirim, email yang dibuat, panggilan HTTP keluar, entri cache, dan exception. Untuk menjawab "kenapa permintaan ini berperilaku aneh", tidak ada alat yang lebih baik.
| Pulse | Telescope | |
|---|---|---|
| Menjawab | Apa yang lambat, secara agregat | Apa yang terjadi pada satu permintaan |
| Beban | Ringan (sampling) | Berat (mencatat semuanya) |
| Di produksi | Ya | Hanya sementara, dengan penyaringan ketat |
| Retensi | Agregat mingguan | Entri mentah; harus dipangkas rutin |
| Pasang sebagai | Dependensi biasa | --dev |
Telescope di produksi tanpa penyaringan akan membanjiri databasemu. Ia menulis beberapa baris untuk
setiap permintaan โ pada lalu lintas menengah saja itu jutaan baris per hari. Kalau memang perlu dipasang,
batasi dengan Telescope::filter() ke error dan permintaan lambat saja, dan jadwalkan
telescope:prune setiap hari.
// app/Providers/TelescopeServiceProvider.php
Telescope::filter(function (IncomingEntry $entry) {
if ($this->app->environment('local')) {
return true;
}
return $entry->isReportableException()
|| $entry->isFailedJob()
|| $entry->isSlowQuery()
|| $entry->hasMonitoredTag();
});
// routes/console.php
Schedule::command('telescope:prune --hours=48')->daily();
Alur kerja saat sesuatu melambat
- Buka Pulse. Temukan rute dengan p95 tertinggi yang juga sering dipanggil โ bukan yang paling lambat tapi jarang.
- Lihat kartu Slow Queries; sering kali penyebabnya langsung muncul di sana beserta berkasnya.
- Reproduksi di lokal dengan Telescope aktif, dan baca daftar query lengkap permintaan itu.
- Kalau jumlah query membengkak seiring jumlah baris โ itu N+1. Kembali ke Fase 2.
- Kalau satu query yang lambat โ jalankan
EXPLAIN. Kembali ke materi index. - Kalau semuanya wajar tapi tetap lambat โ barulah pertimbangkan cache, dan setelah itu worker mode (Fase 8).
Urutan itu penting. Menambahkan cache di depan query N+1 menyembunyikan gejalanya sampai pola aksesnya berubah, lalu masalahnya kembali dalam bentuk yang lebih sulit dilacak. Perbaiki penyebabnya dulu; cache adalah lapisan terakhir, bukan pertama.
Latihan: pasang Pulse dengan koneksi database terpisah dan gate admin. Buat satu rute yang sengaja lambat (satu query N+1 di atas 200 baris), biarkan berjalan beberapa menit, lalu temukan rute itu di kartu Slow Requests dan query-nya di Slow Queries.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.