From a90d0c43336a5f000b5856003d2293c420e7d595 Mon Sep 17 00:00:00 2001 From: asepharyana Date: Mon, 3 Aug 2026 13:06:10 +0700 Subject: [PATCH] fix(dashboard): real error rate from llm_api_errors_total MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - errors now = rate(llm_api_errors_total) instead of network TX bytes - rps = rate(llm_api_requests_total) + rate(http_server_request_count_total) - Latency card → Load Average (was misleading: showed node load as 'ms') - Overview 'Errors' StatBox was hardcoded 0 → real llm err/s - rename hasTraffik → hasTraffic (Traefik removed 2026-08-02) --- src/app/api/dashboard/route.ts | 28 ++++++++++++++++++++-------- src/app/dashboard/page.tsx | 26 +++++++++++++++++--------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/src/app/api/dashboard/route.ts b/src/app/api/dashboard/route.ts index 0dada7d..5ea0bd0 100644 --- a/src/app/api/dashboard/route.ts +++ b/src/app/api/dashboard/route.ts @@ -159,10 +159,10 @@ export async function GET() { load15, netIn, netOut, - rps, - latency, - errors, - traceVolume, + netInSpark, + loadSpark, + netOutSpark, + upstreamCount, ] = await Promise.all([ promQuery( `100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)`, @@ -184,6 +184,18 @@ export async function GET() { promQuery("count(up)"), ]); + // ── Error rate (llm-api) & request rate (any /metrics service) ── + const [errRate, errSpark] = await Promise.all([ + promQuery(`sum(rate(llm_api_errors_total[5m]))`), + promRange(`sum(rate(llm_api_errors_total[1m]))`), + ]); + const reqRate = await promQuery( + `sum(rate(llm_api_requests_total[5m])) + sum(rate(http_server_request_count_total[5m]))`, + ); + const reqSpark = await promRange( + `sum(rate(llm_api_requests_total[1m])) + sum(rate(http_server_request_count_total[1m]))`, + ); + // ── LLM inference metrics (llm-api /metrics) ── const [ llmReqRate, @@ -225,10 +237,10 @@ export async function GET() { services, traces: [], node: { cpu, ram, disk, load1, load5, load15, netIn, netOut }, - rps, - latency, - errors, - traceVolume: traceVolume ? [traceVolume] : [], + rps: reqSpark, + latency: loadSpark, + errors: errSpark, + traceVolume: netInSpark, links, llm: { reqRate: llmReqRate, diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index ad99820..feb5693 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -60,8 +60,8 @@ export default function Dashboard() { data?.services.filter((s) => s.state === "running").length ?? 0; const degraded = (data?.services.length ?? 0) - running; const hasNode = data?.node.cpu !== null || data?.node.ram !== null; - const hasTraffik = - (data?.rps?.length ?? 0) > 0 || (data?.latency?.length ?? 0) > 0; + const hasTraffic = + (data?.rps?.length ?? 0) > 0 || (data?.errors?.length ?? 0) > 0; const node = data?.node; return ( @@ -147,7 +147,15 @@ export default function Dashboard() { label="Traces" color="text-blue-400" /> - + @@ -299,7 +307,7 @@ export default function Dashboard() { {/* Request Rate */} - {hasTraffik && ( + {hasTraffic && ( @@ -317,15 +325,15 @@ export default function Dashboard() { )} - {/* Latency */} - {hasTraffik && ( + {/* Load Average */} + {hasNode && ( - Latency + Load Average {data?.latency?.length - ? `${data.latency[data.latency.length - 1].toFixed(0)}ms` + ? data.latency[data.latency.length - 1].toFixed(2) : "-"} @@ -337,7 +345,7 @@ export default function Dashboard() { )} {/* Error Rate */} - {hasTraffik && ( + {hasTraffic && (