UNPKG

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

775 lines (609 loc) 16.5 kB
# 🔧 Integração Back-end - API Stats Logger ## 📋 Para Desenvolvedores Back-end Esta documentação é destinada a desenvolvedores back-end que precisam integrar o **API Stats Logger** em aplicações existentes ou novas. Aqui você encontrará tudo o que precisa para uma integração perfeita. --- ## 🚀 Início Rápido (5 minutos) ### 1. Instalar e Configurar ```bash # Instalar o pacote npm install api-stats-logger # Configurar automaticamente npx api-stats-init ``` ### 2. Integrar no Código ```javascript // No topo do seu app principal (ANTES de outros requires) require('api-stats-logger').init(); // Resto da sua aplicação continua IGUAL const express = require('express'); // ... resto do código ``` ### 3. Verificar Logs Acesse: [https://apistats.squareweb.app](https://apistats.squareweb.app) **Pronto!** Logs automáticos para todas as requisições. 🎉 --- ## 📊 Especificação do Endpoint de Logs ### URL e Método ``` POST https://apistats.squareweb.app/logs ``` ### Headers Obrigatórios ``` Content-Type: application/json x-api-key: sua-api-key-aqui ``` ### Formato do Payload ```javascript // Array de objetos de log [ { "timestamp": "2024-05-29T10:30:00.000Z", // ISO 8601 (obrigatório) "level": "info", // debug|info|warn|error (obrigatório) "message": "Descrição do log", // string (obrigatório) "service": "nome-do-servico", // string (opcional) "environment": "production", // string (opcional) "metadata": { // object (opcional) "requestId": "req_123", "userId": 456, "duration": 150, // ... qualquer dado adicional } } ] ``` ### ✅ Endpoint Validado **Status**: ✅ 100% Funcional **Bloqueios**: ❌ Nenhum (apenas validação de API key) **Performance**: 🚀 < 400ms (média) **Rate Limit**: ❌ Nenhum **CORS**: ✅ Habilitado ### Respostas #### Sucesso (201) ```json { "success": true } ``` #### Erro de Autenticação (401) ```json { "statusCode": 401, "message": "Unauthorized" } ``` #### Erro de Validação (400) ```json { "statusCode": 400, "message": "Invalid payload format" } ``` #### Erro Interno (500) ```json { "statusCode": 500, "message": "Internal server error" } ``` --- ## 🔧 Métodos de Integração ### Método 1: Auto-instrumentação (RECOMENDADO) ```javascript // app.js ou server.js require('api-stats-logger').init(); // Express, NestJS, Fastify, Koa são detectados automaticamente const express = require('express'); const app = express(); // Suas rotas funcionam normalmente app.get('/users', (req, res) => { res.json({ users: [] }); // Log automático: GET /users 200 [45ms] }); ``` ### Método 2: Middleware Manual ```javascript const express = require('express'); const ApiStatsLogger = require('api-stats-logger'); const app = express(); const logger = new ApiStatsLogger(); // Middleware ANTES das rotas app.use(ApiStatsLogger.expressMiddleware({ logger, captureBody: false, captureHeaders: true, skipPaths: ['/health', '/metrics'] })); // Suas rotas app.get('/users', (req, res) => { res.json({ users: [] }); }); ``` ### Método 3: Logs Manuais ```javascript const ApiStatsLogger = require('api-stats-logger'); const logger = new ApiStatsLogger(); app.post('/users', async (req, res) => { logger.info('Creating user', { email: req.body.email }); try { const user = await createUser(req.body); logger.info('User created successfully', { userId: user.id, email: user.email }); res.status(201).json(user); } catch (error) { logger.error('Error creating user', { error: error.message, email: req.body.email }); res.status(500).json({ error: 'Internal server error' }); } }); ``` --- ## 📦 Frameworks Suportados ### Express.js (4.x e 5.x) ```javascript require('api-stats-logger').init(); // Auto-detecta const express = require('express'); const app = express(); // OU middleware manual app.use(ApiStatsLogger.expressMiddleware()); ``` ### NestJS (8.x, 9.x, 10.x) ```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() })); await app.listen(3000); } ``` ### Fastify (3.x, 4.x, 5.x) ```javascript require('api-stats-logger').init(); // Auto-detecta const fastify = require('fastify'); // OU manual com hooks fastify.addHook('onRequest', ApiStatsLogger.fastifyHook); ``` ### Koa (2.x+) ```javascript require('api-stats-logger').init(); // Auto-detecta const Koa = require('koa'); // OU middleware manual app.use(ApiStatsLogger.koaMiddleware()); ``` ### Outros Frameworks ```javascript // Para qualquer framework HTTP const logger = new ApiStatsLogger(); // Em cada requisição function handleRequest(req, res) { const startTime = Date.now(); logger.info('Request started', { method: req.method, url: req.url, ip: req.ip }); // ... sua lógica const duration = Date.now() - startTime; logger.info(`${req.method} ${req.url} ${res.statusCode}`, { duration, statusCode: res.statusCode }); } ``` --- ## ⚙️ Configuração Avançada ### Variáveis de Ambiente ```env # Obrigatórias (geradas automaticamente pela CLI) API_STATS_API_KEY=ak_1234567890abcdef... API_STATS_URL=https://apistats.squareweb.app/logs API_STATS_SERVICE=minha-api-backend API_STATS_ENVIRONMENT=production # Opcionais (performance) API_STATS_BATCH_SIZE=10 # Logs por batch API_STATS_FLUSH_INTERVAL=2000 # ms entre envios API_STATS_MAX_RETRIES=3 # Tentativas em caso de erro # Opcionais (captura) API_STATS_CAPTURE_BODY=false # Capturar request/response body API_STATS_CAPTURE_HEADERS=true # Capturar headers API_STATS_ENABLED=true # Habilitar/desabilitar ``` ### Configuração Programática ```javascript const logger = new ApiStatsLogger({ // Básico apiKey: process.env.API_STATS_API_KEY, service: 'minha-api', environment: 'production', // Performance batchSize: 20, // Mais logs por batch = menos requisições flushInterval: 5000, // Intervalo maior = menos frequente maxRetries: 2, // Menos tentativas = mais rápido em caso de erro // Segurança captureBody: false, // Não capturar bodies por padrão captureHeaders: false, // Não capturar headers sensíveis sensitiveHeaders: [ // Headers que nunca serão capturados 'authorization', 'cookie', 'x-api-key' ], // Filtros skipPaths: ['/health', '/metrics', '/favicon.ico'], skipMethods: ['OPTIONS'], // Debug debug: process.env.NODE_ENV === 'development' }); ``` --- ## 📊 Tipos de Logs e Métricas ### Logs Automáticos de Requisição ```javascript // Capturado automaticamente para cada requisição HTTP { "timestamp": "2024-05-29T10:30:00.000Z", "level": "info", "message": "POST /api/users 201", "service": "api-backend", "environment": "production", "metadata": { "requestId": "req_1717055400000_abc123", "method": "POST", "url": "/api/users", "statusCode": 201, "duration": 150, "ip": "192.168.1.100", "userAgent": "Mozilla/5.0...", "contentLength": 342, "framework": "express" } } ``` ### Logs de Erro Automáticos ```javascript // Capturado automaticamente quando há erros { "timestamp": "2024-05-29T10:30:00.000Z", "level": "error", "message": "POST /api/users 500", "service": "api-backend", "environment": "production", "metadata": { "requestId": "req_1717055400000_def456", "method": "POST", "url": "/api/users", "statusCode": 500, "duration": 75, "error": "Database connection timeout", "stack": "Error: Database connection timeout\n at..." } } ``` ### Logs de Negócio Manuais ```javascript // Logs específicos da sua aplicação logger.info('User authentication successful', { userId: 123, email: 'user@example.com', loginMethod: 'oauth2', provider: 'google', location: 'São Paulo, BR' }); logger.warn('Slow database query detected', { query: 'SELECT * FROM users WHERE active = true', duration: 2500, threshold: 1000, table: 'users', rowsReturned: 15000 }); logger.error('Payment processing failed', { paymentId: 'pay_123456', userId: 789, amount: 99.90, currency: 'BRL', provider: 'stripe', error: 'Card declined', errorCode: 'card_declined' }); ``` ### Métricas de Performance ```javascript // Monitoramento de operações críticas async function processPayment(paymentData) { const operationId = `payment_${Date.now()}`; const startTime = Date.now(); logger.info('Payment processing started', { operationId, userId: paymentData.userId, amount: paymentData.amount, method: paymentData.method }); try { // Operação principal const result = await paymentGateway.charge(paymentData); const duration = Date.now() - startTime; // Log de sucesso logger.info('Payment processed successfully', { operationId, paymentId: result.id, duration, status: result.status, transactionId: result.transactionId }); return result; } catch (error) { const duration = Date.now() - startTime; // Log de erro logger.error('Payment processing failed', { operationId, duration, error: error.message, errorCode: error.code, amount: paymentData.amount }); throw error; } } ``` --- ## 🔍 Verificação e Teste ### 1. Teste de Conectividade ```bash # Testar endpoint diretamente node test-endpoint.js ``` ### 2. Teste Manual com curl ```bash curl -X POST https://apistats.squareweb.app/logs \ -H "Content-Type: application/json" \ -H "x-api-key: sua-api-key-aqui" \ -d '[{ "timestamp": "'$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)'", "level": "info", "message": "Teste manual", "service": "teste", "environment": "development" }]' ``` ### 3. Debug no Código ```javascript // Habilitar debug const logger = new ApiStatsLogger({ debug: true }); // Ver logs de envio logger.info('Teste de log'); // Output: "Sending 1 logs to API Stats..." ``` ### 4. Verificar no Dashboard 1. Acesse: https://apistats.squareweb.app 2. Faça login com suas credenciais 3. Selecione seu projeto 4. Verifique se os logs estão aparecendo --- ## 🚨 Solução de Problemas ### Problema: "API key inválida" ```bash # Verificar API key echo $API_STATS_API_KEY # Regenerar se necessário npx api-stats-init ``` ### Problema: "Logs não aparecem" 1. **Verificar conectividade**: ```bash node test-endpoint.js ``` 2. **Verificar configuração**: ```javascript const logger = new ApiStatsLogger({ debug: true }); logger.info('Teste'); // Deve mostrar logs de debug ``` 3. **Verificar variáveis de ambiente**: ```bash env | grep API_STATS ``` ### Problema: "Performance degradada" ```javascript // Otimizar configurações const logger = new ApiStatsLogger({ batchSize: 50, // Menos requisições flushInterval: 10000, // Menos frequente maxRetries: 1, // Falha mais rápido captureBody: false, // Menos dados captureHeaders: false // Menos dados }); ``` ### Problema: "Muitos logs" ```javascript // Filtrar logs desnecessários const logger = new ApiStatsLogger({ skipPaths: [ '/health', '/metrics', '/favicon.ico', '/static/*', '/_next/*' ], skipMethods: ['OPTIONS', 'HEAD'] }); // Ou desabilitar completamente em desenvolvimento const logger = new ApiStatsLogger({ enabled: process.env.NODE_ENV === 'production' }); ``` --- ## 📈 Boas Práticas ### 1. Configuração por Ambiente ```javascript // config/logging.js const getLoggingConfig = () => { const baseConfig = { apiKey: process.env.API_STATS_API_KEY, service: process.env.API_STATS_SERVICE }; switch (process.env.NODE_ENV) { case 'development': return { ...baseConfig, environment: 'development', captureBody: true, captureHeaders: true, debug: true }; case 'staging': return { ...baseConfig, environment: 'staging', captureBody: false, captureHeaders: true, batchSize: 10 }; case 'production': return { ...baseConfig, environment: 'production', captureBody: false, captureHeaders: false, batchSize: 50, flushInterval: 5000 }; default: return { ...baseConfig, enabled: false }; } }; module.exports = { getLoggingConfig }; ``` ### 2. Logs Estruturados ```javascript // helpers/logger.js const ApiStatsLogger = require('api-stats-logger'); const logger = new ApiStatsLogger(); class AppLogger { // Operações de usuário static userAction(action, userId, metadata = {}) { logger.info(`User ${action}`, { category: 'user', action, userId, ...metadata }); } // Operações de sistema static systemEvent(event, metadata = {}) { logger.info(`System ${event}`, { category: 'system', event, ...metadata }); } // Erros de negócio static businessError(operation, error, metadata = {}) { logger.error(`Business error in ${operation}`, { category: 'business', operation, error: error.message, ...metadata }); } // Performance static performance(operation, duration, metadata = {}) { const level = duration > 1000 ? 'warn' : 'info'; logger.log({ level, message: `Performance: ${operation} took ${duration}ms`, metadata: { category: 'performance', operation, duration, ...metadata } }); } } module.exports = AppLogger; ``` ### 3. Uso nos Controllers ```javascript // controllers/userController.js const AppLogger = require('../helpers/logger'); class UserController { async createUser(req, res) { const startTime = Date.now(); try { AppLogger.userAction('create_attempt', null, { email: req.body.email, ip: req.ip }); const user = await userService.create(req.body); const duration = Date.now() - startTime; AppLogger.userAction('create_success', user.id, { email: user.email, duration }); AppLogger.performance('user_creation', duration, { userId: user.id }); res.status(201).json(user); } catch (error) { const duration = Date.now() - startTime; AppLogger.businessError('user_creation', error, { email: req.body.email, duration }); res.status(500).json({ error: 'Internal server error' }); } } } ``` --- ## 📚 Recursos Adicionais ### Scripts Úteis ```json { "scripts": { "logs:test": "node test-endpoint.js", "logs:setup": "npx api-stats-init", "logs:check": "node -e \"const l = require('api-stats-logger'); new l().testConnection().then(console.log)\"" } } ``` ### Monitoramento ```javascript // health-check.js const ApiStatsLogger = require('api-stats-logger'); async function checkLoggingHealth() { try { const logger = new ApiStatsLogger(); await logger.testConnection(); console.log('✅ API Stats Logger: OK'); return true; } catch (error) { console.log('❌ API Stats Logger: ERROR', error.message); return false; } } module.exports = { checkLoggingHealth }; ``` ### Documentação - **README.md** - Visão geral e exemplos básicos - **INSTALLATION-GUIDE.md** - Guia detalhado de instalação - **TROUBLESHOOTING.md** - Soluções para problemas comuns - **CHANGELOG.md** - Histórico de versões ### Suporte - 📧 **Email**: dev@grupoloyalty.com.br - 🌐 **API**: https://apistats.squareweb.app - 📚 **GitHub**: https://github.com/grupo-loyalty/api-stats-logger --- **✅ Integração Completa!** Com esta documentação, você tem tudo o que precisa para integrar o API Stats Logger em qualquer aplicação back-end. O endpoint está 100% funcional e não possui bloqueios além da validação de API key. Para dúvidas específicas ou suporte técnico, use os recursos de suporte listados acima.