UNPKG

api-stats-logger

Version:

SDK completo de logging e monitoramento de APIs com nova estrutura de logs organizada, auto-instrumentação, dashboard em tempo real e CLI para configuração automática. Suporta logs estruturados por contexto (HTTP, business, security, system) com campos op

423 lines (336 loc) 10.2 kB
/** * Exemplos de uso do API Stats Logger com múltiplos frameworks * * Este arquivo demonstra como configurar o SDK com diferentes frameworks: * - Express 4.x e 5.x * - NestJS * - Fastify * - Koa */ const ApiStatsLogger = require('./index'); // ==================================== // CONFIGURAÇÃO BASE (Todas as opções) // ==================================== const baseConfig = { apiKey: process.env.API_STATS_API_KEY || 'sua-api-key-aqui', url: process.env.API_STATS_URL || 'https://api.apistats.dev/logs', service: 'multi-framework-example', environment: process.env.NODE_ENV || 'development', batchSize: 10, flushInterval: 2000, enabled: true }; const middlewareConfig = { captureBody: true, captureHeaders: false, // Cuidado com dados sensíveis captureQuery: true, captureParams: true, skipPaths: ['/health', '/metrics', '/favicon.ico'], skipMethods: ['OPTIONS'], maxBodySize: 1024 * 10 // 10KB }; // ==================================== // EXEMPLO 1: EXPRESS 4.x e 5.x // ==================================== function expressExample() { const express = require('express'); const app = express(); // Inicializar logger const logger = new ApiStatsLogger(baseConfig); // Middleware básico do Express app.use(express.json()); // OPÇÃO A: Middleware manual app.use(ApiStatsLogger.expressMiddleware({ logger, ...middlewareConfig })); // Rotas de exemplo app.get('/', (req, res) => { logger.info('Homepage acessada', { user: req.ip }); res.json({ message: 'Express funcionando!', version: '5.x' }); }); app.post('/users', (req, res) => { logger.info('Novo usuário criado', { body: req.body }); res.status(201).json({ id: 123, ...req.body }); }); app.listen(3001, () => { console.log('Express server rodando na porta 3001'); }); return app; } // OPÇÃO B: Express com auto-detecção function expressAutoExample() { const express = require('express'); const app = express(); // Auto-instrumentação (detecta Express automaticamente) const logger = ApiStatsLogger.init({ ...baseConfig, autoDetect: true // Detecta e configura automaticamente }); app.use(express.json()); app.get('/auto', (req, res) => { res.json({ message: 'Express auto-instrumentado!' }); }); app.listen(3002, () => { console.log('Express auto-instrumentado rodando na porta 3002'); }); return app; } // ==================================== // EXEMPLO 2: FASTIFY // ==================================== async function fastifyExample() { const fastify = require('fastify')({ logger: true }); // Inicializar logger const logger = new ApiStatsLogger({ ...baseConfig, service: 'fastify-example' }); // OPÇÃO A: Middleware manual como hook fastify.addHook('preHandler', ApiStatsLogger.fastifyMiddleware({ logger, ...middlewareConfig })); // Rotas de exemplo fastify.get('/', async (request, reply) => { logger.info('Fastify homepage', { requestId: request.requestId }); return { message: 'Fastify funcionando!', framework: 'fastify' }; }); fastify.post('/data', async (request, reply) => { logger.info('Dados recebidos via Fastify', { body: request.body }); return { success: true, received: request.body }; }); // Registrar plugin customizado fastify.register(async function (fastify) { fastify.get('/plugin', async (request, reply) => { return { message: 'Plugin route', timestamp: new Date().toISOString() }; }); }); try { await fastify.listen({ port: 3003 }); console.log('Fastify server rodando na porta 3003'); } catch (err) { fastify.log.error(err); process.exit(1); } return fastify; } // OPÇÃO B: Fastify com auto-detecção async function fastifyAutoExample() { const fastify = require('fastify')({ logger: true }); // Auto-instrumentação const logger = ApiStatsLogger.init({ ...baseConfig, service: 'fastify-auto-example', autoDetect: true }); fastify.get('/auto', async (request, reply) => { return { message: 'Fastify auto-instrumentado!' }; }); try { await fastify.listen({ port: 3004 }); console.log('Fastify auto-instrumentado rodando na porta 3004'); } catch (err) { fastify.log.error(err); process.exit(1); } return fastify; } // ==================================== // EXEMPLO 3: KOA // ==================================== function koaExample() { const Koa = require('koa'); const Router = require('@koa/router'); const bodyParser = require('koa-bodyparser'); const app = new Koa(); const router = new Router(); // Inicializar logger const logger = new ApiStatsLogger({ ...baseConfig, service: 'koa-example' }); // Middleware básico app.use(bodyParser()); // OPÇÃO A: Middleware manual app.use(ApiStatsLogger.koaMiddleware({ logger, ...middlewareConfig })); // Rotas router.get('/', async (ctx) => { logger.info('Koa homepage', { requestId: ctx.state.requestId }); ctx.body = { message: 'Koa funcionando!', framework: 'koa' }; }); router.post('/submit', async (ctx) => { logger.info('Dados submetidos via Koa', { body: ctx.request.body }); ctx.body = { success: true, data: ctx.request.body }; }); app.use(router.routes()); app.use(router.allowedMethods()); app.listen(3005, () => { console.log('Koa server rodando na porta 3005'); }); return app; } // OPÇÃO B: Koa com auto-detecção function koaAutoExample() { const Koa = require('koa'); const Router = require('@koa/router'); const app = new Koa(); const router = new Router(); // Auto-instrumentação const logger = ApiStatsLogger.init({ ...baseConfig, service: 'koa-auto-example', autoDetect: true }); router.get('/auto', async (ctx) => { ctx.body = { message: 'Koa auto-instrumentado!' }; }); app.use(router.routes()); app.listen(3006, () => { console.log('Koa auto-instrumentado rodando na porta 3006'); }); return app; } // ==================================== // EXEMPLO 4: NESTJS (TypeScript) // ==================================== /* Para NestJS, crie um arquivo main.ts: import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ApiStatsLogger } from 'api-stats-logger'; async function bootstrap() { const app = await NestFactory.create(AppModule); // Inicializar logger const logger = new ApiStatsLogger({ apiKey: process.env.API_STATS_API_KEY, service: 'nestjs-example', environment: process.env.NODE_ENV || 'development' }); // OPÇÃO A: Middleware manual app.use(ApiStatsLogger.nestMiddleware({ logger, captureBody: true, captureHeaders: false, skipRoutes: ['/health', '/metrics'] })); await app.listen(3007); console.log('NestJS server rodando na porta 3007'); } // OPÇÃO B: Auto-instrumentação async function bootstrapAuto() { const app = await NestFactory.create(AppModule); // Auto-instrumentação const logger = ApiStatsLogger.init({ apiKey: process.env.API_STATS_API_KEY, service: 'nestjs-auto-example', autoDetect: true }); await app.listen(3008); console.log('NestJS auto-instrumentado rodando na porta 3008'); } bootstrap(); */ // ==================================== // EXEMPLO 5: MÚLTIPLOS FRAMEWORKS SIMULTANEAMENTE // ==================================== function multiFrameworkExample() { console.log('🚀 Iniciando múltiplos frameworks...\n'); // Express na porta 3001 expressExample(); // Express auto na porta 3002 expressAutoExample(); // Fastify na porta 3003 fastifyExample(); // Fastify auto na porta 3004 fastifyAutoExample(); // Koa na porta 3005 koaExample(); // Koa auto na porta 3006 koaAutoExample(); console.log(` 🎯 Servidores rodando: Express (manual): http://localhost:3001 Express (auto): http://localhost:3002 Fastify (manual): http://localhost:3003 Fastify (auto): http://localhost:3004 Koa (manual): http://localhost:3005 Koa (auto): http://localhost:3006 📊 Todos enviando logs para: ${baseConfig.url} 🔑 API Key: ${baseConfig.apiKey} 🧪 Teste fazendo requisições para qualquer endpoint! `); } // ==================================== // EXEMPLO 6: CONFIGURAÇÕES AVANÇADAS // ==================================== function advancedConfigExample() { // Logger com configuração customizada por framework const expressLogger = new ApiStatsLogger({ ...baseConfig, service: 'express-advanced', batchSize: 20, flushInterval: 5000, capturePerformance: true }); const fastifyLogger = new ApiStatsLogger({ ...baseConfig, service: 'fastify-advanced', batchSize: 15, flushInterval: 3000, captureErrors: true }); // Configurações específicas por ambiente const prodConfig = { ...baseConfig, environment: 'production', captureBody: false, // Não capturar body em produção captureHeaders: false, batchSize: 50, flushInterval: 10000 }; const devConfig = { ...baseConfig, environment: 'development', captureBody: true, captureHeaders: true, batchSize: 5, flushInterval: 1000 }; const config = process.env.NODE_ENV === 'production' ? prodConfig : devConfig; return ApiStatsLogger.init({ ...config, autoDetect: true }); } // ==================================== // EXECUTAR EXEMPLOS // ==================================== if (require.main === module) { // Verificar se tem API key configurada if (!process.env.API_STATS_API_KEY) { console.log(` ⚠️ API_STATS_API_KEY não configurada! Configure antes de executar: export API_STATS_API_KEY="sua-api-key-aqui" Ou crie um arquivo .env: echo "API_STATS_API_KEY=sua-api-key-aqui" > .env `); process.exit(1); } // Executar exemplo multi-framework multiFrameworkExample(); } module.exports = { expressExample, expressAutoExample, fastifyExample, fastifyAutoExample, koaExample, koaAutoExample, multiFrameworkExample, advancedConfigExample };