github.com/elastic/gosigar@v0.14.3/concrete_sigar.go (about) 1 package gosigar 2 3 import ( 4 "time" 5 ) 6 7 type ConcreteSigar struct{} 8 9 func (c *ConcreteSigar) CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) { 10 // samplesCh is buffered to 1 value to immediately return first CPU sample 11 samplesCh := make(chan Cpu, 1) 12 13 stopCh := make(chan struct{}) 14 15 go func() { 16 var cpuUsage Cpu 17 18 // Immediately provide non-delta value. 19 // samplesCh is buffered to 1 value, so it will not block. 20 cpuUsage.Get() 21 samplesCh <- cpuUsage 22 23 ticker := time.NewTicker(collectionInterval) 24 25 for { 26 select { 27 case <-ticker.C: 28 previousCpuUsage := cpuUsage 29 30 cpuUsage.Get() 31 32 select { 33 case samplesCh <- cpuUsage.Delta(previousCpuUsage): 34 default: 35 // Include default to avoid channel blocking 36 } 37 38 case <-stopCh: 39 return 40 } 41 } 42 }() 43 44 return samplesCh, stopCh 45 } 46 47 func (c *ConcreteSigar) GetLoadAverage() (LoadAverage, error) { 48 l := LoadAverage{} 49 err := l.Get() 50 return l, err 51 } 52 53 func (c *ConcreteSigar) GetMem() (Mem, error) { 54 m := Mem{} 55 err := m.Get() 56 return m, err 57 } 58 59 func (c *ConcreteSigar) GetSwap() (Swap, error) { 60 s := Swap{} 61 err := s.Get() 62 return s, err 63 } 64 65 func (c *ConcreteSigar) GetHugeTLBPages() (HugeTLBPages, error) { 66 p := HugeTLBPages{} 67 err := p.Get() 68 return p, err 69 } 70 71 func (c *ConcreteSigar) GetFileSystemUsage(path string) (FileSystemUsage, error) { 72 f := FileSystemUsage{} 73 err := f.Get(path) 74 return f, err 75 } 76 77 func (c *ConcreteSigar) GetFDUsage() (FDUsage, error) { 78 fd := FDUsage{} 79 err := fd.Get() 80 return fd, err 81 } 82 83 // GetRusage return the resource usage of the process 84 // Possible params: 0 = RUSAGE_SELF, 1 = RUSAGE_CHILDREN, 2 = RUSAGE_THREAD 85 func (c *ConcreteSigar) GetRusage(who int) (Rusage, error) { 86 r := Rusage{} 87 err := r.Get(who) 88 return r, err 89 }