forked from cloudfoundry/bosh-agent
/
sigar_stats_collector.go
124 lines (97 loc) · 2.9 KB
/
sigar_stats_collector.go
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package sigar
import (
"sync"
"time"
sigar "github.com/cloudfoundry/gosigar"
boshstats "github.com/cloudfoundry/bosh-agent/platform/stats"
bosherr "github.com/cloudfoundry/bosh-utils/errors"
)
type sigarStatsCollector struct {
statsSigar sigar.Sigar
latestCPUStats boshstats.CPUStats
latestCPUStatsLock sync.RWMutex
}
func NewSigarStatsCollector(sigar sigar.Sigar) boshstats.Collector {
return &sigarStatsCollector{
statsSigar: sigar,
}
}
func (s *sigarStatsCollector) StartCollecting(collectionInterval time.Duration, latestGotUpdated chan struct{}) {
cpuSamplesCh, _ := s.statsSigar.CollectCpuStats(collectionInterval)
go func() {
for cpuSample := range cpuSamplesCh {
s.latestCPUStatsLock.Lock()
s.latestCPUStats.User = cpuSample.User
s.latestCPUStats.Nice = cpuSample.Nice
s.latestCPUStats.Sys = cpuSample.Sys
s.latestCPUStats.Wait = cpuSample.Wait
s.latestCPUStats.Total = cpuSample.Total()
s.latestCPUStatsLock.Unlock()
if latestGotUpdated != nil {
latestGotUpdated <- struct{}{}
}
}
}()
}
func (s *sigarStatsCollector) GetCPULoad() (load boshstats.CPULoad, err error) {
l, err := s.statsSigar.GetLoadAverage()
if err != nil {
if err != sigar.ErrNotImplemented {
err = bosherr.WrapError(err, "Getting Sigar Load Average")
}
return
}
load.One = l.One
load.Five = l.Five
load.Fifteen = l.Fifteen
return
}
func (s *sigarStatsCollector) GetCPUStats() (boshstats.CPUStats, error) {
s.latestCPUStatsLock.RLock()
defer s.latestCPUStatsLock.RUnlock()
return s.latestCPUStats, nil
}
func (s *sigarStatsCollector) GetMemStats() (usage boshstats.Usage, err error) {
mem, err := s.statsSigar.GetMem()
if err != nil {
err = bosherr.WrapError(err, "Getting Sigar Mem")
return
}
usage.Total = mem.Total
// actual_used = mem->used - (kern_buffers + kern_cached)
// (https://github.com/hyperic/sigar/blob/1898438/src/os/linux/linux_sigar.c#L344)
usage.Used = mem.ActualUsed
return
}
func (s *sigarStatsCollector) GetSwapStats() (usage boshstats.Usage, err error) {
swap, err := s.statsSigar.GetSwap()
if err != nil {
err = bosherr.WrapError(err, "Getting Sigar Swap")
return
}
usage.Total = swap.Total
usage.Used = swap.Used
return
}
func (s *sigarStatsCollector) GetDiskStats(mountedPath string) (stats boshstats.DiskStats, err error) {
fsUsage, err := s.statsSigar.GetFileSystemUsage(mountedPath)
if err != nil {
err = bosherr.WrapError(err, "Getting Sigar File System Usage")
return
}
stats.DiskUsage.Total = fsUsage.Total
stats.DiskUsage.Used = fsUsage.Used
stats.InodeUsage.Total = fsUsage.Files
stats.InodeUsage.Used = fsUsage.Files - fsUsage.FreeFiles
return
}
func (s *sigarStatsCollector) GetUptimeStats() (stats boshstats.UptimeStats, err error) {
uptime := sigar.Uptime{}
err = uptime.Get()
if err != nil {
err = bosherr.WrapError(err, "Getting Sigar Uptime")
return
}
stats.Secs = uint64(uptime.Length)
return
}