Ответ
Во время разработки на Node.js я собираю метрики, помогающие анализировать производительность и стабильность:
- Производительность:
const start = process.hrtime();
// Код
const diff = process.hrtime(start);
console.log(`Execution time: ${diff[0] * 1e3 + diff[1] / 1e6}ms`);
- Память:
setInterval(() => {
console.log(`Memory usage: ${JSON.stringify(process.memoryUsage())}`);
}, 5000);
-
Event Loop:
Используюevent-loop-lagилиtoobusy-jsдля мониторинга задержек. -
Ошибки:
Логирую uncaught exceptions и unhandled rejections:
process.on('uncaughtException', (err) => {
logger.error('Uncaught Exception', err);
});
- HTTP-запросы:
Сбор метрик через middleware (response time, статус коды).
Для продакшна добавляю APM-системы (New Relic, Datadog), но в разработке достаточно консольного вывода и логов.
Ответ 18+ 🔞
Ну, вот смотри, как я обычно на Node.js метрики собираю, чтобы потом не охуеть от неожиданностей в продакшене. Это ж как с машиной — пока не посмотришь на датчики, не поймёшь, что она бензин хавает как не в себя и вот-вот накрывается медным тазом.
1. Производительность, ёпта.
Вот тут всё просто, как три копейки. Берёшь и замеряешь, сколько твой код тормозит. Главное — не обманывать себя.
const start = process.hrtime();
// Твой код, который может оказаться пиздопроебибным
const diff = process.hrtime(start);
console.log(`Execution time: ${diff[0] * 1e3 + diff[1] / 1e6}ms`);
Смотришь на цифры и думаешь: «Э, бошка, думай!» Если время овердохуища, значит, пора что-то менять.
2. Память.
А вот это, чувак, вообще отдельная песня. Node.js может тихо сожрать всю оперативку, а ты и не заметишь, пока сервер не ляжет с визгом. Поэтому я вот такую штуку вставляю:
setInterval(() => {
console.log(`Memory usage: ${JSON.stringify(process.memoryUsage())}`);
}, 5000);
Каждые пять секунд смотрю, не превратился ли мой процесс в мартышлюшку, которая жрёт бананы без остановки. Если rss ползёт вверх как хуй с горы — подозрение ебать чувствую, где-то утечка.
3. Event Loop.
Это, блядь, святое. Если он лагает, то все запросы начинают вставать в очередь, как гомосеки налетели. Использую toobusy-js или что-то подобное. Просто чтобы знать, когда приложение начинает бздеть и не успевает обрабатывать события. Игнорировать это — всё равно что идти по охуенно тонкому льду.
4. Ошибки.
Тут доверия ебать ноль к самому себе. Всегда есть шанс, что вылезет какая-нибудь необработанная хуйня и положит всё приложение. Поэтому вешаю глобальные обработчики:
process.on('uncaughtException', (err) => {
logger.error('Uncaught Exception', err); // А вот тут уже волнение ебать
});
Терпения ноль ебать с такими ошибками — лучше сразу в лог и перезапустить процесс, чем гадать, почему всё упало.
5. HTTP-запросы.
Ставлю простой middleware, который считает время ответа и статусы. Увидишь, что какой-то эндпоинт вдруг начал отвечать за две секунды вместо ста миллисекунд — сразу понятно, где искать хитрожопого бага.
Ну а для продакшна, конечно, уже ставлю нормальные APM-системы вроде New Relic. Но на этапе разработки, чтобы просто понять, что твой код не полный распиздяй, хватает и консольного вывода. Главное — смотреть на эти цифры и не делать вид, что всё окей. А то потом сам от себя охуеешь, когда в три часа ночи начнётся жара.