code wiki / _hdl_build / nx_apm_dashboard_gate.nx
nx_apm_dashboard_gate.nx source
↩ module page · 108 lines · 5977 B
1// nx_apm_dashboard_gate.nx -- SOVEREIGN gate for the APM dashboard renderer (seg-store edition, NO tsv).
2// Writes synthetic seg-store records (one GREEN daemon, one RED daemon w/ timeouts, one ARTIFACT daemon
3// w/ slowclose>0 but fast ttfb) to an ISOLATED test store, runs nx_apm_dashboard on it, proves the HTML:
4// T1 all daemons rendered as cards
5// T2 DETECTION -- the RED daemon appears in Incidents (<b>name</b>)
6// T3 NEG-CONTROL -- the GREEN daemon is NOT in Incidents
7// T4 LIAR-KILL -- the ARTIFACT daemon (fast ttfb, slow close) is NOT in Incidents
8// T5 the ARTIFACT daemon shows its slowclose info badge
9// Requires /tmp/nx_apm_dashboard.sov.elf built first. license_tier: ORIGINAL
10import "nx_syscalls.nx"
11import "nx_apm_dashboard.nx" // ad_bs / ad_bn / ad_slen / ad_read_small
12import "nx_gate_verdict.nx"
13
14const GD_ELF: *u8 = "/tmp/nx_apm_dashboard.sov.elf"
15const GD_STORE: *u8 = "/tmp/ad_store"
16const GD_HTML: *u8 = "/tmp/ad_test.html"
17
18func gd_uw(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
19func gd_wn(v: i64) -> i64 { let b: *u8 = sys_mmap(24); let e: i64 = ad_bn(b, 0, v); sys_write(1, b, e); return 0 }
20func gd_contains(hay: *u8, hayn: i64, needle: *u8) -> i64 {
21 let nn: i64 = ad_slen(needle); if nn == 0 { return 1 }
22 var i: i64 = 0
23 while i + nn <= hayn {
24 var j: i64 = 0; var ok: i64 = 1
25 while j < nn { if hay[i+j] != needle[j] { ok = 0; j = nn } else { j = j + 1 } }
26 if ok == 1 { return 1 }
27 i = i + 1
28 }
29 return 0
30}
31// write one synthetic seg-store record /tmp/ad_store/apm-<label> (key:value, NO tsv)
32func gd_rec(label: *u8, port: i64, conc: i64, oks: i64, p50: i64, mx: i64, to: i64, slow: i64) -> i64 {
33 let p: *u8 = sys_mmap(256); var po: i64 = ad_bs(p, 0, "/tmp/ad_store/apm-" as *u8); po = ad_bs(p, po, label); p[po]=0 as u8
34 let r: *u8 = sys_mmap(1024); var o: i64 = 0
35 o=ad_bs(r,o,"label=" as *u8); o=ad_bs(r,o,label); r[o]=10 as u8; o=o+1
36 o=ad_bs(r,o,"epoch=100\n" as *u8)
37 o=ad_bs(r,o,"port=" as *u8); o=ad_bn(r,o,port); r[o]=10 as u8; o=o+1
38 o=ad_bs(r,o,"conc=" as *u8); o=ad_bn(r,o,conc); r[o]=10 as u8; o=o+1
39 o=ad_bs(r,o,"oks=" as *u8); o=ad_bn(r,o,oks); r[o]=10 as u8; o=o+1
40 o=ad_bs(r,o,"ttfb_p50=" as *u8); o=ad_bn(r,o,p50); r[o]=10 as u8; o=o+1
41 o=ad_bs(r,o,"ttfb_max=" as *u8); o=ad_bn(r,o,mx); r[o]=10 as u8; o=o+1
42 o=ad_bs(r,o,"stalls=0\n" as *u8)
43 o=ad_bs(r,o,"timeouts=" as *u8); o=ad_bn(r,o,to); r[o]=10 as u8; o=o+1
44 o=ad_bs(r,o,"downs=0\n" as *u8)
45 o=ad_bs(r,o,"slowclose=" as *u8); o=ad_bn(r,o,slow); r[o]=10 as u8; o=o+1
46 let fd: i64 = sys_openat_wr(p, 0x1a4); if fd>=0 { sys_write(fd, r, o); sys_close(fd) }
47 return 0
48}
49
50func main(argc: i64, argv: *i64) -> i64 {
51 var pass: i64 = 0; var total: i64 = 0
52
53 sys_mkdir(GD_STORE, 0x1ff)
54 gd_rec("dmn-green" as *u8, 8001, 8, 8, 1, 2, 0, 0) // healthy
55 gd_rec("dmn-red" as *u8, 8002, 8, 7, 1, 5000, 1, 0) // RED: a timeout
56 gd_rec("dmn-arti" as *u8, 8003, 4, 4, 0, 1, 0, 4) // artifact: fast ttfb + slowclose
57 let ib: *u8 = sys_mmap(128); var io: i64 = ad_bs(ib, 0, "dmn-green\ndmn-red\ndmn-arti\n" as *u8)
58 let ifd: i64 = sys_openat_wr("/tmp/ad_store/apm-ids" as *u8, 0x1a4); if ifd >= 0 { sys_write(ifd, ib, io); sys_close(ifd) }
59
60 let pid: i64 = sys_fork()
61 if pid == 0 {
62 let av: *i64 = sys_mmap(8*4) as *i64
63 av[0] = GD_ELF as i64; av[1] = GD_STORE as i64; av[2] = GD_HTML as i64; av[3] = 0
64 let ev: *i64 = sys_mmap(8) as *i64; ev[0] = 0
65 sys_execve(GD_ELF, av, ev); sys_exit(127)
66 }
67 let rp: *i64 = sys_mmap(16) as *i64; sys_wait4(pid, rp, 0)
68
69 let hb: *u8 = sys_mmap(1048576); let hn: i64 = ad_read_small(GD_HTML, hb, 1048576)
70 if hn <= 0 { gd_uw("[FAIL] dashboard produced no HTML (build /tmp/nx_apm_dashboard.sov.elf first)\n" as *u8); gd_uw("=== nx_apm_dashboard_gate 0/5 verdict=RED\n" as *u8); return 1 }
71
72 total = total + 1
73 var t1: i64 = 0
74 if gd_contains(hb, hn, "dmn-green" as *u8) == 1 { if gd_contains(hb, hn, "dmn-red" as *u8) == 1 { if gd_contains(hb, hn, "dmn-arti" as *u8) == 1 { t1 = 1 } } }
75 if t1 == 1 { pass = pass + 1; gd_uw("[PASS] " as *u8) } else { gd_uw("[FAIL] " as *u8) }
76 gd_uw("T1 all 3 daemons rendered as cards\n" as *u8)
77
78 total = total + 1
79 let t2: i64 = gd_contains(hb, hn, "<b>dmn-red</b>" as *u8)
80 if t2 == 1 { pass = pass + 1; gd_uw("[PASS] " as *u8) } else { gd_uw("[FAIL] " as *u8) }
81 gd_uw("T2 RED daemon listed in Incidents\n" as *u8)
82
83 total = total + 1
84 let t3: i64 = gd_contains(hb, hn, "<b>dmn-green</b>" as *u8)
85 if t3 == 0 { pass = pass + 1; gd_uw("[PASS] " as *u8) } else { gd_uw("[FAIL] " as *u8) }
86 gd_uw("T3 GREEN daemon NOT in Incidents (neg-control)\n" as *u8)
87
88 total = total + 1
89 let t4: i64 = gd_contains(hb, hn, "<b>dmn-arti</b>" as *u8)
90 if t4 == 0 { pass = pass + 1; gd_uw("[PASS] " as *u8) } else { gd_uw("[FAIL] " as *u8) }
91 gd_uw("T4 ARTIFACT daemon NOT in Incidents (slowclose != wedge = liar-kill)\n" as *u8)
92
93 total = total + 1
94 let t5: i64 = gd_contains(hb, hn, "slowclose 4" as *u8)
95 if t5 == 1 { pass = pass + 1; gd_uw("[PASS] " as *u8) } else { gd_uw("[FAIL] " as *u8) }
96 gd_uw("T5 ARTIFACT slowclose badge rendered\n" as *u8)
97
98 gd_uw("=== nx_apm_dashboard_gate " as *u8); gd_wn(pass); gd_uw("/" as *u8); gd_wn(total)
99 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
100 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
101 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
102 let ctr__dry: *i64 = gv_ctr()
103 ctr__dry[0] = pass
104 ctr__dry[1] = total
105 let rc__dry: i64 = gv_verdict("APM-DASHBOARD-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
106 sys_exit(rc__dry)
107 return rc__dry
108}