Laravel — Telescope Kurulum ve Kullanımı
Herkese Merhaba 👋
Bugün geliştirme yaparken işleri çok kolaylaştıran bir paketten bahsedeceğiz. Paketimizin ismi Telescope. Kısaca uygulamamız üzerinde gerçekleşen İstekler, Hatalar, Kayıtlar, Veritabanı sorguları, Kuyrukta ki işlerin durumu, Mail, Bildirim, Önbellek ve Zamanlanmış olan işler için bize tüm detayları nereden başlayıp nerede ne şekilde sonlandığı konusunda bilgi veren bir paket. Geliştirme yaparken oldukça işinize yarayacaktır!
Hadi Başlayalım…

Kurulum
Composer üzerinden basit bir kurulum yolumuz var. Tüm Dökümantasyona https://laravel.com/docs/8.x/telescope üzerinden erişebilirsiniz.
composer require laravel/telescope
ve sonrasında kuruluma
php artisan telescope:install
php artisan migrate
adımları ile devam ediyoruz burada veritabanızda
2018_08_08_100000_create_telescope_entries_table
migration dosyası üzerinden telescope a ait veritabanı tabloları oluşacaktır.
Ayarlar
Laravel üzerinde kurulumunu tamamladıktan sonra ‘config/telescope.php’ dosyası oluşacaktır. Burada izleyicilerden hangilerini açacağımızı veya telescope u tamamen kapatabileceğimiz seçenekler detaylıca açıklanmıştır.
'enabled' => env('TELESCOPE_ENABLED', true),
false yapılarak tamamen kapatmak mümkündür.
Verileri temizlemek
Veritabanımızda ki kayıtların artması ve uzun sürede yer işgal etmesi ile alakalı olarak belirlediğimiz aralıklarla silinmelerini sağlayabiliriz. Bunun için laravel’in bir özelliği olan Zamanlanmış görevlerden yararlanacağız. Şu şekilde yapacağız.
#/app/Console/Kernel.php/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command('telescope:prune')->daily();
}
Burada uygulamamıza günlük olarak verileri temizlemesi gerektiğini söyledik. “telescope:prune” komutu varsayılan olarak son 24 saatten önceki verileri silmek üzerine ayarlanmıştır. Bunu değiştirmek istersek ek bir parametre eklememiz gerekiyor. Bunu şu şekilde yapabiliriz.
$schedule->command('telescope:prune --hours=48')->daily();
Burada son 48 saatlik kaydın korunması ve gerisinin silinmesi gerektiğini söylemiş olduk. Detaylı bilgiyi https://laravel.com/docs/8.x/scheduling üzerinden edinebilirsiniz.
Gece Modu
# app/Providers/TelescopeServiceProvideruse Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*
* @return void
*/
public function register()
{ /** Yorum satırı silinerek Telescope gece modu
* tasarımına geçirilebilir.
**/
Telescope::night();
....
Yetkilendirme
Birazdan bahsedeceğimiz kontrol paneli üzerinde ki verilere kimlerin ulaşabileceğini ayarlamak istersek
#/app/Providers/TelescopeServiceProvider/**
* Register the Telescope gate.
*
* This gate determines who can access Telescope in non-local environments.
*
* @return void
*/
protected function gate()
{
Gate::define('viewTelescope', function ($user) {
return in_array($user->email, [
"tolga.karabulut@medianova.com"
]);
});
}
şeklinde yapabiliriz. Burada belirtiniz mail adresleri giriş yapmış kullanıcılar hariç kontrol paneline erişemeyeceklerdir. Burada JWT ile API sunucularında nasıl erişeceğimiz konusunu daha sonra anlatacağım.
İstekleri Filtreleme
Burada local ve production sunucularımız arasında izlenecek içerikleri düzenleyebiliriz. Varsayılan olarak şöyle görünüyor.
# app/Providers/TelescopeServiceProvideruse Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*
* @return void
*/
public function register()
{
// Telescope::night();
$this->hideSensitiveRequestDetails();
Telescope::filter(function (IncomingEntry $entry) {
/**
* Eğer uygulama local durumdaysa bir filtreleme uygulanmaz
*/
if ($this->app->environment('local')) {
return true;
}
/**
* Değilse
* Hatalı olan İstekler
* Planlanan Eylemler, Tamamlanmayan İşler
* vb. durumlar telescope üzerinde görüntülenmezler.
*/
return $entry->isReportableException() ||
$entry->isFailedRequest() ||
$entry->isFailedJob() ||
$entry->isScheduledTask() ||
$entry->hasMonitoredTag();
});
}
Etiketleme
Telescope üzerinde gelen istekleri bir etiket sistemi ile etiketleyerek daha sonra aramalarda daha rahat bulabiliriz. Bunun için şöyle bir yol izliyoruz.
# app/Providers/TelescopeServiceProvideruse Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
/**
* Register any application services.
*
* @return void
*/
public function register()
{
...
/**
* Eğer isteğin tipi "Request" ise isteğin durum koduna göre gruplamış
* oluyoruz.
*/
Telescope::tag(function (IncomingEntry $entry) {
return $entry->type === 'request'
? ['status:'.$entry->content['response_status']]
: [];
}); ...

Burada şu an tüm istekleri görüyoruz. Biz ise istekleri etiketlemiştik. Arama kısmana “status:404” yazarak “404 — Not Found” olanları filtreleyebiliriz.

İzleyiciler
İzlenen içeriklerin istenmeyen durumların filtreleme kısmında nasıl yönetilebileceğini öğrenmiş. Eğer tamamen takip edilmesini kapatmak veya açmak istiyorsak devreye izleyeciler giriyor. Şu şekilde ayarlayabiliriz.
# config/telescope.php/**
* Önbellek takibi => açık
* Komut Takibi => kapalı
* View Takibi => açık
* Bu şekilde istediğiniz izlemeleri kapatabilirsiniz.
**/'watchers' => [
Watchers\CacheWatcher::class => true,
Watchers\CommandWatcher::class => false,
Watchers\ViewWatcher::class => true,
...
],
Bazı izleyicilere ek ayar yapabilirsiniz. Örneğin;
'watchers' => [
.... Watchers\QueryWatcher::class => [
'enabled' => true,
'slow' => 100,
], ... Watchers\CommandWatcher::class => [
'enabled' => env('TELESCOPE_COMMAND_WATCHER', true),
'ignore' => ['key:generate'],
],
... Watchers\ModelWatcher::class => [
'enabled' => env('TELESCOPE_MODEL_WATCHER', true),
'events' => ['eloquent.created*', 'eloquent.updated*'],
],
...],/**
* Query Watcher
* Burada eğer bir SQL sorgusu 100ms den uzun sürerse size log olarak
* gösterilir.
*
*
* CommandWatcher
* Terminal üzerinden çalıştırdığımız komutlar takip edilirken
* ["key:generate"] komutunun takip edilmemesi gerektiğini söylüyoruz
*
*
* ModelWatcher
*
* Model üzerinde sadece "Create" -- "Updated" işlemlerinin takip
* edilmesini söylemiş oluyoruz.
**/
Diğer tüm detayları dosyayı inceleyerek ve döküman üzerinden inceleyebilirsiniz. Örnek projeye github üzerinden erişebilirsiniz.
Bir konunun daha sonuna geldik. Tüm sorularınızı konunun altına yazarak veya sosyal medya hesaplarım üzerinden iletebilirsiniz.
Herkese İyi Kodlamalar!
Tolga Karabulut
tolga.karabulut@medianova.com
Medianova CDN | Senior PHP Developer