diff --git a/agent/app/api/v2/container.go b/agent/app/api/v2/container.go index de6b3aa798a3..37477c9b6cb0 100644 --- a/agent/app/api/v2/container.go +++ b/agent/app/api/v2/container.go @@ -264,13 +264,19 @@ func (b *BaseApi) ContainerListStats(c *gin.Context) { } // @Summary Load container stats size +// @Accept json +// @Param request body dto.OperationWithName true "request" // @Success 200 {object} dto.ContainerItemStats // @Security ApiKeyAuth // @Security Timestamp -// @Router /containers/item/stats/:id [get] +// @Router /containers/item/stats [post] func (b *BaseApi) ContainerItemStats(c *gin.Context) { - containerID := c.Param("id") - data, err := containerService.ContainerItemStats(containerID) + var req dto.OperationWithName + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + + data, err := containerService.ContainerItemStats(req) if err != nil { helper.InternalServer(c, err) return diff --git a/agent/app/dto/container.go b/agent/app/dto/container.go index 945a14dcfec1..7d3751ea21ea 100644 --- a/agent/app/dto/container.go +++ b/agent/app/dto/container.go @@ -63,15 +63,6 @@ type ContainerStatus struct { NetworkCount int `json:"networkCount"` VolumeCount int `json:"volumeCount"` RepoCount int `json:"repoCount"` - - ContainerUsage int64 `json:"containerUsage"` - ContainerReclaimable int64 `json:"containerReclaimable"` - ImageUsage int64 `json:"imageUsage"` - ImageReclaimable int64 `json:"imageReclaimable"` - VolumeUsage int64 `json:"volumeUsage"` - VolumeReclaimable int64 `json:"volumeReclaimable"` - BuildCacheUsage int64 `json:"buildCacheUsage"` - BuildCacheReclaimable int64 `json:"buildCacheReclaimable"` } type ResourceLimit struct { CPU int `json:"cpu"` @@ -129,6 +120,15 @@ type ContainerUpgrade struct { type ContainerItemStats struct { SizeRw int64 `json:"sizeRw"` SizeRootFs int64 `json:"sizeRootFs"` + + ContainerUsage int64 `json:"containerUsage"` + ContainerReclaimable int64 `json:"containerReclaimable"` + ImageUsage int64 `json:"imageUsage"` + ImageReclaimable int64 `json:"imageReclaimable"` + VolumeUsage int64 `json:"volumeUsage"` + VolumeReclaimable int64 `json:"volumeReclaimable"` + BuildCacheUsage int64 `json:"buildCacheUsage"` + BuildCacheReclaimable int64 `json:"buildCacheReclaimable"` } type ContainerListStats struct { ContainerID string `json:"containerID"` diff --git a/agent/app/service/container.go b/agent/app/service/container.go index 0fd80da0cd14..c84013624f4d 100644 --- a/agent/app/service/container.go +++ b/agent/app/service/container.go @@ -70,7 +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) + ContainerItemStats(req dto.OperationWithName) (dto.ContainerItemStats, error) LoadResourceLimit() (*dto.ResourceLimit, error) ContainerRename(req dto.ContainerRename) error ContainerCommit(req dto.ContainerCommit) error @@ -199,34 +199,8 @@ func (u *ContainerService) LoadStatus() (dto.ContainerStatus, error) { defer client.Close() c := context.Background() - usage, err := client.DiskUsage(c, types.DiskUsageOptions{}) - if err != nil { - return data, err - } - - data.ImageCount = len(usage.Images) - data.VolumeCount = len(usage.Volumes) - for _, item := range usage.Images { - data.ImageUsage += item.Size - if item.Containers < 1 { - data.ImageReclaimable += item.Size - } - } - for _, item := range usage.Containers { - data.ContainerUsage += item.SizeRw - if item.State != "running" { - data.ContainerReclaimable += item.SizeRw - } - } - for _, item := range usage.Volumes { - data.VolumeUsage += item.UsageData.Size - if item.UsageData.RefCount == 0 { - data.VolumeReclaimable += item.UsageData.Size - } - } - for _, item := range usage.BuildCache { - data.BuildCacheUsage += item.Size - } + images, _ := client.ImageList(c, image.ListOptions{All: true}) + data.ImageCount = len(images) repo, _ := imageRepoRepo.List() data.RepoCount = len(repo) templates, _ := composeRepo.List() @@ -236,8 +210,9 @@ func (u *ContainerService) LoadStatus() (dto.ContainerStatus, error) { volumes, _ := client.VolumeList(c, volume.ListOptions{}) data.VolumeCount = len(volumes.Volumes) data.ComposeCount = loadComposeCount(client) - data.ContainerCount = len(usage.Containers) - for _, item := range usage.Containers { + containers, _ := client.ContainerList(c, container.ListOptions{All: true}) + data.ContainerCount = len(containers) + for _, item := range containers { switch item.State { case "created": data.Created++ @@ -257,19 +232,48 @@ func (u *ContainerService) LoadStatus() (dto.ContainerStatus, error) { } return data, nil } -func (u *ContainerService) ContainerItemStats(containerID string) (dto.ContainerItemStats, error) { +func (u *ContainerService) ContainerItemStats(req dto.OperationWithName) (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 req.Name != "system" { + defer client.Close() + containerInfo, _, err := client.ContainerInspectWithRaw(context.Background(), req.Name, true) + if err != nil { + return data, err + } + data.SizeRw = *containerInfo.SizeRw + data.SizeRootFs = *containerInfo.SizeRootFs + return data, nil + } + + usage, err := client.DiskUsage(context.Background(), types.DiskUsageOptions{}) if err != nil { return data, err } - data.SizeRw = *containerInfo.SizeRw - data.SizeRootFs = *containerInfo.SizeRootFs + for _, item := range usage.Images { + data.ImageUsage += item.Size + if item.Containers < 1 { + data.ImageReclaimable += item.Size + } + } + for _, item := range usage.Containers { + data.ContainerUsage += item.SizeRw + if item.State != "running" { + data.ContainerReclaimable += item.SizeRw + } + } + for _, item := range usage.Volumes { + data.VolumeUsage += item.UsageData.Size + if item.UsageData.RefCount == 0 { + data.VolumeReclaimable += item.UsageData.Size + } + } + for _, item := range usage.BuildCache { + data.BuildCacheUsage += item.Size + } return data, nil } func (u *ContainerService) ContainerListStats() ([]dto.ContainerListStats, error) { diff --git a/agent/router/ro_container.go b/agent/router/ro_container.go index 8045dc593277..199e033341b7 100644 --- a/agent/router/ro_container.go +++ b/agent/router/ro_container.go @@ -24,7 +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.POST("/item/stats", 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 3d2a36275f33..8e6ad016d7ae 100644 --- a/frontend/src/api/interface/container.ts +++ b/frontend/src/api/interface/container.ts @@ -137,6 +137,15 @@ export namespace Container { export interface ContainerItemStats { sizeRw: number; sizeRootFs: number; + + containerUsage: number; + containerReclaimable: number; + imageUsage: number; + imageReclaimable: number; + volumeUsage: number; + volumeReclaimable: number; + buildCacheUsage: number; + buildCacheReclaimable: number; } export interface ContainerListStats { containerID: string; diff --git a/frontend/src/api/modules/container.ts b/frontend/src/api/modules/container.ts index ce53345e04a4..5869b9a6134a 100644 --- a/frontend/src/api/modules/container.ts +++ b/frontend/src/api/modules/container.ts @@ -44,7 +44,7 @@ export const cleanContainerLog = (containerName: string, operateNode?: string) = return http.post(`/containers/clean/log${params}`, { name: containerName }); }; export const containerItemStats = (containerID: string) => { - return http.get(`/containers/item/stats/${containerID}`); + return http.post(`/containers/item/stats`, { name: containerID }, TimeoutEnum.T_60S); }; export const containerListStats = () => { return http.get>(`/containers/list/stats`); diff --git a/frontend/src/views/container/dashboard/index.vue b/frontend/src/views/container/dashboard/index.vue index 19423b08a829..694b28462b92 100644 --- a/frontend/src/views/container/dashboard/index.vue +++ b/frontend/src/views/container/dashboard/index.vue @@ -90,7 +90,13 @@