forked from Cloud-Foundations/Dominator
/
metrics.go
65 lines (59 loc) · 2.5 KB
/
metrics.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
package herd
import (
"time"
"github.com/Cloud-Foundations/Dominator/lib/cpusharer"
"github.com/Cloud-Foundations/tricorder/go/tricorder"
"github.com/Cloud-Foundations/tricorder/go/tricorder/units"
)
var latencyBucketer *tricorder.Bucketer
var computeCpuTimeDistribution *tricorder.CumulativeDistribution
var computeTimeDistribution *tricorder.CumulativeDistribution
var connectDistribution *tricorder.CumulativeDistribution
var mdbUpdateTimeDistribution *tricorder.CumulativeDistribution
var fullPollDistribution *tricorder.CumulativeDistribution
var shortPollDistribution *tricorder.CumulativeDistribution
var pollWaitTimeDistribution *tricorder.CumulativeDistribution
func (herd *Herd) setupMetrics(dir *tricorder.DirectorySpec) {
makeCpuSharerMetrics(dir, "cpu-sharer", herd.cpuSharer)
latencyBucketer = tricorder.NewGeometricBucketer(0.1, 100e3)
computeCpuTimeDistribution = makeMetric(dir, latencyBucketer,
"compute-cputime", "compute CPU time")
computeTimeDistribution = makeMetric(dir, latencyBucketer,
"compute-time", "compute time")
connectDistribution = makeMetric(dir, latencyBucketer,
"connect-latency", "connect duration")
mdbUpdateTimeDistribution = makeMetric(dir, latencyBucketer,
"mdb-update-time", "time to update Herd MDB data")
fullPollDistribution = makeMetric(dir, latencyBucketer,
"poll-full-latency", "full poll duration")
shortPollDistribution = makeMetric(dir, latencyBucketer,
"poll-short-latency", "short poll duration")
pollWaitTimeDistribution = makeMetric(dir, latencyBucketer,
"poll-wait-time", "poll wait time")
}
func makeMetric(dir *tricorder.DirectorySpec, bucketer *tricorder.Bucketer,
name string, comment string) *tricorder.CumulativeDistribution {
distribution := latencyBucketer.NewCumulativeDistribution()
dir.RegisterMetric(name, distribution, units.Millisecond, comment)
return distribution
}
func makeCpuSharerMetrics(dir *tricorder.DirectorySpec, name string,
cpuSharer *cpusharer.FifoCpuSharer) {
dir, err := dir.RegisterDirectory(name)
if err != nil {
panic(err)
}
group := tricorder.NewGroup()
group.RegisterUpdateFunc(func() time.Time {
cpuSharer.GetStatistics()
return time.Now()
})
dir.RegisterMetricInGroup("num-cpu", &cpuSharer.Statistics.NumCpu, group,
units.None, "number of CPUs")
dir.RegisterMetricInGroup("num-idle-events",
&cpuSharer.Statistics.NumIdleEvents, group, units.None,
"number of CPU idle events")
dir.RegisterMetricInGroup("num-running",
&cpuSharer.Statistics.NumCpuRunning, group, units.None,
"number of running goroutines")
}