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  }