From 975ff06d699451608aa73561d34cd68931e8313f Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 21 Sep 2023 17:34:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=B9=E5=99=A8=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E4=BD=BF=E7=94=A8=E7=8E=87=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=98=BE=E7=A4=BA=20(#2371)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #2223 ![image](https://github.com/1Panel-dev/1Panel/assets/73214554/e7f8bd8f-dd9a-4783-91eb-56759bad843e) --- backend/app/dto/container.go | 10 +- backend/app/service/container.go | 27 +++-- frontend/src/api/interface/container.ts | 6 + frontend/src/assets/iconfont/iconfont.css | 12 +- frontend/src/assets/iconfont/iconfont.js | 2 +- frontend/src/assets/iconfont/iconfont.json | 7 ++ frontend/src/assets/iconfont/iconfont.svg | 2 + frontend/src/assets/iconfont/iconfont.ttf | Bin 14756 -> 14924 bytes frontend/src/assets/iconfont/iconfont.woff | Bin 9180 -> 9260 bytes frontend/src/assets/iconfont/iconfont.woff2 | Bin 7728 -> 7748 bytes frontend/src/lang/modules/en.ts | 6 + frontend/src/lang/modules/tw.ts | 6 + frontend/src/lang/modules/zh.ts | 6 + .../src/views/container/container/index.vue | 105 +++++++++++++++++- 14 files changed, 173 insertions(+), 16 deletions(-) diff --git a/backend/app/dto/container.go b/backend/app/dto/container.go index 20045b946..f9974d50e 100644 --- a/backend/app/dto/container.go +++ b/backend/app/dto/container.go @@ -63,8 +63,16 @@ type ContainerUpgrade struct { } type ContainerListStats struct { - ContainerID string `json:"containerID"` + ContainerID string `json:"containerID"` + + CPUTotalUsage uint64 `json:"cpuTotalUsage"` + SystemUsage uint64 `json:"systemUsage"` CPUPercent float64 `json:"cpuPercent"` + PercpuUsage int `json:"percpuUsage"` + + MemroyCache uint64 `json:"memoryCache"` + MemoryUsage uint64 `json:"memoryUsage"` + MemoryLimit uint64 `json:"memoryLimit"` MemoryPercent float64 `json:"memoryPercent"` } diff --git a/backend/app/service/container.go b/backend/app/service/container.go index f9400bb32..c21f5e62a 100644 --- a/backend/app/service/container.go +++ b/backend/app/service/container.go @@ -208,8 +208,7 @@ func (u *ContainerService) ContainerListStats() ([]dto.ContainerListStats, error wg.Add(len(list)) for i := 0; i < len(list); i++ { go func(item types.Container) { - cpu, mem := loadCpuAndMem(client, item.ID) - datas = append(datas, dto.ContainerListStats{CPUPercent: cpu, MemoryPercent: mem, ContainerID: item.ID}) + datas = append(datas, loadCpuAndMem(client, item.ID)) wg.Done() }(list[i]) } @@ -766,26 +765,36 @@ func pullImages(ctx context.Context, client *client.Client, image string) error return nil } -func loadCpuAndMem(client *client.Client, container string) (float64, float64) { +func loadCpuAndMem(client *client.Client, container string) dto.ContainerListStats { + data := dto.ContainerListStats{ + ContainerID: container, + } res, err := client.ContainerStats(context.Background(), container, false) if err != nil { - return 0, 0 + return data } body, err := io.ReadAll(res.Body) if err != nil { res.Body.Close() - return 0, 0 + return data } res.Body.Close() var stats *types.StatsJSON if err := json.Unmarshal(body, &stats); err != nil { - return 0, 0 + return data } - CPUPercent := calculateCPUPercentUnix(stats) - MemPercent := calculateMemPercentUnix(stats.MemoryStats) - return CPUPercent, MemPercent + data.CPUTotalUsage = stats.CPUStats.CPUUsage.TotalUsage - stats.PreCPUStats.CPUUsage.TotalUsage + data.SystemUsage = stats.CPUStats.SystemUsage - stats.PreCPUStats.SystemUsage + data.CPUPercent = calculateCPUPercentUnix(stats) + data.PercpuUsage = len(stats.CPUStats.CPUUsage.PercpuUsage) + + data.MemroyCache = stats.MemoryStats.Stats["cache"] + data.MemoryUsage = stats.MemoryStats.Usage + data.MemoryLimit = stats.MemoryStats.Limit + data.MemoryPercent = calculateMemPercentUnix(stats.MemoryStats) + return data } func checkPortStats(ports []dto.PortHelper) (nat.PortMap, error) { diff --git a/frontend/src/api/interface/container.ts b/frontend/src/api/interface/container.ts index 787e63fad..8e1b37821 100644 --- a/frontend/src/api/interface/container.ts +++ b/frontend/src/api/interface/container.ts @@ -70,7 +70,13 @@ export namespace Container { } export interface ContainerListStats { containerID: string; + cpuTotalUsage: number; + systemUsage: number; cpuPercent: number; + percpuUsage: number; + memoryCache: number; + memoryUsage: number; + memoryLimit: number; memoryPercent: number; } export interface ContainerStats { diff --git a/frontend/src/assets/iconfont/iconfont.css b/frontend/src/assets/iconfont/iconfont.css index 447ddad71..4ec831599 100644 --- a/frontend/src/assets/iconfont/iconfont.css +++ b/frontend/src/assets/iconfont/iconfont.css @@ -1,9 +1,9 @@ @font-face { font-family: "panel"; /* Project id 3575356 */ - src: url('iconfont.woff2?t=1687338712846') format('woff2'), - url('iconfont.woff?t=1687338712846') format('woff'), - url('iconfont.ttf?t=1687338712846') format('truetype'), - url('iconfont.svg?t=1687338712846#panel') format('svg'); + src: url('iconfont.woff2?t=1695287081776') format('woff2'), + url('iconfont.woff?t=1695287081776') format('woff'), + url('iconfont.ttf?t=1695287081776') format('truetype'), + url('iconfont.svg?t=1695287081776#panel') format('svg'); } .panel { @@ -14,6 +14,10 @@ -moz-osx-font-smoothing: grayscale; } +.p-xiangqing:before { + content: "\e677"; +} + .p-onedrive:before { content: "\e601"; } diff --git a/frontend/src/assets/iconfont/iconfont.js b/frontend/src/assets/iconfont/iconfont.js index ccdf3fa1c..7442e9db6 100644 --- a/frontend/src/assets/iconfont/iconfont.js +++ b/frontend/src/assets/iconfont/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_3575356='',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],h=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,t,v,p,i,z=function(l,h){h.parentNode.insertBefore(l,h)};if(h&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}a=function(){var l,h=document.createElement("div");h.innerHTML=c._iconfont_svg_string_3575356,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(l=document.body).firstChild?z(h,l.firstChild):l.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(v=a,p=c.document,i=!1,o(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,m())})}function m(){i||(i=!0,v())}function o(){try{p.documentElement.doScroll("left")}catch(l){return void setTimeout(o,50)}m()}}(window); \ No newline at end of file +window._iconfont_svg_string_3575356='',function(c){var l=(l=document.getElementsByTagName("script"))[l.length-1],h=l.getAttribute("data-injectcss"),l=l.getAttribute("data-disable-injectsvg");if(!l){var a,t,v,p,i,z=function(l,h){h.parentNode.insertBefore(l,h)};if(h&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(l){console&&console.log(l)}}a=function(){var l,h=document.createElement("div");h.innerHTML=c._iconfont_svg_string_3575356,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(l=document.body).firstChild?z(h,l.firstChild):l.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(a,0):(t=function(){document.removeEventListener("DOMContentLoaded",t,!1),a()},document.addEventListener("DOMContentLoaded",t,!1)):document.attachEvent&&(v=a,p=c.document,i=!1,o(),p.onreadystatechange=function(){"complete"==p.readyState&&(p.onreadystatechange=null,m())})}function m(){i||(i=!0,v())}function o(){try{p.documentElement.doScroll("left")}catch(l){return void setTimeout(o,50)}m()}}(window); \ No newline at end of file diff --git a/frontend/src/assets/iconfont/iconfont.json b/frontend/src/assets/iconfont/iconfont.json index 951ee1a03..e729e5a2c 100644 --- a/frontend/src/assets/iconfont/iconfont.json +++ b/frontend/src/assets/iconfont/iconfont.json @@ -5,6 +5,13 @@ "css_prefix_text": "p-", "description": "", "glyphs": [ + { + "icon_id": "10293150", + "name": "详情", + "font_class": "xiangqing", + "unicode": "e677", + "unicode_decimal": 58999 + }, { "icon_id": "13015332", "name": "onedrive", diff --git a/frontend/src/assets/iconfont/iconfont.svg b/frontend/src/assets/iconfont/iconfont.svg index 9b44b1eff..c32e34650 100644 --- a/frontend/src/assets/iconfont/iconfont.svg +++ b/frontend/src/assets/iconfont/iconfont.svg @@ -14,6 +14,8 @@ /> + + diff --git a/frontend/src/assets/iconfont/iconfont.ttf b/frontend/src/assets/iconfont/iconfont.ttf index 32cd9a78efb382f2537199767874bcd25e0f1554..7766786e18b08cb0cf58017de0e8b9c84235dc29 100644 GIT binary patch delta 1398 zcmaizQD{?F7{~wTCb>_sTBohGiLI+9Mom|lGKJ~%MQugIL79ZMX*$~4VZkcH zOei8!q#D?R;s!%>f^4`#eNhk<@xce}vk$e(xtaPhL8-8{`yanf*x1-T{O&pDyXW5X zo&Wd07Y{uc9#0p3Y)c*ktQ&x@v$y|9u50f5GQd9yBzNR{vfV2iC)xo_laKNY1diEV z9CJMq`GMh)sh{U(0risehy4e;vUR^jF7f?Z&c7VUjtr^Yc+KZ#-Y}RQ=-GZU>IGUK zaL-SN4j!r;zTle~1U7^j*m&kfd~*hhYst2;b2kr!HoZoWFYtP@_WG5-`uVr>-`JNu z$2s@IGErXUz05?ts#a$$Z!vA1Z!W!yLCwJPZnTEONFbEIIt)&9Qi#s2?koyh&8#oMl%tyYMzI>}u?P`3%*aL(wTLm3l~{!j zp*}_pmS8E5wvOorQGrTSA%rlzs6#!Lp#jU$h&U2hi!!W06Fxu-7Nfa1?(Gkyj2iE+ zbTQ&PQM{$>LWPN0!wXN=v(GJH-Y{`PnrryXz=ZKAE--ayh73FeH03rJ`Sk)k7_?8| z5ut5?hlMVqteW29xuHV>6@ac0s0DPLKvkg42MG0n-XKsZ=uHAOgWfJsJ?IXBIzoRg zP*G_5)quh(4tfO241HKI*3e%IR37?{z#2f`7g!DG8G&_yek!m+(9Z;8Elqh0tQxc{ zuzt`b?r&}^CG@WXiwgZ*V0ocm2rM+*tpZC9_cMXThr3sx4d8wu&=7F@1X=^`ae*d* zds?7f3UJSILg*a0MS&iIdsU#D;Ql1gS8%ThbQs)w0=WUo|la*FgIAn#6hVAfB_?Jjaojn-V`Mz-0_ z+GRavXMUW;Op+<9xYJXw)_tN{Gfja&7?gff{H{#L@Y$gh2eVwO(_Y3XewOPrqsI$ z0&CHOAbKE#3m0J_E<%bnu0$%%wTxCNwaLEYKZ9Cy4!`r7bGYYx-#4!Z?w%cv#t+?G zxequd09SQ)&-t#}ha+QvCkB+x#5!9$ilh0D0W6R`F)sKny4yIOB!#iwfx+1)tKR|R z3+JzU`r2Fl-5LEn&naTPt%LnWJ(l@Z2uCCW(X!>t$M#n$3 z3x8Lj3=!<$6~nwiGPa`}=?Ec(S9YNk8AyeRVw7Mj(y$R(yO4mL@ba2|1dxa%1bOLf zo@uY zMPDPrJrx44i?;=Wwo!45hEIT^!Wu27qUstx3(6(%flzLNPlZZ|>xP@s*#`x_A4<;& zm4M0-w2i7%pgK^M0(FAgFHkY48iCqD9Tlh|)CqxlLbVHsmvGQ2P-LhJ0_BE!DNuN* z839@B-wX5t>VrU6pgs!p2a1wtbfAcuAZE-@F8`zHoCI~kF)f#3A_A`O0 zf;}xTUs$Ai8YT^k9Rf3l#h(Jxhb5}3K@riV7DJddYK=KZwc|>Yk*t nM0h^ADy1!DIJGWyGA%u=D!pUe^p-`83ah-b%fR@($_K_TSib{E diff --git a/frontend/src/assets/iconfont/iconfont.woff b/frontend/src/assets/iconfont/iconfont.woff index 40a4e87d015785c9d8fb79be4db0bf7221a564d1..6b850353659f4ed2d247505b65a671f8246f925d 100644 GIT binary patch delta 8618 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 delta 8594 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 literal 7728 zcmV-09?#)-Pew8T0RR9103I*^3jhEB06C-p03G500RR9100000000000000000000 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
CPU: {{ row.cpuPercent.toFixed(2) }}%
-
+
{{ $t('monitor.memory') }}: {{ row.memoryPercent.toFixed(2) }}%
+ + + +
@@ -314,7 +374,13 @@ const loadStats = async () => { for (const item of stats) { if (container.containerID === item.containerID) { container.hasLoad = true; + container.cpuTotalUsage = item.cpuTotalUsage; + container.systemUsage = item.systemUsage; container.cpuPercent = item.cpuPercent; + container.percpuUsage = item.percpuUsage; + container.memoryCache = item.memoryCache; + container.memoryUsage = item.memoryUsage; + container.memoryLimit = item.memoryLimit; container.memoryPercent = item.memoryPercent; break; } @@ -322,6 +388,38 @@ const loadStats = async () => { } }; +const loadCPUUnit = (t: number) => { + const num = 1000; + if (t < num) return ' ns'; + if (t < Math.pow(num, 2)) return ' μs'; + if (t < Math.pow(num, 3)) return ' ms'; + return ' s'; +}; +function loadCPUValue(t: number) { + const num = 1000; + if (t < num) return t; + if (t < Math.pow(num, 2)) return Number((t / num).toFixed(2)); + if (t < Math.pow(num, 3)) return Number((t / Math.pow(num, 2)).toFixed(2)); + return Number((t / Math.pow(num, 3)).toFixed(2)); +} +const loadMemUnit = (t: number) => { + if (t == 0) { + return ''; + } + const num = 1024; + if (t < num) return ' B'; + if (t < Math.pow(num, 2)) return ' KiB'; + if (t < Math.pow(num, 3)) return ' MiB'; + return ' GiB'; +}; +function loadMemValue(t: number) { + const num = 1024; + if (t < num) return t; + if (t < Math.pow(num, 2)) return Number((t / num).toFixed(2)); + if (t < Math.pow(num, 3)) return Number((t / Math.pow(num, 2)).toFixed(2)); + return Number((t / Math.pow(num, 3)).toFixed(2)); +} + const dialogOperateRef = ref(); const onEdit = async (container: string) => { const res = await loadContainerInfo(container); @@ -549,4 +647,9 @@ onMounted(() => { .source-font { font-size: 12px; } +.svg-icon { + margin-top: -3px; + font-size: 6px; + cursor: pointer; +}