Код Middle Ошибки и логирование обновлено
Статистика по access-логу: коды и p95
Условие
Строки access-лога вида 2026-10-01T12:00:00Z GET /api/users 200 35ms. Напиши logStats(lines), которая возвращает:
total: число корректных строк;byClass: объект с количеством ответов по классам2xx,3xx,4xx,5xx(только встретившиеся классы);p95: 95-й перцентиль времени ответа в мс по методу nearest rank: отсортировать по возрастанию, взять элемент с номеромceil(0.95 * n)(нумерация с 1);null, если строк нет;errorRate: доля 5xx, округлённая до 3 знаков (Math.round(x * 1000) / 1000), 0 при пустом логе.
Битые строки (меньше 5 полей, статус не трёхзначное число, время не в формате <число>ms) пропускать.
Примеры
logStats(["t GET /a 200 10ms", "t GET /b 500 30ms", "t POST /c 201 20ms"]) // {"total":3,"byClass":{"2xx":2,"5xx":1},"p95":30,"errorRate":0.333}
logStats([]) // {"total":0,"byClass":{},"p95":null,"errorRate":0}
logStats(["bad line", "t GET /a 2OO 5ms", "t GET /a 200 fast", "t GET /a 404 7ms"]) // {"total":1,"byClass":{"4xx":1},"p95":7,"errorRate":0}
Как подойти
Подсказки: 2
- Разбей строку по пробелам и проверь поля регулярками.
- Номер элемента для p95:
Math.ceil(0.95 * n), индекс на единицу меньше.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
Необработанный rejected промис в Node 22
Следующий вопрос
Circuit breaker: closed, open, half-open