@gazzehamine/armada-watch-agent 1.0.1 → 1.3.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/collector.js +98 -0
- package/dist/index.js +2 -0
- package/package.json +1 -1
package/dist/collector.js
CHANGED
|
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.getSystemInfo = getSystemInfo;
|
|
7
7
|
exports.collectMetrics = collectMetrics;
|
|
8
8
|
exports.collectProcesses = collectProcesses;
|
|
9
|
+
exports.collectDockerContainers = collectDockerContainers;
|
|
9
10
|
const systeminformation_1 = __importDefault(require("systeminformation"));
|
|
10
11
|
const os_1 = __importDefault(require("os"));
|
|
11
12
|
let lastNetworkStats = null;
|
|
13
|
+
let lastDiskStats = null;
|
|
12
14
|
async function getSystemInfo() {
|
|
13
15
|
const cpu = await systeminformation_1.default.cpu();
|
|
14
16
|
return {
|
|
@@ -53,6 +55,57 @@ async function collectMetrics() {
|
|
|
53
55
|
}
|
|
54
56
|
// Uptime
|
|
55
57
|
const uptime = os_1.default.uptime();
|
|
58
|
+
// Load Average (1, 5, 15 minutes)
|
|
59
|
+
const loadAvg = os_1.default.loadavg();
|
|
60
|
+
const loadAverage = [loadAvg[0], loadAvg[1], loadAvg[2]];
|
|
61
|
+
// Swap Usage
|
|
62
|
+
const swapTotal = mem.swaptotal;
|
|
63
|
+
const swapUsed = mem.swapused;
|
|
64
|
+
const swapUsage = swapTotal > 0 ? (swapUsed / swapTotal) * 100 : 0;
|
|
65
|
+
// Process Count
|
|
66
|
+
const processes = await systeminformation_1.default.processes();
|
|
67
|
+
const processCount = processes.all;
|
|
68
|
+
// Disk I/O (reads/writes per second)
|
|
69
|
+
const diskIO = await systeminformation_1.default.disksIO();
|
|
70
|
+
let diskReadPs = 0;
|
|
71
|
+
let diskWritePs = 0;
|
|
72
|
+
if (lastDiskStats) {
|
|
73
|
+
const timeDiff = (Date.now() - lastDiskStats.timestamp) / 1000; // seconds
|
|
74
|
+
diskReadPs = (diskIO.rIO - lastDiskStats.rIO) / timeDiff;
|
|
75
|
+
diskWritePs = (diskIO.wIO - lastDiskStats.wIO) / timeDiff;
|
|
76
|
+
}
|
|
77
|
+
lastDiskStats = {
|
|
78
|
+
rIO: diskIO.rIO,
|
|
79
|
+
wIO: diskIO.wIO,
|
|
80
|
+
timestamp: Date.now(),
|
|
81
|
+
};
|
|
82
|
+
// Phase 2: TCP Connections
|
|
83
|
+
const networkConnections = await systeminformation_1.default.networkConnections();
|
|
84
|
+
const tcpConnections = networkConnections.filter(c => c.protocol === 'tcp').length;
|
|
85
|
+
const tcpEstablished = networkConnections.filter(c => c.protocol === 'tcp' && c.state === 'ESTABLISHED').length;
|
|
86
|
+
const tcpTimeWait = networkConnections.filter(c => c.protocol === 'tcp' && c.state === 'TIME_WAIT').length;
|
|
87
|
+
// Phase 2: Network Errors and Drops
|
|
88
|
+
const networkErrorsRaw = mainInterface ? (mainInterface.rx_errors + mainInterface.tx_errors) : 0;
|
|
89
|
+
const networkDroppedRaw = mainInterface ? (mainInterface.rx_dropped + mainInterface.tx_dropped) : 0;
|
|
90
|
+
// Return totals (can be used to calculate rates if needed)
|
|
91
|
+
const networkErrors = networkErrorsRaw;
|
|
92
|
+
const networkDropped = networkDroppedRaw;
|
|
93
|
+
// Phase 2: Docker Containers (if Docker is available)
|
|
94
|
+
let dockerContainersRunning = 0;
|
|
95
|
+
let dockerContainersStopped = 0;
|
|
96
|
+
let dockerContainersTotal = 0;
|
|
97
|
+
try {
|
|
98
|
+
const dockerContainers = await systeminformation_1.default.dockerContainers();
|
|
99
|
+
dockerContainersTotal = dockerContainers.length;
|
|
100
|
+
dockerContainersRunning = dockerContainers.filter(c => c.state === 'running').length;
|
|
101
|
+
dockerContainersStopped = dockerContainers.filter(c => c.state !== 'running').length;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
// Docker not available or not running
|
|
105
|
+
dockerContainersTotal = 0;
|
|
106
|
+
dockerContainersRunning = 0;
|
|
107
|
+
dockerContainersStopped = 0;
|
|
108
|
+
}
|
|
56
109
|
return {
|
|
57
110
|
cpuUsage,
|
|
58
111
|
memoryUsage,
|
|
@@ -64,6 +117,21 @@ async function collectMetrics() {
|
|
|
64
117
|
networkRx,
|
|
65
118
|
networkTx,
|
|
66
119
|
uptime,
|
|
120
|
+
loadAverage,
|
|
121
|
+
swapUsage,
|
|
122
|
+
swapTotal,
|
|
123
|
+
swapUsed,
|
|
124
|
+
processCount,
|
|
125
|
+
diskReadPs,
|
|
126
|
+
diskWritePs,
|
|
127
|
+
tcpConnections,
|
|
128
|
+
tcpEstablished,
|
|
129
|
+
tcpTimeWait,
|
|
130
|
+
networkErrors,
|
|
131
|
+
networkDropped,
|
|
132
|
+
dockerContainersRunning,
|
|
133
|
+
dockerContainersStopped,
|
|
134
|
+
dockerContainersTotal,
|
|
67
135
|
};
|
|
68
136
|
}
|
|
69
137
|
async function collectProcesses() {
|
|
@@ -79,3 +147,33 @@ async function collectProcesses() {
|
|
|
79
147
|
memory: p.mem,
|
|
80
148
|
}));
|
|
81
149
|
}
|
|
150
|
+
async function collectDockerContainers() {
|
|
151
|
+
try {
|
|
152
|
+
const dockerContainers = await systeminformation_1.default.dockerContainers();
|
|
153
|
+
return dockerContainers.map((container) => ({
|
|
154
|
+
id: container.id || '',
|
|
155
|
+
name: container.name || '',
|
|
156
|
+
image: container.image || '',
|
|
157
|
+
state: container.state || 'unknown',
|
|
158
|
+
status: container.state || 'unknown',
|
|
159
|
+
created: container.created || 0,
|
|
160
|
+
started: container.started || 0,
|
|
161
|
+
cpuPercent: container.cpuPercent || 0,
|
|
162
|
+
memoryPercent: container.memPercent || 0,
|
|
163
|
+
memoryUsage: container.memUsage || 0,
|
|
164
|
+
memoryLimit: container.memLimit || 0,
|
|
165
|
+
netIO: {
|
|
166
|
+
rx: container.netIO?.rx || 0,
|
|
167
|
+
wx: container.netIO?.wx || 0,
|
|
168
|
+
},
|
|
169
|
+
blockIO: {
|
|
170
|
+
r: container.blockIO?.r || 0,
|
|
171
|
+
w: container.blockIO?.w || 0,
|
|
172
|
+
},
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
// Docker not available or not running
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -48,6 +48,7 @@ async function sendMetrics() {
|
|
|
48
48
|
try {
|
|
49
49
|
const metrics = await (0, collector_1.collectMetrics)();
|
|
50
50
|
const processes = await (0, collector_1.collectProcesses)();
|
|
51
|
+
const dockerContainers = await (0, collector_1.collectDockerContainers)();
|
|
51
52
|
const payload = {
|
|
52
53
|
instanceInfo,
|
|
53
54
|
metrics: {
|
|
@@ -55,6 +56,7 @@ async function sendMetrics() {
|
|
|
55
56
|
...metrics,
|
|
56
57
|
},
|
|
57
58
|
processes,
|
|
59
|
+
dockerContainers,
|
|
58
60
|
};
|
|
59
61
|
await axios_1.default.post(`${SERVER_URL}/api/metrics`, payload, {
|
|
60
62
|
timeout: 5000,
|