Skip to main content

Runbook: Tasso di Errore Elevato

Severita: Warning Alert Prometheus: HighErrorRate

Descrizione

Questo alert si attiva quando il tasso di errore di un servizio Moleculer supera il 5% delle richieste totali in una finestra di 5 minuti. Gli errori includono eccezioni non gestite, timeout, errori di validazione, fallimenti di connessione al database e attivazione dei circuit breaker.

Regola Prometheus:

(rate(moleculer_request_error_total{namespace="pos-enterprise"}[5m])
/ rate(moleculer_request_total{namespace="pos-enterprise"}[5m]))
> 0.05

Impatto

  • Degradazione del servizio: una percentuale significativa di richieste fallisce, gli utenti ricevono errori.
  • Circuit breaker aperti: se il tasso supera la soglia del circuit breaker (default 50%), il servizio viene isolato.
  • Retry storm: i client retentano le richieste fallite, amplificando il carico.
  • Dati inconsistenti: operazioni di scrittura parzialmente completate possono lasciare dati in stato inconsistente.
  • Impatto business: ordini persi, pagamenti non registrati, stampe mancanti.

Diagnosi

1. Identificare i servizi con errori elevati

# Grafana: tasso di errore per servizio
sum by (service) (rate(moleculer_request_error_total{namespace="pos-enterprise"}[5m]))
/ sum by (service) (rate(moleculer_request_total{namespace="pos-enterprise"}[5m]))
# Top 10 azioni con piu errori
topk(10,
sum by (action) (rate(moleculer_request_error_total{namespace="pos-enterprise"}[5m]))
)

2. Analizzare i tipi di errore

# Log degli errori recenti dal gateway
kubectl logs deployment/api-gateway -n pos-enterprise --tail=200 | \
grep -i "error\|ERR\|failed" | tail -30

# Log da un servizio specifico
kubectl logs deployment/orders-node -n pos-enterprise --tail=200 | \
grep -i "error\|ERR\|failed" | tail -30

3. Classificare gli errori Moleculer

I tipi di errore piu comuni nella piattaforma:

Errore MoleculerCodice HTTPCausa tipica
ValidationError422Parametri invalidi
ServiceNotFoundError404Servizio non registrato in NATS
ServiceNotAvailableError503Tutte le istanze down
RequestTimeoutError504Azione non risponde in tempo
RequestRejectedError503Bulkhead pieno, coda esaurita
MaxCallLevelError500Chiamate ricorsive eccessive
MoleculerError500Errore generico applicativo
ServiceSchemaError500Schema servizio malformato
# Contare gli errori per tipo
kubectl logs deployment/api-gateway -n pos-enterprise --since=30m | \
grep -oP '"type":"[^"]+"' | sort | uniq -c | sort -rn

4. Verificare lo stato dei circuit breaker

# Metriche Moleculer via endpoint interno
curl -s https://platform.sellogic.cloud/api/\$node/health | jq '.client.circuitBreaker'

# Lista dei servizi con circuit breaker aperto
curl -s https://platform.sellogic.cloud/api/\$node/list | jq '
.[] | select(.circuits? | length > 0) | {hostname, circuits}
'
# Circuit breaker aperti (Grafana)
moleculer_circuit_breaker_opened_total{namespace="pos-enterprise"}

5. Verificare la connettivita al database

# Test connessione MongoDB
kubectl exec deployment/orders-node -n pos-enterprise -- \
node -e "
const mongoose = require('mongoose');
mongoose.connect(process.env.MONGO_URI).then(() => {
console.log('MongoDB: OK');
return mongoose.connection.db.admin().ping();
}).then(r => {
console.log('Ping:', JSON.stringify(r));
process.exit(0);
}).catch(e => {
console.error('MongoDB error:', e.message);
process.exit(1);
});
"

6. Verificare lo stato di Redis

kubectl run redis-check --rm -it --image=redis:7-alpine -n pos-enterprise -- \
redis-cli -u "$REDIS_URL" info stats | grep -E "rejected_connections|keyspace_misses|evicted_keys"

7. Verificare i retry esauriti

# Cercare nei log i retry falliti
kubectl logs deployment/api-gateway -n pos-enterprise --since=15m | \
grep -c "retry"

Risoluzione

Causa: Errori di connessione MongoDB

# Verificare lo stato del cluster MongoDB Atlas
# Dashboard: https://cloud.mongodb.com

# Se ci sono problemi di rete, verificare la whitelist IP
# Se il cluster e sovraccarico, verificare le metriche Atlas

# Restart rolling dei servizi per rinfrescare le connessioni
kubectl rollout restart deployment orders-node -n pos-enterprise
kubectl rollout restart deployment products-node -n pos-enterprise

Causa: Timeout (RequestTimeoutError)

# Aumentare temporaneamente il timeout per il servizio
kubectl set env deployment/<DEPLOY_NAME> -n pos-enterprise \
MOL_REQUEST_TIMEOUT=30000

# Verificare se ci sono query lente
kubectl exec deployment/orders-node -n pos-enterprise -- \
node -e "
const m = require('mongoose');
m.connect(process.env.MONGO_URI).then(async () => {
const profiler = await m.connection.db.command({profile: -1});
console.log('Profiler level:', profiler.was);
const slow = await m.connection.db.collection('system.profile')
.find({}).sort({ts: -1}).limit(5).toArray();
slow.forEach(q => console.log(q.millis + 'ms -', q.ns, JSON.stringify(q.command).substring(0,100)));
process.exit(0);
});
"

Causa: Circuit breaker aperti

# I circuit breaker si resettano automaticamente dopo halfOpenTime (default 10s).
# Se il problema sottostante e risolto, attendere il reset automatico.

# Per forzare il reset, riavviare il nodo
kubectl rollout restart deployment <DEPLOY_NAME> -n pos-enterprise

Causa: Errori di validazione massivi

Se il tasso di errore e causato da ValidationError (422):

# Verificare i log per capire quali parametri sono invalidi
kubectl logs deployment/api-gateway -n pos-enterprise --since=15m | \
grep "ValidationError" | head -20

# Probabile causa: aggiornamento client con schema incompatibile
# Verificare la versione del client che invia le richieste
kubectl logs deployment/api-gateway -n pos-enterprise --since=15m | \
grep "User-Agent" | sort | uniq -c

Causa: ServiceNotAvailableError

# Verificare quali servizi hanno 0 istanze
curl -s https://platform.sellogic.cloud/api/\$node/services | jq '
.[] | select(.nodes | length == 0) | .name
'

# Riavviare il deployment del servizio mancante
kubectl rollout restart deployment <DEPLOY_NAME> -n pos-enterprise

Mitigazione: ridurre il carico

# Abilitare rate limiting sul gateway (se non attivo)
# Ridurre le repliche dei batch job
kubectl scale deployment scheduler-node -n pos-enterprise --replicas=1

# Scalare i servizi sotto pressione
kubectl scale deployment orders-node -n pos-enterprise --replicas=3

Prevenzione

  • Monitoraggio granulare: alert separati per errori 4xx (client) e 5xx (server).
  • Retry policy ottimizzata: configurare retry con backoff esponenziale e jitter.
  • Bulkhead per servizio: limitare la concorrenza per evitare cascate.
  • Graceful degradation: i servizi devono fallire in modo prevedibile (fallback, cache stale).
  • Canary deploy: introdurre cambiamenti gradualmente per individuare regressioni.
# Alert separato per errori server (5xx)
(rate(moleculer_request_error_total{namespace="pos-enterprise", code=~"5.."}[5m])
/ rate(moleculer_request_total{namespace="pos-enterprise"}[5m]))
> 0.02

# Alert per errori client (potenziale bug nel frontend)
(rate(moleculer_request_error_total{namespace="pos-enterprise", code=~"4.."}[5m])
/ rate(moleculer_request_total{namespace="pos-enterprise"}[5m]))
> 0.10
  • Dashboard dedicata: creare un pannello Grafana con error budget (SLO 99.5% disponibilita).

Escalation

LivelloCondizioneContatto
L1 - OpsError rate 5-10%, singolo servizioMonitorare, verificare logs
L2 - DevError rate > 10%, errori applicativiTeam Dev (Slack #pos-dev)
L2 - OpsError rate > 5%, causa infrastrutturaleDevOps - verificare DB/NATS/Redis
L3 - AllError rate > 20%, multipli serviziIncident call - tutti i team

Tempo massimo di risposta: 15 minuti. Se accompagnato da alert di servizi down, trattare come Critical.

Questa pagina ti è stata utile?