Artikel hoe je langzame queries kan debuggen/tracken in Laravel.
Met de Laravel Debug Bar kan je bij het ontwikkelen kijken welke queries problemen geven zoals de N+1 maar ook de snelheid zodat je kan zien dat je een index bent vergeten te zetten.
Automatisch langzame queries loggen
Alleen moet je hier wel actief naar kijken en op productie heb je deze debug bar uiteraard niet.
In `app/Providers/AppServiceProvider.php` kan je een functie zetten die alle queries teruggeeft.
Hierbij ook de ‘time’ hoe lang hij over de query heeft gedaan, mooi dus om hier trage queries te gaan tracken.
Voorbeeld wat je terug krijgt
<!--?php
Illuminate\Database\Events\QueryExecuted {#535 ▼
+sql: "select * from `users` where `id` = ? and `users`.`deleted_at` is null limit 1"
+bindings: array:1 [▶]
+time: 2.76
+connection: Illuminate\Database\MySqlConnection {#534 …24}
+connectionName: "mysql"
</pre>
<p>In de boot methode kan je de functie `DB::listen` listen gebruiken.<br ?-->
Hier onder een voorbeeld hoe ik deze gebruik in een project. Ik gebruik Ray (van Spatie) als debug logger maar je kan natuurlijk ook de Log functie van Laravel zelf gebruiken.
<!--?php DB::listen(function($query) { if ($query->time > 50 && !app()->environment('production')) {
ray('Slow query', $query);
}
});
</pre>
<h2>Langzame queries loggen op productie</h2>
<p>Op productie kan je hiervoor ongeveer dezelfde code gebruiken. In plaatse van de Log zou je ook de notificatie functionaliteit kunnen gebruiken.<br ?-->
Ikzelf gebruik Honeybadger als error tracking applicatie.
Hier laat ik ook de meldingen van trage queries op binnenkomen.
Mijn DB::listen in de boot method()
<?php /** * Bootstrap any application services. */ public function boot(): void { DB::listen(function($query) { if ($query->time > 500) {
$queryInfo = [
'sql' => $query->sql,
'binding' => $query->bindings,
'time' => $query->time
];
match(app()->environment('production')) {
true => Log::channel('honeybadger')->error('Slow query', $queryInfo),
false => ray('Slow query', $queryInfo)
};
}
});
}