diff --git a/test/e2e/framework/metrics_util.go b/test/e2e/framework/metrics_util.go index 348e6ab27db..e8b9e7c8ca1 100644 --- a/test/e2e/framework/metrics_util.go +++ b/test/e2e/framework/metrics_util.go @@ -167,6 +167,7 @@ type APICall struct { Resource string `json:"resource"` Verb string `json:"verb"` Latency LatencyMetric `json:"latency"` + Count int `json:"count"` } type APIResponsiveness struct { @@ -179,9 +180,10 @@ func (a APIResponsiveness) Less(i, j int) bool { return a.APICalls[i].Latency.Perc99 < a.APICalls[j].Latency.Perc99 } +// Set request latency for a particular quantile in the APICall metric entry (creating one if necessary). // 0 <= quantile <=1 (e.g. 0.95 is 95%tile, 0.5 is median) // Only 0.5, 0.9 and 0.99 quantiles are supported. -func (a *APIResponsiveness) addMetric(resource, verb string, quantile float64, latency time.Duration) { +func (a *APIResponsiveness) addMetricRequestLatency(resource, verb string, quantile float64, latency time.Duration) { for i, apicall := range a.APICalls { if apicall.Resource == resource && apicall.Verb == verb { a.APICalls[i] = setQuantileAPICall(apicall, quantile, latency) @@ -211,6 +213,18 @@ func setQuantile(metric *LatencyMetric, quantile float64, latency time.Duration) } } +// Add request count to the APICall metric entry (creating one if necessary). +func (a *APIResponsiveness) addMetricRequestCount(resource, verb string, count int) { + for i, apicall := range a.APICalls { + if apicall.Resource == resource && apicall.Verb == verb { + a.APICalls[i].Count += count + return + } + } + apicall := APICall{Resource: resource, Verb: verb, Count: count} + a.APICalls = append(a.APICalls, apicall) +} + func readLatencyMetrics(c clientset.Interface) (APIResponsiveness, error) { var a APIResponsiveness @@ -231,7 +245,9 @@ func readLatencyMetrics(c clientset.Interface) (APIResponsiveness, error) { for _, sample := range samples { // Example line: // apiserver_request_latencies_summary{resource="namespaces",verb="LIST",quantile="0.99"} 908 - if sample.Metric[model.MetricNameLabel] != "apiserver_request_latencies_summary" { + // apiserver_request_count{resource="pods",verb="LIST",client="kubectl",code="200",contentType="json"} 233 + if sample.Metric[model.MetricNameLabel] != "apiserver_request_latencies_summary" && + sample.Metric[model.MetricNameLabel] != "apiserver_request_count" { continue } @@ -240,12 +256,20 @@ func readLatencyMetrics(c clientset.Interface) (APIResponsiveness, error) { if ignoredResources.Has(resource) || ignoredVerbs.Has(verb) { continue } - latency := sample.Value - quantile, err := strconv.ParseFloat(string(sample.Metric[model.QuantileLabel]), 64) - if err != nil { - return a, err + + switch sample.Metric[model.MetricNameLabel] { + case "apiserver_request_latencies_summary": + latency := sample.Value + quantile, err := strconv.ParseFloat(string(sample.Metric[model.QuantileLabel]), 64) + if err != nil { + return a, err + } + a.addMetricRequestLatency(resource, verb, quantile, time.Duration(int64(latency))*time.Microsecond) + case "apiserver_request_count": + count := sample.Value + a.addMetricRequestCount(resource, verb, int(count)) + } - a.addMetric(resource, verb, quantile, time.Duration(int64(latency))*time.Microsecond) } return a, err