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;