Un runbook degli incidenti per applicazioni PHP trasforma un avviso in una sequenza di decisioni controllate. Non è un elenco di comandi né un documento che presuppone una causa: deve indicare quale sintomo è stato rilevato, quali evidenze raccogliere, quali azioni sono accettabili, quando fermarsi e chi può decidere il passaggio successivo.
Questo è particolarmente importante nelle applicazioni con traffico web, processi PHP in background, code, cron, integrazioni esterne e database condivisi. Un intervento apparentemente semplice, come riavviare i consumer o ritentare i messaggi, può nascondere l'origine, duplicare operazioni o aumentare il carico su un servizio già degradato.
Cosa risolve un runbook e cosa non deve sostituire

Un runbook riduce l'improvvisazione durante situazioni ripetibili o prevedibili. Rende espliciti l'ordine delle verifiche, i limiti di un intervento e le evidenze necessarie per dichiarare il ripristino. Consente inoltre a sviluppo, operations e business di condividere lo stesso linguaggio di fronte a un incidente.
Non sostituisce i controlli che devono esistere prima dell'incidente:
- Osservabilità: metriche, log correlati, trace e avvisi con soglie comprensibili. Una procedura non compensa un segnale ambiguo o privo di contesto.
- Formazione e permessi: le persone che la eseguono devono comprendere il rischio e disporre soltanto degli accessi necessari.
- Backup e ripristino testato: un backup non è una strategia di recupero se non se ne conoscono integrità, portata e tempo di ripristino.
- Architettura: retry idempotenti, limiti delle risorse, timeout, circuit breaker e isolamento delle dipendenze riducono la necessità di interventi manuali.
- Gestione delle modifiche: un deployment non equivale a un release. Il runbook deve sapere quale versione è attiva e se un'esposizione graduale può ridurre il rischio di un rollback.
L'obiettivo non è documentare ogni possibile guasto. È standardizzare le risposte per segnali che hanno un impatto operativo e per i quali una decisione errata può peggiorare lo stato del sistema.
Quando un avviso merita una procedura specifica
Non ogni avviso richiede un proprio documento. È opportuno dare priorità alle situazioni che combinano frequenza, impatto, pressione temporale o dipendenza tra team. Un avviso merita un runbook quando la reazione non dovrebbe dipendere dal ricordare passaggi sotto stress.
- Si ripete e tende a richiedere le stesse verifiche iniziali.
- Influisce sui ricavi, sui processi dei clienti, sul rispetto delle scadenze o sulla disponibilità di una funzione critica.
- L'azione correttiva è reversibile solo entro una finestra limitata.
- Richiede coordinamento tra applicazione PHP, infrastruttura, database o un provider di API.
- Un'azione manuale può provocare perdita, duplicazione o esposizione di dati.
- L'allarme presenta falsi positivi noti che devono essere esclusi con evidenze concrete.
Iniziate dal sintomo osservabile, non da una teoria. «I job in attesa aumentano», «la latenza dell'endpoint supera la soglia», «aumentano gli errori 5xx» o «un'integrazione restituisce risposte non valide» sono elementi di partenza utili. «Il database è saturo» è un'ipotesi da verificare, non il punto di partenza della procedura.
La struttura minima di un runbook attuabile
Un documento operativo utile può essere letto ed eseguito durante un incidente. Deve evitare frasi come «controllare i log» senza specificare cosa cercare, in quale intervallo e quale risultato modifica la decisione.
- Scopo e ambito: descrivete il sintomo coperto, i componenti interessati e quelli esclusi. Indicate se si applica alla produzione, ad ambienti specifici o a un tipo di processo.
- Segnali di ingresso: includete l'avviso, le soglie, le dashboard rilevanti, il messaggio di errore e le condizioni che distinguono un avviso reale dal rumore.
- Responsabile iniziale e permessi: specificate chi prende in carico l'incidente, chi esegue le azioni e chi autorizza le operazioni ad alto impatto.
- Rischi e condizioni di arresto: chiarite quali azioni non devono essere eseguite, quali dati potrebbero essere interessati e quando fare escalation senza proseguire.
- Passaggi ed evidenze: ogni passaggio deve richiedere una verifica, registrare un risultato atteso e definire il successivo ramo decisionale.
- Uscita: definite quali prove consentono di chiudere l'incidente e quale follow-up rimane aperto in seguito.
I link interni a dashboard, repository o strumenti possono essere utili nella versione operativa, ma non devono essere l'unico contesto. Annotate quale metrica osservare, quale etichetta filtrare e quale finestra temporale utilizzare. Se uno strumento non è disponibile, il team deve sapere quali evidenze alternative può raccogliere.
Separate diagnosi, mitigazione e recupero
Una causa frequente di incidenti prolungati è mescolare indagine e modifiche. Il runbook deve classificare le azioni in base al loro livello di rischio e alla loro finalità.
Azioni sicure e diagnosi
Prendere in carico l'avviso, aprire un canale di coordinamento, acquisire metriche, consultare i log degli errori e verificare lo stato delle dipendenze sono solitamente azioni a basso rischio. Tuttavia, devono avere dei limiti: anche query costose su un database degradato o ricerche nei log senza filtro possono aggiungere pressione.
La diagnosi deve formulare ipotesi verificabili. Per esempio: se aumentano gli errori di connessione e il pool di connessioni è esaurito, si indagano la dipendenza e il pattern di utilizzo prima di modificare i limiti. Se fallisce soltanto una versione esposta di recente, si confrontano il suo traffico e i suoi errori con la versione precedente.
Mitigazione e recupero
La mitigazione limita il danno senza affermare che la causa sia stata corretta: ridurre l'esposizione di una funzionalità, mettere in pausa un ingresso di job o applicare rate limiting sono esempi possibili. Il recupero riporta il servizio a uno stato accettabile: ripristinare un consumer, effettuare il rollback di una versione o elaborare il lavoro in attesa in modo controllato.
Ogni azione deve includere un punto decisionale: quale metrica migliora, per quanto tempo viene osservata e cosa accade se peggiora. Riavviare un processo PHP può essere valido come mitigazione circoscritta, ma non deve essere un'istruzione automatica se esistono attività non idempotenti, lock del database o consumo di memoria senza spiegazione.
Esempio ipotetico: accumulo di job in una coda PHP
Considerate un'applicazione PHP con consumer che elaborano notifiche, sincronizzazioni o attività commerciali. L'avviso indica che il numero di job in attesa aumenta in modo costante. Il runbook non deve semplicemente ordinare di «svuotare la coda».
- Confermate l'ambito: misurate i job in attesa per tipo di job, età del messaggio, tasso di ingresso e tasso di elaborazione. Verificate se il ritardo interessa tutti i consumer o un percorso specifico.
- Esaminate lo stato dei consumer: processi attivi, riavvii, memoria, errori PHP, timeout ed eccezioni ripetute. Verificate anche la connettività con la coda e le dipendenze chiamate dai job.
- Classificate l'ipotesi: ingresso anormalmente elevato, capacità insufficiente, job bloccato, errore nel codice, dipendenza esterna lenta o dati non validi. Non aumentate i consumer se la dipendenza di destinazione è già satura.
- Definite i limiti di retry. I messaggi che falliscono ripetutamente devono passare a un percorso di revisione o a una coda di errori quando il design lo consente; ritentarli senza limiti può amplificare il traffico e duplicare gli effetti.
- Applicate un recupero graduale: ripristinate o scalate i consumer per gradi, osservate il tasso di successo e monitorate errori, latenza e carico del database. Mantenete una condizione di arresto se il backlog cresce più rapidamente o i guasti aumentano.
- Convalidate il risultato: verificate che il lavoro meno recente diminuisca, che non vi siano duplicati, che le operazioni associate siano coerenti e che l'avviso si stabilizzi durante una finestra definita.
Se i job producono effetti esterni, come addebiti, email o modifiche all'inventario, il runbook deve richiedere una revisione umana prima di rielaborare batch. L'idempotenza riduce il rischio, ma non deve essere presunta senza evidenze del design e dei dati interessati.
Proteggete i dati sensibili e le operazioni irreversibili
Una procedura che coinvolge dati personali, credenziali, ordini, pagamenti o registri normativi necessita di controlli aggiuntivi. Non basta che il comando sia tecnicamente corretto.
- Utilizzate privilegi minimi e account separati per lettura, intervento operativo e amministrazione.
- Richiedete una doppia conferma per cancellazioni, rielaborazioni massive, ripristini o modifiche dirette dei dati.
- Registrate chi ha autorizzato ed eseguito l'azione, quale intervallo di dati ha interessato e quale risultato ha ottenuto.
- Definite un campione di convalida prima di agire sull'intero insieme.
- Stabilite una condizione di arresto esplicita in presenza di discrepanze, dati non identificabili o effetti al di fuori dell'ambito iniziale.
Evitate di includere segreti nel runbook, nei log o nelle schermate. Il documento può indicare il sistema autorizzato per ottenere credenziali temporanee, ma non deve trasformare informazioni sensibili in testo permanente.
Escalation e verifica dopo il recupero

L'escalation non è un fallimento del team che gestisce l'avviso; è una decisione di controllo del rischio. Fate escalation allo sviluppo quando vi è un possibile difetto dell'applicazione, una regressione di versione o un comportamento non idempotente. Fate escalation all'infrastruttura se vi è esaurimento di risorse, rete, storage o piattaforma di esecuzione. Coinvolgete il provider esterno quando le evidenze indicano la sua API o il suo servizio. Richiedete una decisione del business se la mitigazione impone di sospendere le vendite, ritardare le comunicazioni o accettare un ordine di elaborazione diverso.
Definite inoltre un tempo massimo per ogni fase. Se non vi sono evidenze sufficienti dopo la diagnosi iniziale, o se una mitigazione non migliora il segnale nell'intervallo previsto, la persona responsabile deve fare escalation anziché ripetere le azioni.
Il recupero termina quando si verifica qualcosa in più della scomparsa dell'avviso:
- Il sintomo iniziale rimane entro i limiti durante una finestra di osservazione.
- Il lavoro in attesa, le transazioni e i dati interessati sono coerenti.
- Gli utenti possono completare i flussi rilevanti senza degrado apprezzabile.
- Gli avvisi correlati non mostrano effetti collaterali dopo la modifica.
- Restano documentati la cronologia, le ipotesi confermate o scartate, le azioni e i miglioramenti in sospeso.
Rivedete il runbook dopo averlo utilizzato. Eliminate i passaggi che non hanno fornito evidenze, integrate le decisioni che sono state necessarie e trasformate i risultati ricorrenti in miglioramenti dell'osservabilità, dei test o dell'architettura. In questo modo la procedura smette di essere documentazione statica e diventa uno strumento di recupero sicuro.



