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  }