Respostas HTTP 5xx e Retentativas
Quatro respostas HTTP 5xx podem pertencer a apenas três operações. Algumas dessas operações podem ter recebido um 200 depois. Qual número deveria aparecer no relatório?

A resposta depende da pergunta. Preparei um exemplo pequeno em JavaScript para separar frequência de erros, operações afetadas e último resultado observado.
Exemplo em JavaScript
Salve o bloco abaixo em exemplo.cjs e execute node exemplo.cjs. Ele usa apenas recursos do JavaScript, sem pacotes ou serviços externos.
```javascript
class LogParser {
constructor(logs) {
this.logs = logs;
this.errors = new Set();
this.successes = new Set();
this.retries = new Set();
this.lastLogs = new Map();
}
parseLogs() {
const { logs, errors, successes, retries, lastLogs } = this;
const { length } = logs;
for (let i = 0; i < length; i++) {
const { operation, response, retry } = logs[i];
if (response >= 500 && response < 600) {
errors.add(operation);
} else if (response === 200) {
successes.add(operation);
} else if (retry) {
retries.add(operation);
}
if (lastLogs.has(operation)) {
const { lastResponse, lastTimestamp } = lastLogs.get(operation);
const currentResponse = response;
const currentTimestamp = new Date().getTime();
if (lastResponse >= 500 && lastResponse < 600) {
errors.add(operation);
} else if (lastResponse === 200) {
successes.add(operation);
} else if (currentResponse >= 500 && currentResponse < 600) {
errors.add(operation);
} else if (currentResponse === 200) {
successes.add(operation);
}
lastLogs.set(operation, { lastResponse, lastTimestamp: currentTimestamp });
} else {
lastLogs.set(operation, { lastResponse: response, lastTimestamp: new Date().getTime() });
}
}
}
}
const logs = [
{ operation: 'A', response: 500, retry: false },
{ operation: 'A', response: 200, retry: false },
{ operation: 'B', response: 200, retry: false },
{ operation: 'C', response: 500, retry: true },
{ operation: 'C', response: 200, retry: false },
{ operation: 'C', response: 500, retry: false },
{ operation: 'D', response: 200, retry: false },
{ operation: 'E', response: 500, retry: false }
];
const parser = new LogParser(logs);
parser.parseLogs();
console.log('Número de requisições que receberam 5xx:', errors.size);
console.log('Número de operações que tiveram algum 5xx:', errors.size + successes.size);
console.log('Número de operações que tiveram 5xx no último registro:', lastLogs.size);
```
Métricas de Falha e Últimos Registros
- Número de requisições que receberam 5xx: Conta todas as tentativas presentes no conjunto, inclusive as repetidas.
- Número de operações que tiveram algum 5xx: Conta cada operação uma única vez, mesmo que tenha falhado várias vezes no conjunto.
- Número de operações que tiveram 5xx no último registro: Considera o horário mais recente de cada operação dentro do conjunto.
Exemplo de Operações
- A, C e E receberam erros: A e E tiveram retentativas com resposta 200. C repetiu o erro.
- A, C e E são as operações afetadas: A e E tiveram retentativas com resposta 200. C repetiu o erro.
- C é a única operação que termina este recorte com um 5xx no registro mais recente:
Taxas de Falha e Últimos Registros
- 50% de falhas: Representa a taxa de falhas em operações, não necessariamente a taxa de falhas por requisição.
- 60% de falhas: Representa a taxa de falhas em operações, não necessariamente a taxa de falhas por requisição.
- 20% de falhas: Representa a taxa de falhas em operações, não necessariamente a taxa de falhas por requisição.
Limites para Levar essa Ideia a Logs Reais
- Uma linha precisa representar uma requisição concluída: Se o log registra início, etapas e fim, contar linhas diretamente mistura eventos com requisições.
- Correlação precisa ser confiável: O exemplo exige um ID textual de operação em todas as linhas. Em dados incompletos, é preciso contabilizar o que ficou sem identificação; não inventar uma operação comum para todos os valores ausentes.
- Contagem precisa: Os logs precisam representar uma requisição completa, não misturar eventos e requisições.
Conclusão
Para uma análise prática de logs de retentativas HTTP, é crucial entender as métricas de falha e última resposta. Isso permite identificar e resolver problemas de forma eficaz, sem confiar em taxas de falha isoladas ou dados incompletos. Compreender a correlação precisa entre eventos e requisições é fundamental para uma análise precisa e confiável.