Skip to content

Commit

Permalink
add pids, IO stat
Browse files Browse the repository at this point in the history
  • Loading branch information
f1yegor committed Mar 12, 2017
1 parent d5ef818 commit dbaebe0
Show file tree
Hide file tree
Showing 9 changed files with 126 additions and 15 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ctop
.idea
4 changes: 2 additions & 2 deletions cwidgets/compact/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type CompactHeader struct {
}

func NewCompactHeader() *CompactHeader {
fields := []string{"", "NAME", "CID", "CPU", "MEM", "NET RX/TX"}
fields := []string{"", "NAME", "CID", "CPU", "MEM", "NET RX/TX", "IO Read/Write", "Pids"}
ch := &CompactHeader{}
ch.Height = 2
for _, f := range fields {
Expand All @@ -27,7 +27,7 @@ func (ch *CompactHeader) GetHeight() int {

func (ch *CompactHeader) SetWidth(w int) {
x := ch.X
autoWidth := calcWidth(w, 5)
autoWidth := calcWidth(w, 7)
for n, col := range ch.pars {
// set status column to static width
if n == 0 {
Expand Down
15 changes: 13 additions & 2 deletions cwidgets/compact/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ type Compact struct {
Cpu *GaugeCol
Memory *GaugeCol
Net *TextCol
IO *TextCol
Pids *TextCol
X, Y int
Width int
Height int
Expand All @@ -32,6 +34,8 @@ func NewCompact(id string) *Compact {
Cpu: NewGaugeCol(),
Memory: NewGaugeCol(),
Net: NewTextCol("-"),
IO: NewTextCol("-"),
Pids: NewTextCol("-"),
X: 1,
Height: 1,
}
Expand Down Expand Up @@ -59,13 +63,17 @@ func (row *Compact) SetMetrics(m metrics.Metrics) {
row.SetCPU(m.CPUUtil)
row.SetNet(m.NetRx, m.NetTx)
row.SetMem(m.MemUsage, m.MemLimit, m.MemPercent)
row.SetIO(m.IOBytesRead, m.IOBytesWrite)
row.SetPids(m.Pids)
}

// Set gauges, counters to default unread values
func (row *Compact) Reset() {
row.Cpu.Reset()
row.Memory.Reset()
row.Net.Reset()
row.IO.Reset()
row.Pids.Reset()
}

func (row *Compact) GetHeight() int {
Expand All @@ -91,7 +99,7 @@ func (row *Compact) SetWidth(width int) {
return
}
x := row.X
autoWidth := calcWidth(width, 5)
autoWidth := calcWidth(width, 7)
for n, col := range row.all() {
// set status column to static width
if n == 0 {
Expand All @@ -116,7 +124,8 @@ func (row *Compact) Buffer() ui.Buffer {
buf.Merge(row.Cpu.Buffer())
buf.Merge(row.Memory.Buffer())
buf.Merge(row.Net.Buffer())

buf.Merge(row.IO.Buffer())
buf.Merge(row.Pids.Buffer())
return buf
}

Expand All @@ -128,5 +137,7 @@ func (row *Compact) all() []ui.GridBufferer {
row.Cpu,
row.Memory,
row.Net,
row.IO,
row.Pids,
}
}
10 changes: 10 additions & 0 deletions cwidgets/compact/setters.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ func (row *Compact) SetNet(rx int64, tx int64) {
row.Net.Set(label)
}

func (row *Compact) SetIO(read int64, write int64) {
label := fmt.Sprintf("%s / %s", cwidgets.ByteFormat(read), cwidgets.ByteFormat(write))
row.IO.Set(label)
}

func (row *Compact) SetPids(val int) {
label := fmt.Sprintf("%s", strconv.Itoa(val))
row.Pids.Set(label)
}

func (row *Compact) SetCPU(val int) {
row.Cpu.BarColor = colorScale(val)
row.Cpu.Label = fmt.Sprintf("%s%%", strconv.Itoa(val))
Expand Down
51 changes: 51 additions & 0 deletions cwidgets/expanded/io.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package expanded

import (
"fmt"
"strings"

"github.com/bcicen/ctop/cwidgets"
ui "github.com/gizak/termui"
)

type IO struct {
*ui.Sparklines
readHist *DiffHist
writeHist *DiffHist
}

func NewIO() *IO {
io := &IO{ui.NewSparklines(), NewDiffHist(60), NewDiffHist(60)}
io.BorderLabel = "IO"
io.Height = 6
io.Width = colWidth[0]
io.X = 0
io.Y = 24

read := ui.NewSparkline()
read.Title = "read"
read.Height = 1
read.Data = io.readHist.Data
read.LineColor = ui.ColorGreen

write := ui.NewSparkline()
write.Title = "write"
write.Height = 1
write.Data = io.writeHist.Data
write.LineColor = ui.ColorYellow

io.Lines = []ui.Sparkline{read, write}
return io
}

func (w *IO) Update(read int64, write int64) {
var rate string

w.readHist.Append(int(read))
rate = strings.ToLower(cwidgets.ByteFormatInt(w.readHist.Val))
w.Lines[0].Title = fmt.Sprintf("read [%s/s]", rate)

w.writeHist.Append(int(write))
rate = strings.ToLower(cwidgets.ByteFormatInt(w.writeHist.Val))
w.Lines[1].Title = fmt.Sprintf("write [%s/s]", rate)
}
5 changes: 5 additions & 0 deletions cwidgets/expanded/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ type Expanded struct {
Net *Net
Cpu *Cpu
Mem *Mem
IO *IO
Width int
}

Expand All @@ -29,6 +30,7 @@ func NewExpanded(id string) *Expanded {
Net: NewNet(),
Cpu: NewCpu(),
Mem: NewMem(),
IO: NewIO(),
Width: ui.TermWidth(),
}
}
Expand All @@ -45,6 +47,7 @@ func (e *Expanded) SetMetrics(m metrics.Metrics) {
e.Cpu.Update(m.CPUUtil)
e.Net.Update(m.NetRx, m.NetTx)
e.Mem.Update(int(m.MemUsage), int(m.MemLimit))
e.IO.Update(m.IOBytesRead, m.IOBytesWrite)
}

func (e *Expanded) Align() {
Expand Down Expand Up @@ -74,6 +77,7 @@ func (e *Expanded) Buffer() ui.Buffer {
buf.Merge(e.Cpu.Buffer())
buf.Merge(e.Mem.Buffer())
buf.Merge(e.Net.Buffer())
buf.Merge(e.IO.Buffer())
return buf
}

Expand All @@ -83,6 +87,7 @@ func (e *Expanded) all() []ui.GridBufferer {
e.Cpu,
e.Mem,
e.Net,
e.IO,
}
}

Expand Down
15 changes: 15 additions & 0 deletions metrics/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ func (c *Docker) Start() {
c.ReadCPU(s)
c.ReadMem(s)
c.ReadNet(s)
c.ReadIO(s)
c.stream <- c.Metrics
}
log.Infof("collector stopped for container: %s", c.id)
Expand Down Expand Up @@ -79,6 +80,7 @@ func (c *Docker) ReadCPU(stats *api.Stats) {
c.CPUUtil = round((cpudiff / syscpudiff * 100) * ncpus)
c.lastCpu = total
c.lastSysCpu = system
c.Pids = int(stats.PidsStats.Current)
}

func (c *Docker) ReadMem(stats *api.Stats) {
Expand All @@ -95,3 +97,16 @@ func (c *Docker) ReadNet(stats *api.Stats) {
}
c.NetRx, c.NetTx = rx, tx
}

func (c *Docker) ReadIO(stats *api.Stats) {
var read, write int64
for _, blk := range stats.BlkioStats.IOServiceBytesRecursive {
if blk.Op == "Read" {
read = int64(blk.Value)
}
if blk.Op == "Write" {
write = int64(blk.Value)
}
}
c.IOBytesRead, c.IOBytesWrite = read, write
}
28 changes: 17 additions & 11 deletions metrics/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,27 @@ import (
var log = logging.Init()

type Metrics struct {
CPUUtil int
NetTx int64
NetRx int64
MemLimit int64
MemPercent int
MemUsage int64
CPUUtil int
NetTx int64
NetRx int64
MemLimit int64
MemPercent int
MemUsage int64
IOBytesRead int64
IOBytesWrite int64
Pids int
}

func NewMetrics() Metrics {
return Metrics{
CPUUtil: -1,
NetTx: -1,
NetRx: -1,
MemUsage: -1,
MemPercent: -1,
CPUUtil: -1,
NetTx: -1,
NetRx: -1,
MemUsage: -1,
MemPercent: -1,
IOBytesRead: -1,
IOBytesWrite: -1,
Pids: -1,
}
}

Expand Down
11 changes: 11 additions & 0 deletions sort.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,15 @@ var Sorters = map[string]sortMethod{
}
return sum1 > sum2
},
"io": func(c1, c2 *Container) bool {
sum1 := sumIO(c1)
sum2 := sumIO(c2)
// Use secondary sort method if equal values
if sum1 == sum2 {
return nameSorter(c1, c2)
}
return sum1 > sum2
},
"state": func(c1, c2 *Container) bool {
// Use secondary sort method if equal values
c1state := c1.GetMeta("state")
Expand Down Expand Up @@ -101,3 +110,5 @@ func (a Containers) Filter() {
}

func sumNet(c *Container) int64 { return c.NetRx + c.NetTx }

func sumIO(c *Container) int64 { return c.IOBytesRead + c.IOBytesWrite }

0 comments on commit dbaebe0

Please sign in to comment.