See what each request did, inside the app.

An opt-in diagnostics dashboard at /_lookout, built from the spans the framework already emits. Each request, job, command and scheduled task becomes a batch of what it did.

What you get

  • Queries, cache, outbound HTTP, jobs, mail, events, logs and failures, side by side per batch.
  • Slow thresholds (queries 100 ms, requests 1 s) and N+1 detection.
  • Scope by route, guard or user; sample per kind of work and per watcher.
  • Memory, database or cache-ring-buffer storage.
  • Hidden by default: a 404 outside APP_ENV=local unless the viewer passes viewLookout.
  • Nothing on the request path waits for it.

In the docs

src/bootstrap.rs
use rainier_framework::lookout::config::{Patterns, Scope, WatcherConfig};
use rainier_framework::lookout::EntryType;

Rainier::new(".")
    .with_lookout(|lookout| {
        lookout
            .scope(Scope {
                routes: Patterns { include: vec![], exclude: vec!["health".into()] },
                jobs: true,
                commands: true,
                scheduled_tasks: true,
                ..Scope::default()
            })
            .watch(EntryType::Cache, |w| WatcherConfig { sample_rate: 0.1, ..w })
            .keep_batch_if(|batch| batch.has_exception || batch.duration_us > 250_000)
    })

Up close

Select an image to see it full size.

One request, everything it caused: three queries, the PostPublished event, its broadcast, the queued job, the notification and the mail it rendered, on one timeline.
A query over the slow threshold is recorded twice: as the query, and as a slow entry naming the threshold it crossed, so it shows up on the Slow page without searching.
Exceptions are grouped by fingerprint (kind and message), so four validation failures are one row with a count, and boot-time configuration warnings sit beside request failures.
Every watcher can be switched and sampled separately; the slow thresholds (requests 1 s, queries 100 ms) are the defaults Lookout ships with.
All features

Type to search 2.0.0 docs.