-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmemory.ts
More file actions
121 lines (106 loc) · 2.85 KB
/
Copy pathmemory.ts
File metadata and controls
121 lines (106 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
export type ProcessMemoryUsage = {
arrayBuffersBytes: number;
externalBytes: number;
heapTotalBytes: number;
heapUsedBytes: number;
rssBytes: number;
};
export type ProcessMemoryUsageCheckOptions = {
maxHeapUsedBytes?: number;
maxRssBytes?: number;
};
export type ProcessMemoryUsageCheck = {
maxBytes: number;
status: "error" | "ok";
usedBytes: number;
usedPercent: number;
};
export type ProcessMemoryUsageCheckResult = ProcessMemoryUsage & {
checks: {
heap?: ProcessMemoryUsageCheck;
rss?: ProcessMemoryUsageCheck;
};
message?: string;
status: "error" | "ok";
};
/**
* Read the current process memory usage with byte-oriented field names.
*
* @example
* ```ts
* const usage = getProcessMemoryUsage();
* ```
*/
export function getProcessMemoryUsage(): ProcessMemoryUsage {
const usage = process.memoryUsage();
return {
arrayBuffersBytes: usage.arrayBuffers ?? 0,
externalBytes: usage.external,
heapTotalBytes: usage.heapTotal,
heapUsedBytes: usage.heapUsed,
rssBytes: usage.rss,
};
}
/**
* Read process memory usage and compare it with optional thresholds.
*
* @example
* ```ts
* const result = checkProcessMemoryUsage({ maxHeapUsedBytes: 150 * 1024 * 1024 });
* ```
*/
export function checkProcessMemoryUsage(
options: ProcessMemoryUsageCheckOptions = {},
): ProcessMemoryUsageCheckResult {
assertMemoryThresholds(options);
const usage = getProcessMemoryUsage();
const checks: ProcessMemoryUsageCheckResult["checks"] = {};
const messages: string[] = [];
if (options.maxHeapUsedBytes !== undefined) {
checks.heap = createMemoryCheck(
"heap",
usage.heapUsedBytes,
options.maxHeapUsedBytes,
messages,
);
}
if (options.maxRssBytes !== undefined) {
checks.rss = createMemoryCheck(
"rss",
usage.rssBytes,
options.maxRssBytes,
messages,
);
}
return {
...usage,
checks,
message: messages.length > 0 ? messages.join("; ") : undefined,
status: messages.length > 0 ? "error" : "ok",
};
}
function assertMemoryThresholds(options: ProcessMemoryUsageCheckOptions): void {
if (options.maxHeapUsedBytes !== undefined && options.maxHeapUsedBytes < 0) {
throw new RangeError("maxHeapUsedBytes must be greater than or equal to 0");
}
if (options.maxRssBytes !== undefined && options.maxRssBytes < 0) {
throw new RangeError("maxRssBytes must be greater than or equal to 0");
}
}
function createMemoryCheck(
name: "heap" | "rss",
usedBytes: number,
maxBytes: number,
messages: string[],
): ProcessMemoryUsageCheck {
const status = usedBytes > maxBytes ? "error" : "ok";
if (status === "error") {
messages.push(`${name} used bytes ${usedBytes} exceeds ${maxBytes}`);
}
return {
maxBytes,
status,
usedBytes,
usedPercent: maxBytes > 0 ? usedBytes / maxBytes : usedBytes > 0 ? 1 : 0,
};
}