summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd/podman/common.go12
-rw-r--r--cmd/podman/history.go7
-rw-r--r--cmd/podman/images.go2
-rw-r--r--cmd/podman/ps.go2
-rw-r--r--cmd/podman/stats.go41
-rw-r--r--docs/podman-stats.1.md60
-rw-r--r--libpod/stats.go2
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 {