Laravel Pulse &amp; Telescope: Production Observability | Mohamed Said       [Skip to content](#main)  [ ![](https://cdn.msaied.com/01KT78WE565VEMM3PSNQAAB0MH.png) Mohamed SaidLaravel Backend Engineer ](https://msaied.com) - [Home](https://msaied.com)
- [Projects](https://msaied.com/projects)
- [Articles](https://msaied.com/articles)
- [Certificates](https://msaied.com/certificates)
- [About](https://msaied.com#about)

           [  Contact](https://msaied.com#contact) Menu 

Menu
----

Close 

 - [HomeStart here](https://msaied.com)
- [ProjectsCase studies](https://msaied.com/projects)
- [ArticlesEngineering notes](https://msaied.com/articles)
- [CertificatesCredentials](https://msaied.com/certificates)
- [AboutHow I work](https://msaied.com#about)
- [ContactGet in touch](https://msaied.com#contact)

  [Start a conversation](https://msaied.com#contact) [WhatsApp](https://wa.me/201094619204) [Email](mailto:hello@msaied.com) 

 1. [Home](https://msaied.com)
2. /
3. [Articles](https://msaied.com/articles)
4. /
5. Laravel Telescope Alternatives: Structured Observability with Pulse, Debugbar, and Custom Watchers

 Laravel Telescope Alternatives: Structured Observability with Pulse, Debugbar, and Custom Watchers
===================================================================================================

 Telescope is convenient but not always production-safe. Learn how to combine Laravel Pulse, custom Telescope watchers, and structured logging to build a layered observability stack that scales.

 ![](https://cdn.msaied.com/01M22N44A70A5MC2S599JP0MPH.webp) [Mohamed Said](https://msaied.com#person) Published 4 Oct 2026 · Updated 4 Oct 2026 · 4 min read

ShareCopy linkCopied

 ![Laravel Telescope Alternatives: Structured Observability with Pulse, Debugbar, and Custom Watchers](https://cdn.msaied.com/737/f5c7e78a645325d4cff8d43f2835f136.png) 

  On this page +1. [The Problem with Telescope in Production](#the-problem-with-telescope-in-production)
2. [Layer 1: Laravel Pulse for Aggregate Metrics](#layer-1-laravel-pulse-for-aggregate-metrics)
3. [Layer 2: Custom Telescope Watchers (Opt-In)](#layer-2-custom-telescope-watchers-opt-in)
4. [Layer 3: Structured Logging with Context](#layer-3-structured-logging-with-context)
5. [Putting It Together](#putting-it-together)
6. [Key Takeaways](#key-takeaways)

 The Problem with Telescope in Production
----------------------------------------

Laravel Telescope is indispensable during development, but running it in production without constraints is a liability. Every request, query, and job gets recorded synchronously (or near-synchronously), inflating your database and adding latency. The common advice — "just disable it in production" — throws away genuinely useful signal.

A better approach is a layered observability stack: **Pulse** for aggregate metrics, **selective Telescope watchers** for targeted deep-dives, and **structured log channels** for the rest.

---

Layer 1: Laravel Pulse for Aggregate Metrics
--------------------------------------------

Pulse (shipped with Laravel 11+) records aggregate data — slow queries, slow jobs, exception counts, queue throughput — into a dedicated `pulse_*` table set, using Redis as a buffer before flushing. It is designed to be always-on.

```php
// config/pulse.php — trim what you don't need
'recorders' => [
    \Laravel\Pulse\Recorders\Exceptions::class => [
        'enabled' => env('PULSE_EXCEPTIONS_ENABLED', true),
        'sample_rate' => 1.0,
        'ignore' => [
            '\Symfony\Component\HttpKernel\Exception\NotFoundHttpException',
        ],
    ],
    \Laravel\Pulse\Recorders\SlowQueries::class => [
        'enabled' => true,
        'threshold' => 500, // ms
        'sample_rate' => 0.25, // record 25% of slow queries
    ],
    \Laravel\Pulse\Recorders\Queues::class => [
        'enabled' => true,
        'queues' => ['default', 'critical'],
    ],
],

```

The `sample_rate` key is the most important tuning lever. At high traffic you rarely need 100% of slow-query samples — 25% gives you statistical confidence without the write pressure.

---

Layer 2: Custom Telescope Watchers (Opt-In)
-------------------------------------------

Instead of enabling all watchers, register only what you need and gate them behind a feature flag or environment variable.

```php
// app/Providers/TelescopeServiceProvider.php
use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
use Laravel\Telescope\Watchers;

public function register(): void
{
    Telescope::night(); // dark mode — cosmetic, but appreciated

    $this->hideSensitiveRequestDetails();

    Telescope::filter(function (IncomingEntry $entry) {
        // In production, only keep slow queries and exceptions
        if (app()->isProduction()) {
            return $entry->isReportableException()
                || ($entry->type === 'query' && ($entry->content['slow'] ?? false))
                || $entry->type === 'job';
        }
        return true;
    });
}

```

Pair this with a **custom watcher** for a domain-specific concern — say, recording every time a payment intent is created:

```php
namespace App\Telescope;

use Laravel\Telescope\IncomingEntry;
use Laravel\Telescope\Telescope;
use Laravel\Telescope\Watchers\Watcher;
use App\Events\PaymentIntentCreated;

class PaymentWatcher extends Watcher
{
    public function register($app): void
    {
        $app['events']->listen(
            PaymentIntentCreated::class,
            function (PaymentIntentCreated $event) {
                Telescope::recordEvent(
                    IncomingEntry::make([
                        'intent_id' => $event->intentId,
                        'amount' => $event->amountInCents,
                        'currency' => $event->currency,
                    ])->type('payment_intent')
                );
            }
        );
    }
}

```

Register it in `config/telescope.php`:

```php
'watchers' => [
    App\Telescope\PaymentWatcher::class => true,
    // ... other watchers
],

```

---

Layer 3: Structured Logging with Context
----------------------------------------

For everything that shouldn't hit a database at all, use a structured log channel. Laravel's `Log::withContext()` propagates shared fields across all log calls within a request lifecycle.

```php
// app/Http/Middleware/RequestContextLogger.php
public function handle(Request $request, Closure $next): Response
{
    Log::withContext([
        'request_id' => $request->header('X-Request-Id', (string) str()->uuid()),
        'user_id' => $request->user()?->id,
        'tenant_id' => $request->user()?->tenant_id,
    ]);

    return $next($request);
}

```

Configure a `stderr` channel with `json` formatter for container environments:

```php
// config/logging.php
'production' => [
    'driver' => 'monolog',
    'handler' => \Monolog\Handler\StreamHandler::class,
    'with' => ['stream' => 'php://stderr'],
    'formatter' => \Monolog\Formatter\JsonFormatter::class,
    'level' => 'info',
],

```

This feeds cleanly into Datadog, Loki, or any log aggregator without a database write per event.

---

Putting It Together
-------------------

| Concern | Tool | Storage | |---|---|---| | Aggregate throughput &amp; slow queries | Pulse | Redis → DB (buffered) | | Deep request inspection (dev/staging) | Telescope (all watchers) | DB | | Domain events in production | Custom Telescope watcher | DB (filtered) | | High-volume request logs | Structured stderr logging | Log aggregator |

---

Key Takeaways
-------------

- **Never run all Telescope watchers in production** — use `Telescope::filter()` to keep only exceptions, slow queries, and jobs.
- **Pulse is designed for production** — tune `sample_rate` and `threshold` per recorder to control write volume.
- **Custom watchers** let you record domain-specific events without instrumenting every request.
- **Structured logging with `Log::withContext()`** gives you request-scoped correlation IDs at zero database cost.
- Treat observability as a stack, not a single tool — each layer has a different cost/fidelity tradeoff.

- [laravel](https://msaied.com/articles?search=laravel)
- [observability](https://msaied.com/articles?search=observability)
- [telescope](https://msaied.com/articles?search=telescope)
- [pulse](https://msaied.com/articles?search=pulse)
- [logging](https://msaied.com/articles?search=logging)

 Frequently asked questions 
---------------------------

  Is it safe to run Laravel Telescope in production?Yes, if you apply a strict `Telescope::filter()` callback that limits recording to exceptions, slow queries, and jobs. Without filtering, Telescope records every request and query synchronously, which adds database writes on every HTTP hit.

   How does Laravel Pulse differ from Telescope for production use?Pulse records aggregated metrics (counts, averages, percentiles) buffered through Redis before flushing to the database, making it far cheaper per request. Telescope records full request/response payloads per entry, which is richer but more expensive at scale.

   Can I create a Telescope watcher for my own domain events?Yes. Extend `Laravel\\Telescope\\Watchers\\Watcher`, implement the `register()` method to listen to any event or hook, and call `Telescope::recordEvent()` with an `IncomingEntry`. Register the class in the `watchers` array in `config/telescope.php`.

   ![Mohamed Said](https://cdn.msaied.com/01M22N44A70A5MC2S599JP0MPH.webp)About the author
----------------

[Mohamed Said](https://msaied.com#person)Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

[About](https://msaied.com#about) [GitHub ↗](https://github.com/EG-Mohamed) [LinkedIn ↗](https://www.linkedin.com/in/msaiedm/) [WhatsApp ↗](https://wa.me/201094619204) [Email Address ↗](mailto:hello@msaied.com) [My CV ↗](https://drive.google.com/file/u/0/d/1MF20IPRJyzfy32mhEutjL5EpSls0w2Q8/view)  

   [Previous articleLaravel 13: New Features, Helpers, and Upgrade Notes](https://msaied.com/articles/laravel-13-new-features-helpers-and-upgrade-notes)  

   On this page
-------------

1. [The Problem with Telescope in Production](#the-problem-with-telescope-in-production)
2. [Layer 1: Laravel Pulse for Aggregate Metrics](#layer-1-laravel-pulse-for-aggregate-metrics)
3. [Layer 2: Custom Telescope Watchers (Opt-In)](#layer-2-custom-telescope-watchers-opt-in)
4. [Layer 3: Structured Logging with Context](#layer-3-structured-logging-with-context)
5. [Putting It Together](#putting-it-together)
6. [Key Takeaways](#key-takeaways)

 ###  Have a technical challenge?

 Tell me what you’re building. I reply within two working days.

[Start a conversation](https://msaied.com#contact) 

   Related articles
-----------------

 [ ![](https://cdn.msaied.com/736/98f6737af2ba4cdcc7400bc7fcab2439.png)  · 3 min read### Laravel 13: New Features, Helpers, and Upgrade Notes

4 Oct 2026 ](https://msaied.com/articles/laravel-13-new-features-helpers-and-upgrade-notes) [ ![](https://cdn.msaied.com/735/2b11b2815a5984a8e3ab654b67f9af60.png)  · 4 min read### Laravel New in 12: First-Class Typed Config, Fluent Routing, and Upgrade Notes

3 Oct 2026 ](https://msaied.com/articles/laravel-new-in-12-first-class-typed-config-fluent-routing-and-upgrade-notes) [ ![](https://cdn.msaied.com/731/7cabd03b86a18f1db2c9ff7de1510270.png)  · 3 min read### Laravel Octane + FrankenPHP: Request Lifecycle, Shared State, and Safe Singleton Patterns

3 Oct 2026 ](https://msaied.com/articles/laravel-octane-frankenphp-request-lifecycle-shared-state-and-safe-singleton-patterns) 

  Have a technical challenge?
----------------------------

Tell me what you’re building. I reply within two working days.

 [Discuss your project ↗](https://msaied.com#contact) 

  © 2026 Mohamed Said · Built with Laravel, meant to last.Senior Backend Engineer specializing in Laravel, scalable SaaS platforms, APIs, and cloud infrastructure. I build secure, high-performance web applications that help businesses grow.

 - [Home](https://msaied.com)
- [Articles](https://msaied.com/articles)
- [Certificates](https://msaied.com/certificates)
- [GitHub](https://github.com/EG-Mohamed)
- [LinkedIn](https://www.linkedin.com/in/msaiedm/)
- [WhatsApp](https://wa.me/201094619204)
- [Email Address](mailto:hello@msaied.com)
- [My CV](https://drive.google.com/file/u/0/d/1MF20IPRJyzfy32mhEutjL5EpSls0w2Q8/view)
- [Sitemap](https://msaied.com/sitemap.xml)
