func parseHistogramMetric()

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)
		}
	}
}