108 lines
3.4 KiB
JavaScript
108 lines
3.4 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
|
|
var endpoint = "/api/cortex-os/runtime-health";
|
|
var states = ["healthy", "degraded", "unavailable", "unknown", "loading", "error", "redacted"];
|
|
|
|
if (window.__cortexOsRuntimeHealthLoaded) {
|
|
return;
|
|
}
|
|
window.__cortexOsRuntimeHealthLoaded = true;
|
|
|
|
function ensurePanel() {
|
|
var panel = document.querySelector("[data-cortex-os-runtime-health]");
|
|
if (panel) {
|
|
return panel;
|
|
}
|
|
|
|
panel = document.createElement("section");
|
|
panel.className = "cortex-os-runtime-health";
|
|
panel.setAttribute("data-cortex-os-runtime-health", "true");
|
|
panel.setAttribute("data-state", "loading");
|
|
|
|
var title = document.createElement("h2");
|
|
title.textContent = "Cortex OS Runtime Health";
|
|
|
|
var badge = document.createElement("span");
|
|
badge.className = "cortex-os-runtime-health__badge";
|
|
badge.setAttribute("data-role", "status");
|
|
badge.textContent = "loading";
|
|
|
|
var summary = document.createElement("p");
|
|
summary.className = "cortex-os-runtime-health__summary";
|
|
summary.setAttribute("data-role", "summary");
|
|
summary.textContent = "Checking Runtime Health.";
|
|
|
|
var list = document.createElement("dl");
|
|
list.className = "cortex-os-runtime-health__signals";
|
|
list.setAttribute("data-role", "signals");
|
|
|
|
panel.appendChild(title);
|
|
panel.appendChild(badge);
|
|
panel.appendChild(summary);
|
|
panel.appendChild(list);
|
|
|
|
var target = document.querySelector("main") || document.body;
|
|
target.appendChild(panel);
|
|
return panel;
|
|
}
|
|
|
|
function setState(panel, state, summary, signals) {
|
|
var nextState = states.indexOf(state) >= 0 ? state : "unknown";
|
|
panel.setAttribute("data-state", nextState);
|
|
panel.querySelector("[data-role='status']").textContent = nextState;
|
|
panel.querySelector("[data-role='summary']").textContent = summary || "redacted";
|
|
renderSignals(panel.querySelector("[data-role='signals']"), signals || []);
|
|
}
|
|
|
|
function renderSignals(list, signals) {
|
|
list.textContent = "";
|
|
signals.slice(0, 3).forEach(function (signal) {
|
|
var name = document.createElement("dt");
|
|
var value = document.createElement("dd");
|
|
name.textContent = signal.name || "redacted";
|
|
value.textContent = signal.status || "unknown";
|
|
list.appendChild(name);
|
|
list.appendChild(value);
|
|
});
|
|
}
|
|
|
|
function renderPayload(panel, payload) {
|
|
if (!payload || payload.ok !== true || !payload.result) {
|
|
setState(panel, "error", "Runtime Health is unavailable.", []);
|
|
return;
|
|
}
|
|
setState(panel, payload.result.status, payload.result.summary, payload.result.signals);
|
|
}
|
|
|
|
function loadRuntimeHealth() {
|
|
var panel = ensurePanel();
|
|
setState(panel, "loading", "Checking Runtime Health.", []);
|
|
|
|
fetch(endpoint, {
|
|
method: "GET",
|
|
headers: { Accept: "application/json" },
|
|
credentials: "same-origin",
|
|
cache: "no-store"
|
|
})
|
|
.then(function (response) {
|
|
if (!response.ok) {
|
|
throw new Error("runtime-health-unavailable");
|
|
}
|
|
return response.json();
|
|
})
|
|
.then(function (payload) {
|
|
renderPayload(panel, payload);
|
|
})
|
|
.catch(function () {
|
|
setState(panel, "error", "Runtime Health is unavailable.", []);
|
|
});
|
|
}
|
|
|
|
if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", loadRuntimeHealth, { once: true });
|
|
} else {
|
|
loadRuntimeHealth();
|
|
}
|
|
})();
|