diff --git a/agent/app/api/v2/container.go b/agent/app/api/v2/container.go index 9e28912bd..de6b3aa79 100644 --- a/agent/app/api/v2/container.go +++ b/agent/app/api/v2/container.go @@ -263,6 +263,21 @@ func (b *BaseApi) ContainerListStats(c *gin.Context) { helper.SuccessWithData(c, data) } +// @Summary Load container stats size +// @Success 200 {object} dto.ContainerItemStats +// @Security ApiKeyAuth +// @Security Timestamp +// @Router /containers/item/stats/:id [get] +func (b *BaseApi) ContainerItemStats(c *gin.Context) { + containerID := c.Param("id") + data, err := containerService.ContainerItemStats(containerID) + if err != nil { + helper.InternalServer(c, err) + return + } + helper.SuccessWithData(c, data) +} + // @Tags Container // @Summary Create container // @Accept json diff --git a/agent/app/dto/container.go b/agent/app/dto/container.go index 2358c8272..945a14dcf 100644 --- a/agent/app/dto/container.go +++ b/agent/app/dto/container.go @@ -31,9 +31,6 @@ type ContainerInfo struct { Network []string `json:"network"` Ports []string `json:"ports"` - SizeRw int64 `json:"sizeRw"` - SizeRootFs int64 `json:"sizeRootFs"` - IsFromApp bool `json:"isFromApp"` IsFromCompose bool `json:"isFromCompose"` @@ -129,6 +126,10 @@ type ContainerUpgrade struct { ForcePull bool `json:"forcePull"` } +type ContainerItemStats struct { + SizeRw int64 `json:"sizeRw"` + SizeRootFs int64 `json:"sizeRootFs"` +} type ContainerListStats struct { ContainerID string `json:"containerID"` diff --git a/agent/app/service/container.go b/agent/app/service/container.go index 33c0fb777..000076301 100644 --- a/agent/app/service/container.go +++ b/agent/app/service/container.go @@ -70,6 +70,7 @@ type IContainerService interface { ContainerUpgrade(req dto.ContainerUpgrade) error ContainerInfo(req dto.OperationWithName) (*dto.ContainerOperate, error) ContainerListStats() ([]dto.ContainerListStats, error) + ContainerItemStats(containerID string) (dto.ContainerItemStats, error) LoadResourceLimit() (*dto.ResourceLimit, error) ContainerRename(req dto.ContainerRename) error ContainerCommit(req dto.ContainerCommit) error @@ -101,10 +102,7 @@ func (u *ContainerService) Page(req dto.PageContainer) (int64, interface{}, erro return 0, nil, err } defer client.Close() - options := container.ListOptions{ - All: true, - Size: true, - } + options := container.ListOptions{All: true} if len(req.Filters) != 0 { options.Filters = filters.NewArgs() options.Filters.Add("label", req.Filters) @@ -259,6 +257,21 @@ func (u *ContainerService) LoadStatus() (dto.ContainerStatus, error) { } return data, nil } +func (u *ContainerService) ContainerItemStats(containerID string) (dto.ContainerItemStats, error) { + var data dto.ContainerItemStats + client, err := docker.NewDockerClient() + if err != nil { + return data, err + } + defer client.Close() + containerInfo, _, err := client.ContainerInspectWithRaw(context.Background(), containerID, true) + if err != nil { + return data, err + } + data.SizeRw = *containerInfo.SizeRw + data.SizeRootFs = *containerInfo.SizeRootFs + return data, nil +} func (u *ContainerService) ContainerListStats() ([]dto.ContainerListStats, error) { client, err := docker.NewDockerClient() if err != nil { @@ -1760,8 +1773,6 @@ func searchWithFilter(req dto.PageContainer, containers []container.Summary) []d ImageName: item.Image, State: item.State, RunTime: item.Status, - SizeRw: item.SizeRw, - SizeRootFs: item.SizeRootFs, IsFromApp: IsFromApp, IsFromCompose: IsFromCompose, } diff --git a/agent/router/ro_container.go b/agent/router/ro_container.go index 4a89bafc5..8045dc593 100644 --- a/agent/router/ro_container.go +++ b/agent/router/ro_container.go @@ -24,6 +24,7 @@ func (s *ContainerRouter) InitRouter(Router *gin.RouterGroup) { baRouter.POST("/list/byimage", baseApi.ListContainerByImage) baRouter.GET("/status", baseApi.LoadContainerStatus) baRouter.GET("/list/stats", baseApi.ContainerListStats) + baRouter.GET("/item/stats/:id", baseApi.ContainerItemStats) baRouter.GET("/search/log", baseApi.ContainerStreamLogs) baRouter.POST("/download/log", baseApi.DownloadContainerLogs) baRouter.GET("/limit", baseApi.LoadResourceLimit) diff --git a/frontend/src/api/interface/container.ts b/frontend/src/api/interface/container.ts index 6bdbded40..3d2a36275 100644 --- a/frontend/src/api/interface/container.ts +++ b/frontend/src/api/interface/container.ts @@ -134,6 +134,10 @@ export namespace Container { name: string; state: string; } + export interface ContainerItemStats { + sizeRw: number; + sizeRootFs: number; + } export interface ContainerListStats { containerID: string; cpuTotalUsage: number; diff --git a/frontend/src/api/modules/container.ts b/frontend/src/api/modules/container.ts index f5ba0b7fb..ce53345e0 100644 --- a/frontend/src/api/modules/container.ts +++ b/frontend/src/api/modules/container.ts @@ -43,6 +43,9 @@ export const cleanContainerLog = (containerName: string, operateNode?: string) = const params = operateNode ? `?operateNode=${operateNode}` : ''; return http.post(`/containers/clean/log${params}`, { name: containerName }); }; +export const containerItemStats = (containerID: string) => { + return http.get(`/containers/item/stats/${containerID}`); +}; export const containerListStats = () => { return http.get>(`/containers/list/stats`); }; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index ed032caf0..acea6e869 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -823,6 +823,7 @@ const message = { memUsage: 'Memory usage', memTotal: 'Memory limit', memCache: 'Memory cache', + loadSize: 'Get Container Size', ip: 'IP address', cpuShare: 'CPU shares', cpuShareHelper: diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index 663b4754e..48cac0e4f 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -826,6 +826,7 @@ const message = { memUsage: 'Uso de memoria', memTotal: 'Límite de memoria', memCache: 'Caché de memoria', + loadSize: 'Obtener Tamaño del Contenedor', ip: 'Dirección IP', cpuShare: 'Proporción de CPU', cpuShareHelper: diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 7948b091a..80dc20fdb 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -803,6 +803,7 @@ const message = { memUsage: 'メモリの使用', memTotal: 'メモリ制限', memCache: 'メモリキャッシュ', + loadSize: 'コンテナサイズを取得', ip: 'IPアドレス', cpuShare: 'CPU共有', cpuShareHelper: diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index d3559328c..4a495a8e4 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -796,6 +796,7 @@ const message = { memUsage: '메모리 사용', memTotal: '메모리 한도', memCache: '메모리 캐시', + loadSize: '컨테이너 크기 가져오기', ip: 'IP 주소', cpuShare: 'CPU 공유', cpuShareHelper: diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index 46ab45002..117c685b9 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -816,6 +816,7 @@ const message = { memUsage: 'Penggunaan memori', memTotal: 'Had memori', memCache: 'Cache memori', + loadSize: 'Dapatkan Saiz Bekas', ip: 'Alamat IP', cpuShare: 'Bahagian CPU', cpuShareHelper: diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index aa752f4cd..b2a81a3a6 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -814,6 +814,7 @@ const message = { memUsage: 'Uso de memória', memTotal: 'Limite de memória', memCache: 'Cache de memória', + loadSize: 'Obter Tamanho do Contêiner', ip: 'Endereço IP', cpuShare: 'Atribuição de CPU', cpuShareHelper: diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 944d8e16d..220a16f00 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -812,6 +812,7 @@ const message = { memUsage: 'Использование памяти', memTotal: 'Лимит памяти', memCache: 'Кэш памяти', + loadSize: 'Получить Размер Контейнера', ip: 'IP-адрес', cpuShare: 'Доли CPU', cpuShareHelper: diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index a1a23c58a..6bcc8dc3c 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -832,6 +832,7 @@ const message = { memUsage: 'Bellek kullanımı', memTotal: 'Bellek sınırı', memCache: 'Bellek önbelleği', + loadSize: 'Konteyner Boyutunu Al', ip: 'IP adresi', cpuShare: 'CPU paylaşımları', cpuShareHelper: diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 438fcc692..ea2e61c17 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -788,6 +788,7 @@ const message = { memUsage: '記憶體使用', memTotal: '記憶體限額', memCache: '快取使用', + loadSize: '取得容器大小', ip: 'IP 位址', cpuShare: 'CPU 權重', cpuShareHelper: '容器預設份額為 1024 個 CPU,增大可使目前容器獲得更多的 CPU 時間', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index 4c6db5acc..dcb8caa8f 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -789,6 +789,7 @@ const message = { memUsage: '内存使用', memTotal: '内存限额', memCache: '缓存使用', + loadSize: '获取容器大小', ip: 'IP 地址', cpuShare: 'CPU 权重', cpuShareHelper: '容器默认份额为 1024 个 CPU,增大可使当前容器获得更多的 CPU 时间', diff --git a/frontend/src/views/container/container/index.vue b/frontend/src/views/container/container/index.vue index 16f871779..41425d6aa 100644 --- a/frontend/src/views/container/container/index.vue +++ b/frontend/src/views/container/container/index.vue @@ -209,8 +209,7 @@ {{ computeSizeForDocker(row.memoryLimit) }} - - + {{ computeSize2(row.sizeRw) }} - + @@ -384,6 +397,7 @@ import ContainerLogDialog from '@/components/log/container-drawer/index.vue'; import Status from '@/components/status/index.vue'; import { reactive, onMounted, ref, computed } from 'vue'; import { + containerItemStats, containerListStats, containerOperator, inspect, @@ -588,6 +602,14 @@ const refresh = async () => { } }; +const loadSize = async (row: any) => { + containerItemStats(row.containerID).then((res) => { + row.sizeRw = res.data.sizeRw || 0; + row.sizeRootFs = res.data.sizeRootFs || 0; + row.hasLoadSize = true; + }); +}; + const loadStats = async () => { const res = await containerListStats(); let stats = res.data || [];