diff --git a/pkg/commands/container_stats.go b/pkg/commands/container_stats.go index 419782ddf..4fc9117ba 100644 --- a/pkg/commands/container_stats.go +++ b/pkg/commands/container_stats.go @@ -16,6 +16,8 @@ type RecordedStats struct { type DerivedStats struct { CPUPercentage float64 MemoryPercentage float64 + MemoryUsed int + MemoryLimit int64 } // ContainerStats autogenerated at https://mholt.github.io/json-to-go/ diff --git a/pkg/commands/docker.go b/pkg/commands/docker.go index 28c12c233..b7dbb2b79 100644 --- a/pkg/commands/docker.go +++ b/pkg/commands/docker.go @@ -169,6 +169,8 @@ func (c *DockerCommand) CreateClientStatMonitor(container *Container) { DerivedStats: DerivedStats{ CPUPercentage: stats.CalculateContainerCPUPercentage(), MemoryPercentage: stats.CalculateContainerMemoryUsage(), + MemoryUsed: stats.MemoryStats.Usage, + MemoryLimit: stats.MemoryStats.Limit, }, RecordedAt: time.Now(), } diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index 9c0ad4745..4abeb7865 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -22,6 +22,11 @@ import ( "github.com/jesseduffield/yaml" ) +const ( + CPUCaption = "CPU (%)" + MemoryCaption = "Memory (%)" +) + // UserConfig holds all of the user-configurable options type UserConfig struct { // Gui is for configuring visual things like colors and whether we show or @@ -460,12 +465,12 @@ func GetDefaultConfig() UserConfig { MaxDuration: duration, Graphs: []GraphConfig{ { - Caption: "CPU (%)", + Caption: CPUCaption, StatPath: "DerivedStats.CPUPercentage", Color: "cyan", }, { - Caption: "Memory (%)", + Caption: MemoryCaption, StatPath: "DerivedStats.MemoryPercentage", Color: "green", }, diff --git a/pkg/gui/presentation/container_stats.go b/pkg/gui/presentation/container_stats.go index e3a9b3dcb..7806e1bb4 100644 --- a/pkg/gui/presentation/container_stats.go +++ b/pkg/gui/presentation/container_stats.go @@ -58,7 +58,8 @@ func plotGraph(container *commands.Container, spec config.GraphConfig, width int container.StatsMutex.Lock() defer container.StatsMutex.Unlock() - data := make([]float64, len(container.StatHistory)) + dataLength := len(container.StatHistory) + data := make([]float64, dataLength) for i, stats := range container.StatHistory { value, err := lookup.LookupString(stats, spec.StatPath) @@ -88,12 +89,27 @@ func plotGraph(container *commands.Container, spec config.GraphConfig, width int height = spec.Height } - caption := fmt.Sprintf( - "%s: %0.2f (%v)", - spec.Caption, - data[len(data)-1], - time.Since(container.StatHistory[0].RecordedAt).Round(time.Second), - ) + memoryUsed := utils.FormatDecimalBytes(container.StatHistory[dataLength-1].DerivedStats.MemoryUsed) + memoryLimit := utils.FormatDecimalBytes(int(container.StatHistory[dataLength-1].DerivedStats.MemoryLimit)) + var caption string + switch spec.Caption { + case config.CPUCaption: + caption = fmt.Sprintf( + "%s: %0.2f (%v)", + spec.Caption, + data[dataLength-1], + time.Since(container.StatHistory[0].RecordedAt).Round(time.Second), + ) + case config.MemoryCaption: + caption = fmt.Sprintf( + "%s: %s / %s (%0.2f) (%v)", + spec.Caption, + memoryUsed, + memoryLimit, + data[dataLength-1], + time.Since(container.StatHistory[0].RecordedAt).Round(time.Second), + ) + } return asciigraph.Plot( data,