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:

Snippet 1JSON
{ "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):

Snippet 2JSON
{
  "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 warning slow_metadata (default 1500 ms).
  • mode/retentionDays/scope documentano la v1 (ibrido, 7 giorni,

global+user); la retention è fissa in v1.

Cosa viene raccolto

MetricaContenuto
fetchdurata ms del ciclo dati del DataSource (getData)
renderms dalla pubblicazione dei dati al frame renderizzato
dqsummary 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 bucket hour/day e 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:

Snippet 3PowerShell
pwsh -File scripts/scaffold-route-metrics-scheduler.ps1

Pannello 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, metrica fetch/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.
  • userId degli eventi è dichiarato dal client (telemetria, non superficie di

sicurezza).