Fix dashboard node charts for clusters showing all nodes correctly
- Changed logic to process ALL nodes from cluster, not just the first one - Added processedClusterIPs set to avoid duplicate processing of cluster servers - Now clusters show all nodes (pve1, pve2, pve3) instead of duplicating first node - Fixed issue where node names were incorrect after node reconnection
This commit is contained in:
@@ -75,10 +75,17 @@ async function loadProxmoxNodesStats() {
|
|||||||
// Собрать все данные сначала, потом отрисовать
|
// Собрать все данные сначала, потом отрисовать
|
||||||
const chartsToRender = [];
|
const chartsToRender = [];
|
||||||
const seenNodes = new Set(); // Для дедупликации нод кластера
|
const seenNodes = new Set(); // Для дедупликации нод кластера
|
||||||
|
const processedClusterIPs = new Set(); // Для отслеживания обработанных кластеров
|
||||||
|
|
||||||
// Загрузить данные для каждого сервера
|
// Загрузить данные для каждого сервера
|
||||||
for (const server of onlineServers) {
|
for (const server of onlineServers) {
|
||||||
try {
|
try {
|
||||||
|
// Если это кластер и мы уже обработали сервер с таким IP - пропускаем
|
||||||
|
// (все серверы кластера видят одни и те же ноды)
|
||||||
|
if (processedClusterIPs.has(server.ip_address)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Получить список нод
|
// Получить список нод
|
||||||
const nodesResponse = await fetchWithAuth(`/proxmox/api/${server.id}/nodes`);
|
const nodesResponse = await fetchWithAuth(`/proxmox/api/${server.id}/nodes`);
|
||||||
if (!nodesResponse || !nodesResponse.ok) {
|
if (!nodesResponse || !nodesResponse.ok) {
|
||||||
@@ -94,39 +101,45 @@ async function loadProxmoxNodesStats() {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Для кластеров берём только ПЕРВУЮ ноду, т.к. все серверы кластера имеют одинаковые ноды
|
// Если это кластер (более одной ноды) - запомнить IP чтобы не обрабатывать дубликаты
|
||||||
// Используем IP сервера + имя ноды для дедупликации
|
if (nodes.length > 1) {
|
||||||
const node = nodes[0].node;
|
processedClusterIPs.add(server.ip_address);
|
||||||
const nodeKey = `${server.ip_address}-${node}`;
|
|
||||||
|
|
||||||
if (seenNodes.has(nodeKey)) {
|
|
||||||
continue; // Уже показали эту ноду
|
|
||||||
}
|
|
||||||
seenNodes.add(nodeKey);
|
|
||||||
|
|
||||||
// Получить данные для графиков
|
|
||||||
const rrdResponse = await fetchWithAuth(`/proxmox/api/${server.id}/node/rrddata?node=${node}&timeframe=hour`);
|
|
||||||
if (!rrdResponse || !rrdResponse.ok) {
|
|
||||||
console.warn(`Failed to load RRD data for ${server.name}/${node}, skipping chart`);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const rrdData = await rrdResponse.json();
|
// Обработать ВСЕ ноды этого сервера
|
||||||
const data = rrdData.data || [];
|
for (const nodeInfo of nodes) {
|
||||||
|
const node = nodeInfo.node;
|
||||||
if (data.length === 0) {
|
const nodeKey = `${server.ip_address}-${node}`;
|
||||||
console.warn(`No RRD data for ${server.name}/${node}`);
|
|
||||||
continue;
|
if (seenNodes.has(nodeKey)) {
|
||||||
|
continue; // Уже показали эту ноду
|
||||||
|
}
|
||||||
|
seenNodes.add(nodeKey);
|
||||||
|
|
||||||
|
// Получить данные для графиков
|
||||||
|
const rrdResponse = await fetchWithAuth(`/proxmox/api/${server.id}/node/rrddata?node=${node}&timeframe=hour`);
|
||||||
|
if (!rrdResponse || !rrdResponse.ok) {
|
||||||
|
console.warn(`Failed to load RRD data for ${server.name}/${node}, skipping chart`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const rrdData = await rrdResponse.json();
|
||||||
|
const data = rrdData.data || [];
|
||||||
|
|
||||||
|
if (data.length === 0) {
|
||||||
|
console.warn(`No RRD data for ${server.name}/${node}`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сохранить данные для отрисовки
|
||||||
|
chartsToRender.push({
|
||||||
|
canvasId: `chart-${server.id}-${node}`,
|
||||||
|
serverName: server.name,
|
||||||
|
nodeName: node,
|
||||||
|
data: data
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Сохранить данные для отрисовки
|
|
||||||
chartsToRender.push({
|
|
||||||
canvasId: `chart-${server.id}-${node}`,
|
|
||||||
serverName: server.name,
|
|
||||||
nodeName: node,
|
|
||||||
data: data
|
|
||||||
});
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error loading stats for server ${server.id}:`, error);
|
console.error(`Error loading stats for server ${server.id}:`, error);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user