Skip to content

Commit

Permalink
Add basic stats implementation
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
  • Loading branch information
crosbymichael committed Nov 6, 2019
1 parent 7bf30d7 commit 54a40c2
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 71 deletions.
21 changes: 21 additions & 0 deletions cmd/cgctl/main.go
Expand Up @@ -45,6 +45,7 @@ func main() {
newCommand,
delCommand,
listCommand,
statCommand,
}
app.Before = func(clix *cli.Context) error {
if clix.GlobalBool("debug") {
Expand Down Expand Up @@ -118,3 +119,23 @@ var listCommand = cli.Command{
return nil
},
}

var statCommand = cli.Command{
Name: "stat",
Usage: "stat a cgroup",
Action: func(clix *cli.Context) error {
path := clix.Args().First()
c, err := v2.LoadManager(clix.GlobalString("mountpoint"), path)
if err != nil {
return err
}
stats, err := c.Stat()
if err != nil {
return err
}
for k, v := range stats {
fmt.Printf("%s->%d\n", k, v)
}
return nil
},
}
45 changes: 43 additions & 2 deletions v2/manager.go
Expand Up @@ -18,6 +18,7 @@ package v2

import (
"bufio"
"fmt"
"io/ioutil"
"os"
"path/filepath"
Expand All @@ -29,7 +30,8 @@ import (
)

const (
subtreeControl = "cgroup.subtree_control"
subtreeControl = "cgroup.subtree_control"
controllersFile = "cgroup.controllers"
)

type cgValuer interface {
Expand Down Expand Up @@ -135,7 +137,7 @@ type Manager struct {
}

func (c *Manager) ListControllers() ([]string, error) {
f, err := os.Open(filepath.Join(c.path, subtreeControl))
f, err := os.Open(filepath.Join(c.path, controllersFile))
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -243,6 +245,45 @@ func (c *Manager) Procs(recursive bool) ([]uint64, error) {
return processes, err
}

func (c *Manager) Stat() (map[string]uint64, error) {
controllers, err := c.ListControllers()
if err != nil {
return nil, err
}
out := make(map[string]uint64)
for _, controller := range controllers {
filename := fmt.Sprintf("%s.stat", controller)
if err := readStatsFile(c.path, filename, out); err != nil {
if os.IsNotExist(err) {
continue
}
return nil, err
}
}
return out, nil
}

func readStatsFile(path string, file string, out map[string]uint64) error {
f, err := os.Open(filepath.Join(path, file))
if err != nil {
return err
}
defer f.Close()

s := bufio.NewScanner(f)
for s.Scan() {
if err := s.Err(); err != nil {
return err
}
name, value, err := parseKV(s.Text())
if err != nil {
return err
}
out[name] = value
}
return nil
}

func (c *Manager) Freeze() error {
return c.freeze(c.path, Frozen)
}
Expand Down
69 changes: 0 additions & 69 deletions v2/memory.go
Expand Up @@ -43,72 +43,3 @@ func (r *Memory) Values() (o []Value) {
}
return o
}

/*
func (m *memoryController) Stat(g GroupPath, stats *statsv2.Metrics) error {
f, err := os.Open(filepath.Join(m.path(g), "memory.stat"))
if err != nil {
return err
}
defer f.Close()
stats.Memory = &statsv2.MemoryStat{
Usage: &statsv2.MemoryEntry{},
Swap: &statsv2.MemoryEntry{},
}
sc := bufio.NewScanner(f)
for sc.Scan() {
if err := sc.Err(); err != nil {
return err
}
filename, v, err := parseKV(sc.Text())
if err != nil {
return err
}
if filename == "cache" {
stats.Memory.Cache = v
break
}
}
for _, t := range []struct {
module string
entry *statsv2.MemoryEntry
}{
{
module: "",
entry: stats.Memory.Usage,
},
{
module: "memsw",
entry: stats.Memory.Swap,
},
} {
for _, tt := range []struct {
name string
value *uint64
}{
{
name: "usage_in_bytes",
value: &t.entry.Usage,
},
{
name: "limit_in_bytes",
value: &t.entry.Limit,
},
} {
parts := []string{"memory"}
if t.module != "" {
parts = append(parts, t.module)
}
parts = append(parts, tt.name)
v, err := readUint(filepath.Join(m.path(g), strings.Join(parts, ".")))
if err != nil {
return err
}
*tt.value = v
}
}
return nil
}
*/

0 comments on commit 54a40c2

Please sign in to comment.