in perfdash/parser.go [355:399]
func parseHistogramMetric(metricName string) func(data []byte, buildNumber int, testResult *BuildData) {
return func(data []byte, buildNumber int, testResult *BuildData) {
testResult.Version = "v1"
build := fmt.Sprintf("%d", buildNumber)
var obj etcdMetrics
if err := json.Unmarshal(data, &obj); err != nil {
klog.Errorf("error parsing JSON in build %d: %v %s", buildNumber, err, string(data))
return
}
var histogramVecMetric histogramVec
switch metricName {
case "backendCommitDuration":
histogramVecMetric = obj.BackendCommitDuration
case "snapshotSaveTotalDuration":
histogramVecMetric = obj.SnapshotSaveTotalDuration
case "peerRoundTripTime":
histogramVecMetric = obj.PeerRoundTripTime
case "walFsyncDuration":
histogramVecMetric = obj.WalFsyncDuration
default:
klog.Errorf("unknown metric name: %s", metricName)
}
for i := range histogramVecMetric {
perfData := perftype.DataItem{Unit: "%", Labels: histogramVecMetric[i].Labels, Data: make(map[string]float64)}
delete(perfData.Labels, "__name__")
count, exists := histogramVecMetric[i].Buckets["+Inf"]
if !exists {
klog.Errorf("err in build %d: no +Inf bucket: %s", buildNumber, string(data))
continue
}
for bucket, buckerVal := range histogramVecMetric[i].Buckets {
if bucket != "+Inf" {
if count == 0 {
perfData.Data["<= "+bucket+"s"] = 0
continue
}
perfData.Data["<= "+bucket+"s"] = float64(buckerVal) / float64(count) * 100
}
}
testResult.Builds[build] = append(testResult.Builds[build], perfData)
}
}
}