// Generated, do not edit. sha256:1196ce67207fc0b54b2fc602d2f16cc37c4414638c2f9a09a7c16d83c58acd2f import { apiMetricsGlobal } from '../data/api-metrics.js'; import { getSettings } from '../data/preferences.js'; import { t } from '../i18n/index.js'; import { esc } from '../ui/escape.js'; import { fmtInt } from '../ui/format.js'; import { CONFIG, METRICS } from '../../shared/config.js'; function sinceBucket(minutes) { return new Date(Date.now() - minutes * 60000).toISOString().slice(0, 16); } function failState(calls, fail) { if (!calls) return 'ok'; const ratio = fail / calls; if (ratio >= METRICS.FAIL_BAD) return 'bad'; if (ratio >= METRICS.FAIL_WARN) return 'warn'; return 'ok'; } function tileHtml(label, value, state) { return `
${value}
${label}
`; } export async function renderMetricsWidget(host) { try { const settings = await getSettings(); const schema = settings ? settings.version : null; const dbState = schema === CONFIG.SCHEMA_VERSION ? 'ok' : 'warn'; const m = await apiMetricsGlobal(sinceBucket(METRICS.WINDOW_MINUTES)); const errState = failState(m.calls, m.fail); const errPct = m.calls ? Math.round((m.fail / m.calls) * 100) : 0; const tiles = [ tileHtml(t('sysmetrics.db'), `v${schema != null ? schema : '?'}`, dbState), tileHtml(t('sysmetrics.calls'), fmtInt(m.calls), m.calls ? 'ok' : 'warn'), tileHtml(t('sysmetrics.errors'), `${errPct}%`, errState), ]; host.innerHTML = `
${t('dashboard.widget.metrics')}
${tiles.join('')}
${t('sysmetrics.window')} ${METRICS.WINDOW_MINUTES} min
`; } catch (err) { console.error('[metrics-widget]', err); host.innerHTML = `
${t('dashboard.widget.metrics')}
⚠ ${esc(err.message)}
`; } }