clinic.js Suite
Profile seus serviços Node.js com as ferramentas clinic.js da NearForm - Doctor para saúde holística, Flame para hotspots de CPU e Bubbleprof para atrasos de I/O assíncronos.
Busque em todas as páginas da documentação
Profile seus serviços Node.js com as ferramentas clinic.js da NearForm - Doctor para saúde holística, Flame para hotspots de CPU e Bubbleprof para atrasos de I/O assíncronos.
Cartão de receita de referência rápida - pronto para copiar e colar.
npm install -g clinic
clinic doctor -- node dist/server.js
# Em outro terminal, gere carga:
npx autocannon -c 50 -d 30 http://localhost:3000/health
# Pressione Ctrl+C no servidor - Doctor abre um relatório HTMLQuando usar isso:
await sequenciais adicionando latência.# 1. Doctor - saúde geral (atraso do loop, CPU, memória)
clinic doctor -- node --import tsx src/server.ts
# 2. Flame - gráfico de chama de CPU (execute sob carga, depois pare)
clinic flame -- node --import tsx src/server.ts
# 3. Bubbleprof - visualização de atraso assíncrono
clinic bubbleprof -- node --import tsx src/server.ts// src/server.ts - aplicativo mínimo para perfilar
import Fastify from "fastify";
const app = Fastify({ logger: false });
app.get("/health", async () => ({ ok: true }));
app.get("/users/:id", async (req) => {
// Simula I/O sequencial - Bubbleprof destacará isso
const profile = await fakeDb("profiles", req.params.id);
const orders = await fakeDb("orders", req.params.id);
return { profile, orders };
});
async function fakeDb(table: string, id: string) {
await new Promise((r) => setTimeout(r, 20));
return { table, id };
}
await app.listen({ port: 3000, host: "0.0.0.0" });O que isso demonstra:
await sequenciais que Promise.all poderia paralelizar.--import tsx evita uma etapa de build separada durante a investigação.| Ferramenta | Melhor para | Não para |
|---|---|---|
| Doctor | Primeira passagem - "o loop está bloqueado?" | Identificar nomes exatos de funções |
| Flame | Caminhos quentes vinculados à CPU, JSON síncrono, loops apertados | Latência apenas de rede (sem queima de CPU) |
| Bubbleprof | HTTP/DB downstream lentos, awaits seriais | Matemática de CPU pura sem I/O |
# Terminal 1
clinic flame -- node dist/server.js
# Terminal 2 - sustentar concorrência
npx autocannon -c 100 -d 60 http://localhost:3000/users/abc-c) e aos tamanhos de payload.clinic doctor -- node --import tsx src/main.ts
# ou compile primeiro para símbolos mais próximos da produção:
npm run build && clinic flame -- node dist/main.jspino-pretty.LOG_LEVEL=warn.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| clinic.js | Serviços HTTP Node, problemas de event loop | Runtimes não Node |
| 0x / flamegraph | Amostras de CPU rápidas e pontuais | Necessita de visualização de cascata assíncrona |
| OpenTelemetry traces | Amostragem contínua em produção | Atribuição profunda de CPU em nível V8 |
--inspect + Chrome DevTools | Depuração interativa de uma solicitação | Carga sustentada sob concorrência |
Não. Execute em staging com dados anonimizados. A sobrecarga é baixa, mas não zero; pare o tráfego para a instância perfilada.
Execute Flame sob a mesma carga. Procure por barras largas em código síncrono: JSON.parse, bcrypt, chamadas *Sync do fs.
Sim. Aponte o clinic para seu main.js compilado ou node --import tsx src/main.ts. Desabilite Swagger e logging detalhado durante a captura.
clinic.js é para investigações profundas e com tempo limitado. OTel é para traces e métricas contínuas em produção. Use ambos.
Ou a carga é muito baixa ou o gargalo está fora do Node (DB, rede). Verifique Bubbleprof e EXPLAIN do DB.
Sim. Instale o clinic mais recente globalmente. Fixe o Node 24.18.0 para corresponder à produção.
Possível, mas pesado. Prefira limites do k6 para portões de regressão; reserve o clinic para mergulhos profundos manuais em falhas.
Doctor mostra o heap aumentando ao longo do tempo. Combine com writeHeapSnapshot de Otimização de Memória e GC.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026