Какую статистику ты собираешь во время разработки на Node.js?

Ответ

Во время разработки на Node.js я собираю метрики, помогающие анализировать производительность и стабильность:

  1. Производительность:
const start = process.hrtime();
// Код
const diff = process.hrtime(start);
console.log(`Execution time: ${diff[0] * 1e3 + diff[1] / 1e6}ms`);
  1. Память:
setInterval(() => {
  console.log(`Memory usage: ${JSON.stringify(process.memoryUsage())}`);
}, 5000);
  1. Event Loop:
    Использую event-loop-lag или toobusy-js для мониторинга задержек.

  2. Ошибки:
    Логирую uncaught exceptions и unhandled rejections:

process.on('uncaughtException', (err) => {
  logger.error('Uncaught Exception', err);
});
  1. 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. Но на этапе разработки, чтобы просто понять, что твой код не полный распиздяй, хватает и консольного вывода. Главное — смотреть на эти цифры и не делать вид, что всё окей. А то потом сам от себя охуеешь, когда в три часа ночи начнётся жара.