2018-01-23 23:51:04 +03:00
|
|
|
package gosigar
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ConcreteSigar struct{}
|
|
|
|
|
|
|
|
func (c *ConcreteSigar) CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) {
|
|
|
|
// samplesCh is buffered to 1 value to immediately return first CPU sample
|
|
|
|
samplesCh := make(chan Cpu, 1)
|
|
|
|
|
|
|
|
stopCh := make(chan struct{})
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
var cpuUsage Cpu
|
|
|
|
|
|
|
|
// Immediately provide non-delta value.
|
|
|
|
// samplesCh is buffered to 1 value, so it will not block.
|
|
|
|
cpuUsage.Get()
|
|
|
|
samplesCh <- cpuUsage
|
|
|
|
|
|
|
|
ticker := time.NewTicker(collectionInterval)
|
|
|
|
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case <-ticker.C:
|
|
|
|
previousCpuUsage := cpuUsage
|
|
|
|
|
|
|
|
cpuUsage.Get()
|
|
|
|
|
|
|
|
select {
|
|
|
|
case samplesCh <- cpuUsage.Delta(previousCpuUsage):
|
|
|
|
default:
|
|
|
|
// Include default to avoid channel blocking
|
|
|
|
}
|
|
|
|
|
|
|
|
case <-stopCh:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
|
|
|
|
return samplesCh, stopCh
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *ConcreteSigar) GetLoadAverage() (LoadAverage, error) {
|
|
|
|
l := LoadAverage{}
|
|
|
|
err := l.Get()
|
|
|
|
return l, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *ConcreteSigar) GetMem() (Mem, error) {
|
|
|
|
m := Mem{}
|
|
|
|
err := m.Get()
|
|
|
|
return m, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *ConcreteSigar) GetSwap() (Swap, error) {
|
|
|
|
s := Swap{}
|
|
|
|
err := s.Get()
|
|
|
|
return s, err
|
|
|
|
}
|
|
|
|
|
2018-04-21 20:19:12 +03:00
|
|
|
func (c *ConcreteSigar) GetHugeTLBPages() (HugeTLBPages, error) {
|
|
|
|
p := HugeTLBPages{}
|
|
|
|
err := p.Get()
|
|
|
|
return p, err
|
|
|
|
}
|
|
|
|
|
2018-01-23 23:51:04 +03:00
|
|
|
func (c *ConcreteSigar) GetFileSystemUsage(path string) (FileSystemUsage, error) {
|
|
|
|
f := FileSystemUsage{}
|
|
|
|
err := f.Get(path)
|
|
|
|
return f, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *ConcreteSigar) GetFDUsage() (FDUsage, error) {
|
|
|
|
fd := FDUsage{}
|
|
|
|
err := fd.Get()
|
|
|
|
return fd, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetRusage return the resource usage of the process
|
|
|
|
// Possible params: 0 = RUSAGE_SELF, 1 = RUSAGE_CHILDREN, 2 = RUSAGE_THREAD
|
|
|
|
func (c *ConcreteSigar) GetRusage(who int) (Rusage, error) {
|
|
|
|
r := Rusage{}
|
|
|
|
err := r.Get(who)
|
|
|
|
return r, err
|
|
|
|
}
|