From 066102a5c2018f3d878aba2770668ec847d781fb Mon Sep 17 00:00:00 2001 From: underwaterresearch Date: Sat, 4 Apr 2026 08:14:08 +0000 Subject: [PATCH] feat: include readiness detail in warning metadata --- .../__tests__/readinessWarning.test.js | 26 ++++++++++++++++++- workers/provisioner/readinessWarning.js | 11 +++++++- workers/provisioner/worker.js | 4 +-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/backend-api/__tests__/readinessWarning.test.js b/backend-api/__tests__/readinessWarning.test.js index 91d9385..989b159 100644 --- a/backend-api/__tests__/readinessWarning.test.js +++ b/backend-api/__tests__/readinessWarning.test.js @@ -1,4 +1,4 @@ -const { buildReadinessWarningDetail } = require("../../workers/provisioner/readinessWarning"); +const { buildReadinessWarningDetail, buildReadinessWarningMetadata } = require("../../workers/provisioner/readinessWarning"); describe("buildReadinessWarningDetail", () => { it("formats a runtime-only readiness warning", () => { @@ -54,3 +54,27 @@ describe("buildReadinessWarningDetail", () => { expect(buildReadinessWarningDetail({})).toBe("readiness checks failed"); }); }); + +describe("buildReadinessWarningMetadata", () => { + it("includes a flattened warning detail alongside the raw readiness payload", () => { + const readiness = { + runtime: { + ok: false, + url: "http://agent.internal:9090/health", + error: "timeout after 5000ms", + }, + gateway: { ok: true }, + }; + + expect(buildReadinessWarningMetadata({ + agentId: "agent-123", + host: "agent.internal", + readiness, + })).toEqual({ + agentId: "agent-123", + host: "agent.internal", + detail: "runtime unavailable at http://agent.internal:9090/health (timeout after 5000ms)", + readiness, + }); + }); +}); diff --git a/workers/provisioner/readinessWarning.js b/workers/provisioner/readinessWarning.js index 3776ae1..7821a9d 100644 --- a/workers/provisioner/readinessWarning.js +++ b/workers/provisioner/readinessWarning.js @@ -16,4 +16,13 @@ function buildReadinessWarningDetail(readiness) { return problems.join('; ') || 'readiness checks failed'; } -module.exports = { buildReadinessWarningDetail }; +function buildReadinessWarningMetadata({ agentId, host, readiness }) { + return { + agentId, + host, + detail: buildReadinessWarningDetail(readiness), + readiness, + }; +} + +module.exports = { buildReadinessWarningDetail, buildReadinessWarningMetadata }; diff --git a/workers/provisioner/worker.js b/workers/provisioner/worker.js index e6c3cf3..59bbc96 100644 --- a/workers/provisioner/worker.js +++ b/workers/provisioner/worker.js @@ -3,7 +3,7 @@ const IORedis = require('ioredis'); const { Pool } = require('pg'); const { agentRuntimeUrl } = require('../../agent-runtime/lib/contracts'); const { waitForAgentReadiness } = require('./healthChecks'); -const { buildReadinessWarningDetail } = require('./readinessWarning'); +const { buildReadinessWarningDetail, buildReadinessWarningMetadata } = require('./readinessWarning'); // ── Connections ────────────────────────────────────────── const connection = new IORedis({ @@ -390,7 +390,7 @@ const worker = new Worker('deployments', async (job) => { await db.query("UPDATE deployments SET status = 'warning' WHERE agent_id = $1", [id]); await db.query( "INSERT INTO events(type, message, metadata) VALUES($1, $2, $3)", - ['agent_runtime_warning', `Agent "${name}" deployed with readiness warning: ${detail}`, JSON.stringify({ agentId: id, host, readiness })] + ['agent_runtime_warning', `Agent "${name}" deployed with readiness warning: ${detail}`, JSON.stringify(buildReadinessWarningMetadata({ agentId: id, host, readiness }))] ); }