Pendahuluan
Pada bagian sebelumnya, kita telah membahas dasar-dasar kustomisasi Laravel Telescope, seperti cara memfilter data yang dikumpulkan dan mengimplementasikan logika autentikasi kustom melalui TelescopeServiceProvider. Kita telah melihat bagaimana beberapa baris kode dapat mengubah Telescope dari sekadar alat diagnostik standar menjadi solusi monitoring yang lebih adaptif.
Kini, saatnya kita melangkah lebih jauh. Bagian kedua ini akan mengungkap fitur-fitur tersembunyi yang memungkinkan Anda untuk menyesuaikan Telescope secara lebih mendalam, memberikan kontrol yang lebih granular atas data yang dicatat, dan bahkan menciptakan fungsionalitas monitoring yang sepenuhnya baru. Bersiaplah untuk membawa pengalaman debugging dan monitoring aplikasi Laravel Anda ke level berikutnya!
Mengintip Lebih Dalam: Kustomisasi Watcher
Watcher adalah komponen inti Telescope yang bertanggung jawab untuk mengumpulkan berbagai jenis data dari aplikasi Anda, seperti request, query, job, event, dan lainnya. Laravel Telescope menyediakan banyak watcher bawaan yang sangat berguna. Namun, bagaimana jika Anda ingin memantau sesuatu yang spesifik, yang tidak dicover oleh watcher standar? Di sinilah kekuatan Watcher Kustom berperan.
Membuat Watcher untuk Event Kustom
Misalkan aplikasi Anda memiliki event kustom seperti UserRegistered, dan Anda ingin setiap kali event ini di-dispatch, Telescope mencatat informasi detail tentang pengguna yang baru terdaftar. Anda bisa membuat watcher kustom untuk tujuan ini:
Buat Kelas Watcher: Buat file watcher baru, misalnya di
app/Telescope/Watchers/CustomEventWatcher.php.
<?php
namespace App\Telescope\Watchers;
use Illuminate\Contracts\Events\Dispatcher;
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
use Laravel\Telescope\Watchers\Watcher;
use App\Events\UserRegistered; // Asumsikan Anda memiliki event kustom ini
class CustomEventWatcher extends Watcher
{
public function register(Dispatcher $events): void
{
// Daftarkan listener untuk event kustom Anda
$events->listen(UserRegistered::class, [$this, 'recordCustomEvent']);
}
public function recordCustomEvent(UserRegistered $event): void
{
// Pastikan Telescope sedang merekam sebelum mencatat entri
if (! Telescope::isRecording()) {
return;
}
// Catat entri baru ke Telescope
Telescope::record(IncomingEntry::make([
'name' => 'Custom Event: User Registered',
'user_id' => $event->user->id,
'user_email' => $event->user->email,
'registered_at' => now()->toDateTimeString(),
])->tags(['custom', 'event', 'user-registration'])); // Tambahkan tag untuk kemudahan filtering
}
}
Daftarkan Watcher di TelescopeServiceProvider: Buka
app/Providers/TelescopeServiceProvider.phpdan daftarkan watcher kustom Anda di metoderegisterWatchers().
// app/Providers/TelescopeServiceProvider.php
use App\Telescope\Watchers\CustomEventWatcher;
// ...
protected function registerWatchers(): void
{
// ... watcher bawaan lainnya
// Daftarkan watcher kustom Anda di sini
$this->watch(CustomEventWatcher::class);
// Contoh: Anda juga bisa mengkonfigurasi watcher bawaan di sini
// $this->watch(CacheWatcher::class, ['enabled' => env('TELESCOPE_CACHE_WATCHER', true)]);
}
Dengan watcher kustom ini, setiap kali UserRegistered di-dispatch, Telescope akan secara otomatis mencatat detailnya, yang bisa Anda lihat di dashboard Telescope.
Memperkaya Data dengan Tag Kustom
Terkadang, data yang dikumpulkan Telescope perlu konteks tambahan agar lebih mudah diidentifikasi atau difilter. Fitur Telescope::tag() memungkinkan Anda untuk menambahkan tag kustom ke entri yang sedang dicatat. Ini sangat berguna untuk menandai entri berdasarkan ID pengguna, ID sesi, ID transaksi, atau karakteristik lain yang relevan.
Implementasi Tag Kustom di Controller atau Job
Anda bisa menambahkan tag kapan saja dalam siklus hidup request atau eksekusi job. Tag ini akan melekat pada semua entri Telescope yang dicatat setelah tag tersebut ditambahkan (hingga akhir request atau job).
Contoh di Controller: Menandai Request dengan ID Pelanggan
// app/Http/Controllers/OrderController.php
use Laravel\Telescope\Telescope;
use Illuminate\Http\Request;
class OrderController extends Controller
{
public function processOrder(Request $request)
{
// Asumsikan user sudah login
if ($request->user()) {
Telescope::tag(function (array $tags) use ($request) {
// Tambahkan tag 'customer_id' dan 'source' ke semua entri request ini
$tags[] = 'customer_id:' . $request->user()->id;
$tags[] = 'source:web';
return $tags;
});
}
// ... logika pemrosesan order Anda
return response()->json(['message' => 'Order processed successfully']);
}
}
Contoh di Job: Menandai Job dengan ID Order
// app/Jobs/ShipOrder.php
use Laravel\Telescope\Telescope;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class ShipOrder implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $orderId;
public function __construct(int $orderId)
{
$this->orderId = $orderId;
}
public function handle(): void
{
// Tambahkan tag 'order_id' ke semua entri yang dicatat selama eksekusi job ini
Telescope::tag(['order_id:' . $this->orderId, 'priority:high']);
// ... logika pengiriman order
// Misalnya, log aktivitas pengiriman
logger()->info("Order #{$this->orderId} shipped.");
}
}
Tag-tag ini akan muncul di dashboard Telescope, memungkinkan Anda untuk mencari dan memfilter entri berdasarkan kriteria kustom yang sangat spesifik.
Kontrol Perekaman Data yang Granular
Terkadang, Anda mungkin ingin menghentikan perekaman data Telescope untuk sementara waktu atau menyembunyikan informasi yang sangat sensitif dari log. Telescope menyediakan API untuk kontrol yang sangat granular ini.
Menghentikan dan Memulai Perekaman
Untuk skenario di mana Anda ingin mencegah Telescope mencatat aktivitas selama operasi tertentu (misalnya, saat memperbarui data sensitif atau melakukan batch import besar), Anda bisa menggunakan Telescope::stopRecording() dan Telescope::startRecording().
// app/Http/Controllers/UserController.php
use Laravel\Telescope\Telescope;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function updateSensitiveUserData(Request $request, User $user)
{
// Hentikan perekaman Telescope sementara
Telescope::stopRecording();
// ... Lakukan operasi sensitif, misalnya update password atau data pribadi
$user->update($request->validate([
'password' => 'required|min:8|confirmed',
'ssn' => 'required|string',
]));
// Mulai kembali perekaman Telescope
Telescope::startRecording();
return back()->with('success', 'User data updated successfully.');
}
}
Semua aktivitas yang terjadi di antara panggilan stopRecording() dan startRecording() tidak akan dicatat oleh Telescope.
Menyembunyikan Informasi Sensitif (Redaksi Data)
Meskipun Anda memfilter data di bagian pertama, mungkin ada kasus di mana Anda perlu mencatat request atau payload, tetapi ingin menyembunyikan bagian tertentu yang mengandung informasi sensitif. Telescope memiliki fitur bawaan untuk ini, dan Anda bisa mengkonfigurasinya lebih lanjut.
Menggunakan Telescope::hideRequestParameters() dan Telescope::hideRequestHeaders()
Ini adalah cara paling mudah untuk merahasiakan parameter dan header yang umum dalam request. Anda bisa menempatkannya di metode boot() dari TelescopeServiceProvider Anda.
// app/Providers/TelescopeServiceProvider.php
use Laravel\Telescope\Telescope;
// ...
public function boot(): void
{
parent::boot();
// ... (Filter dan Autentikasi yang sudah ada)
// Sembunyikan parameter tertentu dari request payload yang dicatat
Telescope::hideRequestParameters([
'password',
'password_confirmation',
'credit_card_number',
'ssn' // Contoh parameter sensitif lainnya
]);
// Anda juga bisa menyembunyikan header HTTP tertentu
Telescope::hideRequestHeaders([
'authorization',
'cookie',
'x-api-key'
]);
}
Modifikasi Entri Secara Dinamis dengan Event EntryRecorded
Untuk skenario redaksi yang lebih kompleks atau kondisional, Anda bisa mendengarkan event EntryRecorded dan memodifikasi konten entri sebelum disimpan ke database Telescope. Ini memberikan fleksibilitas penuh.
// app/Providers/TelescopeServiceProvider.php
use Laravel\Telescope\Events\EntryRecorded;
use Laravel\Telescope\EntryType;
use Illuminate\Support\Facades\Event;
public function boot(): void
{
parent::boot();
// ... (Konfigurasi lainnya)
Event::listen(EntryRecorded::class, function (EntryRecorded $event) {
// Contoh: Jika ini adalah entri request dan URI mengandung '/api/admin/secrets'
if ($event->entry->type === EntryType::REQUEST &&
str_contains($event->entry->content['uri'], '/api/admin/secrets')) {
// Modifikasi payload request untuk menyembunyikan 'admin_token'
if (isset($event->entry->content['payload']['admin_token'])) {
$event->entry->content['payload']['admin_token'] = '********';
}
}
// Contoh lain: Sembunyikan pesan sensitif dari log entry
if ($event->entry->type === EntryType::LOG &&
str_contains($event->entry->content['message'], 'private key')) {
$event->entry->content['message'] = 'Sensitive log message redacted.';
}
});
}
Dengan mendengarkan EntryRecorded, Anda memiliki kekuatan untuk memeriksa dan memodifikasi setiap entri Telescope secara programatis, memastikan data sensitif tetap terlindungi.
Strategi Pruning Data yang Cerdas
Seiring waktu, database Telescope dapat membengkak dengan data, yang berpotensi memengaruhi performa. Selain perintah php artisan telescope:prune yang membersihkan entri lama, Anda dapat mengimplementasikan strategi pruning yang lebih cerdas dengan menggabungkan kustomisasi yang telah kita bahas.
Filter yang Ketat: Seperti dibahas di bagian pertama, filter yang ketat adalah garis pertahanan pertama untuk mencegah data yang tidak perlu masuk ke database.
Pruning Berdasarkan Tag: Meskipun Telescope tidak memiliki fitur pruning bawaan berdasarkan tag, Anda bisa membuat perintah Artisan kustom yang menghapus entri dengan tag tertentu (misalnya, entri 'debug' lama di lingkungan non-lokal).
Custom Database Maintenance: Untuk kontrol penuh, Anda bisa membuat skrip atau job yang secara langsung berinteraksi dengan tabel database Telescope (
telescope_entriesdantelescope_entries_tags) untuk menghapus data berdasarkan kriteria kustom yang sangat spesifik (misalnya, menghapus semua query yang tidak gagal setelah 3 hari).
Ingat, menjaga kesehatan database Telescope adalah kunci untuk memastikan alat ini tetap efisien dan berguna dalam jangka panjang.
Kesimpulan
Laravel Telescope adalah lebih dari sekadar alat diagnostik; ia adalah kanvas yang dapat Anda bentuk sesuai kebutuhan monitoring aplikasi Anda. Dari membuat watcher kustom untuk melacak peristiwa unik, menambahkan konteks dengan tag, hingga mengontrol aliran data sensitif, kustomisasi tingkat lanjut membuka dimensi baru dalam pemahaman dan pemeliharaan aplikasi Anda.
Dengan menguasai fitur-fitur tersembunyi ini, Anda tidak hanya akan mendebug lebih efisien tetapi juga membangun sistem monitoring yang proaktif dan disesuaikan. Teruslah bereksplorasi, karena potensi Telescope dalam membantu Anda memahami dan mengoptimalkan aplikasi Laravel hampir tidak terbatas.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!