diff options
-rw-r--r-- | cmd/podman/common.go | 12 | ||||
-rw-r--r-- | cmd/podman/history.go | 7 | ||||
-rw-r--r-- | cmd/podman/images.go | 2 | ||||
-rw-r--r-- | cmd/podman/ps.go | 2 | ||||
-rw-r--r-- | cmd/podman/stats.go | 41 | ||||
-rw-r--r-- | docs/podman-stats.1.md | 60 | ||||
-rw-r--r-- | libpod/stats.go | 2 |
7 files changed, 75 insertions, 51 deletions
diff --git a/cmd/podman/common.go b/cmd/podman/common.go index ae4bbd65d..921f30b84 100644 --- a/cmd/podman/common.go +++ b/cmd/podman/common.go @@ -22,7 +22,10 @@ var ( } ) -const crioConfigPath = "/etc/crio/crio.conf" +const ( + crioConfigPath = "/etc/crio/crio.conf" + idTruncLength = 12 +) func getRuntime(c *cli.Context) (*libpod.Runtime, error) { @@ -88,6 +91,13 @@ func splitCamelCase(src string) string { return strings.Join(entries, " ") } +func shortID(id string) string { + if len(id) > idTruncLength { + return id[:idTruncLength] + } + return id +} + // validateFlags searches for StringFlags or StringSlice flags that never had // a value set. This commonly occurs when the CLI mistakenly takes the next // option and uses it as a value. diff --git a/cmd/podman/history.go b/cmd/podman/history.go index f142f5fd4..1164555d3 100644 --- a/cmd/podman/history.go +++ b/cmd/podman/history.go @@ -14,10 +14,7 @@ import ( "github.com/urfave/cli" ) -const ( - createdByTruncLength = 45 - idTruncLength = 12 -) +const createdByTruncLength = 45 // historyTemplateParams stores info about each layer type historyTemplateParams struct { @@ -169,7 +166,7 @@ func getHistoryTemplateOutput(history []v1.History, layers []types.BlobInfo, ima imageID = "<missing>" } if !opts.noTrunc && i == len(history)-1 { - imageID = imageID[:idTruncLength] + imageID = shortID(imageID) } var size int64 diff --git a/cmd/podman/images.go b/cmd/podman/images.go index 90dd8ae12..1f1174950 100644 --- a/cmd/podman/images.go +++ b/cmd/podman/images.go @@ -194,7 +194,7 @@ func getImagesTemplateOutput(runtime *libpod.Runtime, images []*storage.Image, o imageID := "sha256:" + img.ID if !opts.noTrunc { - imageID = img.ID[:idTruncLength] + imageID = shortID(img.ID) } repository := "<none>" diff --git a/cmd/podman/ps.go b/cmd/podman/ps.go index 0b75b9a96..e4c90187b 100644 --- a/cmd/podman/ps.go +++ b/cmd/podman/ps.go @@ -482,7 +482,7 @@ func getTemplateOutput(containers []*libpod.Container, opts psOptions) ([]psTemp } if !opts.noTrunc { - ctrID = ctr.ID()[:idTruncLength] + ctrID = shortID(ctr.ID()) imageName = conConfig.RootfsImageName } diff --git a/cmd/podman/stats.go b/cmd/podman/stats.go index 871eb9e2f..21cca1d83 100644 --- a/cmd/podman/stats.go +++ b/cmd/podman/stats.go @@ -15,14 +15,14 @@ import ( ) type statsOutputParams struct { - Container string `json:"name"` - ID string `json:"id"` - CPUPerc string `json:"cpu_percent"` - MemUsage string `json:"mem_usage"` - MemPerc string `json:"mem_percent"` - NetIO string `json:"netio"` - BlockIO string `json:"blocki"` - PIDS string `json:"pids"` + ID string `json:"id"` + Name string `json:"name"` + CPUPerc string `json:"cpu_percent"` + MemUsage string `json:"mem_usage"` + MemPerc string `json:"mem_percent"` + NetIO string `json:"netio"` + BlockIO string `json:"blocki"` + PIDS string `json:"pids"` } var ( @@ -37,7 +37,7 @@ var ( }, cli.StringFlag{ Name: "format", - Usage: "pretty-print container statistics using a Go template", + Usage: "pretty-print container statistics to JSON or using a Go template", }, cli.BoolFlag{ Name: "no-reset", @@ -184,7 +184,12 @@ func outputStats(stats []*libpod.ContainerStats, format string) error { } func genStatsFormat() (format string) { - return "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDS}}" + if format != "" { + // "\t" from the command line is not being recognized as a tab + // replacing the string "\t" to a tab character if the user passes in "\t" + return strings.Replace(format, `\t`, "\t", -1) + } + return "table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDS}}" } // imagesToGeneric creates an empty array of interfaces for output @@ -248,13 +253,13 @@ func pidsToString(pid uint64) string { func getStatsOutputParams(stats *libpod.ContainerStats) statsOutputParams { return statsOutputParams{ - Container: stats.ContainerID[:12], - ID: stats.ContainerID, - CPUPerc: floatToPercentString(stats.CPU), - MemUsage: combineHumanValues(stats.MemUsage, stats.MemLimit), - MemPerc: floatToPercentString(stats.MemPerc), - NetIO: combineHumanValues(stats.NetInput, stats.NetOutput), - BlockIO: combineHumanValues(stats.BlockInput, stats.BlockOutput), - PIDS: pidsToString(stats.PIDs), + Name: stats.Name, + ID: shortID(stats.ContainerID), + CPUPerc: floatToPercentString(stats.CPU), + MemUsage: combineHumanValues(stats.MemUsage, stats.MemLimit), + MemPerc: floatToPercentString(stats.MemPerc), + NetIO: combineHumanValues(stats.NetInput, stats.NetOutput), + BlockIO: combineHumanValues(stats.BlockInput, stats.BlockOutput), + PIDS: pidsToString(stats.PIDs), } } diff --git a/docs/podman-stats.1.md b/docs/podman-stats.1.md index b071a27fa..7af14b8a6 100644 --- a/docs/podman-stats.1.md +++ b/docs/podman-stats.1.md @@ -31,48 +31,58 @@ Disable streaming stats and only pull the first result, default setting is false **--format="TEMPLATE"** -Pretty-print images using a Go template +Pretty-print container statistics to JSON or using a Go template + +Valid placeholders for the Go template are listed below: + +| **Placeholder** | **Description** | +| --------------- | --------------- | +| .ID | Container ID | +| .Name | Container Name | +| .CPUPerc | CPU percentage | +| .MemUsage | Memory usage | +| .MemPerc | Memory percentage | +| .NetIO | Network IO | +| .BlockIO | Block IO | +| .PIDS | Number of PIDs | ## EXAMPLE ``` # podman stats -a --no-stream - -CONTAINER CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS -132ade621b5d 0.00% 1.618MB / 33.08GB 0.00% 0B / 0B 0B / 0B 0 -940e00a40a77 0.00% 1.544MB / 33.08GB 0.00% 0B / 0B 0B / 0B 0 -72a1dfb44ca7 0.00% 1.528MB / 33.08GB 0.00% 0B / 0B 0B / 0B 0 -f5a62a71b07b 0.00% 5.669MB / 33.08GB 0.02% 0B / 0B 0B / 0B 3 -31eab2cf93f4 0.00% 16.42MB / 33.08GB 0.05% 0B / 0B 22.43MB / 0B 0 - -# +ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS +a9f807ffaacd frosty_hodgkin -- 3.092MB / 16.7GB 0.02% -- / -- -- / -- 2 +3b33001239ee sleepy_stallman -- -- / -- -- -- / -- -- / -- -- ``` ``` -# podman stats --no-stream 31eab2cf93f4 -CONTAINER CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS -31eab2cf93f4 0.00% 16.42MB / 33.08GB 0.05% 0B / 0B 22.43MB / 0B 0 - -# +# podman stats --no-stream a9f80 +ID NAME CPU % MEM USAGE / LIMIT MEM % NET IO BLOCK IO PIDS +a9f807ffaacd frosty_hodgkin -- 3.092MB / 16.7GB 0.02% -- / -- -- / -- 2 ``` + ``` -# podman stats --no-stream --format=json 31eab2cf93f4 +# podman stats --no-stream --format=json a9f80 [ { - "name": "31eab2cf93f4", - "id": "31eab2cf93f413af64a3f13d8d78393238658465d75e527333a8577f251162ec", - "cpu_percent": "0.00%", - "mem_usage": "16.42MB / 33.08GB", - "mem_percent": "0.05%", - "netio": "0B / 0B", - "blocki": "22.43MB / 0B", - "pids": 0 + "id": "a9f807ffaacd", + "name": "frosty_hodgkin", + "cpu_percent": "--", + "mem_usage": "3.092MB / 16.7GB", + "mem_percent": "0.02%", + "netio": "-- / --", + "blocki": "-- / --", + "pids": "2" } ] -# ``` +``` +# podman stats --no-stream --format "table {{.ID}} {{.Name}} {{.MemUsage}}" 6eae +ID NAME MEM USAGE / LIMIT +6eae9e25a564 clever_bassi 3.031MB / 16.7GB +``` ## SEE ALSO podman(1) diff --git a/libpod/stats.go b/libpod/stats.go index e87654277..47fb16194 100644 --- a/libpod/stats.go +++ b/libpod/stats.go @@ -13,6 +13,7 @@ import ( // ContainerStats contains the statistics information for a running container type ContainerStats struct { ContainerID string + Name string CPU float64 CPUNano uint64 SystemNano uint64 @@ -30,6 +31,7 @@ type ContainerStats struct { func (c *Container) GetContainerStats(previousStats *ContainerStats) (*ContainerStats, error) { stats := new(ContainerStats) stats.ContainerID = c.ID() + stats.Name = c.Name() c.lock.Lock() defer c.lock.Unlock() if err := c.syncContainer(); err != nil { |