@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 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,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gazzehamine/armada-watch-agent",
3
- "version": "1.0.1",
3
+ "version": "1.3.0",
4
4
  "description": "Monitoring agent for Armada Watch - EC2 instance monitoring",
5
5
  "main": "dist/index.js",
6
6
  "bin": {