Logo Webbouw Plus

Langzame queries debuggen in Laravel

juni 10, 2023

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.

Screenshot Laravel debug bar om langzame queries op te sporen

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"

In de boot methode kan je de functie `DB::listen` listen gebruiken.
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);
   }
});

Langzame queries loggen op productie

Op productie kan je hiervoor ongeveer dezelfde code gebruiken. In plaatse van de Log zou je ook de notificatie functionaliteit kunnen gebruiken.
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)
            };
        }
    });
}

Warning: Undefined array key "preview" in /home/tw109108/domains/webbouwplus.nl/public_html/wp-content/plugins/oxygen/component-framework/components/classes/comments-list.class.php on line 102

Warning: Undefined array key "preview" in /home/tw109108/domains/webbouwplus.nl/public_html/wp-content/plugins/oxygen/component-framework/components/classes/comments-list.class.php on line 113

Warning: Undefined array key "action" in /home/tw109108/domains/webbouwplus.nl/public_html/wp-content/plugins/oxygen/component-framework/components/classes/comments-list.class.php on line 113

Warning: Undefined array key "preview" in /home/tw109108/domains/webbouwplus.nl/public_html/wp-content/plugins/oxygen/component-framework/components/classes/comment-form.class.php on line 75

Warning: Undefined array key "preview" in /home/tw109108/domains/webbouwplus.nl/public_html/wp-content/plugins/oxygen/component-framework/components/classes/comment-form.class.php on line 79

WEBBOUWPLUS

Marcel van Doornen - Freelance Laravel developer
Marcel van Doornen, freelance Laravel developer
Ben je benieuwd hoe ik jou kan helpen?
Neem contact met mij op