Roadmap
Roadmap
Phase 1 — foundation (done)
- Connector layer:
MetricsSource/TracesSource/LogsSource, drivers for Prometheus, Mimir (tenanted), Tempo and Loki, lazyConnectionManagerwithextend(). - Schema autodetection: pages with
detectMetricpatterns; built-in Statamic page lights up when statamic-telemetry metrics exist. - Card/page registry, Livewire base
Card, gate + routes, ECharts bundle, period selector. (Replaced by panels + the SPA in v2.) - Tooling parity with
cboxdk/laravel-telemetry: Pest 4, PHPStan level 8, Pint, arch tests.
Phase 2 + 3 — full information architecture (done)
- Dashboard: requests (status-class stacked bars), duration (avg/p95), exceptions, jobs.
- Service/environment switcher in the sidebar, scoping PromQL, TraceQL and LogQL on every card.
- Requests (route table → trace drill-down), Jobs (outcomes, queue lag,
per-job table), Commands, Scheduled Tasks, Exceptions (chart + by-class
table + error-trace link), Queries (slowest query spans via TraceQL
spanSets), Cache (ops + hit ratio), Outgoing (per-host table), Mail &
Notifications, Users (sampled from
enduser.*traces), Logs (Loki viewer with search + trace-id links), System (memory/CPU/filesystem/network). - Traces: TraceQL search (raw query or quick filters, deep-linked from all drill-downs) + server-rendered waterfall with span attribute expansion.
- Dev environment: ../laravel-telemetry-demo (LGTM stack in one container with query APIs exposed).
Later polish
- Detection heuristics beyond a metric-name family (shape, cardinality).
- Exceptions grouping with first/last-seen (needs app-side state).
Done: short-TTL query cache (cache.ttl, cached GET responses so a busy
dashboard doesn't hammer the backends), transient-blip retries, route
throttling, auto-refresh polling.
Phase 4 — integrations (done)
- Issue trackers as a fourth signal (
IssuesSource): GitHub (issues + PRs, verified live), Sentry (issue groups) and Linear (GraphQL), config-gated Issues page. Add your own viaConnectionManager::extend(). - Actions: create a ticket from an exception — a
CreatesIssuescapability (GitHub, Linear) with a compose form in the drawer prefilled from the exception analysis; the drawer lands on the created ticket.
Phase 5 — correlation, drill-down & agents (done)
The things a generic, app-only or read-only dashboard can't do:
- Signal correlation — opening a trace surfaces the host/runtime signals
recorded around it (CPU, load, memory, network, RSS), each flagged against
its typical baseline. Config-driven and fail-open per signal; headless
Analysis\SignalContextis the reusable core. See correlation. - Purpose-built drill-down — routes/jobs/exceptions/hosts open dedicated
detail pages scoped to one entity (throughput → latency → status codes → its
traces), not a filtered trace search. Built on hidden pages + a
scopeMatchers()card hook +ScopesTo*traits, so overview cards are reused scoped. See custom detail pages. - Dimensional filtering — every trace attribute is a click-to-filter link; a Hosts page lists every reporting server.
- Annotations, written —
telemetry-ui:annotateemits deploy/incident/… markers through the telemetry pipeline;telemetry-ui:scan-versionsproactively annotates un-announced deploys. See annotations. - MCP server — metrics/traces/logs + the correlation tools over the Model
Context Protocol (stdio, or HTTP with OAuth 2.1 + DCR via
laravel/passport), so an agent can drive incident RCA. See MCP.
Production hardening (done)
- Backend failures log full detail server-side but show a generic message in
the UI (no endpoint/body leak); MCP web fails loud on a half-configured OAuth
setup; MCP tools are bounded (row/series/window caps + throttle); correlation
baselines are cached;
tagValueslookups are time+limit bounded. - Feature-tested drill-down/detail pages, dimensional filtering, and the info-leak boundary.
v2 — JSON API + React SPA (done, 2.0.0)
Plan: v2 architecture · implementation plan · ADR 0003.
-
Livewire removed. Cards became framework-free panels returning typed payloads (
Panels\Panel,Panels\Ui); the registry, config key and built-in classes renamed accordingly. -
Versioned JSON API under
{path}/api/v2with typed errors and an SSE live tail; the gate and scope lock run on every endpoint. -
React + Vite + TypeScript SPA (TanStack Query/Router/Virtual, ECharts as a lazy chunk), committed to
public/buildso hosts need no Node. -
Dimensions as a first-class primitive (
TelemetryUi::dimension()), Explore over requests/traces/logs/errors with facets and group-by, and generated entity pages that tell a story instead of dumping attributes. -
Stacked, deep-linkable drawer (
?drawer=), ⌘K palette, brush-to-zoom on the global range, live tail over SSE with a polling fallback. -
Developer integrations: names instead of ids (
resolve()), derived dimensions read out of another attribute, route families as pages, and declared metric panels for sidecars in other languages. -
Embeddable React components for host apps, installed from
vendor/as an npm package — the replacement for the 1.x Livewire widgets.
1.x keeps a maintenance branch (1.x) for fixes. Still open: token auth for
an externally hosted SPA.
Next
- AI triage/chat on a trace, exception or incident (streamed over SSE),
building on the MCP tools and
SignalContext. - Post-to-Slack action alongside ticket creation.
- Threshold / alert hints.
- Detection heuristics beyond a metric-name family (shape, cardinality).