From 01621a477463243ebf2087496ccded94af57954d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E5=8F=8A?= <522caiji@gmail.com> Date: Fri, 2 Oct 2026 20:59:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=81=E9=87=8F?= =?UTF-8?q?=E6=8A=98=E7=BA=BF=E5=9B=BE=E6=95=B0=E6=8D=AE=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 成功和失败折线各自使用自己的计数,失败折线覆盖全部未成功请求。 重新构建控制台静态资源以匹配当前 main。 --- .../unreleased/traffic-chart-error-series.md | 7 ++++ .../src/components/overview/TrafficChart.tsx | 41 +++++++++++++------ ...t-DV-kPoRs.js => TrafficChart-DOeeij-E.js} | 4 +- .../{index-rkF9tr1T.js => index-kaA7hH-B.js} | 2 +- internal/webui/static/index.html | 2 +- 5 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 changelog/unreleased/traffic-chart-error-series.md rename internal/webui/static/assets/{TrafficChart-DV-kPoRs.js => TrafficChart-DOeeij-E.js} (98%) rename internal/webui/static/assets/{index-rkF9tr1T.js => index-kaA7hH-B.js} (99%) diff --git a/changelog/unreleased/traffic-chart-error-series.md b/changelog/unreleased/traffic-chart-error-series.md new file mode 100644 index 00000000..45a8647e --- /dev/null +++ b/changelog/unreleased/traffic-chart-error-series.md @@ -0,0 +1,7 @@ +### English + +- Fix the Overview traffic chart so the success and failure lines each plot their own counts instead of both tracking total requests, and make the failure line cover every non-success outcome (error, incomplete, canceled) so no traffic disappears from the curve. + +### 中文 + +- 修复概览页流量折线图:成功与失败各自显示自己的计数,不再都跟着总请求数;失败折线覆盖全部未成功请求(失败、未完成、取消),曲线不再丢数据。 diff --git a/frontend/src/components/overview/TrafficChart.tsx b/frontend/src/components/overview/TrafficChart.tsx index 406d83fb..96774d25 100644 --- a/frontend/src/components/overview/TrafficChart.tsx +++ b/frontend/src/components/overview/TrafficChart.tsx @@ -31,7 +31,7 @@ function niceMax(peak: number) { return nice * base } -type ChartRow = RequestStatsPoint & { okCount: number } +type ChartRow = RequestStatsPoint & { okCount: number; errorCount: number } function TrafficTooltip({ active, @@ -60,7 +60,8 @@ function TrafficTooltip({
{var i=typeof l==`function`?l(e.value,r):e.value;return p===`width`?ok(lT(i,{fontSize:t,letterSpacing:n}),m,d):lT(i,{fontSize:t,letterSpacing:n})[p]},g=i[0],_=i[1],v=i.length>=2&&g!=null&&_!=null?le(_.coordinate-g.coordinate):1,y=sk(a,v,p);return c===`equidistantPreserveStart`?uk(v,y,h,i,o):c===`equidistantPreserveEnd`?dk(v,y,h,i,o):(f=c===`preserveStart`||c===`preserveStartEnd`?vk(v,y,h,i,o,c===`preserveStartEnd`):_k(v,y,h,i,o),f.filter(e=>e.isShow))}var bk=e=>{var t=e.ticks,n=e.label,r=e.labelGapWithTick,i=r===void 0?5:r,a=e.tickSize,o=a===void 0?0:a,s=e.tickMargin,c=s===void 0?0:s,l=0;if(t){Array.from(t).forEach(e=>{if(e){var t=e.getBoundingClientRect();t.width>l&&(l=t.width)}});var u=n?n.getBoundingClientRect().width:0,d=o+c,f=l+d+u+(n?i:0);return Math.round(f)}return 0},xk=e=>{var t=e.ticks,n=e.label,r=e.labelGapWithTick,i=r===void 0?5:r,a=e.tickSize,o=a===void 0?0:a,s=e.tickMargin,c=s===void 0?0:s,l=0;if(t){Array.from(t).forEach(e=>{if(e){var t=e.getBoundingClientRect();t.height>l&&(l=t.height)}});var u=n?n.getBoundingClientRect().height:0,d=o+c,f=l+d+u+(n?i:0);return Math.round(f)}return 0},Sk=Ua({name:`renderedTicks`,initialState:{xAxis:{},yAxis:{}},reducers:{setRenderedTicks:(e,t)=>{var n=t.payload,r=n.axisType,i=n.axisId,a=n.ticks;e[r][i]=V(a)},removeRenderedTicks:(e,t)=>{var n=t.payload,r=n.axisType,i=n.axisId;delete e[r][i]}}}),Ck=Sk.actions,wk=Ck.setRenderedTicks,Tk=Ck.removeRenderedTicks,Ek=Sk.reducer,Dk=[`axisLine`,`width`,`height`,`className`,`hide`,`ticks`,`axisType`,`axisId`];function Ok(e,t){return Nk(e)||Mk(e,t)||Ak(e,t)||kk()}function kk(){throw TypeError(`Invalid attempt to destructure non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Ak(e,t){if(e){if(typeof e==`string`)return jk(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?jk(e,t):void 0}}function jk(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n