nestjs-profiler 1.0.26 → 1.0.28
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 +286 -227
- package/controllers/profiler.controller.d.ts +15 -1
- package/controllers/profiler.controller.js +91 -4
- package/controllers/profiler.controller.js.map +1 -1
- package/interceptors/request-profiler.interceptor.d.ts +3 -1
- package/interceptors/request-profiler.interceptor.js +10 -5
- package/interceptors/request-profiler.interceptor.js.map +1 -1
- package/package.json +1 -1
- package/profiler.module.js +29 -2
- package/profiler.module.js.map +1 -1
- package/services/cron-explorer.service.d.ts +48 -0
- package/services/cron-explorer.service.js +260 -0
- package/services/cron-explorer.service.js.map +1 -0
- package/services/memory.service.d.ts +58 -0
- package/services/memory.service.js +223 -0
- package/services/memory.service.js.map +1 -0
- package/services/view.service.js +4 -0
- package/services/view.service.js.map +1 -1
- package/views/cron-jobs.html +635 -0
- package/views/layout.html +19 -1
- package/views/memory.html +380 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var CronExplorerService_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.CronExplorerService = void 0;
|
|
11
|
+
exports.humanizeCron = humanizeCron;
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
const EMPTY_HANDLER = { className: '', methodName: '', file: '' };
|
|
14
|
+
let CronExplorerService = CronExplorerService_1 = class CronExplorerService {
|
|
15
|
+
initialize(schedulerRegistry, modulesContainer) {
|
|
16
|
+
CronExplorerService_1._registry = schedulerRegistry ?? null;
|
|
17
|
+
CronExplorerService_1._hasScheduler = !!schedulerRegistry;
|
|
18
|
+
if (modulesContainer) {
|
|
19
|
+
this.scanHandlers(modulesContainer);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
getReport() {
|
|
23
|
+
if (!CronExplorerService_1._registry) {
|
|
24
|
+
return {
|
|
25
|
+
cronJobs: [],
|
|
26
|
+
intervals: [],
|
|
27
|
+
timeouts: [],
|
|
28
|
+
scannedAt: Date.now(),
|
|
29
|
+
hasScheduler: false,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return this.buildFromRegistry();
|
|
33
|
+
}
|
|
34
|
+
buildFromRegistry() {
|
|
35
|
+
const registry = CronExplorerService_1._registry;
|
|
36
|
+
const handlers = CronExplorerService_1._handlers;
|
|
37
|
+
const cronJobs = [];
|
|
38
|
+
const intervals = [];
|
|
39
|
+
const timeouts = [];
|
|
40
|
+
try {
|
|
41
|
+
const jobs = registry.getCronJobs();
|
|
42
|
+
for (const [name, job] of jobs.entries()) {
|
|
43
|
+
const h = handlers.get(name) ?? EMPTY_HANDLER;
|
|
44
|
+
let nextRun = null;
|
|
45
|
+
try {
|
|
46
|
+
const nd = job.nextDate?.();
|
|
47
|
+
if (nd) {
|
|
48
|
+
nextRun = typeof nd.toMillis === 'function'
|
|
49
|
+
? nd.toMillis()
|
|
50
|
+
: nd.toDate?.().getTime() ?? nd.getTime?.() ?? null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch { }
|
|
54
|
+
let lastRun = null;
|
|
55
|
+
try {
|
|
56
|
+
const ld = job.lastDate?.();
|
|
57
|
+
lastRun = ld?.getTime?.() ?? null;
|
|
58
|
+
}
|
|
59
|
+
catch { }
|
|
60
|
+
let expression = '';
|
|
61
|
+
try {
|
|
62
|
+
expression = job.cronTime?.source ?? job.cronTime?.toString?.() ?? '';
|
|
63
|
+
}
|
|
64
|
+
catch { }
|
|
65
|
+
cronJobs.push({
|
|
66
|
+
type: 'cron',
|
|
67
|
+
name,
|
|
68
|
+
expression,
|
|
69
|
+
expressionHuman: humanizeCron(expression),
|
|
70
|
+
nextRun,
|
|
71
|
+
lastRun,
|
|
72
|
+
running: !!job.running,
|
|
73
|
+
handler: h.className && h.methodName
|
|
74
|
+
? `${h.className}.${h.methodName}`
|
|
75
|
+
: name,
|
|
76
|
+
className: h.className ?? '',
|
|
77
|
+
methodName: h.methodName ?? '',
|
|
78
|
+
file: h.file ?? '',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
cronJobs.sort((a, b) => {
|
|
84
|
+
if (a.running !== b.running)
|
|
85
|
+
return a.running ? -1 : 1;
|
|
86
|
+
return (a.nextRun ?? Infinity) - (b.nextRun ?? Infinity);
|
|
87
|
+
});
|
|
88
|
+
try {
|
|
89
|
+
const names = registry.getIntervals();
|
|
90
|
+
for (const name of names) {
|
|
91
|
+
const h = handlers.get(name) ?? EMPTY_HANDLER;
|
|
92
|
+
intervals.push({
|
|
93
|
+
type: 'interval',
|
|
94
|
+
name,
|
|
95
|
+
ms: h.intervalMs ?? 0,
|
|
96
|
+
handler: h.className && h.methodName
|
|
97
|
+
? `${h.className}.${h.methodName}`
|
|
98
|
+
: name,
|
|
99
|
+
className: h.className ?? '',
|
|
100
|
+
methodName: h.methodName ?? '',
|
|
101
|
+
file: h.file ?? '',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch { }
|
|
106
|
+
try {
|
|
107
|
+
const names = registry.getTimeouts();
|
|
108
|
+
for (const name of names) {
|
|
109
|
+
const h = handlers.get(name) ?? EMPTY_HANDLER;
|
|
110
|
+
timeouts.push({
|
|
111
|
+
type: 'timeout',
|
|
112
|
+
name,
|
|
113
|
+
ms: h.timeoutMs ?? 0,
|
|
114
|
+
handler: h.className && h.methodName
|
|
115
|
+
? `${h.className}.${h.methodName}`
|
|
116
|
+
: name,
|
|
117
|
+
className: h.className ?? '',
|
|
118
|
+
methodName: h.methodName ?? '',
|
|
119
|
+
file: h.file ?? '',
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch { }
|
|
124
|
+
return {
|
|
125
|
+
cronJobs,
|
|
126
|
+
intervals,
|
|
127
|
+
timeouts,
|
|
128
|
+
scannedAt: Date.now(),
|
|
129
|
+
hasScheduler: true,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
scanHandlers(modulesContainer) {
|
|
133
|
+
const CRON_KEY = 'SCHEDULE_CRON_OPTIONS';
|
|
134
|
+
const INTERVAL_KEY = 'SCHEDULE_INTERVAL_OPTIONS';
|
|
135
|
+
const TIMEOUT_KEY = 'SCHEDULE_TIMEOUT_OPTIONS';
|
|
136
|
+
const NAME_KEY = 'SCHEDULER_NAME';
|
|
137
|
+
for (const mod of modulesContainer.values()) {
|
|
138
|
+
const providers = [...(mod.providers?.values() ?? [])];
|
|
139
|
+
for (const wrapper of providers) {
|
|
140
|
+
if (!wrapper?.instance || wrapper.isAlias)
|
|
141
|
+
continue;
|
|
142
|
+
const instance = wrapper.instance;
|
|
143
|
+
const proto = Object.getPrototypeOf(instance);
|
|
144
|
+
if (!proto || proto === Object.prototype)
|
|
145
|
+
continue;
|
|
146
|
+
const file = findFileForClass(instance.constructor);
|
|
147
|
+
Object.getOwnPropertyNames(proto).forEach(methodName => {
|
|
148
|
+
if (methodName === 'constructor')
|
|
149
|
+
return;
|
|
150
|
+
try {
|
|
151
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
|
|
152
|
+
if (!descriptor || typeof descriptor.value !== 'function')
|
|
153
|
+
return;
|
|
154
|
+
const fn = descriptor.value;
|
|
155
|
+
const className = instance.constructor.name;
|
|
156
|
+
const schedulerName = Reflect.getMetadata(NAME_KEY, fn);
|
|
157
|
+
const cronOpts = Reflect.getMetadata(CRON_KEY, fn);
|
|
158
|
+
if (cronOpts) {
|
|
159
|
+
const key = cronOpts.name || schedulerName || methodName;
|
|
160
|
+
CronExplorerService_1._handlers.set(key, { className, methodName, file });
|
|
161
|
+
}
|
|
162
|
+
const intervalOpts = Reflect.getMetadata(INTERVAL_KEY, fn);
|
|
163
|
+
if (intervalOpts) {
|
|
164
|
+
const key = schedulerName || intervalOpts.name || methodName;
|
|
165
|
+
CronExplorerService_1._handlers.set(key, {
|
|
166
|
+
className, methodName, file,
|
|
167
|
+
intervalMs: intervalOpts.timeout,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
const timeoutOpts = Reflect.getMetadata(TIMEOUT_KEY, fn);
|
|
171
|
+
if (timeoutOpts) {
|
|
172
|
+
const key = schedulerName || timeoutOpts.name || methodName;
|
|
173
|
+
CronExplorerService_1._handlers.set(key, {
|
|
174
|
+
className, methodName, file,
|
|
175
|
+
timeoutMs: timeoutOpts.timeout,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch { }
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
exports.CronExplorerService = CronExplorerService;
|
|
186
|
+
CronExplorerService._registry = null;
|
|
187
|
+
CronExplorerService._hasScheduler = false;
|
|
188
|
+
CronExplorerService._handlers = new Map();
|
|
189
|
+
exports.CronExplorerService = CronExplorerService = CronExplorerService_1 = __decorate([
|
|
190
|
+
(0, common_1.Injectable)()
|
|
191
|
+
], CronExplorerService);
|
|
192
|
+
function findFileForClass(ctor) {
|
|
193
|
+
if (!ctor?.name)
|
|
194
|
+
return '';
|
|
195
|
+
try {
|
|
196
|
+
const cache = require.cache;
|
|
197
|
+
for (const [filename, mod] of Object.entries(cache)) {
|
|
198
|
+
if (!mod?.exports)
|
|
199
|
+
continue;
|
|
200
|
+
const exp = mod.exports;
|
|
201
|
+
if (exp[ctor.name] === ctor || exp?.default === ctor) {
|
|
202
|
+
return filename.replace(/\.js$/, '.ts');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch { }
|
|
207
|
+
return '';
|
|
208
|
+
}
|
|
209
|
+
function humanizeCron(expression) {
|
|
210
|
+
if (!expression)
|
|
211
|
+
return '';
|
|
212
|
+
const parts = expression.trim().split(/\s+/);
|
|
213
|
+
let min = '', hour = '', dom = '', month = '', dow = '';
|
|
214
|
+
if (parts.length === 6) {
|
|
215
|
+
[, min, hour, dom, month, dow] = parts;
|
|
216
|
+
}
|
|
217
|
+
else if (parts.length === 5) {
|
|
218
|
+
[min, hour, dom, month, dow] = parts;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
return expression;
|
|
222
|
+
}
|
|
223
|
+
const all = (p) => p === '*';
|
|
224
|
+
const zero = (p) => p === '0';
|
|
225
|
+
const everyN = (p) => p.match(/^\*\/(\d+)$/)?.[1];
|
|
226
|
+
const fixed = (p) => /^\d+$/.test(p) ? parseInt(p) : null;
|
|
227
|
+
const DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
|
|
228
|
+
const pad = (n) => n.toString().padStart(2, '0');
|
|
229
|
+
const fmtTime = (h, m) => `${h}:${pad(m)} ${h < 12 ? 'AM' : 'PM'}`.replace('12:00 PM', 'noon').replace('00:00 AM', 'midnight');
|
|
230
|
+
if (all(min) && all(hour) && all(dom) && all(month) && all(dow))
|
|
231
|
+
return 'Every minute';
|
|
232
|
+
const nMin = everyN(min);
|
|
233
|
+
if (nMin && all(hour) && all(dom) && all(month) && all(dow))
|
|
234
|
+
return parseInt(nMin) === 1 ? 'Every minute' : `Every ${nMin} minutes`;
|
|
235
|
+
const nHour = everyN(hour);
|
|
236
|
+
if (zero(min) && nHour && all(dom) && all(month) && all(dow))
|
|
237
|
+
return parseInt(nHour) === 1 ? 'Every hour' : `Every ${nHour} hours`;
|
|
238
|
+
if (zero(min) && all(hour) && all(dom) && all(month) && all(dow))
|
|
239
|
+
return 'Every hour';
|
|
240
|
+
const nDom = everyN(dom);
|
|
241
|
+
if (zero(min) && zero(hour) && nDom && all(month) && all(dow))
|
|
242
|
+
return `Every ${nDom} days`;
|
|
243
|
+
const h = fixed(hour), m = fixed(min);
|
|
244
|
+
if (h !== null && m !== null && all(dom) && all(month) && all(dow))
|
|
245
|
+
return `Daily at ${fmtTime(h, m)}`;
|
|
246
|
+
if (h !== null && m !== null && all(dom) && all(month) &&
|
|
247
|
+
(dow === '1-5' || dow === 'MON-FRI'))
|
|
248
|
+
return `Weekdays at ${fmtTime(h, m)}`;
|
|
249
|
+
const dowN = fixed(dow);
|
|
250
|
+
if (h !== null && m !== null && all(dom) && all(month) &&
|
|
251
|
+
dowN !== null && dowN >= 0 && dowN <= 6)
|
|
252
|
+
return `Every ${DAYS[dowN]} at ${fmtTime(h, m)}`;
|
|
253
|
+
const dayN = fixed(dom);
|
|
254
|
+
if (zero(min) && zero(hour) && dayN !== null && all(month) && all(dow)) {
|
|
255
|
+
const suffix = dayN === 1 ? 'st' : dayN === 2 ? 'nd' : dayN === 3 ? 'rd' : 'th';
|
|
256
|
+
return `Monthly on the ${dayN}${suffix}`;
|
|
257
|
+
}
|
|
258
|
+
return expression;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=cron-explorer.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-explorer.service.js","sourceRoot":"","sources":["../../../libs/nestjs-profiler/src/services/cron-explorer.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
export interface MemorySample {
|
|
3
|
+
timestamp: number;
|
|
4
|
+
heapUsed: number;
|
|
5
|
+
heapTotal: number;
|
|
6
|
+
rss: number;
|
|
7
|
+
external: number;
|
|
8
|
+
arrayBuffers: number;
|
|
9
|
+
heapSizeLimit: number;
|
|
10
|
+
detachedContexts: number;
|
|
11
|
+
}
|
|
12
|
+
export type MemoryTrend = 'stable' | 'growing' | 'likely_leak';
|
|
13
|
+
export interface MemoryReport {
|
|
14
|
+
current: MemorySample;
|
|
15
|
+
trend: MemoryTrend;
|
|
16
|
+
leakScore: number;
|
|
17
|
+
leakScoreBreakdown: {
|
|
18
|
+
growthRate: number;
|
|
19
|
+
detachedContexts: number;
|
|
20
|
+
sustained: number;
|
|
21
|
+
};
|
|
22
|
+
windowSize: number;
|
|
23
|
+
samples: MemorySample[];
|
|
24
|
+
topMemoryRequests: RequestMemoryDelta[];
|
|
25
|
+
gcAvailable: boolean;
|
|
26
|
+
alerts: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface RequestMemoryDelta {
|
|
29
|
+
method: string;
|
|
30
|
+
url: string;
|
|
31
|
+
heapDeltaBytes: number;
|
|
32
|
+
timestamp: number;
|
|
33
|
+
durationMs: number;
|
|
34
|
+
}
|
|
35
|
+
export declare class MemoryService implements OnModuleInit, OnModuleDestroy {
|
|
36
|
+
private readonly logger;
|
|
37
|
+
private samples;
|
|
38
|
+
private requestDeltas;
|
|
39
|
+
private pollTimer;
|
|
40
|
+
onModuleInit(): void;
|
|
41
|
+
onModuleDestroy(): void;
|
|
42
|
+
private takeSample;
|
|
43
|
+
snapshotBefore(): number;
|
|
44
|
+
recordDelta(method: string, url: string, heapBefore: number, durationMs: number): void;
|
|
45
|
+
private computeTrend;
|
|
46
|
+
getReport(): MemoryReport;
|
|
47
|
+
forceGc(): {
|
|
48
|
+
success: boolean;
|
|
49
|
+
message: string;
|
|
50
|
+
heapFreedBytes?: number;
|
|
51
|
+
};
|
|
52
|
+
takeSnapshot(): {
|
|
53
|
+
success: boolean;
|
|
54
|
+
filePath?: string;
|
|
55
|
+
message: string;
|
|
56
|
+
};
|
|
57
|
+
private buildCurrentSample;
|
|
58
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var MemoryService_1;
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.MemoryService = void 0;
|
|
44
|
+
const common_1 = require("@nestjs/common");
|
|
45
|
+
const v8 = __importStar(require("v8"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const POLL_INTERVAL_MS = 10_000;
|
|
48
|
+
const WINDOW_SIZE = 60;
|
|
49
|
+
const MAX_REQUEST_DELTAS = 50;
|
|
50
|
+
const GROWTH_THRESHOLD = 0.05;
|
|
51
|
+
const LEAK_THRESHOLD = 0.15;
|
|
52
|
+
const MB = 1024 * 1024;
|
|
53
|
+
let MemoryService = MemoryService_1 = class MemoryService {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.logger = new common_1.Logger(MemoryService_1.name);
|
|
56
|
+
this.samples = [];
|
|
57
|
+
this.requestDeltas = [];
|
|
58
|
+
this.pollTimer = null;
|
|
59
|
+
}
|
|
60
|
+
onModuleInit() {
|
|
61
|
+
this.takeSample();
|
|
62
|
+
this.pollTimer = setInterval(() => this.takeSample(), POLL_INTERVAL_MS);
|
|
63
|
+
this.logger.log('MemoryService started — polling every 10 s');
|
|
64
|
+
}
|
|
65
|
+
onModuleDestroy() {
|
|
66
|
+
if (this.pollTimer) {
|
|
67
|
+
clearInterval(this.pollTimer);
|
|
68
|
+
this.pollTimer = null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
takeSample() {
|
|
72
|
+
const mem = process.memoryUsage();
|
|
73
|
+
const heap = v8.getHeapStatistics();
|
|
74
|
+
const sample = {
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
heapUsed: mem.heapUsed,
|
|
77
|
+
heapTotal: mem.heapTotal,
|
|
78
|
+
rss: mem.rss,
|
|
79
|
+
external: mem.external,
|
|
80
|
+
arrayBuffers: mem.arrayBuffers,
|
|
81
|
+
heapSizeLimit: heap.heap_size_limit,
|
|
82
|
+
detachedContexts: heap.number_of_detached_contexts,
|
|
83
|
+
};
|
|
84
|
+
this.samples.push(sample);
|
|
85
|
+
if (this.samples.length > WINDOW_SIZE) {
|
|
86
|
+
this.samples.shift();
|
|
87
|
+
}
|
|
88
|
+
if (sample.detachedContexts > 5) {
|
|
89
|
+
this.logger.warn(`[memory] ${sample.detachedContexts} detached V8 contexts detected — possible leak`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
snapshotBefore() {
|
|
93
|
+
return process.memoryUsage().heapUsed;
|
|
94
|
+
}
|
|
95
|
+
recordDelta(method, url, heapBefore, durationMs) {
|
|
96
|
+
const heapDeltaBytes = process.memoryUsage().heapUsed - heapBefore;
|
|
97
|
+
if (Math.abs(heapDeltaBytes) < 1024)
|
|
98
|
+
return;
|
|
99
|
+
this.requestDeltas.push({
|
|
100
|
+
method,
|
|
101
|
+
url,
|
|
102
|
+
heapDeltaBytes,
|
|
103
|
+
timestamp: Date.now(),
|
|
104
|
+
durationMs,
|
|
105
|
+
});
|
|
106
|
+
if (this.requestDeltas.length > MAX_REQUEST_DELTAS) {
|
|
107
|
+
this.requestDeltas.shift();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
computeTrend() {
|
|
111
|
+
if (this.samples.length < 10) {
|
|
112
|
+
return { trend: 'stable', leakScore: 0, breakdown: { growthRate: 0, detachedContexts: 0, sustained: 0 } };
|
|
113
|
+
}
|
|
114
|
+
const half = Math.floor(this.samples.length / 2);
|
|
115
|
+
const first = this.samples.slice(0, half);
|
|
116
|
+
const second = this.samples.slice(half);
|
|
117
|
+
const avgFirst = first.reduce((s, x) => s + x.heapUsed, 0) / first.length;
|
|
118
|
+
const avgSecond = second.reduce((s, x) => s + x.heapUsed, 0) / second.length;
|
|
119
|
+
const growthRate = avgFirst > 0 ? (avgSecond - avgFirst) / avgFirst : 0;
|
|
120
|
+
const latest = this.samples[this.samples.length - 1];
|
|
121
|
+
const detachedPts = Math.min(40, latest.detachedContexts * 8);
|
|
122
|
+
const growthPts = Math.min(40, Math.max(0, growthRate / LEAK_THRESHOLD) * 40);
|
|
123
|
+
let growingIntervals = 0;
|
|
124
|
+
for (let i = 1; i < this.samples.length; i++) {
|
|
125
|
+
if (this.samples[i].heapUsed > this.samples[i - 1].heapUsed)
|
|
126
|
+
growingIntervals++;
|
|
127
|
+
}
|
|
128
|
+
const sustainedRatio = growingIntervals / (this.samples.length - 1);
|
|
129
|
+
const sustainedPts = sustainedRatio > 0.7 ? Math.round(sustainedRatio * 20) : 0;
|
|
130
|
+
const leakScore = Math.round(Math.min(100, detachedPts + growthPts + sustainedPts));
|
|
131
|
+
let trend;
|
|
132
|
+
if (growthRate >= LEAK_THRESHOLD || leakScore >= 60) {
|
|
133
|
+
trend = 'likely_leak';
|
|
134
|
+
}
|
|
135
|
+
else if (growthRate >= GROWTH_THRESHOLD || leakScore >= 30) {
|
|
136
|
+
trend = 'growing';
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
trend = 'stable';
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
trend,
|
|
143
|
+
leakScore,
|
|
144
|
+
breakdown: {
|
|
145
|
+
growthRate: Math.round(growthPts),
|
|
146
|
+
detachedContexts: Math.round(detachedPts),
|
|
147
|
+
sustained: Math.round(sustainedPts),
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
getReport() {
|
|
152
|
+
const { trend, leakScore, breakdown } = this.computeTrend();
|
|
153
|
+
const latest = this.samples[this.samples.length - 1] ?? this.buildCurrentSample();
|
|
154
|
+
const topRequests = [...this.requestDeltas]
|
|
155
|
+
.sort((a, b) => b.heapDeltaBytes - a.heapDeltaBytes)
|
|
156
|
+
.slice(0, 20);
|
|
157
|
+
const alerts = [];
|
|
158
|
+
if (leakScore >= 60)
|
|
159
|
+
alerts.push('High leak score — memory is growing rapidly');
|
|
160
|
+
if (latest.detachedContexts > 5)
|
|
161
|
+
alerts.push(`${latest.detachedContexts} detached V8 contexts detected`);
|
|
162
|
+
if (latest.heapUsed / latest.heapSizeLimit > 0.85)
|
|
163
|
+
alerts.push('Heap usage above 85% of limit');
|
|
164
|
+
return {
|
|
165
|
+
current: latest,
|
|
166
|
+
trend,
|
|
167
|
+
leakScore,
|
|
168
|
+
leakScoreBreakdown: breakdown,
|
|
169
|
+
windowSize: this.samples.length,
|
|
170
|
+
samples: [...this.samples],
|
|
171
|
+
topMemoryRequests: topRequests,
|
|
172
|
+
gcAvailable: typeof global.gc === 'function',
|
|
173
|
+
alerts,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
forceGc() {
|
|
177
|
+
const gc = global.gc;
|
|
178
|
+
if (typeof gc !== 'function') {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
message: 'GC not available. Start Node with --expose-gc to enable manual GC.',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const before = process.memoryUsage().heapUsed;
|
|
185
|
+
gc();
|
|
186
|
+
this.takeSample();
|
|
187
|
+
const after = process.memoryUsage().heapUsed;
|
|
188
|
+
const freed = before - after;
|
|
189
|
+
this.logger.log(`[memory] Manual GC freed ${(freed / MB).toFixed(2)} MB`);
|
|
190
|
+
return { success: true, message: `GC complete — freed ~${(freed / MB).toFixed(2)} MB`, heapFreedBytes: freed };
|
|
191
|
+
}
|
|
192
|
+
takeSnapshot() {
|
|
193
|
+
try {
|
|
194
|
+
const fileName = `Heap-${Date.now()}.heapsnapshot`;
|
|
195
|
+
const filePath = path.join(process.cwd(), fileName);
|
|
196
|
+
v8.writeHeapSnapshot(filePath);
|
|
197
|
+
this.logger.log(`[memory] Heap snapshot written to ${filePath}`);
|
|
198
|
+
return { success: true, filePath, message: `Snapshot saved: ${fileName} (open in Chrome DevTools → Memory tab)` };
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
return { success: false, message: `Snapshot failed: ${err?.message ?? err}` };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
buildCurrentSample() {
|
|
205
|
+
const mem = process.memoryUsage();
|
|
206
|
+
const heap = v8.getHeapStatistics();
|
|
207
|
+
return {
|
|
208
|
+
timestamp: Date.now(),
|
|
209
|
+
heapUsed: mem.heapUsed,
|
|
210
|
+
heapTotal: mem.heapTotal,
|
|
211
|
+
rss: mem.rss,
|
|
212
|
+
external: mem.external,
|
|
213
|
+
arrayBuffers: mem.arrayBuffers,
|
|
214
|
+
heapSizeLimit: heap.heap_size_limit,
|
|
215
|
+
detachedContexts: heap.number_of_detached_contexts,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
exports.MemoryService = MemoryService;
|
|
220
|
+
exports.MemoryService = MemoryService = MemoryService_1 = __decorate([
|
|
221
|
+
(0, common_1.Injectable)()
|
|
222
|
+
], MemoryService);
|
|
223
|
+
//# sourceMappingURL=memory.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.service.js","sourceRoot":"","sources":["../../../libs/nestjs-profiler/src/services/memory.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAAmF;AACnF,uCAAyB;AACzB,2CAA6B;AA2C7B,MAAM,gBAAgB,GAAK,MAAM,CAAC;AAClC,MAAM,WAAW,GAAU,EAAE,CAAC;AAC9B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,gBAAgB,GAAK,IAAI,CAAC;AAChC,MAAM,cAAc,GAAO,IAAI,CAAC;AAChC,MAAM,EAAE,GAAmB,IAAI,GAAG,IAAI,CAAC;AAKhC,IAAM,aAAa,qBAAnB,MAAM,aAAa;IAAnB;QACY,WAAM,GAAG,IAAI,eAAM,CAAC,eAAa,CAAC,IAAI,CAAC,CAAC;QAEjD,YAAO,GAA6B,EAAE,CAAC;QACvC,kBAAa,GAAyB,EAAE,CAAC;QACzC,cAAS,GAA2B,IAAI,CAAC;IAgNnD,CAAC;IA5MC,YAAY;QACV,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IAIO,UAAU;QAChB,MAAM,GAAG,GAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAEpC,MAAM,MAAM,GAAiB;YAC3B,SAAS,EAAS,IAAI,CAAC,GAAG,EAAE;YAC5B,QAAQ,EAAU,GAAG,CAAC,QAAQ;YAC9B,SAAS,EAAS,GAAG,CAAC,SAAS;YAC/B,GAAG,EAAe,GAAG,CAAC,GAAG;YACzB,QAAQ,EAAU,GAAG,CAAC,QAAQ;YAC9B,YAAY,EAAM,GAAG,CAAC,YAAY;YAClC,aAAa,EAAK,IAAI,CAAC,eAAe;YACtC,gBAAgB,EAAE,IAAI,CAAC,2BAA2B;SACnD,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE1B,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,YAAY,MAAM,CAAC,gBAAgB,gDAAgD,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;IAKD,cAAc;QACZ,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;IACxC,CAAC;IAGD,WAAW,CACT,MAAc,EACd,GAAW,EACX,UAAkB,EAClB,UAAkB;QAElB,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,GAAG,UAAU,CAAC;QACnE,IAAI,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,IAAI;YAAE,OAAO;QAE5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACtB,MAAM;YACN,GAAG;YACH,cAAc;YACd,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,UAAU;SACX,CAAC,CAAC;QAGH,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAIO,YAAY;QAClB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC7B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5G,CAAC;QAED,MAAM,IAAI,GAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,MAAM,KAAK,GAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7E,MAAM,UAAU,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAGxE,MAAM,MAAM,GAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAG9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC;QAG9E,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ;gBAAE,gBAAgB,EAAE,CAAC;QAClF,CAAC;QACD,MAAM,cAAc,GAAG,gBAAgB,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,YAAY,GAAK,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC;QAEpF,IAAI,KAAkB,CAAC;QACvB,IAAI,UAAU,IAAI,cAAc,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;YACpD,KAAK,GAAG,aAAa,CAAC;QACxB,CAAC;aAAM,IAAI,UAAU,IAAI,gBAAgB,IAAI,SAAS,IAAI,EAAE,EAAE,CAAC;YAC7D,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,QAAQ,CAAC;QACnB,CAAC;QAED,OAAO;YACL,KAAK;YACL,SAAS;YACT,SAAS,EAAE;gBACT,UAAU,EAAQ,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBACvC,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBACzC,SAAS,EAAS,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;aAC3C;SACF,CAAC;IACJ,CAAC;IAID,SAAS;QACP,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAE5D,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAElF,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;aACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;aACnD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEhB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,SAAS,IAAI,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAChF,IAAI,MAAM,CAAC,gBAAgB,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,gBAAgB,gCAAgC,CAAC,CAAC;QACzG,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,aAAa,GAAG,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAEhG,OAAO;YACL,OAAO,EAAE,MAAM;YACf,KAAK;YACL,SAAS;YACT,kBAAkB,EAAE,SAAS;YAC7B,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC/B,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,iBAAiB,EAAE,WAAW;YAC9B,WAAW,EAAE,OAAQ,MAAc,CAAC,EAAE,KAAK,UAAU;YACrD,MAAM;SACP,CAAC;IACJ,CAAC;IAGD,OAAO;QACL,MAAM,EAAE,GAAI,MAAc,CAAC,EAAE,CAAC;QAC9B,IAAI,OAAO,EAAE,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,oEAAoE;aAC9E,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;QAC9C,EAAE,EAAE,CAAC;QACL,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,MAAM,KAAK,GAAI,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;QAC9C,MAAM,KAAK,GAAI,MAAM,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,wBAAwB,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;IACjH,CAAC;IAGD,YAAY;QACV,IAAI,CAAC;YAEH,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;YACpD,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qCAAqC,QAAQ,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,QAAQ,yCAAyC,EAAE,CAAC;QACpH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,oBAAoB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC;QAChF,CAAC;IACH,CAAC;IAIO,kBAAkB;QACxB,MAAM,GAAG,GAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACpC,OAAO;YACL,SAAS,EAAS,IAAI,CAAC,GAAG,EAAE;YAC5B,QAAQ,EAAU,GAAG,CAAC,QAAQ;YAC9B,SAAS,EAAS,GAAG,CAAC,SAAS;YAC/B,GAAG,EAAe,GAAG,CAAC,GAAG;YACzB,QAAQ,EAAU,GAAG,CAAC,QAAQ;YAC9B,YAAY,EAAM,GAAG,CAAC,YAAY;YAClC,aAAa,EAAK,IAAI,CAAC,eAAe;YACtC,gBAAgB,EAAE,IAAI,CAAC,2BAA2B;SACnD,CAAC;IACJ,CAAC;CACF,CAAA;AArNY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAqNzB"}
|
package/services/view.service.js
CHANGED
|
@@ -88,6 +88,8 @@ let ViewService = class ViewService {
|
|
|
88
88
|
liveLogsActive: active('live-logs'),
|
|
89
89
|
codeQualityActive: active('code-quality'),
|
|
90
90
|
eventsActive: active('events'),
|
|
91
|
+
cronJobsActive: active('cron-jobs'),
|
|
92
|
+
memoryActive: active('memory'),
|
|
91
93
|
summaryIconClass: activeIcon('summary'),
|
|
92
94
|
requestsIconClass: activeIcon('requests'),
|
|
93
95
|
queriesIconClass: activeIcon('queries'),
|
|
@@ -100,6 +102,8 @@ let ViewService = class ViewService {
|
|
|
100
102
|
healthIconClass: activeIcon('health'),
|
|
101
103
|
liveLogsIconClass: activeIcon('live-logs'),
|
|
102
104
|
codeQualityIconClass: activeIcon('code-quality'),
|
|
105
|
+
cronJobsIconClass: activeIcon('cron-jobs'),
|
|
106
|
+
memoryIconClass: activeIcon('memory'),
|
|
103
107
|
};
|
|
104
108
|
layout = this.interpolate(layout, data);
|
|
105
109
|
return layout;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.service.js","sourceRoot":"","sources":["../../../libs/nestjs-profiler/src/services/view.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"view.service.js","sourceRoot":"","sources":["../../../libs/nestjs-profiler/src/services/view.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4C;AAC5C,uCAAyB;AACzB,2CAA6B;AAGtB,IAAM,WAAW,GAAjB,MAAM,WAAW;IAGtB;QAGE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAKD,MAAM,CAAC,QAAgB;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;QAC/D,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,OAAY,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;QAC/D,IAAI,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAG3C,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE5C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKD,gBAAgB,CACd,KAAa,EACb,OAAe,EACf,YAAoB,UAAU,EAC9B,cAAuB,KAAK;QAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QAC5D,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAC7B,SAAS,KAAK,GAAG;YACf,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,oDAAoD,CAAC;QAC3D,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE,CACjC,SAAS,KAAK,GAAG;YACf,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,uCAAuC,CAAC;QAE9C,MAAM,IAAI,GAAG;YACX,KAAK;YACL,OAAO;YACP,SAAS;YACT,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAC3C,WAAW,EAAE,0BAA0B;YACvC,aAAa,EAAE,oDAAoD;YACnE,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC;YAChC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC;YAClC,aAAa,EAAE,MAAM,CAAC,SAAS,CAAC;YAChC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;YAC1B,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC;YAClC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC9B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC;YAC5B,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC;YACrC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC9B,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC;YACnC,iBAAiB,EAAE,MAAM,CAAC,cAAc,CAAC;YACzC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC9B,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC;YACnC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC9B,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC;YACvC,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAAC;YACzC,gBAAgB,EAAE,UAAU,CAAC,SAAS,CAAC;YACvC,aAAa,EAAE,UAAU,CAAC,MAAM,CAAC;YACjC,iBAAiB,EAAE,UAAU,CAAC,UAAU,CAAC;YACzC,eAAe,EAAE,UAAU,CAAC,QAAQ,CAAC;YACrC,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC;YACnC,eAAe,EAAE,UAAU,CAAC,QAAQ,CAAC;YACrC,kBAAkB,EAAE,UAAU,CAAC,YAAY,CAAC;YAC5C,eAAe,EAAE,UAAU,CAAC,QAAQ,CAAC;YACrC,iBAAiB,EAAE,UAAU,CAAC,WAAW,CAAC;YAC1C,oBAAoB,EAAE,UAAU,CAAC,cAAc,CAAC;YAChD,iBAAiB,EAAE,UAAU,CAAC,WAAW,CAAC;YAC1C,eAAe,EAAE,UAAU,CAAC,QAAQ,CAAC;SACtC,CAAC;QAEF,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAExC,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,YAAY,CAAC,QAAgB;QACnC,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAMO,WAAW,CAAC,QAAgB,EAAE,IAAS;QAG7C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACrE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QAGH,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACjE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKO,UAAU,CAAC,IAAY;QAC7B,MAAM,GAAG,GAA2B;YAClC,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,MAAM;YACX,GAAG,EAAE,MAAM;YACX,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,QAAQ;SACd,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAKD,OAAO,CAAC,SAAiB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAE5D,IAAI,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;QAClC,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAExD,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAEzD,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;QAC3B,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAExD,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;QAC1B,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAExD,QAAQ,GAAG,OAAO,GAAG,EAAE,CAAC;QACxB,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;QAExD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACvC,CAAC;IAKD,cAAc,CAAC,UAAkB;QAC/B,IAAI,UAAU,IAAI,GAAG;YAAE,OAAO,yBAAyB,CAAC;QACxD,IAAI,UAAU,IAAI,GAAG;YAAE,OAAO,+BAA+B,CAAC;QAC9D,IAAI,UAAU,IAAI,GAAG;YAAE,OAAO,2BAA2B,CAAC;QAC1D,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAKD,cAAc,CAAC,MAAc;QAC3B,MAAM,MAAM,GAA2B;YACrC,GAAG,EAAE,2BAA2B;YAChC,IAAI,EAAE,6BAA6B;YACnC,GAAG,EAAE,+BAA+B;YACpC,KAAK,EAAE,+BAA+B;YACtC,MAAM,EAAE,yBAAyB;SAClC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,2BAA2B,CAAC;QAC9D,OAAO,8EAA8E,OAAO,KAAK,MAAM,SAAS,CAAC;IACnH,CAAC;IAKD,gBAAgB,CAAC,QAAgB;QAC/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,kGAAkG,CAAC;QAC5G,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,kGAAkG,CAAC;QAC5G,CAAC;QACD,OAAO,mGAAmG,CAAC;IAC7G,CAAC;IAKD,gBAAgB,CAAC,KAAa;QAC5B,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,wCAAwC,CAAC;QACvE,IAAI,KAAK,KAAK,MAAM;YAClB,OAAO,iDAAiD,CAAC;QAC3D,OAAO,2CAA2C,CAAC;IACrD,CAAC;IAKD,sBAAsB,CAAC,EAAU;QAC/B,MAAM,MAAM,GAA2B;YACrC,GAAG,EAAE,2BAA2B;YAChC,GAAG,EAAE,+BAA+B;YACpC,GAAG,EAAE,yBAAyB;YAC9B,KAAK,EAAE,+BAA+B;SACvC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,2BAA2B,CAAC;QAC1D,OAAO,wFAAwF,OAAO,KAAK,EAAE,SAAS,CAAC;IACzH,CAAC;IAKD,mBAAmB,CAAC,MAAc;QAChC,MAAM,MAAM,GAA2B;YACrC,GAAG,EAAE,6BAA6B;YAClC,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,6BAA6B;YACtC,IAAI,EAAE,yBAAyB;SAChC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,2BAA2B,CAAC;QAC9D,OAAO,wFAAwF,OAAO,KAAK,MAAM,SAAS,CAAC;IAC7H,CAAC;CACF,CAAA;AAzOY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;;GACA,WAAW,CAyOvB"}
|