Performance Logging¶
The dashboard writes structured JSONL timing events to:
/data/aurora/products/dashboard/dashboard_perf.jsonl
The log rotates automatically.
aurora-dashboard-perf-summary.timer runs every 15 minutes and writes derived
watch files under:
/data/aurora/products/dashboard/perf_summaries/latest_24h.json/data/aurora/products/dashboard/perf_summaries/latest_24h.md/data/aurora/products/dashboard/perf_summaries/history_24h.jsonl
The JSON and Markdown files are the latest 24 h view. The history JSONL keeps one summary record per timer run, so we can look back at usage, slow renders, session counts, and frequently changed controls even after the raw timing log rotates. Session summaries include mobile/tablet/desktop/bot counts derived from user agents plus the most common request paths, which helps separate phone-specific loading problems from desktop/browser workflows.
Operations monitoring records whether this log exists, how large it is, and
when it was last written. The Operations Dashboard shows that as the
Dashboard perf log card so stale browsing telemetry is visible alongside the
source-transfer checks. It also reads recent timed events directly and reports
the current render-performance summary, including p50, p95, the slowest event,
and the maximum live browser-session count seen in the sampled log window.
These performance signals are diagnostic only; they do not drive the
Operations Dashboard Overall action state or the health report's
overall_level.
Environment controls¶
AURORA_DASHBOARD_PERF_LOGAURORA_DASHBOARD_PERF_LOG_MAX_BYTESAURORA_DASHBOARD_PERF_LOG_BACKUP_COUNTAURORA_DASHBOARD_PERF_ENABLEDAURORA_DASHBOARD_SESSION_HEARTBEAT_MSAURORA_DASHBOARD_ASSET_PREFIXAURORA_RENDER_DEBOUNCE_MSAURORA_INTERACTIVE_RENDER_CACHE_SIZEAURORA_INTERACTIVE_MAX_TIME_SAMPLESAURORA_POWER_INTERACTIVE_MAX_TIME_SAMPLESAURORA_MET_INTERACTIVE_MAX_TIME_SAMPLESAURORA_RADIATION_INTERACTIVE_MAX_TIME_SAMPLESAURORA_OPS_INTERACTIVE_MAX_TIME_SAMPLESAURORA_SUMMARY_COARSE_TIME_SAMPLESAURORA_POWER_LATEST_CACHE_ROUND_MINUTESAURORA_POWER_LATEST_CACHE_TOLERANCE_MINUTESAURORA_PREWARM_LATEST_CACHE_TOLERANCE_MINUTESAURORA_DASHBOARD_PREP_WORKERSAURORA_POWER_PREWARM_WORKERSAURORA_POWER_PREWARM_MAX_TIME_SAMPLESAURORA_POWER_GENERAL_CACHE_ROUND_MINUTESAURORA_POWER_DISPLAY_SUMMARY_FREQAURORA_POWER_DISPLAY_ENERGY_FREQAURORA_MEASURE_PLOT_JSON_BYTESPOWER_DISPLAY_SUMMARY_ZARR_PATHPOWER_DISPLAY_ENERGY_ZARR_PATHAURORA_INTERACTIVE_PREWARM_DIRAURORA_OPS_TREND_CACHE_TTL_MINUTESAURORA_OPS_TREND_DAYSAURORA_QUICKLOOK_MAX_TIME_SAMPLES
AURORA_DASHBOARD_SESSION_HEARTBEAT_MS defaults to 0, which disables
per-session heartbeat logging. That avoids keeping mobile browser sessions
alive on the server after the phone has backgrounded or killed the tab.
The dashboard logo and shared stylesheet are served as normal static assets
under AURORA_DASHBOARD_ASSET_PREFIX, rather than being embedded in every HTML
document. This lets browsers cache them independently of the live dashboard
document and prevents the same CSS from being repeated in Panel models.
The native Power API bounds each trace to AURORA_MOBILE_POWER_MAX_POINTS
(default 160) using per-bucket extrema, preserving visible peaks and dips
without asking Swift Charts to draw thousands of points. The offline Power
prewarm writer uses up to AURORA_POWER_PREWARM_WORKERS processes (default
2) only for JSON serialization; it does not share or mutate live Zarr or
Panel state.
Browser Power prewarms use AURORA_POWER_PREWARM_MAX_TIME_SAMPLES (default
120, capped at 700) per trace. Sampling retains the local minimum and
maximum of each time bucket, so short load and voltage events remain visible
while the first browser payload stays compact.
AURORA_DASHBOARD_PREP_WORKERS defaults to 2 and is capped at 4. It is
used only for custom browser Power windows that cannot use prewarmed JSON.
The executor prepares Zarr/NumPy/Plotly data away from the Panel event loop;
the finished figure is committed through a document callback. A new control
change cancels the awaiting stale request, so only the newest completed result
can update the browser.
Useful commands¶
tail -f /data/aurora/products/dashboard/dashboard_perf.jsonl
/opt/aurora-cloud-dashboard/venv/bin/python summarize_dashboard_perf.py --hours 24
/opt/aurora-cloud-dashboard/venv/bin/python summarize_dashboard_perf.py --hours 6 --event interactive_view_update
cat /data/aurora/products/dashboard/perf_summaries/latest_24h.md
tail -n 20 /data/aurora/products/dashboard/perf_summaries/history_24h.jsonl
systemctl status aurora-dashboard-perf-summary.timer
journalctl -u aurora-dashboard-perf-summary.service --since '1 hour ago' --no-pager
Logged event families¶
base_dataset_opendataset_time_boundsdataset_time_bounds_cache_hitinteractive_render_deferredinteractive_render_cache_hitinteractive_render_debouncedinteractive_prewarm_loadinteractive_prewarm_load_asyncpower_background_prepare_scheduledpower_background_preparewindow_openpower_display_summary_openpower_display_summary_windowpower_display_section_openpower_display_energy_openpower_display_energy_windowinteractive_view_updateinteractive_render_budget_exceededhatpro_renderstacked_timeseries_renderscience_quicklook_renderhousekeeping_quicklook_renderwxcam_interactive_renderwxcam_calendar_optionswxcam_calendar_day_viewwxcam_calendar_syncoperations_dashboard_rendersession_loadedsession_heartbeatsession_destroyedui_selection_changeplot_relayout
The interactive browser also uses a few runtime behaviors that affect how these events should be interpreted:
- per-instrument pane reuse keeps the last rendered view warm while a refresh is queued
- exact interactive views are cached for the most recent instrument/window combinations, so returning to a recent view can repaint immediately
- rapid widget-change bursts are debounced before rendering to avoid duplicate back-to-back Plotly builds
- dataset time bounds and latest timestamps are cached briefly
- the periodic metadata timer invalidates timestamp bounds only; open Zarr handles are reopened by the live-refresh path when they age past the configured data-refresh interval
- stale-render protection drops older queued renders before they can repaint the page
- custom Power preparations run in the bounded background executor; cancelling a superseded request never mutates the active Bokeh document
- the matching cached Science Quicklook is shown first when available, otherwise a loading skeleton is shown for uncached views
- the initial interactive render is deferred until the browser session is loaded, which keeps application startup from blocking on a full Plotly build
- the heavier 2D interactive plots use a coarse-first pass before a full detail pass replaces it
- Power interactive plots use the same display-time preparation and per-trace time downsampling approach as the quicklooks, with display-only sanity limits for impossible APS values
- Power summary traces are read from section-specific one-minute display Zarrs when available: Current Conditions opens only observed variables and Forecast & Planning opens only forecast variables. The legacy combined display-summary and display-energy Zarrs remain compatibility fallbacks. Latest Power, Meteorology, and Radiation interactive figures can be loaded from prewarmed Plotly JSON created by their quicklook generators
- the live Power 24 h window is rounded into 5-minute cache buckets, so a small latest-timestamp change does not force an immediate full rebuild
- fixed-summary instruments use instrument-specific display-time sample caps; this changes only the browser/PNG rendering density, not the ingested Zarr data
- inactive quicklook and operations tabs are lazy-loaded the first time the user opens them
- interactive freshness and availability bars are also delayed until after the page opens, so first paint does not wait for a full timestamp scan
- empty interactive views report the selected UTC window and suggest the next useful check instead of showing a bare blank plot
Session context¶
When available, events also carry:
session_idlive_sessionsserver_sessionstotal_sessionssession_age_sbusy
stacked_timeseries_render events include phase timings for the main render
path:
source_open_mscombine_msfigure_build_mssource_window_countsource_window_time_countssource_window_var_countscombined_var_countplot_trace_countplot_points_totalplot_points_minplot_points_max- optional
plot_json_byteswhenAURORA_MEASURE_PLOT_JSON_BYTES=1
These fields make it easier to distinguish slow Zarr reads from slow Plotly figure construction and from oversized browser payloads.
These fields are useful for understanding real browser behavior, including multi-user overlap and concurrent browsing.
The wxcam_calendar_* event names are retained for continuity with existing
performance logs. In the visible dashboard those events now correspond to the
WXcam hourly HDR grid on the Science Quicklooks tab.