feat: progressive drill-down dashboard with RED metrics and SLA compliance (#94)
Three-level dashboard driven by sidebar selection:
- L1 (no selection): all-apps overview with health table, per-app charts
- L2 (app selected): route performance table, error velocity, top errors
- L3 (route selected): processor table, latency heatmap data, bottleneck KPI
Backend: 3 new endpoints (timeseries/by-app, timeseries/by-route, errors/top),
per-app SLA settings (app_settings table, V12 migration), exact SLA compliance
from executions hypertable, error velocity with acceleration detection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 23:29:20 +02:00
|
|
|
.content {
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
gap: 20px;
|
2026-03-30 15:42:02 +02:00
|
|
|
flex: 1;
|
|
|
|
|
min-height: 0;
|
|
|
|
|
overflow-y: auto;
|
2026-04-09 18:21:58 +02:00
|
|
|
padding: 0 24px 20px;
|
feat: progressive drill-down dashboard with RED metrics and SLA compliance (#94)
Three-level dashboard driven by sidebar selection:
- L1 (no selection): all-apps overview with health table, per-app charts
- L2 (app selected): route performance table, error velocity, top errors
- L3 (route selected): processor table, latency heatmap data, bottleneck KPI
Backend: 3 new endpoints (timeseries/by-app, timeseries/by-route, errors/top),
per-app SLA settings (app_settings table, V12 migration), exact SLA compliance
from executions hypertable, error velocity with acceleration detection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 23:29:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Charts */
|
|
|
|
|
.chartGrid {
|
|
|
|
|
display: grid;
|
|
|
|
|
grid-template-columns: 1fr 1fr;
|
|
|
|
|
gap: 16px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.chartRow {
|
|
|
|
|
display: grid;
|
|
|
|
|
grid-template-columns: 1fr 1fr 1fr;
|
|
|
|
|
gap: 16px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.appNameCell {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
gap: 8px;
|
|
|
|
|
font-size: 12px;
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
color: var(--text-primary);
|
|
|
|
|
font-family: var(--font-mono);
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.appNameCell:hover {
|
|
|
|
|
text-decoration: underline;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-09 18:34:04 +02:00
|
|
|
/* Diagram container — height override; card styling via tableStyles.tableSection */
|
|
|
|
|
.diagramHeight {
|
feat: progressive drill-down dashboard with RED metrics and SLA compliance (#94)
Three-level dashboard driven by sidebar selection:
- L1 (no selection): all-apps overview with health table, per-app charts
- L2 (app selected): route performance table, error velocity, top errors
- L3 (route selected): processor table, latency heatmap data, bottleneck KPI
Backend: 3 new endpoints (timeseries/by-app, timeseries/by-route, errors/top),
per-app SLA settings (app_settings table, V12 migration), exact SLA compliance
from executions hypertable, error velocity with acceleration detection.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 23:29:20 +02:00
|
|
|
height: 280px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Chart fill */
|
|
|
|
|
.chart {
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-30 10:32:23 +02:00
|
|
|
/* Visualization row: treemap left (wider) + punchcards right (stacked) */
|
|
|
|
|
.vizRow {
|
|
|
|
|
display: grid;
|
|
|
|
|
grid-template-columns: 3fr 2fr;
|
|
|
|
|
gap: 16px;
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-30 15:45:22 +02:00
|
|
|
/* Toggle button row */
|
|
|
|
|
.toggleRow {
|
|
|
|
|
display: flex;
|
|
|
|
|
gap: 2px;
|
|
|
|
|
padding: 0 12px 4px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.toggleBtn {
|
|
|
|
|
padding: 3px 10px;
|
2026-04-07 11:41:51 +02:00
|
|
|
font-size: 12px;
|
2026-03-30 15:45:22 +02:00
|
|
|
font-family: var(--font-mono);
|
|
|
|
|
color: var(--text-muted);
|
|
|
|
|
background: transparent;
|
|
|
|
|
border: 1px solid var(--border-subtle);
|
|
|
|
|
border-radius: var(--radius-sm);
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
transition: all 0.15s;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.toggleBtn:hover {
|
|
|
|
|
color: var(--text-primary);
|
|
|
|
|
border-color: var(--border);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.toggleActive {
|
|
|
|
|
color: var(--text-primary);
|
|
|
|
|
background: var(--bg-inset);
|
|
|
|
|
border-color: var(--border);
|
|
|
|
|
font-weight: 600;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-09 18:34:04 +02:00
|
|
|
/* errorsSection removed — use tableStyles.tableSection instead */
|