in perfdash/parser.go [175:222]
func parseApiserverRequestCount(data []byte, buildNumber int, testResult *BuildData) {
testResult.Version = "v1"
build := fmt.Sprintf("%d", buildNumber)
var obj metrics.Collection
if err := json.Unmarshal(data, &obj); err != nil {
klog.Errorf("error parsing JSON in build %d: %v %s", buildNumber, err, string(data))
return
}
if obj.APIServerMetrics == nil {
klog.Errorf("no ApiServerMetrics data in build %d", buildNumber)
return
}
metric, ok := obj.APIServerMetrics["apiserver_request_count"]
if !ok {
klog.Errorf("no apiserver_request_count metric data in build %d", buildNumber)
return
}
resultMap := make(map[string]*perftype.DataItem)
for i := range metric {
perfData := perftype.DataItem{Unit: "", Data: make(map[string]float64), Labels: make(map[string]string)}
for k, v := range metric[i].Metric {
perfData.Labels[string(k)] = string(v)
}
delete(perfData.Labels, "__name__")
delete(perfData.Labels, "contentType")
dataLabel := "RequestCount"
if client, ok := perfData.Labels["client"]; ok {
// Client label contains kubernetes version, which is different
// in every build. This causes unnecessary creation on multiple different label sets
// for one metric.
// This fix removes kubernetes version from client label.
newClient := commitMatcher.ReplaceAllString(client, "kubernetes")
if version := versionMatcher.Find([]byte(newClient)); version != nil {
dataLabel = string(version)
newClient = strings.Replace(newClient, dataLabel, "", 1)
}
perfData.Labels["client"] = newClient
}
perfData.Data[dataLabel] = float64(metric[i].Value)
key := createMapID(perfData.Labels)
if result, exists := resultMap[key]; exists {
result.Data[dataLabel] += perfData.Data[dataLabel]
continue
}
resultMap[key] = &perfData
testResult.Builds[build] = append(testResult.Builds[build], perfData)
}
}