Skip to content

Dashboard

The native_observability_dashboard submodule provides the operational dashboard. It is installed by the DASHBOARD preset (drush no:preset:dashboard), which also enables native_observability_execution, native_observability_database_observer, native_observability_report, and native_observability_status_block.

Overview tab of the dashboard, showing the primary KPI cards
The Overview tab over a 30 minute window: request count, average and P95 latency, error rate, and the duration breakdown between database, Drupal overhead and outbound HTTP.

Routes

Route Path Permission
native_observability_dashboard.overview /admin/reports/native-observability/dashboard access native observability dashboard
native_observability_dashboard.cache /admin/reports/native-observability/dashboard/cache access native observability dashboard
native_observability_dashboard.database /admin/reports/native-observability/dashboard/database access native observability dashboard
native_observability_dashboard.forensic_route_analysis /admin/reports/native-observability/dashboard/forensic-route-analysis access native observability dashboard
native_observability_dashboard.forensic_route_analysis_export_html /admin/reports/native-observability/dashboard/forensic-route-analysis/export/html access native observability dashboard
native_observability_dashboard.export /admin/reports/native-observability/export/{dataset} administer site configuration
native_observability_dashboard.flush /admin/reports/native-observability/flush/{dataset} administer site configuration
native_observability_dashboard.cache_runtime_records_export /admin/reports/native-observability/dashboard/cache/export/runtime-records access native observability dashboard
native_observability_dashboard.cache_route_bound_records_export /admin/reports/native-observability/dashboard/cache/export/route-bound-records access native observability dashboard

The export and flush routes require administer site configuration, a stricter permission than the tab routes. Grant it only to roles that should manage the underlying explorer cache, not to every dashboard viewer.

Tabs

The dashboard is built around OverviewController, CacheController, DatabaseController, and ForensicRouteAnalysisController. Each controller resolves a time range and delegates rendering to a dedicated builder service.

  • Overview (OverviewController). Primary KPI cards, the request timeline, AJAX activity, a response time breakdown donut, and the Technical Insights explorer (slow endpoints, AJAX endpoints, external requests). The donut covers every span in the window, which includes spans recorded outside a web request, such as outbound calls made by cron or drush.
  • Cache (CacheController). Cache observability charts and two record tables: runtime (orphan) events with no active HTTP route, and route-bound events captured inside a routed request.
  • Database (DatabaseController). Database pressure trend and request comparison charts, built from DashboardDatabaseBuilder.
  • Forensic Route Analysis (ForensicRouteAnalysisController). Cross-references traces, spans, and cache/database events for a selected route or trace. Supports a free-text search (q), subject filters (subjects[]), paginated evidence (evidence_page), paginated external dependencies (external_dependency_page), and an AJAX trace detail view (trace_id).

Range selection

Every tab shares DashboardTimeRangeResolver. The active range is read from the range query argument and validated against a fixed set of keys: 15m, 30m, 1h, 6h, 24h, 7d. An unknown or missing value falls back to the resolver default. The range selector rebuilds the current route with each key so switching ranges preserves the active tab and any other query arguments (search term, subjects, pagination).

flowchart LR
    A[Request with ?range=key] --> B{Key in allowed set?}
    B -- yes --> C[Use requested range]
    B -- no / missing --> D[Use default range]
    C --> E[Resolve start/end timestamps]
    D --> E
    E --> F[Builder service renders the tab]

Technical Insights export and flush

The Overview tab's Technical Insights explorer exposes three datasets: slow_endpoints (legacy alias slow), ajax_endpoints (legacy alias ajax), and external_requests (legacy alias external).

  • Export (TechnicalInsightsController::export) streams the dataset as CSV for the currently resolved range. external_requests exports target,method,calls,avg,errors; the other datasets export path,route,calls,avg,errors. An empty dataset returns 204 No Content. The download is named native-observability-<dataset>-<range>-<YYYYMMDD-HHMMSS>.csv.
  • Flush (TechnicalInsightsController::flush) invalidates the cache tags native_observability_dashboard, native_observability_dashboard:technical_insights, and native_observability_dashboard:<dataset>. It never deletes raw trace or span records; it only clears the dashboard-level render cache for that dataset.
Technical Insights explorer listing the slowest routes
The Technical Insights explorer under the Overview tab, on the Slow Endpoints dataset: call count, average duration and error count per route, with a per-row action to exclude a route from logging.
Modal showing captured requests and the full trace payload
Selecting a route opens the detail dialog: captured requests on the left, and the full trace payload with correlation metadata on the right, including the per-request database counters.
Forensic Route Analysis for a single route
Forensic Route Analysis after adding one subject. It correlates traces, spans and SQL for that route alone: status distribution, database pressure, cache signals, and request-by-request evidence.

Cache CSV exports

CacheController::exportRuntimeRecords and CacheController::exportRouteBoundRecords export the two cache record tables shown on the Cache tab, independently of the Technical Insights datasets above:

Export route Rows Filename
cache_runtime_records_export Cache events with no active HTTP route (orphan) native-observability-cache-orphan-records-<YYYYMMDD-HHMMSS>.csv
cache_route_bound_records_export Cache events captured inside a routed request native-observability-cache-route-bound-records-<YYYYMMDD-HHMMSS>.csv

Both exports share the same CSV columns: time, event_type, cache_layer, method, context, status. The timestamp in the filename is the request time, so exporting the same table twice does not overwrite the earlier file.

The cache and database observer settings that feed these tabs are documented in Configuration and Configuration.