Documentación/Dashboards y Saved Charts
Dashboards y Saved Charts
DBFlux persiste configuraciones de chart como Saved Charts y las agrupa en Dashboards — un grid de paneles de chart (y divisores markdown opcionales) que comparten un rango de tiempo y una política de refresco.
Para los internals del motor de charts (renderizado, ejes, decimación, paleta), ver Charts. Para la capa de almacenamiento SQLite, ver Architecture.
Visión general
- Un SavedChart es la forma persistida de una configuración de chart: binding de fuente de datos, series, bindings del eje Y, política de refresco y preset de rango de tiempo.
- Un Dashboard es un grid con nombre compuesto por paneles. Cada panel es
o bien un slot
Chart(referencia a unSavedChartpor id) o bien un slotDivider(franja de encabezado markdown inline — sin chart, sin toolbar). - Los dashboards tienen un rango de tiempo y una política de refresco compartidos que se propagan a cada panel de chart cargado mediante suscripciones.
- Los dashboards remotos (por ejemplo CloudWatch) se pueden explorar en la sidebar e importar a un Dashboard local cuando el driver anuncia las capacidades adecuadas.
Capa de almacenamiento
Todos los datos de dashboard y saved-chart viven en
~/.local/share/dbflux/dbflux.db, bajo el prefijo de tabla viz_*:
| Tabla | Propósito |
|---|---|
viz_dashboards | Registros de dashboard (profile_id nullable, ON DELETE SET NULL) |
viz_dashboard_panels | Slots de panel: discriminador panel_kind + divider_markdown opcional |
viz_saved_charts | Raíz de saved chart (SavedChartDto) |
viz_saved_chart_series | Configuración por serie |
viz_saved_chart_binding_y | Bindings del eje Y |
viz_saved_chart_source_metric_dimensions | Dimensiones de métrica de CloudWatch |
viz_saved_chart_source_metric_series | Spec de serie de métrica de CloudWatch |
Los repositorios viven en crates/dbflux_storage/src/repositories/viz_*.rs e
implementan el trait Repository estándar
(all(), find_by_id(), upsert(), delete()).
Gestores en memoria
Ambos gestores envuelven los repositorios SQLite con cachés en memoria para lecturas síncronas. Las escrituras van primero al repositorio; las cachés se actualizan solo si tienen éxito.
DashboardManager(crates/dbflux_ui_base/src/dashboard_manager.rs) — tipos de dominioDashboard,DashboardPanel,DashboardPanelKind(Chart { saved_chart_id }|Divider { markdown }|Inspector { metric_id }),DashboardPanelDraft. Los dashboards nuevos se crean congrid_columns = 12; los paneles nuevos se añaden engrid_column = 0en una fila nueva congrid_width = 12, grid_height = 2.SavedChartManager(crates/dbflux_ui_base/src/saved_chart_manager.rs) — gestiona el ciclo de vida deSavedChart, incluyendoSavedChartRefreshPolicy(Off/Interval { every_secs }).RemoteDashboardCache(crates/dbflux_app/src/remote_dashboard_cache.rs) — caché en memoria con alcance de sesión para los listados de dashboards remotos. No se persiste entre reinicios.
Integración con el sistema de documentos
Los dashboards se abren como un DashboardDocument
(crates/dbflux_ui_document/src/dashboard/):
- Clave de dedup:
DocumentKey::Dashboard { dashboard_id }(persistido) oDocumentKey::InstanceOverview { profile_id }(auto-generado, de solo lectura). - Paneles de chart: cada slot envuelve una entidad
ChartDocument(Loaded) o un placeholder para un chart eliminado (Orphan). - Paneles de inspector: cada slot envuelve una entidad
InspectorPanelque aloja unDataGridPanely se refresca en el intervalo compartido del dashboard. Las acciones de fila suministradas por el driver (por ejemplo, terminar conexión, cancelar query) aparecen en el menú contextual de la fila. - Toolbar compartida: un único
TimeRangePanelpropaga los cambios de ventana a todos los paneles cargados mediante suscripciones. - Concurrencia: la re-ejecución de paneles está acotada por
PANEL_REEXEC_CAPpara evitar saturar la conexión con queries concurrentes. - Grid: grid canónico de 12 columnas; arrastrar para reordenar y
arrastrar para redimensionar mediante
DragReorderState/DragResizeStateendashboard/builder.rs.
Los saved charts independientes se abren como ChartDocument
(crates/dbflux_ui_document/src/chart_document/), con clave
DocumentKey::Chart { saved_chart_id }. ChartDocument se renderiza tanto de
forma independiente como embebido dentro de un panel de DashboardDocument.
Instance Overview e inspectores
Las conexiones cuyo driver anuncia INSTANCE_METRICS o INSTANCE_INSPECTOR
exponen un Instance Overview de solo lectura — un dashboard sintetizado
con métricas de servidor en vivo e inspectores tabulares que nunca toca el
almacenamiento hasta que el usuario decide conservarlo.
Abrir el Instance Overview
La sidebar muestra una única hoja Instance Overview bajo un perfil conectado (encima de las carpetas Instance Metrics e Instance Inspectors). Al hacer clic en ella — o al elegir Open desde su menú de clic derecho — se abre el overview.
| Paso | Detalle |
|---|---|
| Fuente | El descriptor DefaultInstanceDashboard del driver (layout fijo de 12 columnas) devuelto por InstanceCatalog::default_dashboard() |
| Dedup | DocumentKey::InstanceOverview { profile_id } — una pestaña por conexión; hacer clic de nuevo enfoca la pestaña existente |
| Persistencia | Ninguna. El DashboardDocument se construye en memoria en el momento de la apertura; no se escribe ninguna fila viz_* |
| Modo | Solo lectura. Las transiciones a modo edición, Add Panel y el toggle Edit/View se suprimen; el arrastrar-para-reordenar y arrastrar-para-redimensionar están deshabilitados |
Guardarlo como dashboard editable
Un overview de solo lectura muestra un botón Save as editable (toolbar,
grupo derecho; tooltip “Clone this overview into a new editable
dashboard”). Clona el layout sintetizado — incluyendo las posiciones exactas
de los paneles — en un nuevo Dashboard persistido y propiedad del usuario,
vía DashboardManager::append_panels con un DraftGridLayout explícito por
panel. El clon se abre como una pestaña editable normal
DocumentKey::Dashboard { dashboard_id }. El overview original permanece de
solo lectura y se re-sintetiza en cada apertura.
Paneles de inspector
Los inspectores son el tercer tipo de panel de dashboard, junto a Chart y
Divider:
| Tipo de panel | Respaldo | Notas |
|---|---|---|
Chart | Referencia a SavedChart (saved_chart_id) | Chart de serie temporal |
Divider | Markdown inline | Franja de encabezado; sin toolbar |
Inspector | DashboardPanelKind::Inspector { metric_id } | Snapshot tabular; se refresca en el intervalo compartido |
DashboardPanelKind::Inspector { metric_id }
(crates/dbflux_ui_base/src/dashboard_manager.rs) no lleva ninguna
referencia a chart — el inspector se identifica únicamente por metric_id.
Cada panel de inspector aloja un DataGridPanel que muestra el snapshot
actual devuelto por InstanceCatalog::fetch_inspector_snapshot (por ejemplo
pg_stat_activity de PostgreSQL, PROCESSLIST de MySQL, currentOp de
MongoDB, CLIENT LIST de Redis).
Persistencia: el valor Inspector se almacena en
viz_dashboard_panels.panel_kind, con la clave del inspector en
inspector_metric_id. Ambos fueron añadidos por la migración 014
(014_viz_inspector_and_instance_metric), que extiende el CHECK de
panel_kind — introducido primero en la migración 013 con chart /
divider — para aceptar también inspector. (Las pestañas de inspector
independientes abiertas directamente desde la carpeta de sidebar Instance
Inspectors usan DocumentKey::InstanceInspector { profile_id, metric_id }.)
Acciones de fila del inspector
Las filas del inspector pueden exponer acciones de fila suministradas por el driver (menú contextual de clic derecho), por ejemplo Kill connection / Terminate session. El flujo:
- El driver devuelve
InspectorRowActions desdeInstanceCatalog::row_actions(metric_id). La disponibilidad está condicionada por sondas de privilegio propias de cada driver (ver los README de driver), de modo que una sesión con privilegios insuficientes nunca ve una acción que no puede ejecutar. - Las acciones
is_destructivepiden confirmación en un modal antes de ejecutarse. - Al confirmar, la conexión se re-resuelve en el momento de la ejecución (no en el momento del clic) y se ejecuta
InstanceCatalog::execute_row_action(metric_id, action_id, row_values). - Cada intento registra un evento de auditoría. Los fallos se enrutan a través de
report_error_async(UserFacingErrordeErrorKind::Driver), así que el usuario recibe un toast con un id de correlación que enlaza a la fila de auditoría.
La ejecución vive en
crates/dbflux_ui_document/src/instance_inspector/mod.rs.
Comportamiento de refresco
Los timers de refresco de dashboard, chart independiente e inspector
comprueban AppState::connections() para el perfil del panel antes de cada
tick y omiten su trabajo cuando la conexión está cerrada. El timer en sí
permanece activo, así que el refresco se reanuda automáticamente al
reconectar sin necesidad de rearmarlo.
Cobertura de drivers integrados
| Driver | INSTANCE_METRICS | INSTANCE_INSPECTOR | Lista de métricas / inspectores |
|---|---|---|---|
| PostgreSQL | ✓ | ✓ | README |
| MySQL / MariaDB | ✓ | ✓ | README |
| MongoDB | ✓ | ✓ | README |
| Redis | ✓ | ✓ | README |
| SQL Server | ✓ | ✓ | README |
El README de cada driver lista las métricas, inspectores y acciones de fila concretas que expone; este documento no las duplica.
Seams de driver
Los drivers se integran con los dashboards a través de seams genéricos del core — la UI nunca bifurca según IDs de driver.
Importar dashboards (JSON → Dashboard local)
- Trait:
DashboardImporter(crates/dbflux_core/src/connection/dashboard_import.rs) - Capacidad:
DriverCapabilities::DASHBOARD_IMPORT - Tipos de valor:
WidgetImportSpec— spec de widget parseadoMetricView::{TimeSeries, StackedArea, SingleValue}ImportedMetricSeries— serie + dimensionesWidgetLayout— coordenadas de layout nativas trasladadas al grid local
Los drivers parsean el JSON del dashboard en un conjunto normalizado de
widgets que la UI importa como SavedCharts y coloca en un nuevo
Dashboard.
Explorar dashboards remotos (sidebar)
- Trait:
DashboardSource(crates/dbflux_core/src/connection/dashboard_source.rs) - Capacidad:
DriverCapabilities::DASHBOARD_SYNC - Tipos de valor:
RemoteDashboard,DashboardRef(last_modified: ISO8601opcional)
La sidebar lista los dashboards remotos a través de este seam; los
resultados se cachean en RemoteDashboardCache. Seleccionar un dashboard
remoto dispara DashboardImporter para materializarlo localmente.
Métricas e inspectores de instancia
- Trait:
InstanceCatalog(crates/dbflux_core/src/connection/instance_catalog.rs) - Capacidades:
DriverCapabilities::INSTANCE_METRICS(series temporales),DriverCapabilities::INSTANCE_INSPECTOR(snapshots tabulares) - Tipos de valor:
InstanceMetricDef,InstanceInspectorDef,DefaultInstanceDashboard,InspectorRowAction
Los drivers exponen métricas de servidor en vivo (por ejemplo pg.tps,
mysql.queries_per_sec) e inspectores tabulares (por ejemplo pg.activity,
mysql.processlist, mongo.currentop, redis.client_list) a través de un
único catálogo. Cada driver también publica un descriptor
DefaultInstanceDashboard con un layout fijo de 12 columnas — el workspace
abre este descriptor como un dashboard Instance Overview de solo lectura
(clave de dedup DocumentKey::InstanceOverview { profile_id }). La acción
“Save as editable” clona el layout en un dashboard persistido propiedad del
usuario.
Las filas de inspector pueden declarar InspectorRowActions (por ejemplo
Terminate connection). La disponibilidad de las acciones está condicionada
por sondas de privilegio propias de cada driver (pg_monitor /
pg_signal_backend para PostgreSQL, PROCESS / CONNECTION_ADMIN para
MySQL, killOp para MongoDB, CLIENT KILL para Redis, VIEW SERVER STATE /
KILL para SQL Server), de modo que una sesión con privilegios insuficientes
nunca ve acciones que no podría ejecutar.
Cada timer de refresco (tick de dashboard, tick de chart independiente, tick
de inspector) comprueba AppState::connections() para el perfil del panel y
omite su trabajo cuando la conexión está cerrada; el timer permanece activo
así que el refresco se reanuda automáticamente al reconectar.
Para el comportamiento de cara al usuario de este seam (cómo se abre el Instance Overview, Save as editable, paneles de inspector y acciones de fila), ver Instance Overview e inspectores más arriba.
Implementación de CloudWatch
crates/dbflux_driver_cloudwatch/src/ provee:
CloudWatchDashboardSource— lista los dashboards de CloudWatch a través del SDK de AWSCloudWatchDashboardImporter— parsea el JSON de dashboard de CloudWatch enWidgetImportSpecs con series de métrica, dimensiones y agregaciones estadísticas
Esto es exploración e importación de solo lectura, no una función de sincronización. DBFlux nunca escribe de vuelta en los dashboards de CloudWatch.
Matriz de capacidades
| Bit de capacidad | Significado |
|---|---|
DASHBOARD_IMPORT (51) | El driver puede parsear JSON de dashboard en specs de widget |
DASHBOARD_SYNC (52) | El driver puede listar dashboards remotos |
Ambas capacidades son independientes: un driver puede anunciar sync sin import, o viceversa.
Añadir un nuevo driver compatible con dashboards
- Implementa
DashboardSourceen elConnectiondel driver para listar los dashboards remotos. AñadeDASHBOARD_SYNCaDriverMetadata.capabilities. - Implementa
DashboardImporteren elConnectiondel driver para parsear un payload de dashboard enWidgetImportSpecs. AñadeDASHBOARD_IMPORT. - La UI mostrará el árbol de dashboards en la sidebar y enrutará las importaciones sin ninguna bifurcación específica de driver.