aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/elastic/gosigar/concrete_sigar.go
blob: e3ee80a980b982de819bf0a42491cd69da67930f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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
}

func (c *ConcreteSigar) GetHugeTLBPages() (HugeTLBPages, error) {
    p := HugeTLBPages{}
    err := p.Get()
    return p, err
}

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
}