diff --git a/server.js b/server.js index efa6a11..3ccf111 100644 --- a/server.js +++ b/server.js @@ -8,6 +8,14 @@ const status = { lastSuccess: "", }; +const metrics = { + processed: 0, + failed: 0, + lastError: "", + lastMessageAt: "", + lastAction: "", +}; + function setStatus(state, error) { status.state = state; status.error = error || ""; @@ -16,6 +24,62 @@ function setStatus(state, error) { } } +function renderStatusPage() { + const queueName = (process.env.RABBIT_QUEUES || "crud_queue").split(",")[0] || "crud_queue"; + const tableName = process.env.PG_TABLE || "rabbit_messages"; + return ` + + + + Rabbit NodeJS Worker + + + +
+
+

NodeJS Worker

+
Queue: ${queueName} | Table: ${tableName}
+
+ ${status.state} +
+
+
+
Processed
+
${metrics.processed}
+
+
+
Failed
+
${metrics.failed}
+
+
+
Last Action
+
${metrics.lastAction || "-"}
+
${metrics.lastMessageAt || ""}
+
+
+
Last Error
+
${metrics.lastError || "-"}
+
${status.lastSuccess || ""}
+
+
+
+
+ +`; +} + function buildPgConfig() { if (process.env.DATABASE_URL) { return { @@ -111,8 +175,8 @@ function startHttpServer() { res.end(JSON.stringify(status)); return; } - res.writeHead(200, { "Content-Type": "text/plain" }); - res.end("rabbit-nodeworker ready"); + res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" }); + res.end(renderStatusPage()); }); server.listen(port, () => { console.log(`health server listening on ${port}`); @@ -149,8 +213,14 @@ async function consumeLoop() { try { const parsed = parseMessage(msg.content); await handleMessage(table, parsed); + metrics.processed += 1; + metrics.lastAction = parsed.action || "create"; + metrics.lastMessageAt = new Date().toISOString(); channel.ack(msg); } catch (err) { + metrics.failed += 1; + metrics.lastError = String(err.message || err); + metrics.lastMessageAt = new Date().toISOString(); if (String(err.message || "").includes("missing id") || String(err.message || "").includes("invalid action")) { channel.nack(msg, false, false); return;