logs-interceptor
Version:
High-performance, production-ready log interceptor for Node.js applications with Loki integration. Built with Clean Architecture principles. Supports Node.js, Browser, and Node-RED.
71 lines • 3.36 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogsInterceptorFactory = void 0;
/**
* Presentation: Factory for creating LogsInterceptor instances
* Dependency Injection Container
*/
const LogService_1 = require("../../application/services/LogService");
const LokiTransport_1 = require("../../infrastructure/transport/LokiTransport");
const MemoryBuffer_1 = require("../../infrastructure/buffer/MemoryBuffer");
const LogFilter_1 = require("../../infrastructure/filter/LogFilter");
const CircuitBreaker_1 = require("../../infrastructure/circuit-breaker/CircuitBreaker");
const AsyncLocalStorageContextProvider_1 = require("../../infrastructure/context/AsyncLocalStorageContextProvider");
const ConsoleInterceptor_1 = require("../../infrastructure/interceptors/ConsoleInterceptor");
const api_1 = require("@opentelemetry/api");
class LogsInterceptorFactory {
static create(config) {
// Create context provider
const contextProvider = new AsyncLocalStorageContextProvider_1.AsyncLocalStorageContextProvider();
// Setup dynamic labels with OpenTelemetry support
const dynamicLabels = {
trace_id: () => {
const span = api_1.trace.getSpan(api_1.context.active());
return span?.spanContext().traceId ?? 'undefined';
},
span_id: () => {
const span = api_1.trace.getSpan(api_1.context.active());
return span?.spanContext().spanId ?? 'undefined';
},
request_id: () => {
return contextProvider.get('requestId') ?? 'undefined';
},
...config.dynamicLabels,
};
// Create circuit breaker
const circuitBreaker = new CircuitBreaker_1.CircuitBreaker(config.circuitBreaker);
// Create transport
const transport = new LokiTransport_1.LokiTransport({
url: config.transport.url,
tenantId: config.transport.tenantId,
authToken: config.transport.authToken,
timeout: config.transport.timeout,
maxRetries: config.transport.maxRetries,
retryDelay: config.transport.retryDelay,
compression: config.transport.compression,
compressionLevel: config.performance.compressionLevel,
}, circuitBreaker);
// Create buffer
const buffer = new MemoryBuffer_1.MemoryBuffer(config.buffer);
// Create filter
const filter = new LogFilter_1.LogFilter(config.filter);
// Create log service
const logger = new LogService_1.LogService(filter, buffer, transport, contextProvider, {
appName: config.appName,
version: config.version,
environment: config.environment,
labels: config.labels,
dynamicLabels,
enableMetrics: config.enableMetrics,
});
// Create console interceptor if enabled
let consoleInterceptor;
if (config.interceptConsole) {
consoleInterceptor = new ConsoleInterceptor_1.ConsoleInterceptor(logger, config.preserveOriginalConsole);
consoleInterceptor.enable();
}
return { logger, consoleInterceptor };
}
}
exports.LogsInterceptorFactory = LogsInterceptorFactory;
//# sourceMappingURL=LogsInterceptorFactory.js.map