@454creative/easy-events
Version:
A minimal event engine for Node.js and NestJS, wrapping Emmett for lightweight in-process event handling
159 lines • 5.42 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DefaultObservabilityEngine = void 0;
const uuid_1 = require("uuid");
class DefaultObservabilityEngine {
constructor(config = {}) {
this.metrics = {
totalEvents: 0,
eventsByType: {},
averageProcessingTime: 0,
errorCount: 0,
activeHandlers: 0,
};
this.auditLogs = [];
this.processingTimes = [];
this.config = {
enableMetrics: true,
enableAuditing: true,
enableTracing: true,
enablePerformanceMonitoring: true,
auditRetentionDays: 30,
metricsRetentionDays: 7,
logLevel: "info",
...config,
};
}
recordEvent(event, payload, tracing) {
if (!this.config.enableMetrics && !this.config.enableAuditing)
return;
const eventId = (0, uuid_1.v4)();
const timestamp = new Date();
// Update metrics
if (this.config.enableMetrics) {
this.metrics.totalEvents++;
this.metrics.eventsByType[event] =
(this.metrics.eventsByType[event] || 0) + 1;
}
// Record audit log
if (this.config.enableAuditing) {
const audit = {
eventId,
eventType: event,
timestamp,
payload,
correlationId: tracing?.correlationId || undefined,
userId: tracing?.userId || undefined,
source: tracing?.metadata?.["source"],
success: true,
};
this.auditLogs.push(audit);
// Call custom audit logger if provided
if (this.config.customAuditLogger) {
this.config.customAuditLogger(audit);
}
// Log to console based on log level
this.logAudit(audit);
}
}
recordHandlerExecution(event, _handler, duration, success, error) {
if (!this.config.enableMetrics && !this.config.enableAuditing)
return;
// Update metrics
if (this.config.enableMetrics) {
this.processingTimes.push(duration);
this.metrics.averageProcessingTime =
this.calculateAverageProcessingTime();
if (!success) {
this.metrics.errorCount++;
}
}
// Update audit log if exists
if (this.config.enableAuditing) {
const auditLog = this.auditLogs.find((log) => log.eventType === event);
if (auditLog) {
auditLog.processingTime = duration;
auditLog.success = success;
auditLog.error = error;
}
}
}
recordError(event, error, tracing) {
if (!this.config.enableMetrics && !this.config.enableAuditing)
return;
// Update metrics
if (this.config.enableMetrics) {
this.metrics.errorCount++;
}
// Record error audit
if (this.config.enableAuditing) {
const errorAudit = {
eventId: (0, uuid_1.v4)(),
eventType: event,
timestamp: new Date(),
payload: { error: error.message, stack: error.stack },
correlationId: tracing?.correlationId || undefined,
userId: tracing?.userId || undefined,
source: tracing?.metadata?.["source"],
success: false,
error: error.message,
};
this.auditLogs.push(errorAudit);
if (this.config.customAuditLogger) {
this.config.customAuditLogger(errorAudit);
}
this.logAudit(errorAudit);
}
}
getMetrics() {
return { ...this.metrics };
}
getAuditLogs(filters) {
let logs = [...this.auditLogs];
if (filters) {
logs = logs.filter((log) => {
return Object.entries(filters).every(([key, value]) => {
return log[key] === value;
});
});
}
return logs;
}
clearAuditLogs() {
this.auditLogs = [];
}
clearMetrics() {
this.metrics = {
totalEvents: 0,
eventsByType: {},
averageProcessingTime: 0,
errorCount: 0,
activeHandlers: 0,
};
this.processingTimes = [];
}
calculateAverageProcessingTime() {
if (this.processingTimes.length === 0)
return 0;
return (this.processingTimes.reduce((sum, time) => sum + time, 0) /
this.processingTimes.length);
}
logAudit(audit) {
const level = this.config.logLevel || "info";
const message = `[${audit.eventType}] ${audit.success ? "SUCCESS" : "ERROR"} - ${audit.eventId}`;
if (level === "debug") {
console.debug(message, audit);
}
else if (level === "info") {
console.info(message);
}
else if (level === "warn") {
console.warn(message);
}
else if (level === "error" && !audit.success) {
console.error(message, audit.error);
}
}
}
exports.DefaultObservabilityEngine = DefaultObservabilityEngine;
//# sourceMappingURL=observability-engine.js.map