tuimon 0.3.4 → 0.3.6
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/quick/presets/docker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../../src/quick/presets/docker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAmB9C,wBAAgB,YAAY,IAAI,YAAY,CAmI3C"}
|
|
@@ -1,34 +1,61 @@
|
|
|
1
|
-
import { execSync } from 'node:child_process';
|
|
1
|
+
import { execSync, spawn } from 'node:child_process';
|
|
2
2
|
function parsePercent(value) {
|
|
3
3
|
return parseFloat(value.replace('%', '')) || 0;
|
|
4
4
|
}
|
|
5
|
-
function execCommand(cmd) {
|
|
6
|
-
try {
|
|
7
|
-
return execSync(cmd, { encoding: 'utf-8', timeout: 10_000 });
|
|
8
|
-
}
|
|
9
|
-
catch (err) {
|
|
10
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
11
|
-
if (msg.includes('ENOENT') || msg.includes('not found') || msg.includes('command not found')) {
|
|
12
|
-
throw new Error('[tuimon] Docker not found. Make sure Docker is installed and running.');
|
|
13
|
-
}
|
|
14
|
-
throw err;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
function parseJsonLines(output) {
|
|
18
|
-
return output
|
|
19
|
-
.trim()
|
|
20
|
-
.split('\n')
|
|
21
|
-
.filter((line) => line.trim() !== '')
|
|
22
|
-
.map((line) => JSON.parse(line));
|
|
23
|
-
}
|
|
24
5
|
export function dockerPreset() {
|
|
25
|
-
// Verify docker is available
|
|
6
|
+
// Verify docker is available
|
|
26
7
|
try {
|
|
27
8
|
execSync('docker --version', { encoding: 'utf-8', stdio: 'pipe' });
|
|
28
9
|
}
|
|
29
10
|
catch {
|
|
30
11
|
throw new Error('[tuimon] Docker not found. Make sure Docker is installed and running.');
|
|
31
12
|
}
|
|
13
|
+
// Cache for latest stats from streaming docker stats
|
|
14
|
+
let latestStats = [];
|
|
15
|
+
let statsReady = false;
|
|
16
|
+
// Spawn streaming docker stats process
|
|
17
|
+
const statsProc = spawn('docker', [
|
|
18
|
+
'stats', '--format', '{{json .}}',
|
|
19
|
+
], { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
20
|
+
// Strip ANSI escape sequences from docker stats output
|
|
21
|
+
function stripAnsi(s) {
|
|
22
|
+
return s.replace(/\x1b\[[0-9;]*[A-Za-z]/g, '').replace(/\x1b\[?[0-9;]*[A-Za-z]/g, '');
|
|
23
|
+
}
|
|
24
|
+
let lineBuf = '';
|
|
25
|
+
let currentBatch = [];
|
|
26
|
+
statsProc.stdout.on('data', (chunk) => {
|
|
27
|
+
lineBuf += stripAnsi(chunk.toString());
|
|
28
|
+
const lines = lineBuf.split('\n');
|
|
29
|
+
// Keep last potentially incomplete line
|
|
30
|
+
lineBuf = lines.pop() ?? '';
|
|
31
|
+
for (const line of lines) {
|
|
32
|
+
const trimmed = line.trim();
|
|
33
|
+
if (!trimmed)
|
|
34
|
+
continue;
|
|
35
|
+
// Try to parse each line as JSON
|
|
36
|
+
try {
|
|
37
|
+
const entry = JSON.parse(trimmed);
|
|
38
|
+
currentBatch.push(entry);
|
|
39
|
+
// Docker stats outputs one line per container then repeats.
|
|
40
|
+
// We detect a new batch when we see a Name we already have in the current batch.
|
|
41
|
+
const names = currentBatch.map((e) => e.Name);
|
|
42
|
+
const hasDuplicate = names.length !== new Set(names).size;
|
|
43
|
+
if (hasDuplicate) {
|
|
44
|
+
// The last entry is the start of a new batch - save everything before it
|
|
45
|
+
latestStats = currentBatch.slice(0, -1);
|
|
46
|
+
currentBatch = [entry];
|
|
47
|
+
statsReady = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Not JSON, skip
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
// Clean up on exit
|
|
56
|
+
process.once('beforeExit', () => { statsProc.kill(); });
|
|
57
|
+
process.once('SIGINT', () => { statsProc.kill(); });
|
|
58
|
+
process.once('SIGTERM', () => { statsProc.kill(); });
|
|
32
59
|
const layout = {
|
|
33
60
|
title: 'Docker',
|
|
34
61
|
stats: [
|
|
@@ -45,10 +72,24 @@ export function dockerPreset() {
|
|
|
45
72
|
],
|
|
46
73
|
};
|
|
47
74
|
const data = () => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
75
|
+
// Get container list (fast, ~50ms)
|
|
76
|
+
let psEntries = [];
|
|
77
|
+
try {
|
|
78
|
+
const psOutput = execSync("docker ps --format '{{json .}}'", {
|
|
79
|
+
encoding: 'utf-8',
|
|
80
|
+
timeout: 5000,
|
|
81
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
82
|
+
});
|
|
83
|
+
psEntries = psOutput
|
|
84
|
+
.trim()
|
|
85
|
+
.split('\n')
|
|
86
|
+
.filter((l) => l.trim())
|
|
87
|
+
.map((l) => JSON.parse(l));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// use empty if docker ps fails
|
|
91
|
+
}
|
|
92
|
+
const statsEntries = latestStats;
|
|
52
93
|
const totalContainers = psEntries.length;
|
|
53
94
|
const runningCount = psEntries.filter((c) => c.State === 'running').length;
|
|
54
95
|
const totalCpu = statsEntries.reduce((sum, e) => sum + parsePercent(e.CPUPerc), 0);
|
|
@@ -67,23 +108,6 @@ export function dockerPreset() {
|
|
|
67
108
|
for (const entry of statsEntries) {
|
|
68
109
|
memUsage[entry.Name] = parsePercent(entry.MemPerc);
|
|
69
110
|
}
|
|
70
|
-
let events = [];
|
|
71
|
-
try {
|
|
72
|
-
const eventsOutput = execCommand("docker events --since 60s --until 0s --format '{{json .}}'");
|
|
73
|
-
const lines = eventsOutput
|
|
74
|
-
.trim()
|
|
75
|
-
.split('\n')
|
|
76
|
-
.filter((line) => line.trim() !== '');
|
|
77
|
-
events = lines.map((line) => {
|
|
78
|
-
const parsed = JSON.parse(line);
|
|
79
|
-
const name = parsed.Actor?.Attributes?.name ?? 'unknown';
|
|
80
|
-
const action = parsed.Action ?? 'unknown';
|
|
81
|
-
return { text: `${name}: ${action}`, type: 'info' };
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
events = [];
|
|
86
|
-
}
|
|
87
111
|
return {
|
|
88
112
|
containers: totalContainers,
|
|
89
113
|
running: runningCount,
|
|
@@ -92,7 +116,7 @@ export function dockerPreset() {
|
|
|
92
116
|
cpuHistory,
|
|
93
117
|
health,
|
|
94
118
|
memUsage,
|
|
95
|
-
events,
|
|
119
|
+
events: statsReady ? [] : [{ text: 'Waiting for docker stats...', type: 'info' }],
|
|
96
120
|
};
|
|
97
121
|
};
|
|
98
122
|
return { layout, data, refresh: 1000 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/quick/presets/docker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/quick/presets/docker.ts"],"names":[],"mappings":"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"}
|