endeavour-agency / laravel-query-insights
This packages aims to provide insights into performed queries. Multiple handlers exist to control what should be done with the query data.
Requires
- php: ^8.2
- laravel/framework: ^11
Requires (Dev)
- mockery/mockery: ^1.6
- nuwave/lighthouse: ^6.45
- orchestra/testbench: ^9
- phpunit/phpunit: ^11.3
This package is auto-updated.
Last update: 2025-03-13 13:34:39 UTC
README
This package aims to provide query insights. By default, it comes with two handlers:
LogHandler
: Writes the executed queries to a log fileLighthouseResponseHandler
: Adds the executed queries to the extensions section of a Lighthouse GraphQL response.
Getting started
To get started, simply install the package.
composer require endeavour-agency/laravel-query-insights
Then, in a service provider, register the desired handlers with the QueryCollectorInterface
.
public function register(): void { $collector = $this->app->make(QueryCollectorInterface::class); $collector ->registerHandler( $this->app->make(LogHandler::class), ) ->registerHandler( $this->app->make(LighthouseResponseHandler::class), ); }
Configuration
The package comes with a configuration file which can be published through
php artisan vendor:publish --provider=EndeavourAgency\\LaravelQueryInsights\\Providers\\LaravelQueryInsightsProvider
Through the configuration file, the insights can be enabled or disabled. By default, insights will only
be enabled if config('app.debug')
evaluates to true
.
Alternatively, insights can be enabled or disabled through the QUERY_INSIGHTS_ENABLED
env variable.
Handlers
The package bundles a few handlers to get you started quickly.
Log handler
The log handler will log all executed queries to a log file. It accepts an instance of the Psr\Log\LoggerInterface
.
By default, it will log the queries to the default log channel (config('logging.default')
).
Example log handler output:
[2024-11-08 14:27:30] local.INFO: Queries: POST http://localhost:8000/graphql {"queries":[{"query":"select * from `users` where `email` = 'john@doe.com' and `users`.`deleted_at` is null limit 1","sql":"select * from `users` where `email` = ? and `users`.`deleted_at` is null limit 1","bindings":["john@doe.com"],"time":1.54}]}
[2024-11-08 14:27:31] local.INFO: Queries: POST http://localhost:8000/graphql {"queries":[{"query":"select * from `users` where `email` = 'jane@doe.com' and `users`.`deleted_at` is null limit 1","sql":"select * from `users` where `email` = ? and `users`.`deleted_at` is null limit 1","bindings":["jane@doe.com"],"time":1.51}]}
Lighthouse Response Handler
The Lighthouse response handler will add executed queries to the extensions section of the GraphQL responses bodies, when using Lighthouse.
Example Lighthouse response handler output:
{ "data": { "me": { "email": "john@doe.com" } }, "extensions": { "queries": [ { "query": "select * from `oauth_access_tokens` where `id` = '******' limit 1", "sql": "select * from `oauth_access_tokens` where `id` = ? limit 1", "bindings": [ "******" ], "time": 1.51 }, { "query": "select * from `users` where `id` = '17' and `users`.`deleted_at` is null limit 1", "sql": "select * from `users` where `id` = ? and `users`.`deleted_at` is null limit 1", "bindings": [ "17" ], "time": 0.45 } ] } }
Custom handlers
To create your own handler, simply create a class that implements the EndeavourAgency\LaravelQueryInsights\Contracts\HandlerInterface
interface. Then, register it like you would with the default handlers (see Getting started).