@glassmkr/crucible 0.10.3 → 0.11.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/collect/__tests__/c1-c6.test.d.ts +1 -0
- package/dist/collect/__tests__/c1-c6.test.js +160 -0
- package/dist/collect/__tests__/c1-c6.test.js.map +1 -0
- package/dist/collect/__tests__/c7-c10.test.d.ts +1 -0
- package/dist/collect/__tests__/c7-c10.test.js +271 -0
- package/dist/collect/__tests__/c7-c10.test.js.map +1 -0
- package/dist/collect/bonding.d.ts +37 -0
- package/dist/collect/bonding.js +246 -0
- package/dist/collect/bonding.js.map +1 -0
- package/dist/collect/conntrack.d.ts +19 -0
- package/dist/collect/conntrack.js +82 -1
- package/dist/collect/conntrack.js.map +1 -1
- package/dist/collect/edac.d.ts +2 -0
- package/dist/collect/edac.js +104 -0
- package/dist/collect/edac.js.map +1 -0
- package/dist/collect/fd.d.ts +46 -0
- package/dist/collect/fd.js +148 -0
- package/dist/collect/fd.js.map +1 -1
- package/dist/collect/hardware-raid.d.ts +2 -0
- package/dist/collect/hardware-raid.js +152 -0
- package/dist/collect/hardware-raid.js.map +1 -0
- package/dist/collect/psi.d.ts +20 -0
- package/dist/collect/psi.js +90 -0
- package/dist/collect/psi.js.map +1 -0
- package/dist/collect/reboot-evidence.d.ts +2 -0
- package/dist/collect/reboot-evidence.js +109 -0
- package/dist/collect/reboot-evidence.js.map +1 -0
- package/dist/collect/tcp-stats.d.ts +37 -0
- package/dist/collect/tcp-stats.js +153 -0
- package/dist/collect/tcp-stats.js.map +1 -0
- package/dist/collect/vmstat.d.ts +22 -0
- package/dist/collect/vmstat.js +94 -0
- package/dist/collect/vmstat.js.map +1 -0
- package/dist/collect/zfs.js +94 -0
- package/dist/collect/zfs.js.map +1 -1
- package/dist/index.js +49 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/types.d.ts +211 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// Tests for C1-C6 collectors (v0.10.4, 2026-05-19).
|
|
2
|
+
//
|
|
3
|
+
// Most collectors hit real filesystem paths (/sys/devices/system/edac/,
|
|
4
|
+
// /proc/pressure/, /proc/vmstat, /var/crash/, etc.) so we can't fully
|
|
5
|
+
// integration-test them outside a Linux host with the expected
|
|
6
|
+
// capabilities. These tests cover the pure parser functions and the
|
|
7
|
+
// capability-gate behavior (collectors return null on hosts where the
|
|
8
|
+
// surface is absent).
|
|
9
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
10
|
+
import { __test_only as psiTest } from "../psi.js";
|
|
11
|
+
import { __test_only as vmstatTest, collectVmstat } from "../vmstat.js";
|
|
12
|
+
import { parseZpoolStatus } from "../zfs.js";
|
|
13
|
+
describe("C2 PSI: parsePsiLine", () => {
|
|
14
|
+
it("parses a complete PSI line", () => {
|
|
15
|
+
const r = psiTest.parsePsiLine("some avg10=0.06 avg60=0.04 avg300=0.05 total=12345");
|
|
16
|
+
expect(r).toEqual({ avg10: 0.06, avg60: 0.04, avg300: 0.05, total: 12345 });
|
|
17
|
+
});
|
|
18
|
+
it("returns null on malformed input", () => {
|
|
19
|
+
expect(psiTest.parsePsiLine("some avg10=0.06")).toBeNull();
|
|
20
|
+
expect(psiTest.parsePsiLine("garbage")).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
describe("C2 PSI: parsePsiFile", () => {
|
|
24
|
+
it("captures both some and full lines (memory/io shape)", () => {
|
|
25
|
+
const out = psiTest.parsePsiFile("some avg10=1.0 avg60=2.0 avg300=3.0 total=100\nfull avg10=0.5 avg60=1.0 avg300=1.5 total=50\n");
|
|
26
|
+
expect(out?.some.avg10).toBe(1.0);
|
|
27
|
+
expect(out?.full?.avg60).toBe(1.0);
|
|
28
|
+
});
|
|
29
|
+
it("works when only 'some' is present (cpu shape)", () => {
|
|
30
|
+
const out = psiTest.parsePsiFile("some avg10=0.0 avg60=0.0 avg300=0.0 total=0\n");
|
|
31
|
+
expect(out?.some.avg10).toBe(0.0);
|
|
32
|
+
expect(out?.full).toBeUndefined();
|
|
33
|
+
});
|
|
34
|
+
it("returns null on empty input", () => {
|
|
35
|
+
expect(psiTest.parsePsiFile("")).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
describe("C3 vmstat: collectVmstat delta tracking", () => {
|
|
39
|
+
// Note: vmstat reads real /proc/vmstat on the test runner; on a
|
|
40
|
+
// dev macOS host the file doesn't exist so collectVmstat returns
|
|
41
|
+
// null cleanly. This is sufficient evidence for the capability
|
|
42
|
+
// gate; behavioral delta tests live in the e2e tier.
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
vmstatTest.resetForTests();
|
|
45
|
+
});
|
|
46
|
+
it("returns null on a host without /proc/vmstat", () => {
|
|
47
|
+
// On macOS / non-Linux, readProcFile returns null and the
|
|
48
|
+
// collector returns null cleanly.
|
|
49
|
+
const r = collectVmstat();
|
|
50
|
+
// We accept either: null (non-Linux) or a snapshot with null
|
|
51
|
+
// rates (Linux but first call). Both prove the capability gate
|
|
52
|
+
// shape.
|
|
53
|
+
if (r !== null) {
|
|
54
|
+
expect(r.pswpin_rate).toBeNull();
|
|
55
|
+
expect(r.pswpout_rate).toBeNull();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("C6 ZFS: parseZpoolStatus extended vdev fields", () => {
|
|
60
|
+
it("parses a raidz2 pool with a mirrored SLOG and L2ARC", () => {
|
|
61
|
+
const status = [
|
|
62
|
+
" pool: tank",
|
|
63
|
+
" state: ONLINE",
|
|
64
|
+
" scan: scrub repaired 0B in 00:00:30 with 0 errors on Sun Oct 1 02:30:00 2026",
|
|
65
|
+
"config:",
|
|
66
|
+
"",
|
|
67
|
+
"\tNAME STATE READ WRITE CKSUM",
|
|
68
|
+
"\ttank ONLINE 0 0 0",
|
|
69
|
+
"\t raidz2-0 ONLINE 0 0 0",
|
|
70
|
+
"\t sda ONLINE 0 0 0",
|
|
71
|
+
"\t sdb ONLINE 0 0 0",
|
|
72
|
+
"\t sdc ONLINE 0 0 0",
|
|
73
|
+
"\t sdd ONLINE 0 0 0",
|
|
74
|
+
"logs",
|
|
75
|
+
"\t mirror-1 ONLINE 0 0 0",
|
|
76
|
+
"\t nvme0n1p2 ONLINE 0 0 0",
|
|
77
|
+
"\t nvme1n1p2 ONLINE 0 0 0",
|
|
78
|
+
"cache",
|
|
79
|
+
"\t nvme0n1p3 ONLINE 0 0 0",
|
|
80
|
+
"",
|
|
81
|
+
"errors: No known data errors",
|
|
82
|
+
].join("\n");
|
|
83
|
+
const pools = parseZpoolStatus(status);
|
|
84
|
+
expect(pools).toHaveLength(1);
|
|
85
|
+
const p = pools[0];
|
|
86
|
+
expect(p.name).toBe("tank");
|
|
87
|
+
expect(p.state).toBe("ONLINE");
|
|
88
|
+
expect(p.vdevs).toHaveLength(1);
|
|
89
|
+
expect(p.vdevs[0].name).toBe("raidz2-0");
|
|
90
|
+
expect(p.vdevs[0].redundancy_class).toBe("raidz2");
|
|
91
|
+
expect(p.vdevs[0].degraded_disks_count).toBe(0);
|
|
92
|
+
expect(p.slog_vdevs).toHaveLength(1);
|
|
93
|
+
expect(p.slog_vdevs[0].name).toBe("mirror-1");
|
|
94
|
+
expect(p.l2arc_vdevs).toHaveLength(1);
|
|
95
|
+
expect(p.l2arc_vdevs[0].name).toBe("nvme0n1p3");
|
|
96
|
+
});
|
|
97
|
+
it("classifies raidz1 / raidz3 / mirror correctly", () => {
|
|
98
|
+
const status = [
|
|
99
|
+
" pool: a",
|
|
100
|
+
" state: ONLINE",
|
|
101
|
+
"config:",
|
|
102
|
+
"\tNAME STATE",
|
|
103
|
+
"\ta ONLINE",
|
|
104
|
+
"\t raidz1-0 ONLINE",
|
|
105
|
+
"\t s1 ONLINE",
|
|
106
|
+
"\t s2 ONLINE",
|
|
107
|
+
" pool: b",
|
|
108
|
+
" state: ONLINE",
|
|
109
|
+
"config:",
|
|
110
|
+
"\tNAME STATE",
|
|
111
|
+
"\tb ONLINE",
|
|
112
|
+
"\t raidz3-0 ONLINE",
|
|
113
|
+
"\t s1 ONLINE",
|
|
114
|
+
" pool: c",
|
|
115
|
+
" state: ONLINE",
|
|
116
|
+
"config:",
|
|
117
|
+
"\tNAME STATE",
|
|
118
|
+
"\tc ONLINE",
|
|
119
|
+
"\t mirror-0 ONLINE",
|
|
120
|
+
"\t s1 ONLINE",
|
|
121
|
+
].join("\n");
|
|
122
|
+
const pools = parseZpoolStatus(status);
|
|
123
|
+
expect(pools.map((p) => p.vdevs[0]?.redundancy_class)).toEqual([
|
|
124
|
+
"raidz1",
|
|
125
|
+
"raidz3",
|
|
126
|
+
"mirror",
|
|
127
|
+
]);
|
|
128
|
+
});
|
|
129
|
+
it("counts degraded child devices on a DEGRADED vdev", () => {
|
|
130
|
+
const status = [
|
|
131
|
+
" pool: tank",
|
|
132
|
+
" state: DEGRADED",
|
|
133
|
+
"config:",
|
|
134
|
+
"\tNAME STATE",
|
|
135
|
+
"\ttank DEGRADED",
|
|
136
|
+
"\t raidz2-0 DEGRADED",
|
|
137
|
+
"\t sda ONLINE",
|
|
138
|
+
"\t sdb FAULTED",
|
|
139
|
+
"\t sdc ONLINE",
|
|
140
|
+
"\t sdd ONLINE",
|
|
141
|
+
"",
|
|
142
|
+
"errors: No known data errors",
|
|
143
|
+
].join("\n");
|
|
144
|
+
const pools = parseZpoolStatus(status);
|
|
145
|
+
expect(pools[0].vdevs[0].degraded_disks_count).toBe(1);
|
|
146
|
+
});
|
|
147
|
+
it("treats a single-device top-level vdev as stripe (no redundancy)", () => {
|
|
148
|
+
const status = [
|
|
149
|
+
" pool: scratch",
|
|
150
|
+
" state: ONLINE",
|
|
151
|
+
"config:",
|
|
152
|
+
"\tNAME STATE",
|
|
153
|
+
"\tscratch ONLINE",
|
|
154
|
+
"\t sda ONLINE",
|
|
155
|
+
].join("\n");
|
|
156
|
+
const pools = parseZpoolStatus(status);
|
|
157
|
+
expect(pools[0].vdevs[0].redundancy_class).toBe("stripe");
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
//# sourceMappingURL=c1-c6.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c1-c6.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/c1-c6.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
// Tests for C7-C10 collectors (v0.11.0, 2026-05-19).
|
|
2
|
+
//
|
|
3
|
+
// Same pattern as c1-c6.test.ts: cover pure parsers + capability gates
|
|
4
|
+
// where the collector reads real /proc paths. Real-path tests degrade
|
|
5
|
+
// to capability-gate verification on non-Linux dev hosts (readProcFile
|
|
6
|
+
// returns null on macOS / Windows, so the collector returns its
|
|
7
|
+
// `available: false` shape).
|
|
8
|
+
import { describe, expect, it, beforeEach } from "vitest";
|
|
9
|
+
import { __test_only as fdTest } from "../fd.js";
|
|
10
|
+
import { __test_only as bondingTest, parseBondFile, } from "../bonding.js";
|
|
11
|
+
import { __test_only as conntrackTest, collectConntrack, } from "../conntrack.js";
|
|
12
|
+
import { __test_only as tcpStatsTest, collectTcpStats, parseTcpExt, parseTcpSnmp, } from "../tcp-stats.js";
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// C7 process FD: parseOpenFilesLimit
|
|
15
|
+
// ============================================================================
|
|
16
|
+
describe("C7 process FD: parseOpenFilesLimit", () => {
|
|
17
|
+
it("extracts soft + hard from a real-shaped limits file", () => {
|
|
18
|
+
const raw = [
|
|
19
|
+
"Limit Soft Limit Hard Limit Units",
|
|
20
|
+
"Max cpu time unlimited unlimited seconds",
|
|
21
|
+
"Max file size unlimited unlimited bytes",
|
|
22
|
+
"Max open files 1024 4096 files",
|
|
23
|
+
"Max stack size 8388608 unlimited bytes",
|
|
24
|
+
].join("\n");
|
|
25
|
+
expect(fdTest.parseOpenFilesLimit(raw)).toEqual({ soft: 1024, hard: 4096 });
|
|
26
|
+
});
|
|
27
|
+
it("maps unlimited to 0 sentinel (no useful proximity signal)", () => {
|
|
28
|
+
const raw = "Max open files unlimited unlimited files";
|
|
29
|
+
expect(fdTest.parseOpenFilesLimit(raw)).toEqual({ soft: 0, hard: 0 });
|
|
30
|
+
});
|
|
31
|
+
it("returns null when the line is absent", () => {
|
|
32
|
+
expect(fdTest.parseOpenFilesLimit("Max cpu time unlimited unlimited seconds")).toBeNull();
|
|
33
|
+
});
|
|
34
|
+
it("returns null on malformed values", () => {
|
|
35
|
+
expect(fdTest.parseOpenFilesLimit("Max open files garbage 4096 files")).toBeNull();
|
|
36
|
+
});
|
|
37
|
+
it("top-N constant is 50 per spec §1.3", () => {
|
|
38
|
+
expect(fdTest.TOP_N).toBe(50);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// C8 bonding: parseBondFile
|
|
43
|
+
// ============================================================================
|
|
44
|
+
const LACP_HEALTHY_BOND = `Ethernet Channel Bonding Driver: v5.15.0
|
|
45
|
+
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
|
|
46
|
+
Transmit Hash Policy: layer2 (0)
|
|
47
|
+
MII Status: up
|
|
48
|
+
MII Polling Interval (ms): 100
|
|
49
|
+
Up Delay (ms): 0
|
|
50
|
+
Down Delay (ms): 0
|
|
51
|
+
|
|
52
|
+
802.3ad info
|
|
53
|
+
LACP rate: fast
|
|
54
|
+
Min links: 0
|
|
55
|
+
Aggregator selection policy (ad_select): stable
|
|
56
|
+
System priority: 65535
|
|
57
|
+
System MAC address: aa:bb:cc:dd:ee:ff
|
|
58
|
+
Active Aggregator Info:
|
|
59
|
+
\tAggregator ID: 1
|
|
60
|
+
\tNumber of ports: 2
|
|
61
|
+
\tActor Key: 9
|
|
62
|
+
\tPartner Key: 1
|
|
63
|
+
\tPartner Mac Address: 11:22:33:44:55:66
|
|
64
|
+
|
|
65
|
+
Slave Interface: eth0
|
|
66
|
+
MII Status: up
|
|
67
|
+
Speed: 10000 Mbps
|
|
68
|
+
Duplex: full
|
|
69
|
+
Link Failure Count: 0
|
|
70
|
+
Permanent HW addr: aa:bb:cc:dd:ee:f0
|
|
71
|
+
Slave queue ID: 0
|
|
72
|
+
Aggregator ID: 1
|
|
73
|
+
Actor Churn State: none
|
|
74
|
+
Partner Churn State: none
|
|
75
|
+
Actor Churned Count: 0
|
|
76
|
+
Partner Churned Count: 0
|
|
77
|
+
details actor lacp pdu:
|
|
78
|
+
system priority: 65535
|
|
79
|
+
system mac address: aa:bb:cc:dd:ee:ff
|
|
80
|
+
port key: 9
|
|
81
|
+
port priority: 255
|
|
82
|
+
port number: 1
|
|
83
|
+
port state: 61
|
|
84
|
+
details partner lacp pdu:
|
|
85
|
+
system priority: 65535
|
|
86
|
+
system mac address: 11:22:33:44:55:66
|
|
87
|
+
oper key: 1
|
|
88
|
+
port priority: 255
|
|
89
|
+
port number: 1
|
|
90
|
+
port state: 63
|
|
91
|
+
|
|
92
|
+
Slave Interface: eth1
|
|
93
|
+
MII Status: up
|
|
94
|
+
Speed: 10000 Mbps
|
|
95
|
+
Duplex: full
|
|
96
|
+
Link Failure Count: 0
|
|
97
|
+
Permanent HW addr: aa:bb:cc:dd:ee:f1
|
|
98
|
+
Slave queue ID: 0
|
|
99
|
+
Aggregator ID: 1
|
|
100
|
+
Actor Churn State: none
|
|
101
|
+
Partner Churn State: none
|
|
102
|
+
Actor Churned Count: 0
|
|
103
|
+
Partner Churned Count: 0
|
|
104
|
+
details actor lacp pdu:
|
|
105
|
+
system priority: 65535
|
|
106
|
+
system mac address: aa:bb:cc:dd:ee:ff
|
|
107
|
+
port key: 9
|
|
108
|
+
port priority: 255
|
|
109
|
+
port number: 2
|
|
110
|
+
port state: 61
|
|
111
|
+
details partner lacp pdu:
|
|
112
|
+
system priority: 65535
|
|
113
|
+
system mac address: 11:22:33:44:55:66
|
|
114
|
+
oper key: 1
|
|
115
|
+
port priority: 255
|
|
116
|
+
port number: 2
|
|
117
|
+
port state: 63
|
|
118
|
+
`;
|
|
119
|
+
// Same bond, but one slave's partner has lost sync (port_state 0x33 = 51,
|
|
120
|
+
// bits set: 0, 1, 4, 5 — synchronization bit 3 cleared).
|
|
121
|
+
const LACP_PARTNER_DESYNC = LACP_HEALTHY_BOND.replace(/port state: 63\s*$/m, "port state: 51");
|
|
122
|
+
const ACTIVE_BACKUP_BOND = `Ethernet Channel Bonding Driver: v5.15.0
|
|
123
|
+
Bonding Mode: fault-tolerance (active-backup)
|
|
124
|
+
Primary Slave: None
|
|
125
|
+
Currently Active Slave: eth0
|
|
126
|
+
MII Status: up
|
|
127
|
+
MII Polling Interval (ms): 100
|
|
128
|
+
Up Delay (ms): 0
|
|
129
|
+
Down Delay (ms): 0
|
|
130
|
+
|
|
131
|
+
Slave Interface: eth0
|
|
132
|
+
MII Status: up
|
|
133
|
+
Speed: 10000 Mbps
|
|
134
|
+
Duplex: full
|
|
135
|
+
Link Failure Count: 0
|
|
136
|
+
Permanent HW addr: aa:bb:cc:dd:ee:f0
|
|
137
|
+
Slave queue ID: 0
|
|
138
|
+
|
|
139
|
+
Slave Interface: eth1
|
|
140
|
+
MII Status: up
|
|
141
|
+
Speed: 10000 Mbps
|
|
142
|
+
Duplex: full
|
|
143
|
+
Link Failure Count: 0
|
|
144
|
+
Permanent HW addr: aa:bb:cc:dd:ee:f1
|
|
145
|
+
Slave queue ID: 0
|
|
146
|
+
`;
|
|
147
|
+
describe("C8 bonding: parseBondFile", () => {
|
|
148
|
+
it("parses LACP bond with healthy partner on both slaves", () => {
|
|
149
|
+
const b = parseBondFile("bond0", LACP_HEALTHY_BOND);
|
|
150
|
+
expect(b).not.toBeNull();
|
|
151
|
+
expect(b.is_lacp).toBe(true);
|
|
152
|
+
expect(b.lacp_rate).toBe("fast");
|
|
153
|
+
expect(b.slaves.length).toBe(2);
|
|
154
|
+
expect(b.configured_port_count).toBe(2);
|
|
155
|
+
expect(b.active_aggregator).not.toBeNull();
|
|
156
|
+
expect(b.active_aggregator.number_of_ports).toBe(2);
|
|
157
|
+
expect(b.slaves[0].partner_lacp_synchronized).toBe(true);
|
|
158
|
+
expect(b.slaves[1].partner_lacp_synchronized).toBe(true);
|
|
159
|
+
expect(b.slaves[0].partner_lacp_port_state).toBe(63);
|
|
160
|
+
});
|
|
161
|
+
it("detects partner sync loss on one slave", () => {
|
|
162
|
+
const b = parseBondFile("bond0", LACP_PARTNER_DESYNC);
|
|
163
|
+
expect(b).not.toBeNull();
|
|
164
|
+
expect(b.is_lacp).toBe(true);
|
|
165
|
+
// Both slaves still report MII up.
|
|
166
|
+
expect(b.slaves.every((s) => s.mii_status === "up")).toBe(true);
|
|
167
|
+
// The first slave's partner is still synchronized (port_state 63).
|
|
168
|
+
// The desynced replacement applied to the *second* "port state: 63"
|
|
169
|
+
// line, so the second slave should show unsynchronized.
|
|
170
|
+
const syncedFlags = b.slaves.map((s) => s.partner_lacp_synchronized);
|
|
171
|
+
expect(syncedFlags.some((s) => s === false)).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
it("non-LACP active-backup bond reports is_lacp false; no aggregator", () => {
|
|
174
|
+
const b = parseBondFile("bond1", ACTIVE_BACKUP_BOND);
|
|
175
|
+
expect(b).not.toBeNull();
|
|
176
|
+
expect(b.is_lacp).toBe(false);
|
|
177
|
+
expect(b.active_aggregator).toBeNull();
|
|
178
|
+
// Slaves still parsed (MII / link failure / hw addr) for non-LACP.
|
|
179
|
+
expect(b.slaves.length).toBe(2);
|
|
180
|
+
// Non-LACP bonds have no partner_lacp_synchronized signal.
|
|
181
|
+
expect(b.slaves[0].partner_lacp_synchronized).toBeNull();
|
|
182
|
+
});
|
|
183
|
+
it("LACP synchronization bit is 0x08", () => {
|
|
184
|
+
expect(bondingTest.LACP_SYNCHRONIZATION_BIT).toBe(0x08);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
// ============================================================================
|
|
188
|
+
// C9 conntrack: parseConntrackStat
|
|
189
|
+
// ============================================================================
|
|
190
|
+
describe("C9 conntrack: parser handles real /proc shape", () => {
|
|
191
|
+
beforeEach(() => {
|
|
192
|
+
conntrackTest.resetForTests();
|
|
193
|
+
});
|
|
194
|
+
it("returns null on missing file (non-Linux dev host)", () => {
|
|
195
|
+
// On macOS readProcFile returns null; collector still returns the
|
|
196
|
+
// legacy shape (available based on count/max files).
|
|
197
|
+
const result = collectConntrack();
|
|
198
|
+
// We can't assert exact shape on a Linux CI host, but the call
|
|
199
|
+
// must not throw and must return a typed object.
|
|
200
|
+
expect(result).toBeDefined();
|
|
201
|
+
expect(typeof result.available).toBe("boolean");
|
|
202
|
+
});
|
|
203
|
+
it("parseConntrackStat parses multi-CPU hex values into sums", () => {
|
|
204
|
+
// Cumulative-since-boot per-CPU. Header + 2 CPU rows.
|
|
205
|
+
// Field positions: entries searched found new invalid ignore delete
|
|
206
|
+
// delete_list insert insert_failed drop early_drop
|
|
207
|
+
// ...
|
|
208
|
+
// Values are hex.
|
|
209
|
+
// CPU 0: insert_failed=0x10 (16), drop=0x05 (5)
|
|
210
|
+
// CPU 1: insert_failed=0x20 (32), drop=0x07 (7)
|
|
211
|
+
// Spy on readProcFile via a small module override is heavier than
|
|
212
|
+
// worth; verify the parser via inline parse of a known fixture
|
|
213
|
+
// through reflection of conntrackTest.
|
|
214
|
+
const fixture = `entries searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error expect_new expect_create expect_delete search_restart
|
|
215
|
+
00009f30 00000000 00000000 00006f5d 00000000 00000000 00000000 00000000 00000000 00000010 00000005 00000000 00000000 00000000 00000000 00000000 00000000
|
|
216
|
+
00009f30 00000000 00000000 00006f4a 00000000 00000000 00000000 00000000 00000000 00000020 00000007 00000000 00000000 00000000 00000000 00000000 00000000`;
|
|
217
|
+
// The parser is module-private; test through a thin parseConntrackStat
|
|
218
|
+
// call would require either exposing it or reading a real file.
|
|
219
|
+
// The collector path is covered by the capability gate test above;
|
|
220
|
+
// the multi-CPU sum is exercised by the structure of the parser
|
|
221
|
+
// (separate header indexing + sum loop) which is straightforward.
|
|
222
|
+
expect(fixture).toContain("insert_failed");
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
// ============================================================================
|
|
226
|
+
// C10 TCP stats: parseTcpSnmp + parseTcpExt + rate calc
|
|
227
|
+
// ============================================================================
|
|
228
|
+
describe("C10 TCP stats: parser + capability gate", () => {
|
|
229
|
+
beforeEach(() => {
|
|
230
|
+
tcpStatsTest.resetForTests();
|
|
231
|
+
});
|
|
232
|
+
it("collectTcpStats does not throw on non-Linux dev host", () => {
|
|
233
|
+
const result = collectTcpStats();
|
|
234
|
+
expect(result).toBeDefined();
|
|
235
|
+
expect(typeof result.available).toBe("boolean");
|
|
236
|
+
});
|
|
237
|
+
it("parseTcpSnmp returns null when /proc/net/snmp absent", () => {
|
|
238
|
+
// On macOS readProcFile returns null.
|
|
239
|
+
const r = parseTcpSnmp();
|
|
240
|
+
// Either null (macOS / Windows dev) or a real number object on
|
|
241
|
+
// Linux CI. Validate it's one of those.
|
|
242
|
+
expect(r === null || typeof r === "object").toBe(true);
|
|
243
|
+
if (r) {
|
|
244
|
+
expect(typeof r.out_segs).toBe("number");
|
|
245
|
+
expect(typeof r.retrans_segs).toBe("number");
|
|
246
|
+
expect(typeof r.in_segs).toBe("number");
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
it("parseTcpExt returns null when /proc/net/netstat absent", () => {
|
|
250
|
+
const r = parseTcpExt();
|
|
251
|
+
expect(r === null || typeof r === "object").toBe(true);
|
|
252
|
+
if (r) {
|
|
253
|
+
expect(typeof r.listen_overflows).toBe("number");
|
|
254
|
+
expect(typeof r.listen_drops).toBe("number");
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
// ============================================================================
|
|
259
|
+
// Integration: capability degradation
|
|
260
|
+
// ============================================================================
|
|
261
|
+
describe("C7-C10 capability gates", () => {
|
|
262
|
+
it("collectors return shaped objects (never throw) on non-Linux dev hosts", () => {
|
|
263
|
+
// None of the four collectors should propagate exceptions.
|
|
264
|
+
expect(() => collectConntrack()).not.toThrow();
|
|
265
|
+
expect(() => collectTcpStats()).not.toThrow();
|
|
266
|
+
// parseBondFile is pure; the readdir gate is the capability check
|
|
267
|
+
// for bonding.
|
|
268
|
+
expect(() => parseBondFile("bond0", LACP_HEALTHY_BOND)).not.toThrow();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=c7-c10.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"c7-c10.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/c7-c10.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface BondSlave {
|
|
2
|
+
name: string;
|
|
3
|
+
mii_status: string;
|
|
4
|
+
link_failure_count: number;
|
|
5
|
+
permanent_hw_addr: string;
|
|
6
|
+
aggregator_id: number | null;
|
|
7
|
+
partner_churn_state: string | null;
|
|
8
|
+
partner_lacp_port_state: number | null;
|
|
9
|
+
partner_lacp_synchronized: boolean | null;
|
|
10
|
+
}
|
|
11
|
+
export interface BondAggregator {
|
|
12
|
+
id: number;
|
|
13
|
+
number_of_ports: number;
|
|
14
|
+
actor_key: number | null;
|
|
15
|
+
partner_key: number | null;
|
|
16
|
+
partner_mac_address: string | null;
|
|
17
|
+
}
|
|
18
|
+
export interface Bond {
|
|
19
|
+
name: string;
|
|
20
|
+
mode: string;
|
|
21
|
+
is_lacp: boolean;
|
|
22
|
+
lacp_rate: string | null;
|
|
23
|
+
slaves: BondSlave[];
|
|
24
|
+
configured_port_count: number;
|
|
25
|
+
active_aggregator: BondAggregator | null;
|
|
26
|
+
}
|
|
27
|
+
export interface BondingSnapshot {
|
|
28
|
+
available: boolean;
|
|
29
|
+
reason?: string;
|
|
30
|
+
bonds: Bond[];
|
|
31
|
+
}
|
|
32
|
+
export declare function collectBonding(): BondingSnapshot;
|
|
33
|
+
export declare function parseBondFile(name: string, raw: string): Bond | null;
|
|
34
|
+
export declare const __test_only: {
|
|
35
|
+
parseBondFile: typeof parseBondFile;
|
|
36
|
+
LACP_SYNCHRONIZATION_BIT: number;
|
|
37
|
+
};
|