xypriss 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -13
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/mods/security/src/index.js +35 -12
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/src/plugins/modules/PluginEngine.js +378 -0
- package/dist/cjs/src/plugins/modules/PluginEngine.js.map +1 -0
- package/dist/cjs/src/plugins/modules/PluginRegistry.js +339 -0
- package/dist/cjs/src/plugins/modules/PluginRegistry.js.map +1 -0
- package/dist/cjs/src/plugins/modules/builtin/JWTAuthPlugin.js +591 -0
- package/dist/cjs/src/plugins/modules/builtin/JWTAuthPlugin.js.map +1 -0
- package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js +413 -0
- package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -0
- package/dist/cjs/src/plugins/modules/builtin/SmartCachePlugin.js +843 -0
- package/dist/cjs/src/plugins/modules/builtin/SmartCachePlugin.js.map +1 -0
- package/dist/cjs/src/plugins/modules/core/CachePlugin.js +1975 -0
- package/dist/cjs/src/plugins/modules/core/CachePlugin.js.map +1 -0
- package/dist/cjs/src/plugins/modules/core/PerformancePlugin.js +894 -0
- package/dist/cjs/src/plugins/modules/core/PerformancePlugin.js.map +1 -0
- package/dist/cjs/src/plugins/modules/core/SecurityPlugin.js +799 -0
- package/dist/cjs/src/plugins/modules/core/SecurityPlugin.js.map +1 -0
- package/dist/cjs/src/plugins/modules/types/PluginTypes.js +47 -0
- package/dist/cjs/src/plugins/modules/types/PluginTypes.js.map +1 -0
- package/dist/cjs/src/server/FastServer.js +22 -3
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/PluginManager.js +5 -5
- package/dist/cjs/src/server/components/fastapi/PluginManager.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/RequestProcessor.js +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/mods/security/src/index.js +14 -10
- package/dist/esm/mods/security/src/index.js.map +1 -1
- package/dist/esm/src/plugins/modules/PluginEngine.js +376 -0
- package/dist/esm/src/plugins/modules/PluginEngine.js.map +1 -0
- package/dist/esm/src/plugins/modules/PluginRegistry.js +337 -0
- package/dist/esm/src/plugins/modules/PluginRegistry.js.map +1 -0
- package/dist/esm/src/plugins/modules/builtin/JWTAuthPlugin.js +589 -0
- package/dist/esm/src/plugins/modules/builtin/JWTAuthPlugin.js.map +1 -0
- package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js +411 -0
- package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -0
- package/dist/esm/src/plugins/modules/builtin/SmartCachePlugin.js +841 -0
- package/dist/esm/src/plugins/modules/builtin/SmartCachePlugin.js.map +1 -0
- package/dist/esm/src/plugins/modules/core/CachePlugin.js +1973 -0
- package/dist/esm/src/plugins/modules/core/CachePlugin.js.map +1 -0
- package/dist/esm/src/plugins/modules/core/PerformancePlugin.js +872 -0
- package/dist/esm/src/plugins/modules/core/PerformancePlugin.js.map +1 -0
- package/dist/esm/src/plugins/modules/core/SecurityPlugin.js +797 -0
- package/dist/esm/src/plugins/modules/core/SecurityPlugin.js.map +1 -0
- package/dist/esm/src/plugins/modules/types/PluginTypes.js +47 -0
- package/dist/esm/src/plugins/modules/types/PluginTypes.js.map +1 -0
- package/dist/esm/src/server/FastServer.js +22 -3
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/PluginManager.js +5 -5
- package/dist/esm/src/server/components/fastapi/PluginManager.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/RequestProcessor.js +1 -1
- package/dist/index.d.ts +5 -0
- package/package.json +4 -4
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var events = require('events');
|
|
4
|
+
var PerformancePlugin = require('../core/PerformancePlugin.js');
|
|
5
|
+
var PluginTypes = require('../types/PluginTypes.js');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Response Time Monitoring Plugin
|
|
9
|
+
*
|
|
10
|
+
* Ultra-fast performance monitoring plugin with <0.3ms overhead
|
|
11
|
+
* for tracking response times and performance metrics.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Response Time Monitoring Plugin for ultra-fast performance tracking
|
|
15
|
+
*/
|
|
16
|
+
class ResponseTimePlugin extends PerformancePlugin.PerformancePlugin {
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...arguments);
|
|
19
|
+
this.eventEmitter = new events.EventEmitter();
|
|
20
|
+
this.id = "XyPriss.performance.response-time";
|
|
21
|
+
this.name = "Response Time Monitoring Plugin";
|
|
22
|
+
this.version = "1.0.0";
|
|
23
|
+
this.priority = PluginTypes.PluginPriority.NORMAL;
|
|
24
|
+
// Performance thresholds (can be configured)
|
|
25
|
+
this.performanceThresholds = {
|
|
26
|
+
responseTime: 100, // 100ms
|
|
27
|
+
memoryUsage: 50 * 1024 * 1024, // 50MB
|
|
28
|
+
cpuUsage: 80, // 80%
|
|
29
|
+
};
|
|
30
|
+
// Performance tracking
|
|
31
|
+
this.routeMetrics = new Map();
|
|
32
|
+
// Alert thresholds
|
|
33
|
+
this.alertThresholds = {
|
|
34
|
+
slowResponseTime: 1000, // 1 second
|
|
35
|
+
verySlowResponseTime: 5000, // 5 seconds
|
|
36
|
+
highMemoryUsage: 100 * 1024 * 1024, // 100MB
|
|
37
|
+
criticalMemoryUsage: 200 * 1024 * 1024, // 200MB
|
|
38
|
+
};
|
|
39
|
+
// Performance alerts
|
|
40
|
+
this.alertCooldowns = new Map();
|
|
41
|
+
this.ALERT_COOLDOWN = 60000; // 1 minute
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Initialize performance monitoring plugin
|
|
45
|
+
*/
|
|
46
|
+
async initializePerformanceMonitoring(context) {
|
|
47
|
+
// Configure thresholds from settings
|
|
48
|
+
if (context.config.customSettings.responseTimeThreshold) {
|
|
49
|
+
this.alertThresholds.slowResponseTime =
|
|
50
|
+
context.config.customSettings.responseTimeThreshold;
|
|
51
|
+
}
|
|
52
|
+
if (context.config.customSettings.memoryThreshold) {
|
|
53
|
+
this.alertThresholds.highMemoryUsage =
|
|
54
|
+
context.config.customSettings.memoryThreshold;
|
|
55
|
+
}
|
|
56
|
+
// Setup periodic metrics cleanup
|
|
57
|
+
this.setupMetricsCleanup();
|
|
58
|
+
// Setup performance alerts
|
|
59
|
+
this.setupPerformanceAlerts();
|
|
60
|
+
context.logger.info("Response Time Monitoring Plugin initialized");
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Execute performance monitoring logic
|
|
64
|
+
*/
|
|
65
|
+
executePerformanceLogic(context, metrics) {
|
|
66
|
+
const { req, res } = context;
|
|
67
|
+
const route = this.normalizeRoute(req.path);
|
|
68
|
+
// Start response time tracking
|
|
69
|
+
const startTime = performance.now();
|
|
70
|
+
// Add response time header
|
|
71
|
+
res.setHeader("X-Response-Time-Start", startTime.toString());
|
|
72
|
+
// Hook into response finish event to capture total time
|
|
73
|
+
const originalEnd = res.end;
|
|
74
|
+
res.end = (...args) => {
|
|
75
|
+
const endTime = performance.now();
|
|
76
|
+
const responseTime = endTime - startTime;
|
|
77
|
+
// Record route metrics
|
|
78
|
+
this.recordRouteMetrics(route, responseTime);
|
|
79
|
+
// Add response time headers
|
|
80
|
+
res.setHeader("X-Response-Time", `${responseTime.toFixed(2)}ms`);
|
|
81
|
+
res.setHeader("X-Performance-Score", this.calculatePerformanceScore(responseTime, metrics));
|
|
82
|
+
// Check for performance alerts
|
|
83
|
+
this.checkRoutePerformanceAlerts(route, responseTime, metrics);
|
|
84
|
+
// Call original end method with proper arguments
|
|
85
|
+
return originalEnd.apply(res, args);
|
|
86
|
+
};
|
|
87
|
+
return {
|
|
88
|
+
route,
|
|
89
|
+
startTime,
|
|
90
|
+
memoryUsage: metrics.memoryUsage,
|
|
91
|
+
cpuUsage: metrics.cpuUsage,
|
|
92
|
+
requestSize: metrics.requestSize,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Precompile performance monitoring systems
|
|
97
|
+
*/
|
|
98
|
+
async precompilePerformanceMonitoring() {
|
|
99
|
+
// Pre-warm performance calculation functions
|
|
100
|
+
this.calculatePerformanceScore(100, {
|
|
101
|
+
memoryUsage: 10 * 1024 * 1024,
|
|
102
|
+
cpuUsage: 50,
|
|
103
|
+
});
|
|
104
|
+
// Pre-warm route normalization
|
|
105
|
+
this.normalizeRoute("/api/test/123");
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Collect custom performance metrics
|
|
109
|
+
*/
|
|
110
|
+
collectCustomMetrics(context) {
|
|
111
|
+
const { req } = context;
|
|
112
|
+
const route = this.normalizeRoute(req.path);
|
|
113
|
+
const routeMetrics = this.routeMetrics.get(route);
|
|
114
|
+
return {
|
|
115
|
+
route,
|
|
116
|
+
routeMetrics: routeMetrics
|
|
117
|
+
? {
|
|
118
|
+
averageResponseTime: routeMetrics.averageTime,
|
|
119
|
+
p95ResponseTime: routeMetrics.p95Time,
|
|
120
|
+
p99ResponseTime: routeMetrics.p99Time,
|
|
121
|
+
requestCount: routeMetrics.count,
|
|
122
|
+
minResponseTime: routeMetrics.minTime,
|
|
123
|
+
maxResponseTime: routeMetrics.maxTime,
|
|
124
|
+
}
|
|
125
|
+
: null,
|
|
126
|
+
totalRoutes: this.routeMetrics.size,
|
|
127
|
+
alertsActive: this.getActiveAlerts(),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// ===== ROUTE METRICS METHODS =====
|
|
131
|
+
/**
|
|
132
|
+
* Record metrics for a specific route
|
|
133
|
+
*/
|
|
134
|
+
recordRouteMetrics(route, responseTime) {
|
|
135
|
+
let metrics = this.routeMetrics.get(route);
|
|
136
|
+
if (!metrics) {
|
|
137
|
+
metrics = {
|
|
138
|
+
count: 0,
|
|
139
|
+
totalTime: 0,
|
|
140
|
+
minTime: Infinity,
|
|
141
|
+
maxTime: 0,
|
|
142
|
+
averageTime: 0,
|
|
143
|
+
p95Time: 0,
|
|
144
|
+
p99Time: 0,
|
|
145
|
+
recentTimes: [],
|
|
146
|
+
};
|
|
147
|
+
this.routeMetrics.set(route, metrics);
|
|
148
|
+
}
|
|
149
|
+
// Update basic metrics
|
|
150
|
+
metrics.count++;
|
|
151
|
+
metrics.totalTime += responseTime;
|
|
152
|
+
metrics.minTime = Math.min(metrics.minTime, responseTime);
|
|
153
|
+
metrics.maxTime = Math.max(metrics.maxTime, responseTime);
|
|
154
|
+
metrics.averageTime = metrics.totalTime / metrics.count;
|
|
155
|
+
// Update recent times for percentile calculation
|
|
156
|
+
metrics.recentTimes.push(responseTime);
|
|
157
|
+
// Keep only last 100 response times for memory efficiency
|
|
158
|
+
if (metrics.recentTimes.length > 100) {
|
|
159
|
+
metrics.recentTimes.shift();
|
|
160
|
+
}
|
|
161
|
+
// Calculate percentiles
|
|
162
|
+
this.updatePercentiles(metrics);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Update percentile calculations
|
|
166
|
+
*/
|
|
167
|
+
updatePercentiles(metrics) {
|
|
168
|
+
if (metrics.recentTimes.length === 0)
|
|
169
|
+
return;
|
|
170
|
+
const sortedTimes = [...metrics.recentTimes].sort((a, b) => a - b);
|
|
171
|
+
const length = sortedTimes.length;
|
|
172
|
+
// Calculate P95 (95th percentile)
|
|
173
|
+
const p95Index = Math.ceil(length * 0.95) - 1;
|
|
174
|
+
metrics.p95Time = sortedTimes[Math.max(0, p95Index)];
|
|
175
|
+
// Calculate P99 (99th percentile)
|
|
176
|
+
const p99Index = Math.ceil(length * 0.99) - 1;
|
|
177
|
+
metrics.p99Time = sortedTimes[Math.max(0, p99Index)];
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Normalize route for consistent metrics tracking
|
|
181
|
+
*/
|
|
182
|
+
normalizeRoute(path) {
|
|
183
|
+
// Replace dynamic segments with placeholders
|
|
184
|
+
return path
|
|
185
|
+
.replace(/\/\d+/g, "/:id") // Replace numeric IDs
|
|
186
|
+
.replace(/\/[a-f0-9-]{36}/g, "/:uuid") // Replace UUIDs
|
|
187
|
+
.replace(/\/[a-f0-9]{24}/g, "/:objectId") // Replace MongoDB ObjectIds
|
|
188
|
+
.replace(/\?.*$/, ""); // Remove query parameters
|
|
189
|
+
}
|
|
190
|
+
// ===== PERFORMANCE SCORING =====
|
|
191
|
+
/**
|
|
192
|
+
* Calculate performance score (0-100)
|
|
193
|
+
*/
|
|
194
|
+
calculatePerformanceScore(responseTime, metrics) {
|
|
195
|
+
let score = 100;
|
|
196
|
+
// Response time scoring (50% weight)
|
|
197
|
+
if (responseTime > this.alertThresholds.verySlowResponseTime) {
|
|
198
|
+
score -= 50;
|
|
199
|
+
}
|
|
200
|
+
else if (responseTime > this.alertThresholds.slowResponseTime) {
|
|
201
|
+
score -= 25;
|
|
202
|
+
}
|
|
203
|
+
else if (responseTime > this.performanceThresholds.responseTime) {
|
|
204
|
+
score -= 10;
|
|
205
|
+
}
|
|
206
|
+
// Memory usage scoring (25% weight)
|
|
207
|
+
if (metrics.memoryUsage > this.alertThresholds.criticalMemoryUsage) {
|
|
208
|
+
score -= 25;
|
|
209
|
+
}
|
|
210
|
+
else if (metrics.memoryUsage > this.alertThresholds.highMemoryUsage) {
|
|
211
|
+
score -= 15;
|
|
212
|
+
}
|
|
213
|
+
else if (metrics.memoryUsage > this.performanceThresholds.memoryUsage) {
|
|
214
|
+
score -= 5;
|
|
215
|
+
}
|
|
216
|
+
// CPU usage scoring (25% weight)
|
|
217
|
+
if (metrics.cpuUsage > 90) {
|
|
218
|
+
score -= 25;
|
|
219
|
+
}
|
|
220
|
+
else if (metrics.cpuUsage > this.performanceThresholds.cpuUsage) {
|
|
221
|
+
score -= 10;
|
|
222
|
+
}
|
|
223
|
+
return Math.max(0, score);
|
|
224
|
+
}
|
|
225
|
+
// ===== PERFORMANCE ALERTS =====
|
|
226
|
+
/**
|
|
227
|
+
* Check for performance alerts (override from PerformancePlugin)
|
|
228
|
+
*/
|
|
229
|
+
checkPerformanceAlerts(metrics) {
|
|
230
|
+
const alerts = [];
|
|
231
|
+
// Check response time alerts
|
|
232
|
+
if (metrics.responseTime > this.alertThresholds.verySlowResponseTime) {
|
|
233
|
+
alerts.push("CRITICAL: Response time severely degraded");
|
|
234
|
+
this.triggerAlert("critical_response_time", {
|
|
235
|
+
route: metrics.route,
|
|
236
|
+
responseTime: metrics.responseTime,
|
|
237
|
+
threshold: this.alertThresholds.verySlowResponseTime,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
else if (metrics.responseTime > this.alertThresholds.slowResponseTime) {
|
|
241
|
+
alerts.push("WARNING: Slow response time detected");
|
|
242
|
+
this.triggerAlert("slow_response_time", {
|
|
243
|
+
route: metrics.route,
|
|
244
|
+
responseTime: metrics.responseTime,
|
|
245
|
+
threshold: this.alertThresholds.slowResponseTime,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
// Check memory usage alerts
|
|
249
|
+
if (metrics.memoryUsage > this.alertThresholds.criticalMemoryUsage) {
|
|
250
|
+
alerts.push("CRITICAL: Memory usage critically high");
|
|
251
|
+
this.triggerAlert("critical_memory_usage", {
|
|
252
|
+
memoryUsage: metrics.memoryUsage,
|
|
253
|
+
threshold: this.alertThresholds.criticalMemoryUsage,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
else if (metrics.memoryUsage > this.alertThresholds.highMemoryUsage) {
|
|
257
|
+
alerts.push("WARNING: High memory usage detected");
|
|
258
|
+
this.triggerAlert("high_memory_usage", {
|
|
259
|
+
memoryUsage: metrics.memoryUsage,
|
|
260
|
+
threshold: this.alertThresholds.highMemoryUsage,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
// Check CPU usage alerts
|
|
264
|
+
if (metrics.cpuUsage > 90) {
|
|
265
|
+
alerts.push("CRITICAL: CPU usage critically high");
|
|
266
|
+
this.triggerAlert("critical_cpu_usage", {
|
|
267
|
+
cpuUsage: metrics.cpuUsage,
|
|
268
|
+
threshold: 90,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return alerts;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Check for performance alerts with route-specific parameters
|
|
275
|
+
*/
|
|
276
|
+
checkRoutePerformanceAlerts(route, responseTime, metrics) {
|
|
277
|
+
// Use the base class method with enhanced metrics
|
|
278
|
+
const enhancedMetrics = {
|
|
279
|
+
...metrics,
|
|
280
|
+
route,
|
|
281
|
+
responseTime,
|
|
282
|
+
};
|
|
283
|
+
this.checkPerformanceAlerts(enhancedMetrics);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Trigger performance alert with cooldown
|
|
287
|
+
*/
|
|
288
|
+
triggerAlert(alertType, data) {
|
|
289
|
+
const now = Date.now();
|
|
290
|
+
const lastAlert = this.alertCooldowns.get(alertType) || 0;
|
|
291
|
+
// Check cooldown
|
|
292
|
+
if (now - lastAlert < this.ALERT_COOLDOWN) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
// Update cooldown
|
|
296
|
+
this.alertCooldowns.set(alertType, now);
|
|
297
|
+
// Log alert
|
|
298
|
+
console.warn(`[PERFORMANCE ALERT] ${alertType}:`, data);
|
|
299
|
+
// Emit alert event (can be listened to by monitoring systems)
|
|
300
|
+
this.eventEmitter.emit("performance_alert", {
|
|
301
|
+
type: alertType,
|
|
302
|
+
data,
|
|
303
|
+
timestamp: new Date(),
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Get active alerts
|
|
308
|
+
*/
|
|
309
|
+
getActiveAlerts() {
|
|
310
|
+
const now = Date.now();
|
|
311
|
+
const activeAlerts = [];
|
|
312
|
+
for (const [alertType, lastTriggered,] of this.alertCooldowns.entries()) {
|
|
313
|
+
if (now - lastTriggered < this.ALERT_COOLDOWN) {
|
|
314
|
+
activeAlerts.push(alertType);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return activeAlerts;
|
|
318
|
+
}
|
|
319
|
+
// ===== CLEANUP AND MAINTENANCE =====
|
|
320
|
+
/**
|
|
321
|
+
* Setup metrics cleanup
|
|
322
|
+
*/
|
|
323
|
+
setupMetricsCleanup() {
|
|
324
|
+
// Clean up old metrics every 10 minutes
|
|
325
|
+
setInterval(() => {
|
|
326
|
+
this.cleanupOldMetrics();
|
|
327
|
+
}, 600000); // 10 minutes
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Clean up old metrics to prevent memory leaks
|
|
331
|
+
*/
|
|
332
|
+
cleanupOldMetrics() {
|
|
333
|
+
const now = Date.now();
|
|
334
|
+
// Remove routes that haven't been accessed in the last hour
|
|
335
|
+
for (const [route, metrics] of this.routeMetrics.entries()) {
|
|
336
|
+
// If no recent activity, remove the route metrics
|
|
337
|
+
if (metrics.recentTimes.length === 0) {
|
|
338
|
+
this.routeMetrics.delete(route);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Clean up old alert cooldowns
|
|
342
|
+
for (const [alertType, lastTriggered,] of this.alertCooldowns.entries()) {
|
|
343
|
+
if (now - lastTriggered > this.ALERT_COOLDOWN * 2) {
|
|
344
|
+
this.alertCooldowns.delete(alertType);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Setup performance alerts monitoring
|
|
350
|
+
*/
|
|
351
|
+
setupPerformanceAlerts() {
|
|
352
|
+
// Monitor overall system performance every 30 seconds
|
|
353
|
+
setInterval(() => {
|
|
354
|
+
this.checkSystemPerformance();
|
|
355
|
+
}, 30000); // 30 seconds
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Check overall system performance
|
|
359
|
+
*/
|
|
360
|
+
checkSystemPerformance() {
|
|
361
|
+
const memoryUsage = this.getMemoryUsage();
|
|
362
|
+
const cpuUsage = this.getCpuUsage();
|
|
363
|
+
// Check system-wide thresholds
|
|
364
|
+
if (memoryUsage > this.alertThresholds.criticalMemoryUsage) {
|
|
365
|
+
this.triggerAlert("system_critical_memory", { memoryUsage });
|
|
366
|
+
}
|
|
367
|
+
if (cpuUsage > 95) {
|
|
368
|
+
this.triggerAlert("system_critical_cpu", { cpuUsage });
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// ===== PUBLIC API =====
|
|
372
|
+
/**
|
|
373
|
+
* Get route performance summary
|
|
374
|
+
*/
|
|
375
|
+
getRoutePerformanceSummary() {
|
|
376
|
+
const summary = {};
|
|
377
|
+
for (const [route, metrics] of this.routeMetrics.entries()) {
|
|
378
|
+
summary[route] = {
|
|
379
|
+
requestCount: metrics.count,
|
|
380
|
+
averageResponseTime: Math.round(metrics.averageTime * 100) / 100,
|
|
381
|
+
minResponseTime: Math.round(metrics.minTime * 100) / 100,
|
|
382
|
+
maxResponseTime: Math.round(metrics.maxTime * 100) / 100,
|
|
383
|
+
p95ResponseTime: Math.round(metrics.p95Time * 100) / 100,
|
|
384
|
+
p99ResponseTime: Math.round(metrics.p99Time * 100) / 100,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
return summary;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get performance alerts summary
|
|
391
|
+
*/
|
|
392
|
+
getPerformanceAlertsSummary() {
|
|
393
|
+
return {
|
|
394
|
+
activeAlerts: this.getActiveAlerts(),
|
|
395
|
+
alertThresholds: this.alertThresholds,
|
|
396
|
+
lastAlerts: Object.fromEntries(this.alertCooldowns),
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Reset route metrics
|
|
401
|
+
*/
|
|
402
|
+
resetRouteMetrics(route) {
|
|
403
|
+
if (route) {
|
|
404
|
+
this.routeMetrics.delete(route);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
this.routeMetrics.clear();
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
exports.ResponseTimePlugin = ResponseTimePlugin;
|
|
413
|
+
//# sourceMappingURL=ResponseTimePlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseTimePlugin.js","sources":["../../../../../../src/plugins/modules/builtin/ResponseTimePlugin.ts"],"sourcesContent":[null],"names":["PerformancePlugin","EventEmitter","PluginPriority"],"mappings":"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"}
|