Layer 1 — Exceptions
The minimum-viable production monitoring. Every uncaught exception needs to surface somewhere within minutes — not days.
What you want per exception:
- Grouping by fingerprint (10,000 occurrences of the same exception should be one issue)
- Full stack trace with request context (URL, user, input)
- First seen / last seen / occurrence count per group
- Alert channel (Slack, Discord, Email) with rate limiting to prevent spam during incidents
- Status management (open / resolved / ignored) to track triage
Layer 2 — Slow queries
SQL is the number-one source of Laravel performance pain. Monitoring requires per-pattern aggregation, not per-query logs.
What you want:
- Query fingerprinting (bind-parameter normalization so 10K executions roll up into one pattern)
- Per-pattern p95 duration over any time range
- N+1 detection across real traffic (not just local dev)
- Correlation to the route/request that fired each query
→ Slow query guide · N+1 detection
Layer 3 — Queue workers and jobs
Queued work is where silent failures live. Users don't see the error — the job just doesn't run. Essential signals:
- Failure rate per job class (not aggregate)
- p95 runtime per job class
- Queue lag — time from dispatch to start
- Worker health — are workers processing? Any crashes?
→ Queue monitoring · Failed job monitoring
Layer 4 — Scheduled tasks
The easiest thing to forget. If cron stops running, you might not notice for days.
- Invocation history (did it run? when?)
- Duration per task (growing durations = trouble)
- Missed-run detection (scheduler itself stopped)
- Dead-man's-switch alert — alert when no tasks have run in N minutes
Layer 5 — Request latency
Average latency lies. You want p95 per route pattern, with trending.
- p50, p95, p99 per route pattern
- Time-series trending (regressions on deploy)
- Request drill-down — for a slow request, see every DB query and external call
- Error rate per route (separate from exception tracking — 5xx as a metric)
→ Slow endpoints · p95 latency
What NOT to prioritize early
Things that look important but aren't where most teams spend their first monitoring dollar:
- Real-user monitoring (RUM) — browser-side latency. Useful eventually, overkill for monolithic Laravel apps early on.
- Distributed tracing — only matters if you have multiple services. One Laravel app = request-level tracing is enough.
- Infrastructure metrics — CPU, disk, memory. Your hosting provider's dashboards cover this.
- Synthetic transaction monitoring — scripted browser replays. Valuable for specific user journeys but lots of setup.
Tool recommendation by team size
| Team | Tools | Monthly cost |
|---|---|---|
| Solo dev | NightOwl Hobby or Nightwatch Cloud + UptimeRobot free | $0-5 |
| Small team (2-10) | NightOwl Team $15 + BetterUptime $29 | $44 |
| Agency (multi-client) | NightOwl Agency $69 (unlimited apps) | $69 |
| Enterprise (compliance) | NightOwl BYOD + ELK self-host + Datadog for infra | $500+ |
THE EASY WAY
NightOwl covers all five layers in one install
Exceptions, queries, jobs, scheduled tasks, requests, cache, mail, notifications, outgoing HTTP — every Laravel watcher in one dashboard, all in your own PostgreSQL.
composer require nightowl/agent
php artisan nightowl:installFrom $5/month flat. 14-day free trial.