A systematic workflow for N+1 detection
Telescope makes N+1 debugging a structured three-step process rather than a guessing game.Find the slow request
Open
/telescope and go to the Requests tab. Sort by duration to find the slowest request.Inspect the query list
Click the request to open its detail view. Look for a pattern of nearly identical SELECT statements repeating many times.
Tag-based tracking for targeted filtering
Telescope supports tags on entries. CallingTelescope::tag() lets you attach arbitrary strings to entries, which you can then use to filter the dashboard to exactly what you care about.
This is especially useful when you want to isolate all activity related to a specific user ID or order ID.
user:42 into the search bar on /telescope/requests instantly filters to only that user’s requests.
Automatic model tags
You can also implement theHasTags contract on a model so that Telescope automatically tags every entry associated with that model.
Using the Dump watcher
Usingdump() in a controller pollutes the HTML response and breaks JSON APIs. The Telescope Dump watcher solves this by capturing dump() output in the dashboard rather than inline in the response.
Open the Dump tab in /telescope first, then call dump() in your code.
dd(), the Dump watcher does not halt execution. You can leave dump() calls in place while running a series of requests and review all the captured output at once.
Pairing Telescope with Mailpit
The Mail watcher shows rendered previews of outgoing emails directly in the Telescope dashboard. Combine it with Mailpit for the most complete local email workflow.Debugging event-driven flows
When debugging event-driven code, the two most common questions are “did the event fire?” and “which listener handled it?”. The Events watcher answers both without requiring any log statements. If a listener is not being called, check the Telescope Events tab:- Event appears but no listener is shown → the listener is not registered (check
EventServiceProvider) - Event does not appear at all → the
event()call is not being reached
Queue job debugging with sync driver
Async jobs are hard to trace because they run in a separate process. Temporarily switching to the sync queue driver makes jobs run inline during the request, so they appear in the same Telescope request entry as the controller that dispatched them.queue:failed entries and reconstructing the context manually.
HTTP client request inspection
When integrating with external APIs, the HTTP Client watcher records every outgoingHttp:: request with its URL, headers, response status, body, and duration.
dd($response->json()) calls when investigating unexpected API responses.
Summary
| Technique | What it solves |
|---|---|
| N+1 workflow | Find and fix query problems without debug code |
| Tag-based tracking | Filter to a specific user or model instantly |
| Dump watcher | Capture dump output without breaking responses |
| Mailpit pairing | Complete local email debugging without real sends |
| Events watcher | Confirm event firing and listener registration visually |
| Jobs + sync driver | Trace async jobs inline with their dispatching request |
| HTTP client watcher | Inspect outgoing API calls without dd() |
Laravel Telescope guide
Installation and watcher configuration reference.
Laravel Nightwatch
For production monitoring, use Nightwatch.