api-stats-logger
Version:
SDK completo de logging e monitoramento de APIs com auto-instrumentação, dashboard em tempo real e CLI para configuração automática
758 lines (592 loc) • 17.1 kB
Markdown
# 🚀 API Stats Logger - SDK de Monitoramento
[](https://www.npmjs.com/package/api-stats-logger)
[](https://opensource.org/licenses/MIT)
## 📋 Visão Geral
O **API Stats Logger** é um SDK de logging e monitoramento completo, inspirado no New Relic, que oferece:
- 🔍 **Auto-instrumentação** de frameworks (Express, NestJS, Fastify, Koa)
- 📊 **Métricas automáticas** de performance e erros
- 🔄 **Logs em tempo real** via WebSocket
- 🎯 **Sistema de alertas** inteligente
- 🛡️ **Retry automático** e tolerância a falhas
- 🔧 **Setup ultra-rápido** com criação automática de projeto
- 🤖 **Auto-criação** de API keys
## 🚀 Instalação
```bash
npm install api-stats-logger
# ou
yarn add api-stats-logger
```
**Problemas com versões?** Use uma dessas opções:
```bash
# Opção 1: Instalar com --legacy-peer-deps
npm install api-stats-logger --legacy-peer-deps
# Opção 2: Instalar com --force (não recomendado para produção)
npm install api-stats-logger --force
# Opção 3: Configurar npm para aceitar dependências peer opcionais
npm config set legacy-peer-deps true
npm install api-stats-logger
```
## ⚡ Quick Start (REALMENTE 30 segundos!)
### 1. Setup 100% automático com CLI
```bash
npx api-stats-init
```
**O CLI agora automaticamente:**
- ✅ Cria um projeto para você
- ✅ Gera uma API key
- ✅ Configura todas as variáveis de ambiente
- ✅ Gera exemplos prontos para seu framework
### 2. Uso mais simples possível
```javascript
// Apenas isso! 🔥
require('api-stats-logger').init();
// Resto da sua aplicação...
const express = require('express');
const app = express();
// Logs automáticos para tudo!
```
### 3. Suas variáveis já estão prontas!
```env
# Gerado automaticamente pelo CLI
API_STATS_API_KEY=abc123def456...
API_STATS_SERVICE=minha-api
API_STATS_ENVIRONMENT=production
API_STATS_PROJECT_ID=507f1f77bcf86cd799439011
```
## 🎯 Integração por Framework
### Express.js
```javascript
const ApiStatsLogger = require('api-stats-logger');
const express = require('express');
// Opção 1: Auto-instrumentação (Recomendado)
const logger = ApiStatsLogger.init({
autoDetect: true
});
// Opção 2: Middleware manual
const app = express();
app.use(ApiStatsLogger.expressMiddleware({
logger: new ApiStatsLogger(),
captureBody: false,
skipPaths: ['/health']
}));
```
### NestJS
```typescript
// main.ts
import { ApiStatsLogger } from 'api-stats-logger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.use(ApiStatsLogger.nestMiddleware({
logger: new ApiStatsLogger(),
captureBody: false
}));
await app.listen(3000);
}
```
### Fastify
```javascript
const fastify = require('fastify');
const ApiStatsLogger = require('api-stats-logger');
// Auto-instrumentação automática detecta Fastify!
const logger = ApiStatsLogger.init();
```
### Koa
```javascript
const Koa = require('koa');
const ApiStatsLogger = require('api-stats-logger');
const app = new Koa();
// Auto-instrumentação automática detecta Koa!
const logger = ApiStatsLogger.init();
```
## 🔧 Configuração Avançada
### Configuração Completa
```javascript
const logger = new ApiStatsLogger({
// Basic (auto-preenchidos pelo CLI)
apiKey: process.env.API_STATS_API_KEY,
url: process.env.API_STATS_URL,
service: process.env.API_STATS_SERVICE,
environment: process.env.API_STATS_ENVIRONMENT,
// Performance
batchSize: 50,
flushInterval: 5000,
maxRetries: 3,
// Features
captureErrors: true,
capturePerformance: true,
// Security
captureBody: false,
captureHeaders: false
});
```
### Setup para Projetos Existentes
Se você já tem um projeto e API key:
```bash
npx api-stats-init
# Escolha "Sim" quando perguntado se já tem projeto
# Cole sua API key existente
```
### Setup Manual (sem CLI)
```javascript
// Apenas se não quiser usar o CLI automático
const logger = new ApiStatsLogger({
apiKey: 'sua-api-key-existente',
service: 'minha-api',
environment: 'production'
});
```
## 📊 Exemplos de Uso
### Logging Manual
```javascript
const logger = new ApiStatsLogger();
// Métodos de conveniência
logger.info('Usuário logado', { userId: 123, ip: '1.2.3.4' });
logger.error('Erro no banco', { error: 'timeout', table: 'users' });
logger.warn('Cache miss', { key: 'user:123' });
logger.debug('Debug info', { step: 'validation' });
// Logging avançado
logger.log({
level: 'info',
message: 'Operação concluída',
metadata: {
operation: 'payment',
duration: 450,
success: true,
paymentId: 'pay_123'
}
});
```
### Logging de Operações
```javascript
async function processPayment(paymentData) {
const startTime = Date.now();
const operationId = `pay_${Date.now()}`;
logger.info('Processamento iniciado', {
operationId,
amount: paymentData.amount
});
try {
// Sua lógica aqui
const result = await paymentGateway.process(paymentData);
logger.info('Pagamento processado', {
operationId,
paymentId: result.id,
duration: Date.now() - startTime,
status: 'success'
});
return result;
} catch (error) {
logger.error('Erro no pagamento', {
operationId,
error: error.message,
duration: Date.now() - startTime,
paymentData: { ...paymentData, cardNumber: '[REDACTED]' }
});
throw error;
}
}
```
### Instrumentação de Banco de Dados
```javascript
// MongoDB/Mongoose
const mongoose = require('mongoose');
const { database } = require('api-stats-logger/middleware');
const dbLogger = database({
logger: new ApiStatsLogger(),
captureQueries: true
});
dbLogger.mongoose(); // Instrumenta automaticamente
// PostgreSQL
const { Client } = require('pg');
// Instrumentação automática já ativa!
```
## 📈 Métricas Automáticas
O SDK captura automaticamente:
### HTTP Requests
- Response time médio
- Status codes
- Throughput (req/min)
- Endpoints mais lentos
- Error rate
### Erros
- Tipos de erro
- Stack traces
- Frequência por serviço
- Padrões de erro
### Performance
- Uso de memória
- CPU usage
- Uptime
- GC metrics
### Banco de Dados
- Query time médio
- Queries mais lentas
- Tipos de operação
- Connection pool
## 🔔 Alertas Inteligentes
```javascript
// Alertas automáticos para:
// - Error rate > 5%
// - Response time > 2s
// - Memory usage > 80%
// - 5xx errors
// - Database timeouts
// Configurar alertas customizados
logger.alert({
name: 'high_error_rate',
condition: 'error_rate > 0.05',
channels: ['email', 'slack'],
cooldown: '5m'
});
```
## 📊 Dashboard e Visualização
Acesse o dashboard em: `http://localhost:3000`
### Features do Dashboard:
- 📊 Gráficos em tempo real
- 🔍 Busca avançada de logs
- 📈 Métricas de performance
- 🚨 Central de alertas
- 🔄 Logs ao vivo (WebSocket)
## 🛠️ CLI Úteis
```bash
# Setup inicial
npx api-stats-init
# Verificar conectividade
npx api-stats-test
# Ver estatísticas
npm run logs:stats
# Gerar relatório
npx api-stats-report --period=1d
```
## 🔒 Segurança
### Headers Sensíveis (Automaticamente Removidos)
- `authorization`
- `cookie`
- `x-api-key`
- `x-auth-token`
### Configuração de Segurança
```javascript
const logger = new ApiStatsLogger({
captureBody: false, // Não capturar payloads
captureHeaders: false, // Não capturar headers
maxBodySize: 1024 * 5, // Limite de 5KB
skipPaths: ['/admin'], // Pular rotas sensíveis
sensitiveKeys: ['password', 'token'] // Keys para redact
});
```
## 🚀 Performance
### Configurações de Performance
```javascript
const logger = new ApiStatsLogger({
batchSize: 100, // Logs por batch
flushInterval: 10000, // Flush a cada 10s
maxRetries: 5, // Tentativas de reenvio
enabled: process.env.NODE_ENV !== 'test' // Desabilitar em testes
});
```
### Estatísticas
```javascript
const stats = logger.getStats();
console.log(stats);
// {
// sent: 1250,
// failed: 5,
// retries: 12,
// bufferSize: 0,
// avgFlushTime: 45.2
// }
```
## 🔧 Troubleshooting
### Verificar Conectividade
```javascript
const logger = new ApiStatsLogger({ apiKey: 'test' });
logger.info('Test log');
setTimeout(() => {
const stats = logger.getStats();
if (stats.failed > 0) {
console.log('❌ Problemas de conectividade');
} else {
console.log('✅ Tudo funcionando!');
}
}, 5000);
```
### Debug Mode
```javascript
const logger = new ApiStatsLogger({
debug: true, // Logs detalhados no console
logLevel: 'debug'
});
```
### Health Check
```javascript
app.get('/health', (req, res) => {
const stats = logger.getStats();
const healthy = stats.failed < stats.sent * 0.1; // < 10% falhas
res.status(healthy ? 200 : 503).json({
status: healthy ? 'ok' : 'degraded',
logger: stats
});
});
```
## 🔄 Migração de Outros Sistemas
### Do Winston
```javascript
// Antes
const winston = require('winston');
const logger = winston.createLogger({...});
// Depois
const ApiStatsLogger = require('api-stats-logger');
const logger = new ApiStatsLogger();
// API compatível!
logger.info('message', { metadata });
logger.error('error', { error: err });
```
### Do Bunyan
```javascript
// Antes
const bunyan = require('bunyan');
const log = bunyan.createLogger({name: 'app'});
// Depois
const logger = new ApiStatsLogger({ service: 'app' });
```
## 📚 Exemplos Completos
### E-commerce API
```javascript
const ApiStatsLogger = require('api-stats-logger');
const express = require('express');
const logger = ApiStatsLogger.init({
service: 'ecommerce-api',
captureBody: false, // PCI compliance
skipPaths: ['/health', '/metrics']
});
const app = express();
app.post('/orders', async (req, res) => {
const { userId, items, total } = req.body;
logger.info('Novo pedido', {
userId,
itemCount: items.length,
total,
channel: 'web'
});
try {
const order = await createOrder({ userId, items, total });
logger.info('Pedido criado', {
orderId: order.id,
userId,
total,
processingTime: order.processingTime
});
res.json(order);
} catch (error) {
logger.error('Erro ao criar pedido', {
userId,
error: error.message,
stack: error.stack,
items: items.length
});
res.status(500).json({ error: 'Erro interno' });
}
});
```
### Microserviço
```javascript
const ApiStatsLogger = require('api-stats-logger');
const logger = new ApiStatsLogger({
service: 'user-service',
environment: process.env.NODE_ENV,
tags: {
version: process.env.SERVICE_VERSION,
region: process.env.AWS_REGION
}
});
// Graceful shutdown
process.on('SIGTERM', async () => {
logger.info('Recebido SIGTERM, finalizando...');
await logger.close();
process.exit(0);
});
```
## 🤝 Suporte
- 📖 **Documentação**: [docs.api-stats.com](https://docs.api-stats.com)
- 🐛 **Issues**: [GitHub Issues](https://github.com/api-stats/logger/issues)
- 💬 **Discord**: [Comunidade](https://discord.gg/api-stats)
- 📧 **Email**: support@api-stats.com
## 📄 Licença
MIT License - veja [LICENSE](LICENSE) para detalhes.
---
**Feito com ❤️ para desenvolvedores que querem observabilidade simples e poderosa.**
## ✨ Novidades v1.1.1
🚀 **Suporte Completo a Múltiplos Frameworks!**
- ✅ Express 4.x e 5.x
- ✅ NestJS 8.x, 9.x e 10.x
- ✅ Fastify 3.x, 4.x e 5.x
- ✅ Koa 2.x+
- 🔧 Resolvidos problemas de dependências peer
## 📦 Uso por Framework
### Express (4.x e 5.x)
```javascript
const ApiStatsLogger = require('api-stats-logger');
const logger = new ApiStatsLogger({
apiKey: 'sua-api-key',
service: 'meu-servico'
});
const app = express();
// Middleware automático
app.use(ApiStatsLogger.expressMiddleware({ logger }));
// Ou use a auto-instrumentação
const logger = ApiStatsLogger.init({
apiKey: 'sua-api-key',
service: 'meu-servico',
autoDetect: true // Detecta Express automaticamente
});
```
### NestJS
```typescript
// main.ts
import { ApiStatsLogger } from 'api-stats-logger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const logger = new ApiStatsLogger({
apiKey: process.env.API_STATS_API_KEY,
service: 'meu-servico-nest'
});
app.use(ApiStatsLogger.nestMiddleware({ logger }));
await app.listen(3000);
}
```
### Fastify
```javascript
const fastify = require('fastify')({ logger: true });
const ApiStatsLogger = require('api-stats-logger');
const logger = new ApiStatsLogger({
apiKey: 'sua-api-key',
service: 'meu-servico-fastify'
});
// Registrar como plugin
fastify.register(async function (fastify) {
fastify.addHook('preHandler', ApiStatsLogger.fastifyMiddleware({ logger }));
});
// Ou usar auto-instrumentação
const logger = ApiStatsLogger.init({
apiKey: 'sua-api-key',
autoDetect: true
});
```
### Koa
```javascript
const Koa = require('koa');
const ApiStatsLogger = require('api-stats-logger');
const app = new Koa();
const logger = new ApiStatsLogger({
apiKey: 'sua-api-key',
service: 'meu-servico-koa'
});
// Adicionar middleware
app.use(ApiStatsLogger.koaMiddleware({ logger }));
// Ou usar auto-instrumentação
const logger = ApiStatsLogger.init({
apiKey: 'sua-api-key',
autoDetect: true
});
```
## 🔧 Configuração Avançada
### Variáveis de Ambiente
Crie um arquivo `.env`:
```env
API_STATS_API_KEY=sua-api-key-aqui
API_STATS_URL=https://api.apistats.dev/logs
API_STATS_SERVICE=meu-servico
API_STATS_ENVIRONMENT=production
API_STATS_BATCH_SIZE=20
API_STATS_FLUSH_INTERVAL=5000
API_STATS_ENABLED=true
```
### Opções do Middleware
```javascript
const middlewareOptions = {
logger,
captureBody: true, // Capturar corpo das requisições
captureHeaders: false, // Capturar headers (dados sensíveis)
captureQuery: true, // Capturar query parameters
captureParams: true, // Capturar route parameters
skipPaths: ['/health', '/metrics'], // Pular rotas específicas
skipMethods: ['OPTIONS'], // Pular métodos específicos
maxBodySize: 1024 * 10 // Tamanho máximo do corpo (10KB)
};
app.use(ApiStatsLogger.expressMiddleware(middlewareOptions));
```
## 🔍 Compatibilidade de Versões
| Framework | Versões Suportadas | Status |
|-----------|-------------------|---------|
| Express | 4.18.0+ e 5.x | ✅ Pleno |
| NestJS | 8.x, 9.x, 10.x | ✅ Pleno |
| Fastify | 3.x, 4.x, 5.x | ✅ Pleno |
| Koa | 2.x+ | ✅ Pleno |
| Node.js | 14.0.0+ | ✅ Pleno |
## 🚨 Resolvendo Conflitos de Dependências
### Problema: ERESOLVE com Express 5.x
**Erro:**
```
npm error ERESOLVE could not resolve
npm error Could not resolve dependency:
npm error peerOptional express@"^4.18.0" from api-stats-logger@1.1.0
```
**Soluções:**
1. **Atualizar para v1.1.1+** (recomendado):
```bash
npm install api-stats-logger@latest
```
2. **Usar flags do npm**:
```bash
npm install api-stats-logger --legacy-peer-deps
```
3. **Configurar .npmrc**:
```bash
echo "legacy-peer-deps=true" >> .npmrc
npm install api-stats-logger
```
### Problemas com TypeScript
Se estiver usando TypeScript, instale os tipos:
```bash
npm install --save-dev @types/express @types/koa
```
## 📊 Recursos
- ✅ **Auto-instrumentação** - Detecta seu framework automaticamente
- ✅ **Múltiplos Frameworks** - Express, NestJS, Fastify, Koa
- ✅ **Captura de Requests/Responses** - Dados completos de HTTP
- ✅ **Métricas de Performance** - Tempo de resposta, CPU, memória
- ✅ **Detecção de Erros** - Captura automática de exceções
- ✅ **Instrumentação de Banco** - MongoDB, PostgreSQL, MySQL
- ✅ **Dashboard em Tempo Real** - Visualização ao vivo
- ✅ **Batching Inteligente** - Envio otimizado de logs
- ✅ **Retry Automático** - Reenvio em caso de falha
## 🏃♂️ Início Rápido Completo
```bash
# 1. Instalar
npm install api-stats-logger
# 2. Configurar automaticamente
npx api-stats-init
# 3. Definir variáveis de ambiente
export API_STATS_API_KEY="sua-api-key"
# 4. Usar no código (detecção automática)
```
```javascript
const ApiStatsLogger = require('api-stats-logger');
// Inicialização com auto-detecção
const logger = ApiStatsLogger.init({
apiKey: process.env.API_STATS_API_KEY,
service: 'meu-servico',
autoDetect: true // Detecta e instrumenta automaticamente
});
// Pronto! Seu framework será detectado e instrumentado automaticamente
```
## 📚 Documentação Completa
- [Guia de Setup](./API-STATS-SETUP.md)
- [Changelog](./CHANGELOG.md)
- [Release Notes](./RELEASE-NOTES.md)
## 🆘 Suporte
- 📧 Email: dev@grupoloyalty.com.br
- 🐛 Issues: [GitHub Issues](https://github.com/grupo-loyalty/api-stats-logger/issues)
- 📖 Docs: [Documentation](https://github.com/grupo-loyalty/api-stats-logger#readme)
## 📄 Licença
MIT License - veja [LICENSE](LICENSE) para detalhes.