4runr-os 2.10.39 → 2.10.41
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/apps/gateway/dist/apps/gateway/src/index.js +14 -4
- package/apps/gateway/dist/apps/gateway/src/index.js.map +1 -1
- package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.d.ts +18 -0
- package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.d.ts.map +1 -0
- package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.js +117 -0
- package/apps/gateway/dist/apps/gateway/src/metrics/monitoring-detail.js.map +1 -0
- package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.d.ts +2 -0
- package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.d.ts.map +1 -0
- package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.js +54 -0
- package/apps/gateway/dist/apps/gateway/src/middleware/log-capture.js.map +1 -0
- package/apps/gateway/dist/apps/gateway/src/routes/monitoring.d.ts +15 -0
- package/apps/gateway/dist/apps/gateway/src/routes/monitoring.d.ts.map +1 -0
- package/apps/gateway/dist/apps/gateway/src/routes/monitoring.js +164 -0
- package/apps/gateway/dist/apps/gateway/src/routes/monitoring.js.map +1 -0
- package/apps/gateway/package-lock.json +204 -353
- package/apps/gateway/src/index.ts +27 -8
- package/apps/gateway/src/metrics/monitoring-detail.ts +162 -0
- package/apps/gateway/src/middleware/log-capture.ts +70 -0
- package/apps/gateway/src/routes/monitoring.ts +298 -0
- package/dist/gateway-client.d.ts +2 -0
- package/dist/gateway-client.d.ts.map +1 -1
- package/dist/gateway-client.js +22 -0
- package/dist/gateway-client.js.map +1 -1
- package/dist/tui-handlers.js +498 -0
- package/dist/tui-handlers.js.map +1 -1
- package/mk3-tui/src/app/render_scheduler.rs +111 -112
- package/mk3-tui/src/app.rs +1078 -295
- package/mk3-tui/src/debug_log.rs +131 -124
- package/mk3-tui/src/io/mod.rs +63 -66
- package/mk3-tui/src/io/protocol.rs +14 -15
- package/mk3-tui/src/io/stdio.rs +31 -32
- package/mk3-tui/src/io/ws.rs +25 -32
- package/mk3-tui/src/main.rs +774 -212
- package/mk3-tui/src/monitoring/mod.rs +428 -0
- package/mk3-tui/src/screens/mod.rs +53 -39
- package/mk3-tui/src/storage/cache.rs +221 -224
- package/mk3-tui/src/storage/mod.rs +5 -6
- package/mk3-tui/src/ui/agent_builder.rs +1148 -922
- package/mk3-tui/src/ui/agent_list.rs +344 -295
- package/mk3-tui/src/ui/boot.rs +145 -148
- package/mk3-tui/src/ui/connection_portal.rs +121 -98
- package/mk3-tui/src/ui/help.rs +340 -284
- package/mk3-tui/src/ui/layout.rs +966 -803
- package/mk3-tui/src/ui/mod.rs +1 -1
- package/mk3-tui/src/ui/portal_monitoring.rs +1027 -147
- package/mk3-tui/src/ui/run_manager.rs +784 -764
- package/mk3-tui/src/ui/safe_viewport.rs +236 -235
- package/mk3-tui/src/ui/settings.rs +414 -362
- package/mk3-tui/src/ui/setup_portal.rs +158 -101
- package/mk3-tui/src/websocket.rs +315 -308
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"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"}
|
package/dist/tui-handlers.js
CHANGED
|
@@ -132,6 +132,9 @@ async function routeCommand(ctx) {
|
|
|
132
132
|
case 'setup':
|
|
133
133
|
await handleSetupCommand(ctx, action);
|
|
134
134
|
break;
|
|
135
|
+
case 'monitoring':
|
|
136
|
+
await handleMonitoringCommand(ctx, action);
|
|
137
|
+
break;
|
|
135
138
|
default:
|
|
136
139
|
ctx.server.sendError(ctx.ws, ctx.id, `Unknown command category: ${category}`);
|
|
137
140
|
}
|
|
@@ -400,10 +403,146 @@ async function handleSystemCommand(ctx, action) {
|
|
|
400
403
|
case 'status':
|
|
401
404
|
await handleSystemStatus(ctx);
|
|
402
405
|
break;
|
|
406
|
+
case 'stats':
|
|
407
|
+
await handleSystemStats(ctx);
|
|
408
|
+
break;
|
|
403
409
|
default:
|
|
404
410
|
ctx.server.sendError(ctx.ws, ctx.id, `Unknown system action: ${action}`);
|
|
405
411
|
}
|
|
406
412
|
}
|
|
413
|
+
function formatBytes(n) {
|
|
414
|
+
if (!Number.isFinite(n) || n < 0)
|
|
415
|
+
return '?';
|
|
416
|
+
const units = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
417
|
+
let v = n;
|
|
418
|
+
let i = 0;
|
|
419
|
+
while (v >= 1024 && i < units.length - 1) {
|
|
420
|
+
v /= 1024;
|
|
421
|
+
i += 1;
|
|
422
|
+
}
|
|
423
|
+
return `${v.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;
|
|
424
|
+
}
|
|
425
|
+
function formatDuration(seconds) {
|
|
426
|
+
const s = Math.max(0, Math.floor(seconds));
|
|
427
|
+
const d = Math.floor(s / 86400);
|
|
428
|
+
const h = Math.floor((s % 86400) / 3600);
|
|
429
|
+
const m = Math.floor((s % 3600) / 60);
|
|
430
|
+
const sec = s % 60;
|
|
431
|
+
const parts = [];
|
|
432
|
+
if (d)
|
|
433
|
+
parts.push(`${d}d`);
|
|
434
|
+
if (h)
|
|
435
|
+
parts.push(`${h}h`);
|
|
436
|
+
if (m)
|
|
437
|
+
parts.push(`${m}m`);
|
|
438
|
+
if (sec || parts.length === 0)
|
|
439
|
+
parts.push(`${sec}s`);
|
|
440
|
+
return parts.join(' ');
|
|
441
|
+
}
|
|
442
|
+
async function collectSystemStats(ctx, runDiagnostics = false) {
|
|
443
|
+
const mem = process.memoryUsage();
|
|
444
|
+
const cpu = process.cpuUsage();
|
|
445
|
+
const cpus = os.cpus();
|
|
446
|
+
const freeMem = os.freemem();
|
|
447
|
+
const totalMem = os.totalmem();
|
|
448
|
+
const gc = effectiveGatewayClient(ctx);
|
|
449
|
+
const raw = {
|
|
450
|
+
cli: {
|
|
451
|
+
pid: process.pid,
|
|
452
|
+
platform: process.platform,
|
|
453
|
+
node: process.version,
|
|
454
|
+
uptimeSeconds: Math.floor(process.uptime()),
|
|
455
|
+
memory: mem,
|
|
456
|
+
cpuSeconds: {
|
|
457
|
+
user: Number((cpu.user / 1_000_000).toFixed(2)),
|
|
458
|
+
system: Number((cpu.system / 1_000_000).toFixed(2)),
|
|
459
|
+
},
|
|
460
|
+
websocket: {
|
|
461
|
+
port: ctx.server.getListenPort(),
|
|
462
|
+
clients: ctx.server.getClientCount(),
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
host: {
|
|
466
|
+
type: os.type(),
|
|
467
|
+
release: os.release(),
|
|
468
|
+
arch: os.arch(),
|
|
469
|
+
cpuModel: cpus[0]?.model ?? 'unknown',
|
|
470
|
+
cpuCores: cpus.length,
|
|
471
|
+
loadAverage: os.loadavg(),
|
|
472
|
+
totalMemoryBytes: totalMem,
|
|
473
|
+
freeMemoryBytes: freeMem,
|
|
474
|
+
},
|
|
475
|
+
gateway: {
|
|
476
|
+
connected: gc !== null,
|
|
477
|
+
url: process.env.GATEWAY_URL || null,
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
const lines = [
|
|
481
|
+
'── System stats (CLI host + TUI bridge) ──',
|
|
482
|
+
`timestamp: ${new Date().toISOString()}`,
|
|
483
|
+
'',
|
|
484
|
+
'OS CLI process',
|
|
485
|
+
` pid=${process.pid} node=${process.version} uptime=${formatDuration(process.uptime())}`,
|
|
486
|
+
` memory: rss=${formatBytes(mem.rss)} heap=${formatBytes(mem.heapUsed)}/${formatBytes(mem.heapTotal)} external=${formatBytes(mem.external)}`,
|
|
487
|
+
` cpu time: user=${(cpu.user / 1_000_000).toFixed(2)}s system=${(cpu.system / 1_000_000).toFixed(2)}s`,
|
|
488
|
+
` TUI WebSocket: port=${ctx.server.getListenPort()} clients=${ctx.server.getClientCount()}`,
|
|
489
|
+
'',
|
|
490
|
+
'Host',
|
|
491
|
+
` ${os.type()} ${os.release()} ${os.arch()} cores=${cpus.length}`,
|
|
492
|
+
` cpu: ${cpus[0]?.model ?? 'unknown'}`,
|
|
493
|
+
` memory: free=${formatBytes(freeMem)} / total=${formatBytes(totalMem)} (${(((totalMem - freeMem) / Math.max(totalMem, 1)) * 100).toFixed(1)}% used)`,
|
|
494
|
+
` loadavg: ${os.loadavg().map((x) => x.toFixed(2)).join(', ')} (0.00 on Windows is expected)`,
|
|
495
|
+
' disk: unavailable via Node stdlib (Phase 4 keeps this honest; add native probe later if needed)',
|
|
496
|
+
'',
|
|
497
|
+
'Gateway link',
|
|
498
|
+
` connected=${gc !== null ? 'yes' : 'no'} url=${process.env.GATEWAY_URL || '(none)'}`,
|
|
499
|
+
];
|
|
500
|
+
if (runDiagnostics) {
|
|
501
|
+
lines.push('');
|
|
502
|
+
lines.push('Diagnostics');
|
|
503
|
+
if (!gc) {
|
|
504
|
+
lines.push(' Gateway verify: skipped (not connected)');
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
try {
|
|
508
|
+
const v = await gc.verify({ readyTimeoutMs: 8000 });
|
|
509
|
+
raw.gateway = {
|
|
510
|
+
...raw.gateway,
|
|
511
|
+
verifyOk: v.ok,
|
|
512
|
+
healthLatencyMs: v.healthLatencyMs,
|
|
513
|
+
readyLatencyMs: v.readyLatencyMs,
|
|
514
|
+
};
|
|
515
|
+
lines.push(` Gateway verify: ${v.ok ? 'ok' : 'degraded'} /health=${v.healthLatencyMs ?? '?'}ms /ready=${v.readyLatencyMs ?? '?'}ms`);
|
|
516
|
+
}
|
|
517
|
+
catch (e) {
|
|
518
|
+
raw.gateway = {
|
|
519
|
+
...raw.gateway,
|
|
520
|
+
verifyError: errorMessage(e),
|
|
521
|
+
};
|
|
522
|
+
lines.push(` Gateway verify: failed — ${errorMessage(e)}`);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
return {
|
|
527
|
+
systemStats: true,
|
|
528
|
+
timestamp: new Date().toISOString(),
|
|
529
|
+
lines,
|
|
530
|
+
raw,
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
async function handleSystemStats(ctx) {
|
|
534
|
+
try {
|
|
535
|
+
const diagnostics = ctx.data?.diagnostics === true;
|
|
536
|
+
const stats = await collectSystemStats(ctx, diagnostics);
|
|
537
|
+
ctx.server.sendResponse(ctx.ws, ctx.id, {
|
|
538
|
+
success: true,
|
|
539
|
+
data: stats,
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
catch (e) {
|
|
543
|
+
ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
|
|
544
|
+
}
|
|
545
|
+
}
|
|
407
546
|
async function handleSystemStatus(ctx) {
|
|
408
547
|
// Determine actual mode based on gateway connection
|
|
409
548
|
let mode;
|
|
@@ -668,6 +807,7 @@ async function handleGatewayCommand(ctx, action) {
|
|
|
668
807
|
}
|
|
669
808
|
}
|
|
670
809
|
function observabilityHealthLines(v) {
|
|
810
|
+
// First line must stay substring-compatible with mk3-tui `SNAPSHOT_MARKER_LIVE` ("Live link check").
|
|
671
811
|
const lines = ['Live link check (/health + /ready)'];
|
|
672
812
|
if (!v.ok) {
|
|
673
813
|
lines.push(`Verify failed: ${v.error ?? 'unknown'} (${v.healthLatencyMs} ms)`);
|
|
@@ -733,6 +873,364 @@ function observabilityHealthLines(v) {
|
|
|
733
873
|
}
|
|
734
874
|
return lines;
|
|
735
875
|
}
|
|
876
|
+
/** Lines before `Dependency checks (from /ready):` — Portal Monitoring “Health” section. */
|
|
877
|
+
function sliceHealthMainLines(full) {
|
|
878
|
+
const i = full.findIndex((l) => l.includes('Dependency checks (from /ready)'));
|
|
879
|
+
if (i === -1)
|
|
880
|
+
return full;
|
|
881
|
+
return full.slice(0, i);
|
|
882
|
+
}
|
|
883
|
+
/** Dependency block only — Portal Monitoring “Dependencies” section. */
|
|
884
|
+
function sliceDependencyLines(full) {
|
|
885
|
+
const i = full.findIndex((l) => l.includes('Dependency checks (from /ready)'));
|
|
886
|
+
if (i === -1)
|
|
887
|
+
return [];
|
|
888
|
+
return full.slice(i);
|
|
889
|
+
}
|
|
890
|
+
function formatMetricsRefreshBlock(snap) {
|
|
891
|
+
const statsNoQueue = snap.statsLines.filter((l) => !l.includes('Queue jobs'));
|
|
892
|
+
const out = [
|
|
893
|
+
'Prometheus /metrics (HTTP total includes this screen’s /health, /ready, and /metrics polls; add API/agent traffic for runs/queue/SSE).',
|
|
894
|
+
'',
|
|
895
|
+
...statsNoQueue,
|
|
896
|
+
'',
|
|
897
|
+
'Top HTTP routes (from http_requests_total labels)',
|
|
898
|
+
];
|
|
899
|
+
if (snap.routeLines.length > 0) {
|
|
900
|
+
out.push(' (method route) count');
|
|
901
|
+
for (const r of snap.routeLines) {
|
|
902
|
+
out.push(` ${r}`);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
else {
|
|
906
|
+
out.push(' (no labeled requests yet — exercise the Gateway to populate.)');
|
|
907
|
+
}
|
|
908
|
+
return out;
|
|
909
|
+
}
|
|
910
|
+
function formatQueueFromPrometheusSnap(snap) {
|
|
911
|
+
return snap.statsLines.filter((l) => l.includes('Queue jobs'));
|
|
912
|
+
}
|
|
913
|
+
function linesFromQueueMetricsApi(data) {
|
|
914
|
+
if (!data || typeof data !== 'object') {
|
|
915
|
+
return ['(invalid queue response)'];
|
|
916
|
+
}
|
|
917
|
+
const o = data;
|
|
918
|
+
if (o.available === false) {
|
|
919
|
+
return [String(o.message ?? o.error ?? 'Queue unavailable')];
|
|
920
|
+
}
|
|
921
|
+
const jobs = o.jobs;
|
|
922
|
+
if (!jobs) {
|
|
923
|
+
return [JSON.stringify(data)];
|
|
924
|
+
}
|
|
925
|
+
const qn = typeof o.queueName === 'string' ? o.queueName : 'run-execution';
|
|
926
|
+
return [
|
|
927
|
+
`queue: ${qn}`,
|
|
928
|
+
`Queue jobs waiting ${jobs['waiting'] ?? 0}`,
|
|
929
|
+
`Queue jobs active ${jobs['active'] ?? 0}`,
|
|
930
|
+
`Queue jobs completed ${jobs['completed'] ?? 0}`,
|
|
931
|
+
`Queue jobs failed ${jobs['failed'] ?? 0}`,
|
|
932
|
+
`delayed: ${jobs['delayed'] ?? 0}`,
|
|
933
|
+
`paused: ${jobs['paused'] ?? 0}`,
|
|
934
|
+
];
|
|
935
|
+
}
|
|
936
|
+
/** Phase 3: format JSON from `GET /api/monitoring/dependencies/detail` for TUI lines. */
|
|
937
|
+
function linesFromDependenciesDetailApi(data) {
|
|
938
|
+
if (!data || typeof data !== 'object') {
|
|
939
|
+
return ['(invalid dependencies detail)'];
|
|
940
|
+
}
|
|
941
|
+
const o = data;
|
|
942
|
+
const details = o.details;
|
|
943
|
+
if (!details) {
|
|
944
|
+
return ['(no details object in response)'];
|
|
945
|
+
}
|
|
946
|
+
const lines = ['── Dependencies (detail) ──'];
|
|
947
|
+
const ts = typeof o.timestamp === 'string' ? o.timestamp : '';
|
|
948
|
+
if (ts) {
|
|
949
|
+
lines.push(`Fetched: ${ts}`);
|
|
950
|
+
}
|
|
951
|
+
const telemetry = o.telemetry;
|
|
952
|
+
if (telemetry?.bestEffort === true) {
|
|
953
|
+
lines.push(`Telemetry: best effort (${String(telemetry.source ?? 'unknown source')})`);
|
|
954
|
+
if (typeof telemetry.note === 'string') {
|
|
955
|
+
lines.push(` ${telemetry.note}`);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
lines.push('');
|
|
959
|
+
const db = details.database;
|
|
960
|
+
if (db && typeof db === 'object') {
|
|
961
|
+
const pool = db.pool;
|
|
962
|
+
lines.push(`database: status=${db.status ?? '?'}${db.latency !== undefined ? ` latency=${db.latency}ms` : ''}`);
|
|
963
|
+
if (pool) {
|
|
964
|
+
const tel = db.telemetry;
|
|
965
|
+
lines.push(` pool (best-effort gauge): active=${pool.active ?? '?'} idle=${pool.idle ?? '?'}`);
|
|
966
|
+
if (tel?.bestEffort === true) {
|
|
967
|
+
lines.push(' note: zeros may mean gauge instrumentation is idle, not that Postgres is down.');
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
const redis = details.redis;
|
|
972
|
+
if (redis && typeof redis === 'object') {
|
|
973
|
+
const conn = redis.connections;
|
|
974
|
+
lines.push(`redis: status=${redis.status ?? '?'}${redis.latency !== undefined ? ` latency=${redis.latency}ms` : ''}`);
|
|
975
|
+
if (conn) {
|
|
976
|
+
lines.push(` connections.active (best-effort gauge): ${conn.active ?? '?'}`);
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
const queue = details.queue;
|
|
980
|
+
if (queue && typeof queue === 'object') {
|
|
981
|
+
lines.push(`queue: status=${queue.status ?? '?'}`);
|
|
982
|
+
const jobs = queue.jobs;
|
|
983
|
+
if (jobs) {
|
|
984
|
+
lines.push(` waiting=${jobs['waiting'] ?? 0} active=${jobs['active'] ?? 0} completed=${jobs['completed'] ?? 0} failed=${jobs['failed'] ?? 0} delayed=${jobs['delayed'] ?? 0}`);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
return lines;
|
|
988
|
+
}
|
|
989
|
+
/** Phase 3: drill-down lines for `monitoring.drill` WebSocket command. */
|
|
990
|
+
function formatMonitoringDrillLines(target, data) {
|
|
991
|
+
if (!data || typeof data !== 'object') {
|
|
992
|
+
return ['(invalid drill response)'];
|
|
993
|
+
}
|
|
994
|
+
const o = data;
|
|
995
|
+
switch (target) {
|
|
996
|
+
case 'metrics_http': {
|
|
997
|
+
const lines = ['── HTTP metrics (Gateway prom-client) ──'];
|
|
998
|
+
const summary = o.summary;
|
|
999
|
+
if (summary) {
|
|
1000
|
+
lines.push(`Requests: ${String(summary.totalRequests ?? '?')} HTTP errors: ${String(summary.totalErrors ?? '?')} error rate: ${String(summary.errorRate ?? '?')}`);
|
|
1001
|
+
}
|
|
1002
|
+
lines.push('');
|
|
1003
|
+
lines.push('Top routes (method route status → count)');
|
|
1004
|
+
const top = o.topRoutes;
|
|
1005
|
+
if (top?.length) {
|
|
1006
|
+
for (const r of top.slice(0, 22)) {
|
|
1007
|
+
lines.push(` ${String(r.method ?? '')} ${String(r.route ?? '')} ${String(r.status_code ?? '')} → ${String(r.count ?? '')}`);
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
else {
|
|
1011
|
+
lines.push(' (no labeled http_requests_total samples yet)');
|
|
1012
|
+
}
|
|
1013
|
+
const errs = o.errorsByRoute;
|
|
1014
|
+
if (errs?.some((e) => Number(e.count) > 0)) {
|
|
1015
|
+
lines.push('');
|
|
1016
|
+
lines.push('http_request_errors_total (by route)');
|
|
1017
|
+
for (const e of errs.slice(0, 14)) {
|
|
1018
|
+
if (Number(e.count) > 0) {
|
|
1019
|
+
lines.push(` ${String(e.method ?? '')} ${String(e.route ?? '')} [${String(e.error_type ?? '')}] → ${String(e.count ?? '')}`);
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
return lines;
|
|
1024
|
+
}
|
|
1025
|
+
case 'metrics_runs': {
|
|
1026
|
+
const lines = ['── Run metrics (prom-client) ──'];
|
|
1027
|
+
const summary = o.summary;
|
|
1028
|
+
if (summary) {
|
|
1029
|
+
lines.push(`created=${String(summary.created ?? '?')} started=${String(summary.started ?? '?')} completed=${String(summary.completed ?? '?')} failed=${String(summary.failed ?? '?')} active (gauge)=${String(summary.active ?? '?')}`);
|
|
1030
|
+
}
|
|
1031
|
+
const failedLabels = o.failedStatusLabels;
|
|
1032
|
+
if (failedLabels?.length) {
|
|
1033
|
+
lines.push(`failed label values: ${failedLabels.map((x) => String(x)).join(', ')}`);
|
|
1034
|
+
}
|
|
1035
|
+
else {
|
|
1036
|
+
lines.push('failed label values: none observed');
|
|
1037
|
+
}
|
|
1038
|
+
const byStatus = o.byStatus;
|
|
1039
|
+
if (byStatus?.length) {
|
|
1040
|
+
lines.push('');
|
|
1041
|
+
lines.push('runs_completed_total by status label');
|
|
1042
|
+
for (const row of byStatus) {
|
|
1043
|
+
lines.push(` ${String(row.status ?? '')} → ${String(row.count ?? '')}`);
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
return lines;
|
|
1047
|
+
}
|
|
1048
|
+
case 'metrics_queue':
|
|
1049
|
+
return linesFromQueueMetricsApi(data);
|
|
1050
|
+
case 'metrics_sse': {
|
|
1051
|
+
const lines = ['── SSE metrics (prom-client) ──'];
|
|
1052
|
+
const summary = o.summary;
|
|
1053
|
+
if (summary) {
|
|
1054
|
+
lines.push(`opened=${String(summary.connectionsOpened ?? '?')} closed=${String(summary.connectionsClosed ?? '?')} active (gauge)=${String(summary.activeConnections ?? '?')} messages=${String(summary.messagesSent ?? '?')}`);
|
|
1055
|
+
}
|
|
1056
|
+
return lines;
|
|
1057
|
+
}
|
|
1058
|
+
case 'dependencies_detail':
|
|
1059
|
+
return linesFromDependenciesDetailApi(data);
|
|
1060
|
+
default:
|
|
1061
|
+
return [JSON.stringify(data)];
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
/**
|
|
1065
|
+
* Phase 2 Portal Monitoring: targeted Gateway calls (`monitoring.refresh`, `monitoring.logs`).
|
|
1066
|
+
*/
|
|
1067
|
+
async function handleMonitoringCommand(ctx, action) {
|
|
1068
|
+
const gc = effectiveGatewayClient(ctx);
|
|
1069
|
+
if (action === 'logs') {
|
|
1070
|
+
if (!gc) {
|
|
1071
|
+
ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
|
|
1072
|
+
return;
|
|
1073
|
+
}
|
|
1074
|
+
const limit = typeof ctx.data?.limit === 'number' ? Math.min(ctx.data.limit, 1000) : 100;
|
|
1075
|
+
const level = typeof ctx.data?.level === 'string' && ctx.data.level.length > 0 ? ctx.data.level : undefined;
|
|
1076
|
+
try {
|
|
1077
|
+
const params = new URLSearchParams();
|
|
1078
|
+
params.set('limit', String(limit));
|
|
1079
|
+
if (level)
|
|
1080
|
+
params.set('level', level);
|
|
1081
|
+
const data = (await gc.getJson(`/api/monitoring/logs?${params.toString()}`));
|
|
1082
|
+
ctx.server.sendResponse(ctx.ws, ctx.id, {
|
|
1083
|
+
success: true,
|
|
1084
|
+
data: {
|
|
1085
|
+
monitoringLogs: true,
|
|
1086
|
+
...data,
|
|
1087
|
+
},
|
|
1088
|
+
});
|
|
1089
|
+
}
|
|
1090
|
+
catch (e) {
|
|
1091
|
+
ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
|
|
1092
|
+
}
|
|
1093
|
+
return;
|
|
1094
|
+
}
|
|
1095
|
+
if (action === 'refresh') {
|
|
1096
|
+
const section = typeof ctx.data?.section === 'string' ? ctx.data.section.trim().toLowerCase() : '';
|
|
1097
|
+
const valid = new Set([
|
|
1098
|
+
'overview',
|
|
1099
|
+
'health',
|
|
1100
|
+
'dependencies',
|
|
1101
|
+
'metrics',
|
|
1102
|
+
'queue',
|
|
1103
|
+
'logs',
|
|
1104
|
+
'system',
|
|
1105
|
+
]);
|
|
1106
|
+
if (!valid.has(section)) {
|
|
1107
|
+
ctx.server.sendError(ctx.ws, ctx.id, `Invalid monitoring section: ${section}`);
|
|
1108
|
+
return;
|
|
1109
|
+
}
|
|
1110
|
+
if (section !== 'system' && !gc) {
|
|
1111
|
+
ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
|
|
1112
|
+
return;
|
|
1113
|
+
}
|
|
1114
|
+
try {
|
|
1115
|
+
// Portal Monitoring TUI sends `gateway.observability` for Overview; this branch exists for
|
|
1116
|
+
// API symmetry and other clients that call `monitoring.refresh` with section `overview`.
|
|
1117
|
+
if (section === 'overview') {
|
|
1118
|
+
if (!gc) {
|
|
1119
|
+
ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
|
|
1120
|
+
return;
|
|
1121
|
+
}
|
|
1122
|
+
await handleGatewayObservability(ctx);
|
|
1123
|
+
return;
|
|
1124
|
+
}
|
|
1125
|
+
let lines = [];
|
|
1126
|
+
if (section === 'health' || section === 'dependencies') {
|
|
1127
|
+
const v = await gc.verify({ readyTimeoutMs: 8000 });
|
|
1128
|
+
const full = observabilityHealthLines(v);
|
|
1129
|
+
lines = section === 'health' ? sliceHealthMainLines(full) : sliceDependencyLines(full);
|
|
1130
|
+
}
|
|
1131
|
+
else if (section === 'metrics') {
|
|
1132
|
+
const text = await gc.prometheusMetrics();
|
|
1133
|
+
const snap = summarizeGatewayPrometheusMetrics(text);
|
|
1134
|
+
lines = formatMetricsRefreshBlock(snap);
|
|
1135
|
+
}
|
|
1136
|
+
else if (section === 'queue') {
|
|
1137
|
+
try {
|
|
1138
|
+
const data = await gc.getJson('/api/monitoring/metrics/queue');
|
|
1139
|
+
lines = linesFromQueueMetricsApi(data);
|
|
1140
|
+
}
|
|
1141
|
+
catch {
|
|
1142
|
+
const text = await gc.prometheusMetrics();
|
|
1143
|
+
const snap = summarizeGatewayPrometheusMetrics(text);
|
|
1144
|
+
lines = formatQueueFromPrometheusSnap(snap);
|
|
1145
|
+
}
|
|
1146
|
+
}
|
|
1147
|
+
else if (section === 'logs') {
|
|
1148
|
+
const params = new URLSearchParams();
|
|
1149
|
+
params.set('limit', '100');
|
|
1150
|
+
const data = (await gc.getJson(`/api/monitoring/logs?${params.toString()}`));
|
|
1151
|
+
const logs = Array.isArray(data.logs) ? data.logs : [];
|
|
1152
|
+
lines = logs.map((entry) => {
|
|
1153
|
+
if (entry && typeof entry === 'object') {
|
|
1154
|
+
const e = entry;
|
|
1155
|
+
const ts = typeof e.timestamp === 'string' ? e.timestamp : '';
|
|
1156
|
+
const lvl = typeof e.level === 'string' ? e.level : '';
|
|
1157
|
+
const msg = typeof e.message === 'string' ? e.message : JSON.stringify(entry);
|
|
1158
|
+
return `${ts} [${lvl}] ${msg}`;
|
|
1159
|
+
}
|
|
1160
|
+
return String(entry);
|
|
1161
|
+
});
|
|
1162
|
+
}
|
|
1163
|
+
else if (section === 'system') {
|
|
1164
|
+
const stats = await collectSystemStats(ctx, false);
|
|
1165
|
+
lines = stats.lines;
|
|
1166
|
+
}
|
|
1167
|
+
ctx.server.sendResponse(ctx.ws, ctx.id, {
|
|
1168
|
+
success: true,
|
|
1169
|
+
data: {
|
|
1170
|
+
monitoringRefresh: true,
|
|
1171
|
+
section,
|
|
1172
|
+
lines,
|
|
1173
|
+
},
|
|
1174
|
+
});
|
|
1175
|
+
}
|
|
1176
|
+
catch (e) {
|
|
1177
|
+
ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
|
|
1178
|
+
}
|
|
1179
|
+
return;
|
|
1180
|
+
}
|
|
1181
|
+
if (action === 'drill') {
|
|
1182
|
+
const target = typeof ctx.data?.target === 'string' ? ctx.data.target.trim() : '';
|
|
1183
|
+
const paths = {
|
|
1184
|
+
metrics_http: '/api/monitoring/metrics/http',
|
|
1185
|
+
metrics_runs: '/api/monitoring/metrics/runs',
|
|
1186
|
+
metrics_queue: '/api/monitoring/metrics/queue',
|
|
1187
|
+
metrics_sse: '/api/monitoring/metrics/sse',
|
|
1188
|
+
dependencies_detail: '/api/monitoring/dependencies/detail',
|
|
1189
|
+
};
|
|
1190
|
+
if (target === 'system_diagnostics') {
|
|
1191
|
+
try {
|
|
1192
|
+
const stats = await collectSystemStats(ctx, true);
|
|
1193
|
+
ctx.server.sendResponse(ctx.ws, ctx.id, {
|
|
1194
|
+
success: true,
|
|
1195
|
+
data: {
|
|
1196
|
+
monitoringDrill: true,
|
|
1197
|
+
target,
|
|
1198
|
+
lines: stats.lines,
|
|
1199
|
+
},
|
|
1200
|
+
});
|
|
1201
|
+
}
|
|
1202
|
+
catch (e) {
|
|
1203
|
+
ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
|
|
1204
|
+
}
|
|
1205
|
+
return;
|
|
1206
|
+
}
|
|
1207
|
+
if (!gc) {
|
|
1208
|
+
ctx.server.sendError(ctx.ws, ctx.id, 'Not connected to a Gateway');
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
if (!paths[target]) {
|
|
1212
|
+
ctx.server.sendError(ctx.ws, ctx.id, `Unknown monitoring drill target: ${target}`);
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
try {
|
|
1216
|
+
const raw = await gc.getJson(paths[target]);
|
|
1217
|
+
const lines = formatMonitoringDrillLines(target, raw);
|
|
1218
|
+
ctx.server.sendResponse(ctx.ws, ctx.id, {
|
|
1219
|
+
success: true,
|
|
1220
|
+
data: {
|
|
1221
|
+
monitoringDrill: true,
|
|
1222
|
+
target,
|
|
1223
|
+
lines,
|
|
1224
|
+
},
|
|
1225
|
+
});
|
|
1226
|
+
}
|
|
1227
|
+
catch (e) {
|
|
1228
|
+
ctx.server.sendError(ctx.ws, ctx.id, errorMessage(e));
|
|
1229
|
+
}
|
|
1230
|
+
return;
|
|
1231
|
+
}
|
|
1232
|
+
ctx.server.sendError(ctx.ws, ctx.id, `Unknown monitoring action: ${action}`);
|
|
1233
|
+
}
|
|
736
1234
|
async function handleGatewayObservability(ctx) {
|
|
737
1235
|
const gc = effectiveGatewayClient(ctx);
|
|
738
1236
|
if (!gc) {
|