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}