@agent-relay/resiliency 0.1.0
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/dist/context-persistence.d.ts +140 -0
- package/dist/context-persistence.d.ts.map +1 -0
- package/dist/context-persistence.js +397 -0
- package/dist/context-persistence.js.map +1 -0
- package/dist/crash-insights.d.ts +156 -0
- package/dist/crash-insights.d.ts.map +1 -0
- package/dist/crash-insights.js +492 -0
- package/dist/crash-insights.js.map +1 -0
- package/dist/gossip-health.d.ts +137 -0
- package/dist/gossip-health.d.ts.map +1 -0
- package/dist/gossip-health.js +241 -0
- package/dist/gossip-health.js.map +1 -0
- package/dist/health-monitor.d.ts +97 -0
- package/dist/health-monitor.d.ts.map +1 -0
- package/dist/health-monitor.js +291 -0
- package/dist/health-monitor.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/leader-watchdog.d.ts +109 -0
- package/dist/leader-watchdog.d.ts.map +1 -0
- package/dist/leader-watchdog.js +189 -0
- package/dist/leader-watchdog.js.map +1 -0
- package/dist/logger.d.ts +114 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +250 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory-monitor.d.ts +172 -0
- package/dist/memory-monitor.d.ts.map +1 -0
- package/dist/memory-monitor.js +599 -0
- package/dist/memory-monitor.js.map +1 -0
- package/dist/metrics.d.ts +115 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +239 -0
- package/dist/metrics.js.map +1 -0
- package/dist/provider-context.d.ts +100 -0
- package/dist/provider-context.d.ts.map +1 -0
- package/dist/provider-context.js +362 -0
- package/dist/provider-context.js.map +1 -0
- package/dist/stateless-lead.d.ts +149 -0
- package/dist/stateless-lead.d.ts.map +1 -0
- package/dist/stateless-lead.js +308 -0
- package/dist/stateless-lead.js.map +1 -0
- package/dist/supervisor.d.ts +147 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +459 -0
- package/dist/supervisor.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Memory Monitor
|
|
3
|
+
*
|
|
4
|
+
* Comprehensive memory monitoring for agent processes:
|
|
5
|
+
* - Detailed memory metrics (RSS, heap, external)
|
|
6
|
+
* - Memory trend analysis (growing/stable/shrinking)
|
|
7
|
+
* - High watermark tracking
|
|
8
|
+
* - Configurable thresholds for proactive alerting
|
|
9
|
+
* - Memory history for trend analysis
|
|
10
|
+
* - Crash prevention through memory pressure detection
|
|
11
|
+
*/
|
|
12
|
+
import { EventEmitter } from 'events';
|
|
13
|
+
import { execSync } from 'child_process';
|
|
14
|
+
import * as os from 'os';
|
|
15
|
+
const DEFAULT_THRESHOLDS = {
|
|
16
|
+
warningBytes: 512 * 1024 * 1024, // 512MB
|
|
17
|
+
criticalBytes: 1024 * 1024 * 1024, // 1GB
|
|
18
|
+
oomImminentBytes: 1.5 * 1024 * 1024 * 1024, // 1.5GB
|
|
19
|
+
trendGrowthRateWarning: 100 * 1024 * 1024, // 100MB per minute (was 10MB - too sensitive)
|
|
20
|
+
historyRetentionMinutes: 60, // Keep 1 hour of history
|
|
21
|
+
historyMaxSamples: 360, // Max 360 samples (every 10s for 1 hour)
|
|
22
|
+
};
|
|
23
|
+
const DEFAULT_CONFIG = {
|
|
24
|
+
checkIntervalMs: 10000, // Every 10 seconds
|
|
25
|
+
thresholds: DEFAULT_THRESHOLDS,
|
|
26
|
+
enableTrendAnalysis: true,
|
|
27
|
+
enableProactiveAlerts: true,
|
|
28
|
+
};
|
|
29
|
+
export class AgentMemoryMonitor extends EventEmitter {
|
|
30
|
+
agents = new Map();
|
|
31
|
+
pids = new Map(); // name -> pid
|
|
32
|
+
intervalId;
|
|
33
|
+
config;
|
|
34
|
+
isRunning = false;
|
|
35
|
+
alertCooldowns = new Map(); // Prevent alert spam
|
|
36
|
+
constructor(config = {}) {
|
|
37
|
+
super();
|
|
38
|
+
this.config = {
|
|
39
|
+
...DEFAULT_CONFIG,
|
|
40
|
+
...config,
|
|
41
|
+
thresholds: {
|
|
42
|
+
...DEFAULT_THRESHOLDS,
|
|
43
|
+
...config.thresholds,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Register an agent for memory monitoring
|
|
49
|
+
*/
|
|
50
|
+
register(name, pid) {
|
|
51
|
+
const now = new Date();
|
|
52
|
+
const initialSnapshot = {
|
|
53
|
+
timestamp: now,
|
|
54
|
+
rssBytes: 0,
|
|
55
|
+
heapUsedBytes: 0,
|
|
56
|
+
heapTotalBytes: 0,
|
|
57
|
+
externalBytes: 0,
|
|
58
|
+
cpuPercent: 0,
|
|
59
|
+
};
|
|
60
|
+
this.agents.set(name, {
|
|
61
|
+
name,
|
|
62
|
+
pid,
|
|
63
|
+
current: initialSnapshot,
|
|
64
|
+
highWatermark: 0,
|
|
65
|
+
lowWatermark: Infinity,
|
|
66
|
+
averageRss: 0,
|
|
67
|
+
trend: 'unknown',
|
|
68
|
+
trendRatePerMinute: 0,
|
|
69
|
+
alertLevel: 'normal',
|
|
70
|
+
memoryHistory: [],
|
|
71
|
+
startedAt: now,
|
|
72
|
+
uptimeMs: 0,
|
|
73
|
+
});
|
|
74
|
+
this.pids.set(name, pid);
|
|
75
|
+
this.emit('registered', { name, pid });
|
|
76
|
+
this.log('info', `Registered agent for memory monitoring: ${name} (PID: ${pid})`);
|
|
77
|
+
// Immediate first sample
|
|
78
|
+
if (this.isRunning) {
|
|
79
|
+
this.sampleAgent(name).catch(() => { });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Update PID for an agent (after restart)
|
|
84
|
+
*/
|
|
85
|
+
updatePid(name, newPid) {
|
|
86
|
+
const metrics = this.agents.get(name);
|
|
87
|
+
if (metrics) {
|
|
88
|
+
metrics.pid = newPid;
|
|
89
|
+
// Reset metrics but keep history for trend continuity
|
|
90
|
+
metrics.highWatermark = 0;
|
|
91
|
+
metrics.lowWatermark = Infinity;
|
|
92
|
+
metrics.alertLevel = 'normal';
|
|
93
|
+
metrics.startedAt = new Date();
|
|
94
|
+
}
|
|
95
|
+
this.pids.set(name, newPid);
|
|
96
|
+
this.log('info', `Updated PID for ${name}: ${newPid}`);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Unregister an agent
|
|
100
|
+
*/
|
|
101
|
+
unregister(name) {
|
|
102
|
+
const metrics = this.agents.get(name);
|
|
103
|
+
this.agents.delete(name);
|
|
104
|
+
this.pids.delete(name);
|
|
105
|
+
this.alertCooldowns.delete(name);
|
|
106
|
+
if (metrics) {
|
|
107
|
+
this.emit('unregistered', { name, finalMetrics: metrics });
|
|
108
|
+
}
|
|
109
|
+
this.log('info', `Unregistered agent: ${name}`);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Start memory monitoring
|
|
113
|
+
*/
|
|
114
|
+
start() {
|
|
115
|
+
if (this.isRunning)
|
|
116
|
+
return;
|
|
117
|
+
this.isRunning = true;
|
|
118
|
+
this.log('info', 'Memory monitor started', {
|
|
119
|
+
checkInterval: this.config.checkIntervalMs,
|
|
120
|
+
thresholds: this.config.thresholds,
|
|
121
|
+
});
|
|
122
|
+
this.intervalId = setInterval(() => {
|
|
123
|
+
this.sampleAll().catch((err) => {
|
|
124
|
+
this.log('error', 'Failed to sample agents', { error: String(err) });
|
|
125
|
+
});
|
|
126
|
+
}, this.config.checkIntervalMs);
|
|
127
|
+
// Initial sample
|
|
128
|
+
this.sampleAll().catch(() => { });
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Stop memory monitoring
|
|
132
|
+
*/
|
|
133
|
+
stop() {
|
|
134
|
+
if (this.intervalId) {
|
|
135
|
+
clearInterval(this.intervalId);
|
|
136
|
+
this.intervalId = undefined;
|
|
137
|
+
}
|
|
138
|
+
this.isRunning = false;
|
|
139
|
+
this.log('info', 'Memory monitor stopped');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get memory metrics for all agents
|
|
143
|
+
*/
|
|
144
|
+
getAll() {
|
|
145
|
+
return Array.from(this.agents.values()).map((m) => ({
|
|
146
|
+
...m,
|
|
147
|
+
uptimeMs: Date.now() - m.startedAt.getTime(),
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get memory metrics for a specific agent
|
|
152
|
+
*/
|
|
153
|
+
get(name) {
|
|
154
|
+
const metrics = this.agents.get(name);
|
|
155
|
+
if (metrics) {
|
|
156
|
+
return {
|
|
157
|
+
...metrics,
|
|
158
|
+
uptimeMs: Date.now() - metrics.startedAt.getTime(),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get crash context for an agent (for crash analysis)
|
|
165
|
+
*/
|
|
166
|
+
getCrashContext(name) {
|
|
167
|
+
const metrics = this.agents.get(name);
|
|
168
|
+
const now = new Date();
|
|
169
|
+
if (!metrics) {
|
|
170
|
+
return {
|
|
171
|
+
agentName: name,
|
|
172
|
+
pid: this.pids.get(name) || 0,
|
|
173
|
+
crashTime: now,
|
|
174
|
+
lastKnownMemory: null,
|
|
175
|
+
peakMemory: 0,
|
|
176
|
+
averageMemory: 0,
|
|
177
|
+
memoryTrend: 'unknown',
|
|
178
|
+
recentHistory: [],
|
|
179
|
+
likelyCause: 'unknown',
|
|
180
|
+
analysisNotes: ['No memory data available - agent was not being monitored'],
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const recentHistory = metrics.memoryHistory.slice(-30); // Last 30 samples
|
|
184
|
+
const analysisNotes = [];
|
|
185
|
+
let likelyCause = 'unknown';
|
|
186
|
+
// Analyze crash cause
|
|
187
|
+
const lastMemory = metrics.current.rssBytes;
|
|
188
|
+
const { thresholds } = this.config;
|
|
189
|
+
if (lastMemory >= thresholds.oomImminentBytes) {
|
|
190
|
+
likelyCause = 'oom';
|
|
191
|
+
analysisNotes.push(`Memory was at OOM-imminent level: ${formatBytes(lastMemory)}`);
|
|
192
|
+
}
|
|
193
|
+
else if (metrics.trend === 'growing' && metrics.trendRatePerMinute > thresholds.trendGrowthRateWarning) {
|
|
194
|
+
likelyCause = 'memory_leak';
|
|
195
|
+
analysisNotes.push(`Memory was growing at ${formatBytes(metrics.trendRatePerMinute)}/min`);
|
|
196
|
+
}
|
|
197
|
+
else if (recentHistory.length >= 2) {
|
|
198
|
+
const prevMemory = recentHistory[recentHistory.length - 2]?.rssBytes || 0;
|
|
199
|
+
const spike = lastMemory - prevMemory;
|
|
200
|
+
if (spike > 100 * 1024 * 1024) {
|
|
201
|
+
// 100MB spike
|
|
202
|
+
likelyCause = 'sudden_spike';
|
|
203
|
+
analysisNotes.push(`Sudden memory spike of ${formatBytes(spike)} detected`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Add general analysis notes
|
|
207
|
+
analysisNotes.push(`Peak memory: ${formatBytes(metrics.highWatermark)}`);
|
|
208
|
+
analysisNotes.push(`Average memory: ${formatBytes(metrics.averageRss)}`);
|
|
209
|
+
analysisNotes.push(`Memory trend: ${metrics.trend} (${formatBytes(metrics.trendRatePerMinute)}/min)`);
|
|
210
|
+
analysisNotes.push(`Alert level at crash: ${metrics.alertLevel}`);
|
|
211
|
+
return {
|
|
212
|
+
agentName: name,
|
|
213
|
+
pid: metrics.pid,
|
|
214
|
+
crashTime: now,
|
|
215
|
+
lastKnownMemory: metrics.current,
|
|
216
|
+
peakMemory: metrics.highWatermark,
|
|
217
|
+
averageMemory: metrics.averageRss,
|
|
218
|
+
memoryTrend: metrics.trend,
|
|
219
|
+
recentHistory,
|
|
220
|
+
likelyCause,
|
|
221
|
+
analysisNotes,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get system-wide memory summary
|
|
226
|
+
*/
|
|
227
|
+
getSystemSummary() {
|
|
228
|
+
const allMetrics = this.getAll();
|
|
229
|
+
const byAlertLevel = {
|
|
230
|
+
normal: 0,
|
|
231
|
+
warning: 0,
|
|
232
|
+
critical: 0,
|
|
233
|
+
oom_imminent: 0,
|
|
234
|
+
};
|
|
235
|
+
for (const m of allMetrics) {
|
|
236
|
+
byAlertLevel[m.alertLevel] = (byAlertLevel[m.alertLevel] || 0) + 1;
|
|
237
|
+
}
|
|
238
|
+
const totalMemory = allMetrics.reduce((sum, m) => sum + m.current.rssBytes, 0);
|
|
239
|
+
const topConsumers = allMetrics
|
|
240
|
+
.sort((a, b) => b.current.rssBytes - a.current.rssBytes)
|
|
241
|
+
.slice(0, 5)
|
|
242
|
+
.map((m) => ({ name: m.name, rssBytes: m.current.rssBytes }));
|
|
243
|
+
return {
|
|
244
|
+
totalAgents: allMetrics.length,
|
|
245
|
+
totalMemoryBytes: totalMemory,
|
|
246
|
+
agentsByAlertLevel: byAlertLevel,
|
|
247
|
+
topMemoryConsumers: topConsumers,
|
|
248
|
+
systemMemory: this.getSystemMemory(),
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Sample memory for all registered agents
|
|
253
|
+
*/
|
|
254
|
+
async sampleAll() {
|
|
255
|
+
const promises = Array.from(this.agents.keys()).map((name) => this.sampleAgent(name).catch((err) => {
|
|
256
|
+
this.log('warn', `Failed to sample ${name}`, { error: String(err) });
|
|
257
|
+
}));
|
|
258
|
+
await Promise.all(promises);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Sample memory for a single agent
|
|
262
|
+
*/
|
|
263
|
+
async sampleAgent(name) {
|
|
264
|
+
const metrics = this.agents.get(name);
|
|
265
|
+
if (!metrics)
|
|
266
|
+
return;
|
|
267
|
+
const pid = metrics.pid;
|
|
268
|
+
// Check if process is still alive
|
|
269
|
+
if (!this.isProcessAlive(pid)) {
|
|
270
|
+
this.log('warn', `Process ${pid} for ${name} is not alive`);
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
try {
|
|
274
|
+
const snapshot = await this.getProcessMemory(pid);
|
|
275
|
+
this.updateMetrics(name, snapshot);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
this.log('warn', `Failed to get memory for ${name}`, { error: String(error) });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Update metrics with new snapshot
|
|
283
|
+
*/
|
|
284
|
+
updateMetrics(name, snapshot) {
|
|
285
|
+
const metrics = this.agents.get(name);
|
|
286
|
+
if (!metrics)
|
|
287
|
+
return;
|
|
288
|
+
const { thresholds } = this.config;
|
|
289
|
+
const _previousRss = metrics.current.rssBytes;
|
|
290
|
+
const previousAlertLevel = metrics.alertLevel;
|
|
291
|
+
// Update current snapshot
|
|
292
|
+
metrics.current = snapshot;
|
|
293
|
+
metrics.uptimeMs = Date.now() - metrics.startedAt.getTime();
|
|
294
|
+
// Update watermarks
|
|
295
|
+
if (snapshot.rssBytes > metrics.highWatermark) {
|
|
296
|
+
metrics.highWatermark = snapshot.rssBytes;
|
|
297
|
+
}
|
|
298
|
+
if (snapshot.rssBytes < metrics.lowWatermark && snapshot.rssBytes > 0) {
|
|
299
|
+
metrics.lowWatermark = snapshot.rssBytes;
|
|
300
|
+
}
|
|
301
|
+
// Add to history
|
|
302
|
+
metrics.memoryHistory.push(snapshot);
|
|
303
|
+
// Trim history
|
|
304
|
+
const maxAge = Date.now() - thresholds.historyRetentionMinutes * 60 * 1000;
|
|
305
|
+
metrics.memoryHistory = metrics.memoryHistory
|
|
306
|
+
.filter((s) => s.timestamp.getTime() > maxAge)
|
|
307
|
+
.slice(-thresholds.historyMaxSamples);
|
|
308
|
+
// Calculate rolling average
|
|
309
|
+
if (metrics.memoryHistory.length > 0) {
|
|
310
|
+
const sum = metrics.memoryHistory.reduce((acc, s) => acc + s.rssBytes, 0);
|
|
311
|
+
metrics.averageRss = sum / metrics.memoryHistory.length;
|
|
312
|
+
}
|
|
313
|
+
// Analyze trend
|
|
314
|
+
if (this.config.enableTrendAnalysis && metrics.memoryHistory.length >= 6) {
|
|
315
|
+
this.analyzeTrend(metrics);
|
|
316
|
+
}
|
|
317
|
+
// Update alert level
|
|
318
|
+
if (snapshot.rssBytes >= thresholds.oomImminentBytes) {
|
|
319
|
+
metrics.alertLevel = 'oom_imminent';
|
|
320
|
+
}
|
|
321
|
+
else if (snapshot.rssBytes >= thresholds.criticalBytes) {
|
|
322
|
+
metrics.alertLevel = 'critical';
|
|
323
|
+
}
|
|
324
|
+
else if (snapshot.rssBytes >= thresholds.warningBytes) {
|
|
325
|
+
metrics.alertLevel = 'warning';
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
metrics.alertLevel = 'normal';
|
|
329
|
+
}
|
|
330
|
+
// Emit events
|
|
331
|
+
this.emit('sample', { name, snapshot, metrics });
|
|
332
|
+
// Check for alerts
|
|
333
|
+
if (this.config.enableProactiveAlerts) {
|
|
334
|
+
this.checkAlerts(name, metrics, previousAlertLevel);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Analyze memory trend
|
|
339
|
+
*/
|
|
340
|
+
analyzeTrend(metrics) {
|
|
341
|
+
const history = metrics.memoryHistory;
|
|
342
|
+
if (history.length < 6) {
|
|
343
|
+
metrics.trend = 'unknown';
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
// Use last 6 samples for trend (1 minute at 10s intervals)
|
|
347
|
+
const recent = history.slice(-6);
|
|
348
|
+
const oldest = recent[0];
|
|
349
|
+
const newest = recent[recent.length - 1];
|
|
350
|
+
const timeDeltaMs = newest.timestamp.getTime() - oldest.timestamp.getTime();
|
|
351
|
+
const memoryDelta = newest.rssBytes - oldest.rssBytes;
|
|
352
|
+
// Calculate rate per minute
|
|
353
|
+
const ratePerMinute = timeDeltaMs > 0 ? (memoryDelta / timeDeltaMs) * 60000 : 0;
|
|
354
|
+
metrics.trendRatePerMinute = ratePerMinute;
|
|
355
|
+
// Determine trend (threshold: 10MB/min change - was 1MB which was too sensitive)
|
|
356
|
+
const threshold = 10 * 1024 * 1024; // 10MB
|
|
357
|
+
if (ratePerMinute > threshold) {
|
|
358
|
+
metrics.trend = 'growing';
|
|
359
|
+
}
|
|
360
|
+
else if (ratePerMinute < -threshold) {
|
|
361
|
+
metrics.trend = 'shrinking';
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
metrics.trend = 'stable';
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Check and emit alerts
|
|
369
|
+
*/
|
|
370
|
+
checkAlerts(name, metrics, previousLevel) {
|
|
371
|
+
const { thresholds } = this.config;
|
|
372
|
+
const now = new Date();
|
|
373
|
+
// Check cooldown (don't spam alerts)
|
|
374
|
+
const lastAlert = this.alertCooldowns.get(name);
|
|
375
|
+
const cooldownMs = 60000; // 1 minute cooldown
|
|
376
|
+
if (lastAlert && now.getTime() - lastAlert.getTime() < cooldownMs) {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
let alert = null;
|
|
380
|
+
// Check for level transitions
|
|
381
|
+
if (metrics.alertLevel !== previousLevel) {
|
|
382
|
+
if (metrics.alertLevel === 'oom_imminent') {
|
|
383
|
+
alert = {
|
|
384
|
+
type: 'oom_imminent',
|
|
385
|
+
agentName: name,
|
|
386
|
+
pid: metrics.pid,
|
|
387
|
+
currentRss: metrics.current.rssBytes,
|
|
388
|
+
threshold: thresholds.oomImminentBytes,
|
|
389
|
+
message: `Agent ${name} is about to run out of memory!`,
|
|
390
|
+
recommendation: 'Consider restarting the agent or killing heavy operations',
|
|
391
|
+
timestamp: now,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
else if (metrics.alertLevel === 'critical') {
|
|
395
|
+
alert = {
|
|
396
|
+
type: 'critical',
|
|
397
|
+
agentName: name,
|
|
398
|
+
pid: metrics.pid,
|
|
399
|
+
currentRss: metrics.current.rssBytes,
|
|
400
|
+
threshold: thresholds.criticalBytes,
|
|
401
|
+
message: `Agent ${name} memory usage is critical`,
|
|
402
|
+
recommendation: 'Monitor closely, may need intervention soon',
|
|
403
|
+
timestamp: now,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
else if (metrics.alertLevel === 'warning') {
|
|
407
|
+
alert = {
|
|
408
|
+
type: 'warning',
|
|
409
|
+
agentName: name,
|
|
410
|
+
pid: metrics.pid,
|
|
411
|
+
currentRss: metrics.current.rssBytes,
|
|
412
|
+
threshold: thresholds.warningBytes,
|
|
413
|
+
message: `Agent ${name} memory usage is elevated`,
|
|
414
|
+
recommendation: 'Keep monitoring, consider investigation if trend continues',
|
|
415
|
+
timestamp: now,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
else if (previousLevel !== 'normal' && metrics.alertLevel === 'normal') {
|
|
419
|
+
alert = {
|
|
420
|
+
type: 'recovered',
|
|
421
|
+
agentName: name,
|
|
422
|
+
pid: metrics.pid,
|
|
423
|
+
currentRss: metrics.current.rssBytes,
|
|
424
|
+
threshold: thresholds.warningBytes,
|
|
425
|
+
message: `Agent ${name} memory usage returned to normal`,
|
|
426
|
+
recommendation: 'No action needed',
|
|
427
|
+
timestamp: now,
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// Check for rapid growth trend (only if memory is already significant - 100MB+)
|
|
432
|
+
// Don't alert on rapid growth if total memory is still low
|
|
433
|
+
const minMemoryForTrendAlert = 100 * 1024 * 1024; // 100MB
|
|
434
|
+
if (metrics.trend === 'growing' &&
|
|
435
|
+
metrics.trendRatePerMinute > thresholds.trendGrowthRateWarning &&
|
|
436
|
+
metrics.current.rssBytes >= minMemoryForTrendAlert &&
|
|
437
|
+
!alert) {
|
|
438
|
+
alert = {
|
|
439
|
+
type: 'trend_warning',
|
|
440
|
+
agentName: name,
|
|
441
|
+
pid: metrics.pid,
|
|
442
|
+
currentRss: metrics.current.rssBytes,
|
|
443
|
+
threshold: thresholds.trendGrowthRateWarning,
|
|
444
|
+
message: `Agent ${name} memory is growing rapidly: ${formatBytes(metrics.trendRatePerMinute)}/min`,
|
|
445
|
+
recommendation: 'Investigate for potential memory leak',
|
|
446
|
+
timestamp: now,
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
if (alert) {
|
|
450
|
+
metrics.lastAlertAt = now;
|
|
451
|
+
this.alertCooldowns.set(name, now);
|
|
452
|
+
this.emit('alert', alert);
|
|
453
|
+
this.log(alert.type === 'recovered' ? 'info' : 'warn', alert.message, {
|
|
454
|
+
agent: name,
|
|
455
|
+
type: alert.type,
|
|
456
|
+
rss: formatBytes(alert.currentRss),
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Get memory for a process using ps
|
|
462
|
+
*/
|
|
463
|
+
async getProcessMemory(pid) {
|
|
464
|
+
try {
|
|
465
|
+
// ps command for detailed memory: rss, vsz, and CPU
|
|
466
|
+
const output = execSync(`ps -o rss=,vsz=,pcpu= -p ${pid}`, {
|
|
467
|
+
encoding: 'utf8',
|
|
468
|
+
timeout: 5000,
|
|
469
|
+
}).trim();
|
|
470
|
+
const parts = output.split(/\s+/);
|
|
471
|
+
const rssKb = parseInt(parts[0] || '0', 10);
|
|
472
|
+
const _vszKb = parseInt(parts[1] || '0', 10);
|
|
473
|
+
const cpu = parseFloat(parts[2] || '0');
|
|
474
|
+
// Try to get more detailed memory from /proc on Linux
|
|
475
|
+
let heapUsed = 0;
|
|
476
|
+
const heapTotal = 0;
|
|
477
|
+
const external = 0;
|
|
478
|
+
try {
|
|
479
|
+
const smaps = execSync(`cat /proc/${pid}/smaps_rollup 2>/dev/null || echo ""`, {
|
|
480
|
+
encoding: 'utf8',
|
|
481
|
+
timeout: 2000,
|
|
482
|
+
});
|
|
483
|
+
const rssMatch = smaps.match(/Rss:\s+(\d+)\s+kB/);
|
|
484
|
+
if (rssMatch) {
|
|
485
|
+
// Use smaps for more accurate RSS
|
|
486
|
+
}
|
|
487
|
+
// For heap estimation on Linux
|
|
488
|
+
const heapMatch = smaps.match(/Private_Dirty:\s+(\d+)\s+kB/);
|
|
489
|
+
if (heapMatch) {
|
|
490
|
+
heapUsed = parseInt(heapMatch[1], 10) * 1024;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
// Not on Linux or no access to /proc
|
|
495
|
+
}
|
|
496
|
+
return {
|
|
497
|
+
timestamp: new Date(),
|
|
498
|
+
rssBytes: rssKb * 1024,
|
|
499
|
+
heapUsedBytes: heapUsed || rssKb * 1024 * 0.6, // Estimate heap as 60% of RSS
|
|
500
|
+
heapTotalBytes: heapTotal || rssKb * 1024 * 0.8,
|
|
501
|
+
externalBytes: external,
|
|
502
|
+
cpuPercent: cpu,
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
catch {
|
|
506
|
+
return {
|
|
507
|
+
timestamp: new Date(),
|
|
508
|
+
rssBytes: 0,
|
|
509
|
+
heapUsedBytes: 0,
|
|
510
|
+
heapTotalBytes: 0,
|
|
511
|
+
externalBytes: 0,
|
|
512
|
+
cpuPercent: 0,
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
/**
|
|
517
|
+
* Get system memory info
|
|
518
|
+
*/
|
|
519
|
+
getSystemMemory() {
|
|
520
|
+
try {
|
|
521
|
+
const meminfo = execSync('cat /proc/meminfo', { encoding: 'utf8' });
|
|
522
|
+
const total = parseInt(meminfo.match(/MemTotal:\s+(\d+)/)?.[1] || '0', 10) * 1024;
|
|
523
|
+
const free = parseInt(meminfo.match(/MemFree:\s+(\d+)/)?.[1] || '0', 10) * 1024;
|
|
524
|
+
const available = parseInt(meminfo.match(/MemAvailable:\s+(\d+)/)?.[1] || '0', 10) * 1024;
|
|
525
|
+
return { total, free, available };
|
|
526
|
+
}
|
|
527
|
+
catch {
|
|
528
|
+
// Fallback for non-Linux
|
|
529
|
+
return {
|
|
530
|
+
total: os.totalmem(),
|
|
531
|
+
free: os.freemem(),
|
|
532
|
+
available: os.freemem(),
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Check if a process is alive
|
|
538
|
+
*/
|
|
539
|
+
isProcessAlive(pid) {
|
|
540
|
+
try {
|
|
541
|
+
process.kill(pid, 0);
|
|
542
|
+
return true;
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
return false;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Structured logging
|
|
550
|
+
*/
|
|
551
|
+
log(level, message, context) {
|
|
552
|
+
const entry = {
|
|
553
|
+
timestamp: new Date().toISOString(),
|
|
554
|
+
level,
|
|
555
|
+
component: 'memory-monitor',
|
|
556
|
+
message,
|
|
557
|
+
...context,
|
|
558
|
+
};
|
|
559
|
+
this.emit('log', entry);
|
|
560
|
+
const prefix = `[memory-monitor]`;
|
|
561
|
+
switch (level) {
|
|
562
|
+
case 'info':
|
|
563
|
+
// Only log info messages in debug mode to reduce noise
|
|
564
|
+
if (process.env.DEBUG_SPAWN === '1') {
|
|
565
|
+
console.log(prefix, message, context ? JSON.stringify(context) : '');
|
|
566
|
+
}
|
|
567
|
+
break;
|
|
568
|
+
case 'warn':
|
|
569
|
+
console.warn(prefix, message, context ? JSON.stringify(context) : '');
|
|
570
|
+
break;
|
|
571
|
+
case 'error':
|
|
572
|
+
console.error(prefix, message, context ? JSON.stringify(context) : '');
|
|
573
|
+
break;
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Format bytes for human-readable display
|
|
579
|
+
*/
|
|
580
|
+
function formatBytes(bytes) {
|
|
581
|
+
if (bytes === 0)
|
|
582
|
+
return '0 B';
|
|
583
|
+
const k = 1024;
|
|
584
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
585
|
+
const i = Math.floor(Math.log(Math.abs(bytes)) / Math.log(k));
|
|
586
|
+
const value = bytes / Math.pow(k, i);
|
|
587
|
+
return `${value.toFixed(2)} ${sizes[i]}`;
|
|
588
|
+
}
|
|
589
|
+
// Export utility
|
|
590
|
+
export { formatBytes };
|
|
591
|
+
// Singleton instance
|
|
592
|
+
let _memoryMonitor = null;
|
|
593
|
+
export function getMemoryMonitor(config) {
|
|
594
|
+
if (!_memoryMonitor) {
|
|
595
|
+
_memoryMonitor = new AgentMemoryMonitor(config);
|
|
596
|
+
}
|
|
597
|
+
return _memoryMonitor;
|
|
598
|
+
}
|
|
599
|
+
//# sourceMappingURL=memory-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-monitor.js","sourceRoot":"","sources":["../src/memory-monitor.ts"],"names":[],"mappings":"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"}
|