Overview
Performance Inspector
Metriche runtime delle route (fetch/render) e Data Quality del dataset caricato,
con persistenza server ibrida: eventi raw a retention breve (7 giorni) +
aggregati storici per analisi veloce (avg / p95 / max / count per finestra).
Screenshot reference (manuale utente)
manual__performance-inspector__01.png: dialog Performance Inspector su una list con campione locale e trend server. (stato: unavailable — cattura pianificata)
Prerequisito: gate applicativo (obbligatorio)
Tutti i logging aggiuntivi della feature sono attivi solo se in
appsettings.json il flag è true:
{ "AppSettings": { "enablePerformanceInspector": "true" } }- Modificabile dall'appsettings-editor (sezione App Runtime) con effetto
hot-reload: nessun restart.
- A flag spento: nessuna scrittura su DB, ingest/job/trend rispondono
enabled:false, il client non invia nulla. Il pannello mostra comunque il
campione locale.
Attivazione per route (metadata)
Nel md_props_bag della route (editor metadata → props bag):
{
"qualityInspector": {
"persistence": {
"enabled": true,
"mode": "hybrid",
"retentionDays": 7,
"scope": "global+user"persistence.enabled: attiva raccolta + invio metriche per la route e il
bottone Performance nella caption-bar della list.
thresholds.slowFetchMs: soglia del warningslow_metadata(default 1500 ms).mode/retentionDays/scopedocumentano la v1 (ibrido, 7 giorni,
global+user); la retention è fissa in v1.
Cosa viene raccolto
| Metrica | Contenuto |
|---|---|
fetch | durata ms del ciclo dati del DataSource (getData) |
render | ms dalla pubblicazione dei dati al frame renderizzato |
dq | summary Data Quality del dataset caricato: completeness %, duplicati, anomalie (z-score>3), severità |
Solo metriche tecniche e summary: mai dati di riga. L'invio è batch
(debounce 2s), asincrono e best-effort: un ingest fallito non impatta la UI.
Persistenza server
sys_route_metrics_events: eventi raw, retention 7 giorni.sys_route_metrics_agg: aggregati per buckethour/daye scope
global/user (avg, p95 nearest-rank, max, count, warning_count).
- Job
route_metrics_job(scheduler, ogni 5 minuti,action_type 3):
ricalcolo idempotente dei bucket recenti + cleanup raw. Registrazione:
pwsh -File scripts/scaffold-route-metrics-scheduler.ps1Pannello UI
Bottone Performance nella caption-bar della list (visibile solo con
qualityInspector.persistence.enabled): apre il dialog con
- ultimo campione locale: fetch ms, render ms, completeness, duplicati,
anomalie + warning slow metadata;
- trend storico server (ultime finestre orarie) con toggle scope
Globale / Mio utente e metrica fetch / render / dq.
API
GET api/route-metrics/status—{ enabled }(gate).POST api/route-metrics/ingest— batch eventi{ events: [...] }.GET api/route-metrics/trend?route=&scope=global|user&metric=&bucket=hour|day&userId=— ultime 50 finestre.POST api/route-metrics/admin/run-job— esegue subito aggregazione+retention.GET api/route-metrics/routes— elenco route scaffoldate con config e stato metriche (dashboard).POST api/route-metrics/route-config— abilita/disabilita la raccolta per una route (admin).GET api/route-metrics/series?routes=&metric=&bucket=&from=&to=— serie aggregate multi-route per il chart.
Dashboard amministrativa
Voce di menu Amministrazione → Metriche route (route /route-metrics-dashboard,
registrata con scripts/scaffold-route-metrics-dashboard-menu.ps1, idempotente su
tutti i DBMS): pagina di analisi e configurazione centralizzata.
- Elenco di tutte le route scaffoldate (non-system): il checkbox
abilita/disabilita la raccolta metriche per la route (scrive
qualityInspector.persistence.enabled nel md_props_bag e invalida la cache
metadata — admin only) e al tempo stesso include/esclude la serie dal chart.
Il pallino verde indica le route che hanno già metriche registrate.
- Filtri: range date, granularità
hour/day, metricafetch/render/dq,
valore avg/p95/max, scope Globale / Mio utente.
- Chart line multi-serie (una serie per route abilitata) sui bucket aggregati.
API dedicate: GET api/route-metrics/routes, POST api/route-metrics/route-config
(admin), GET api/route-metrics/series?routes=&metric=&bucket=&from=&to=.
Limiti (v1)
- Retention fissa 7 giorni; bucket trend UI: orari.
- DQ calcolata sul dataset caricato (pagina corrente), non sull'intera tabella.
userIddegli eventi è dichiarato dal client (telemetria, non superficie di
sicurezza).