From 19d81722d6cda750a3009c6b3d4c83aa77f56917 Mon Sep 17 00:00:00 2001 From: lukacan Date: Thu, 14 May 2026 09:35:30 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=91=EF=B8=8F=20Fix=20dashboard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard_template.html | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/crates/metrics/src/dashboard-template/dashboard_template.html b/crates/metrics/src/dashboard-template/dashboard_template.html index 61fff7eb7..d89ea0c4b 100644 --- a/crates/metrics/src/dashboard-template/dashboard_template.html +++ b/crates/metrics/src/dashboard-template/dashboard_template.html @@ -802,26 +802,55 @@

${instruction}

} // Format Solana logs with syntax highlighting + function escapeHtml(text) { + return String(text) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + function normalizeLogsToLines(logs) { + if (logs === undefined || logs === null) return []; + if (Array.isArray(logs)) return logs; + + // In metrics JSON, some logs are serialized as a single string. + if (typeof logs === 'string') { + const normalized = logs.replace(/\\n/g, '\n'); + return normalized.split(/\r?\n/).filter(line => line.length > 0); + } + + // Fallback: stringify unexpected shapes. + try { + return [JSON.stringify(logs, null, 2)]; + } catch (_) { + return [String(logs)]; + } + } + function formatSolanaLogs(logs) { - if (!logs || logs.length === 0) return 'No logs available'; + const lines = normalizeLogsToLines(logs); + if (lines.length === 0) return 'No logs available'; - return logs.map(log => { - let formattedLog = log.replace(/\\n/g, '\n'); // Handle escaped newlines + return lines.map(log => { + const rawLog = String(log).replace(/\\n/g, '\n'); // Handle escaped newlines + let formattedLog = escapeHtml(rawLog); // Color different types of log lines - if (formattedLog.includes('Program') && formattedLog.includes('invoke')) { + if (rawLog.includes('Program') && rawLog.includes('invoke')) { formattedLog = `${formattedLog}`; - } else if (formattedLog.includes('Program') && formattedLog.includes('success')) { + } else if (rawLog.includes('Program') && rawLog.includes('success')) { formattedLog = `${formattedLog}`; - } else if (formattedLog.includes('Program') && formattedLog.includes('failed')) { + } else if (rawLog.includes('Program') && rawLog.includes('failed')) { formattedLog = `${formattedLog}`; - } else if (formattedLog.includes('Program log:')) { + } else if (rawLog.includes('Program log:')) { formattedLog = `${formattedLog}`; - } else if (formattedLog.includes('consumed') && formattedLog.includes('compute units')) { + } else if (rawLog.includes('consumed') && rawLog.includes('compute units')) { formattedLog = `${formattedLog}`; - } else if (formattedLog.includes('Program') && formattedLog.includes('error')) { + } else if (rawLog.includes('Program') && rawLog.includes('error')) { formattedLog = `${formattedLog}`; - } else if (formattedLog.startsWith('Program ')) { + } else if (rawLog.startsWith('Program ')) { formattedLog = `${formattedLog}`; }