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
JavaScript
/**
* 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
};