Scopri come progettare e costruire una web app che monitora l'affidabilità degli strumenti interni con SLIs/SLOs, workflow di incidenti, dashboard, alert e reportistica.

Prima di scegliere metriche o costruire dashboard, decidi di cosa si deve occupare l'app di monitoraggio—e di cosa non si occupa. Un ambito chiaro impedisce che lo strumento diventi un “portale ops” tuttofare di cui nessuno si fida.
Inizia elencando gli strumenti interni che l'app coprirà (per es., ticketing, payroll, integrazioni CRM, pipeline dati) e i team che li possiedono o li dipendono. Sii esplicito sui confini: “sito verso i clienti” potrebbe essere fuori ambito, mentre “console admin interna” è dentro.
Organizzazioni diverse usano il termine in modo diverso. Scrivi la tua definizione operativa in linguaggio chiaro—di solito una combinazione di:
Se i team non concordano, l'app finirà per confrontare mele con arance.
Scegli 1–3 risultati principali, come:
Questi risultati guideranno poi cosa misuri e come lo presenti.
Elenca chi userà l'app e quali decisioni prendono: ingegneri che indagano incidenti, supporto che scala problemi, manager che rivedono trend e stakeholder che vogliono aggiornamenti sullo stato. Questo influenzerà terminologia, permessi e livello di dettaglio che ogni vista deve mostrare.
Il monitoraggio dell'affidabilità funziona solo se tutti concordano su cosa significa “buono”. Inizia separando tre termini che suonano simili.
Un SLI (Service Level Indicator) è una misura: “Quale percentuale di richieste ha avuto successo?” o “Quanto tempo hanno impiegato le pagine a caricarsi?”
Un SLO (Service Level Objective) è l'obiettivo per quella misura: “99,9% di successi su 30 giorni.”
Un SLA (Service Level Agreement) è una promessa con conseguenze, di solito esterna (crediti, penali). Per gli strumenti interni, spesso imposti SLO senza SLA formali—sufficienti per allineare aspettative senza trasformare l'affidabilità in diritto contrattuale.
Mantienilo confrontabile tra strumenti e facile da spiegare. Una baseline pratica è:
Evita di aggiungere altro finché non puoi rispondere: “Quale decisione guiderà questa metrica?”
Usa finestre scorrevoli così le scorecard si aggiornano continuamente:
La tua app dovrebbe trasformare le metriche in azione. Definisci livelli di severità (es. Sev1–Sev3) e trigger espliciti come:
Queste definizioni rendono alerting, timeline di incidente e tracciamento del budget di errore coerenti tra i team.
Un'app di monitoraggio dell'affidabilità è credibile quanto i dati che la alimentano. Prima di costruire pipeline di ingestione, mappa ogni segnale che tratterai come “verità” e scrivi quale domanda risponde (disponibilità, latenza, errori, impatto dei deploy, risposta agli incidenti).
La maggior parte dei team può coprire il necessario usando una combinazione di:
Sii esplicito su quali sistemi sono autorevoli. Per esempio, il tuo “SLI di uptime” potrebbe provenire solo dalle probe sintetiche, non dai log del server.
Imposta la frequenza di aggiornamento in base al caso d'uso: le dashboard possono aggiornarsi ogni 1–5 minuti, mentre le scorecard possono essere calcolate ogni ora/giorno.
Crea ID coerenti per tool/service, ambienti (prod/stage) e owner. Concorda regole di naming presto così “Payments-API”, “payments_api” e “payments” non diventano tre entità separate.
Pianifica cosa conservare e per quanto (es. eventi raw 30–90 giorni, aggregati giornalieri 12–24 mesi). Evita di ingerire payload sensibili; conserva solo i metadati necessari per l'analisi di affidabilità (timestamp, codici di stato, bucket di latenza, tag di incidente).
Il tuo schema dovrebbe rendere semplici due cose: rispondere a domande quotidiane (“questo strumento è sano?”) e ricostruire cosa è successo durante un incidente (“quando sono iniziati i sintomi, chi ha cambiato cosa, quali alert sono scattati?”). Parti da un piccolo set di entità core e rendi esplicite le relazioni.
Una baseline pratica è:
Questa struttura supporta dashboard (“tool → stato attuale → incidenti recenti”) e drill-down (“incidente → eventi → check e metriche correlate”).
Aggiungi campi di audit dove serve responsabilità e storia:
created_by, created_at, updated_atstatus più tracciamento cambi di status (o nella tabella Event o in una history dedicata)Infine, includi tag flessibili per filtrare e fare report (es. team, criticità, sistema, compliance). Una tabella di join tool_tags (tool_id, key, value) mantiene il tagging coerente e semplifica scorecard e rollup più avanti.
Il tuo tracker di affidabilità dovrebbe essere “noioso” nel senso migliore: facile da eseguire, da modificare e da supportare. Lo stack “giusto” è di solito quello che il tuo team può mantenere senza eroismi.
Scegli un framework web mainstream che il team conosce bene—Node/Express, Django o Rails sono tutte opzioni solide. Prioritizza:
Se integri sistemi interni (SSO, ticketing, chat), scegli l'ecosistema dove queste integrazioni sono più semplici.
Se vuoi accelerare la prima iterazione, una piattaforma di vibe-coding come Koder.ai può essere un punto di partenza pratico: descrivi le tue entità (tool, check, SLO, incidenti), i workflow (alert → incidente → postmortem) e le dashboard in chat, poi genera rapidamente uno scaffold di web app funzionante. Perché Koder.ai comunemente mira a React sul frontend e Go + PostgreSQL sul backend, si mappa bene allo stack di default “noioso e manutenibile” che molti team preferiscono—e puoi esportare il codice sorgente se poi vuoi passare a una pipeline completamente manuale.
Per la maggior parte delle app interne, PostgreSQL è il default giusto: gestisce bene reporting relazionale, query basate sul tempo e auditing.
Aggiungi componenti extra solo se risolvono un problema reale:
Decidi tra:
Qualunque scelta, standardizza dev/staging/prod e automatizza i deployment (CI/CD), così i cambiamenti non alterano silenziosamente i numeri di affidabilità. Se usi un approccio piattaforma (incluso Koder.ai), cerca funzionalità come separazione degli ambienti, hosting, e rollback rapido (snapshot) per poter iterare senza rompere il tracker stesso.
Documenta la configurazione in un unico posto: environment variable, segreti e feature flag. Mantieni una guida minima “come eseguire localmente” e un runbook ridotto (cosa fare se l'ingestione si ferma, la coda si accumula o il DB raggiunge i limiti). Una pagina breve in /docs è spesso sufficiente.
Un'app di monitoraggio dell'affidabilità funziona quando le persone possono rispondere a due domande in pochi secondi: “Stiamo bene?” e “Cosa faccio adesso?” Progetta le schermate attorno a queste decisioni, con navigazione chiara da overview → tool specifico → incidente specifico.
Rendi la homepage un centro di comando compatto. Metti in evidenza un sommario di salute generale (es. numero di tool che rispettano gli SLO, incidenti attivi, principali rischi attuali), poi mostra incidenti e alert recenti con badge di stato.
Mantieni la vista predefinita calma: evidenzia solo ciò che richiede attenzione. Dai a ogni riquadro un drill-down diretto sul tool o sull'incidente interessato.
Ogni pagina di tool dovrebbe rispondere a “Questo strumento è abbastanza affidabile?” e “Perché/no?”. Includi:
Progetta i grafici per non esperti: etichetta le unità, segna le soglie SLO e aggiungi brevi spiegazioni (tooltip) invece di controlli tecnici densi.
Una pagina incidente è un record vivo. Includi una timeline (eventi auto-catturati come alert scattato, acknowledged, mitigato), aggiornamenti umani, utenti impattati e azioni intraprese.
Rendi le aggiornamenti facili da pubblicare: una sola casella di testo, stati predefiniti (Investigating/Identified/Monitoring/Resolved) e note interne opzionali. Quando l'incidente viene chiuso, un'azione “Avvia postmortem” dovrebbe precompilare fatti dalla timeline.
Gli admin hanno bisogno di schermate semplici per gestire tool, check, target SLO e owner. Ottimizza per correttezza: valori predefiniti sensati, validazione e avvisi quando le modifiche impattano i report. Aggiungi una traccia “ultima modifica” visibile così le persone si fidano dei numeri.
I dati di affidabilità restano utili solo se le persone si fidano. Ciò significa collegare ogni modifica a un'identità, limitare chi può fare edit ad alto impatto e mantenere una storia chiara consultabile durante le review.
Per uno strumento interno, punta all'SSO (SAML) o OAuth/OIDC tramite il tuo identity provider (Okta, Azure AD, Google Workspace). Questo riduce la gestione password e rende onboarding/offboarding automatico.
Dettagli pratici:
Inizia con ruoli semplici e aggiungi regole più fini solo quando necessario:
Proteggi le azioni che possono cambiare esiti di affidabilità o narrazioni di reportistica:
Logga ogni edit a SLO, check e campi di incidente con:
Rendi i log di audit ricercabili e visibili dalle pagine di dettaglio pertinenti (es. la pagina incidente mostra tutta la storia dei cambi). Questo mantiene le review fattuali e riduce i confronti durante i postmortem.
Il monitoring è lo “strato sensoriale” della tua app: trasforma il comportamento reale in dati affidabili. Per gli strumenti interni, i check sintetici sono spesso la via più veloce perché tu puoi controllare cosa significa “sano”.
Inizia con un piccolo set di tipi di check che coprono la maggior parte delle app interne:
Mantieni i check deterministici. Se una validazione può fallire a causa di contenuto variabile, creerai rumore e la fiducia scenderà.
Per ogni esecuzione del check, cattura:
Conserva i dati come eventi di serie temporali (una riga per ogni run) o come rollup aggregati (es. rollup per minuto con conteggi e p95 di latenza). I dati eventi sono ottimi per debug; i rollup sono ottimi per dashboard veloci. Molti team fanno entrambe le cose: mantengono eventi raw per 7–30 giorni e rollup per report a lungo termine.
Un risultato mancante di un check non dovrebbe automaticamente significare “down.” Aggiungi uno stato unknown esplicito per casi come:
Questo evita downtime gonfiato e rende i “gap di monitoring” visibili come problema operativo a sé.
Usa worker in background (scheduling tipo cron, code) per eseguire check a intervalli fissi (es. ogni 30–60 secondi per tool critici). Inserisci timeout, retry con backoff e limiti di concorrenza così il tuo checker non sovraccarica i servizi interni. Persiste ogni risultato di run—anche i fallimenti—così la dashboard di uptime mostra sia lo stato corrente sia una cronologia affidabile.
Gli alert sono il punto in cui il monitoraggio diventa azione. L'obiettivo è semplice: notificare le persone giuste, con il contesto giusto, al momento giusto—senza sommergere tutti.
Inizia definendo regole di alert che mappano direttamente ai tuoi SLIs/SLOs. Due pattern pratici:
Per ogni regola, memorizza il “perché” insieme al “cosa”: quale SLO è impattato, la finestra di valutazione e la severità prevista.
Invia notifiche nei canali dove i team sono già presenti (email, Slack, Microsoft Teams). Ogni messaggio dovrebbe includere:
Evita di scaricare metriche raw. Fornisci un breve “prossimo passo” come “Controlla i deploy recenti” o “Apri i log.”
Implementa:
Anche in uno strumento interno, le persone hanno bisogno di controllo. Aggiungi escalation manuale (pulsante sulla pagina alert/incidente) e integra con tool on-call se disponibili (PagerDuty/Opsgenie equivalenti), o almeno una lista di rotazione configurabile memorizzata nell'app.
La gestione degli incidenti trasforma “abbiamo ricevuto un alert” in una risposta condivisa e tracciabile. Costruiscila nell'app così le persone possono passare dal segnale alla coordinazione senza saltare tra strumenti.
Rendi possibile creare un incidente direttamente da un alert, da una pagina servizio o da un grafico uptime. Precompila campi chiave (servizio, ambiente, fonte dell'alert, primo istante rilevato) e assegna un ID incidente univoco.
Un set di campi predefinito mantiene il flusso leggero: severità, impatto sui “clienti” (team interni coinvolti), owner corrente e link all'alert che ha scatenato tutto.
Usa un ciclo semplice che rispecchi il modo in cui i team lavorano veramente:
Ogni cambio di stato dovrebbe registrare chi lo ha fatto e quando. Aggiungi aggiornamenti a timeline (note brevi con timestamp), supporto per allegati e link a runbook e ticket (es. /runbooks/payments-retries o /tickets/INC-1234). Questo diventa il thread unico per “cosa è successo e cosa abbiamo fatto”.
I postmortem devono essere veloci da avviare e coerenti da revisionare. Fornisci template con:
Collega gli action item all'incidente, traccia il completamento e metti in evidenza gli item scaduti nelle dashboard del team. Se supporti le review di apprendimento, abilita una modalità “blameless” che si concentri su sistemi e processi invece che su errori individuali.
Il reporting è dove il monitoraggio diventa decisione. Le dashboard aiutano gli operatori; le scorecard aiutano i leader a capire se gli strumenti interni stanno migliorando, dove investire e cosa significa “bene”.
Costruisci una vista coerente e ripetibile per ogni tool (e opzionalmente per team) che risponda velocemente a poche domande:
Dove possibile, aggiungi contesto leggero: “SLO mancato a causa di 2 deploy” o “La maggior parte del downtime dal dipendente X”, senza trasformare il report in una review completa di incidente.
I leader raramente vogliono “tutto”. Aggiungi filtri per team, criticità del tool (es. Tier 0–3) e finestra temporale. Assicurati che lo stesso tool possa apparire in più rollup (il team platform lo possiede, finance lo usa).
Fornisci riepiloghi settimanali e mensili che si possono condividere fuori dall'app:
Mantieni la narrativa coerente (“Cosa è cambiato rispetto al periodo precedente?” “Dove siamo oltre budget?”). Se serve un primer per gli stakeholder, linka una breve guida come /blog/sli-slo-basics.
Un tracker di affidabilità diventa rapidamente fonte di verità. Trattalo come un sistema di produzione: sicuro per default, resistente ai dati sporchi e facile da recuperare quando qualcosa va storto.
Blocca ogni endpoint—anche quelli “solo interni”.
Tieni le credenziali fuori dal codice e fuori dai log.
Conserva i segreti in un secret manager e ruotali. Dai all'app web accesso al DB con il minimo privilegio: ruoli lettura/scrittura separati, restrizioni solo alle tabelle necessarie e credenziali a vita breve se possibile. Cripta i dati in transito (TLS) tra browser↔app e app↔database.
Le metriche sono utili solo se gli eventi sottostanti sono affidabili.
Aggiungi controlli server-side per timestamp (timezone/clock skew), campi obbligatori e chiavi di idempotenza per deduplicare i retry. Traccia errori di ingestione in una dead-letter queue o tabella di “quarantena” così eventi corrotti non inquinano le dashboard.
Automatizza migrazioni DB e testa rollback. Pianifica backup, verifica regolarmente i restore e documenta un piano di disaster recovery minimo (chi, cosa, quanto tempo).
Infine, rendi affidabile anche l'app di affidabilità: aggiungi health check, monitoraggio base per lag delle code e latenza DB, e alert quando l'ingestione scende silenziosamente a zero.
Un'app di monitoraggio ha successo quando la gente si fida e la usa. Considera la prima release come un loop di apprendimento, non un lancio “big bang”.
Scegli 2–3 strumenti interni largamente usati e con owner chiari. Implementa un set minimo di check (per esempio: disponibilità homepage, successo login e un endpoint API chiave) e pubblica una dashboard che risponda: “È su? Se no, cosa è cambiato e chi lo possiede?”
Mantieni il pilot visibile ma contenuto: un team o un piccolo gruppo di power user basta per convalidare il flusso.
Nelle prime 1–2 settimane, raccogli attivamente feedback su:
Trasforma il feedback in backlog concreto. Un semplice pulsante “Segnala un problema con questa metrica” su ogni grafico spesso fa emergere le intuizioni più rapide.
Aggiungi valore a strati: connetti lo strumento di chat per notifiche, poi lo strumento incidente per creazione ticket automatica, poi CI/CD per marker dei deploy. Ogni integrazione dovrebbe ridurre lavoro manuale o abbreviare il tempo di diagnosi—altrimenti è solo complessità.
Se stai prototipando velocemente, considera l'uso della planning mode di Koder.ai per mappare l'ambito iniziale (entità, ruoli e workflow) prima di generare la prima build. È un modo semplice per mantenere l'MVP compatto—e poiché puoi snapshot e rollback, puoi iterare su dashboard e ingestione in sicurezza mentre i team rifiniscono le definizioni.
Prima di estendere ad altri team, definisci metriche di successo come utenti attivi settimanali della dashboard, riduzione del time-to-detect, meno alert duplicati o revisioni SLO coerenti. Pubblica una roadmap leggera in /blog/reliability-tracking-roadmap ed espandi strumento per strumento con owner chiari e sessioni di training.
Inizia definendo il perimetro (quali strumenti e ambienti sono inclusi) e la tua definizione operativa di affidabilità (disponibilità, latenza, errori). Poi scegli 1–3 risultati che vuoi migliorare (es. rilevazione più rapida, reportistica più chiara) e progetta le prime schermate attorno alle decisioni principali che gli utenti devono prendere: “Stiamo bene?” e “Cosa devo fare adesso?”
Un SLI è ciò che misuri (es. % di richieste riuscite, p95 di latenza). Un SLO è l'obiettivo per quella misura (es. 99,9% su 30 giorni). Un SLA è una promessa formale con conseguenze (spesso esterna). Per gli strumenti interni, gli SLO servono generalmente per allineare aspettative senza l'onere legale degli SLA.
Usa un set basico piccolo e comparabile tra strumenti:
Aggiungi altri indicatori solo se sai quale decisione guideranno (alerting, priorità, lavori di capacità, ecc.).
Le finestre scorrevoli mantengono le scorecard aggiornate continuamente:
Scegli finestre che corrispondono a come la tua organizzazione rivede le prestazioni, così i numeri risultano intuitivi e utili.
Definisci trigger di severità espliciti legati a impatto utente e durata, ad esempio:
Documenta queste regole nell'app in modo che alerting, timeline di incidente e reportistica siano consistenti tra i team.
Mappa quale sistema è la “fonte di verità” per ogni domanda:
Sii esplicito (es. “l'SLI di uptime viene solo dalle probe”), altrimenti i team discuteranno su quali numeri contano.
Usa pull per sistemi che puoi interrogare a intervalli (API di monitoring, API di ticketing). Usa push (webhook/eventi) per eventi ad alto volume o in tempo quasi reale (deploy, alert, aggiornamenti di incidente). Un comune schema è: dashboard che si aggiornano ogni 1–5 minuti, mentre le scorecard si calcolano ogni ora o giorno.
Serve tipicamente:
Registra ogni modifica ad alto impatto con chi, quando, cosa è cambiato (prima/dopo) e da dove è arrivata (UI/API/automation). Combina questo con accesso basato sui ruoli:
Queste salvaguardie impediscono modifiche silenziose che minano la fiducia nei numeri di affidabilità.
Tratta i risultati mancanti dei check come uno stato separato unknown, non come downtime automatico. I dati mancanti possono provenire da:
Rendere “unknown” visibile previene downtime gonfiato e evidenzia gap di monitoring come problema operativo a sé.
Rendi esplicite le relazioni (tool → check → metriche; incident → eventi) così le query “overview → drill-down” restano semplici.