github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/dom/herd/metrics.go (about) 1 package herd 2 3 import ( 4 "time" 5 6 "github.com/Cloud-Foundations/Dominator/lib/cpusharer" 7 "github.com/Cloud-Foundations/tricorder/go/tricorder" 8 "github.com/Cloud-Foundations/tricorder/go/tricorder/units" 9 ) 10 11 var latencyBucketer *tricorder.Bucketer 12 var computeCpuTimeDistribution *tricorder.CumulativeDistribution 13 var computeTimeDistribution *tricorder.CumulativeDistribution 14 var connectDistribution *tricorder.CumulativeDistribution 15 var mdbUpdateTimeDistribution *tricorder.CumulativeDistribution 16 var fullPollDistribution *tricorder.CumulativeDistribution 17 var shortPollDistribution *tricorder.CumulativeDistribution 18 var pollWaitTimeDistribution *tricorder.CumulativeDistribution 19 20 func (herd *Herd) setupMetrics(dir *tricorder.DirectorySpec) { 21 makeCpuSharerMetrics(dir, "cpu-sharer", herd.cpuSharer) 22 latencyBucketer = tricorder.NewGeometricBucketer(0.1, 100e3) 23 computeCpuTimeDistribution = makeMetric(dir, latencyBucketer, 24 "compute-cputime", "compute CPU time") 25 computeTimeDistribution = makeMetric(dir, latencyBucketer, 26 "compute-time", "compute time") 27 connectDistribution = makeMetric(dir, latencyBucketer, 28 "connect-latency", "connect duration") 29 mdbUpdateTimeDistribution = makeMetric(dir, latencyBucketer, 30 "mdb-update-time", "time to update Herd MDB data") 31 fullPollDistribution = makeMetric(dir, latencyBucketer, 32 "poll-full-latency", "full poll duration") 33 shortPollDistribution = makeMetric(dir, latencyBucketer, 34 "poll-short-latency", "short poll duration") 35 pollWaitTimeDistribution = makeMetric(dir, latencyBucketer, 36 "poll-wait-time", "poll wait time") 37 } 38 39 func makeMetric(dir *tricorder.DirectorySpec, bucketer *tricorder.Bucketer, 40 name string, comment string) *tricorder.CumulativeDistribution { 41 distribution := latencyBucketer.NewCumulativeDistribution() 42 dir.RegisterMetric(name, distribution, units.Millisecond, comment) 43 return distribution 44 } 45 46 func makeCpuSharerMetrics(dir *tricorder.DirectorySpec, name string, 47 cpuSharer *cpusharer.FifoCpuSharer) { 48 dir, err := dir.RegisterDirectory(name) 49 if err != nil { 50 panic(err) 51 } 52 group := tricorder.NewGroup() 53 group.RegisterUpdateFunc(func() time.Time { 54 cpuSharer.GetStatistics() 55 return time.Now() 56 }) 57 dir.RegisterMetricInGroup("num-cpu", &cpuSharer.Statistics.NumCpu, group, 58 units.None, "number of CPUs") 59 dir.RegisterMetricInGroup("num-idle-events", 60 &cpuSharer.Statistics.NumIdleEvents, group, units.None, 61 "number of CPU idle events") 62 dir.RegisterMetricInGroup("num-running", 63 &cpuSharer.Statistics.NumCpuRunning, group, units.None, 64 "number of running goroutines") 65 }