| /* |
| Copyright 2019 The Kubernetes Authors. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package metrics |
| |
| import ( |
| "fmt" |
| |
| e2eperftype "k8s.io/kubernetes/test/e2e/perftype" |
| ) |
| |
| // APICall is a struct for managing API call. |
| type APICall struct { |
| Resource string `json:"resource"` |
| Subresource string `json:"subresource"` |
| Verb string `json:"verb"` |
| Scope string `json:"scope"` |
| Latency LatencyMetric `json:"latency"` |
| Count int `json:"count"` |
| } |
| |
| // APIResponsiveness is a struct for managing multiple API calls. |
| type APIResponsiveness struct { |
| APICalls []APICall `json:"apicalls"` |
| } |
| |
| // SummaryKind returns the summary of API responsiveness. |
| func (a *APIResponsiveness) SummaryKind() string { |
| return "APIResponsiveness" |
| } |
| |
| // PrintHumanReadable returns metrics with JSON format. |
| func (a *APIResponsiveness) PrintHumanReadable() string { |
| return PrettyPrintJSON(a) |
| } |
| |
| // PrintJSON returns metrics of PerfData(50, 90 and 99th percentiles) with JSON format. |
| func (a *APIResponsiveness) PrintJSON() string { |
| return PrettyPrintJSON(APICallToPerfData(a)) |
| } |
| |
| func (a *APIResponsiveness) Len() int { return len(a.APICalls) } |
| func (a *APIResponsiveness) Swap(i, j int) { |
| a.APICalls[i], a.APICalls[j] = a.APICalls[j], a.APICalls[i] |
| } |
| func (a *APIResponsiveness) Less(i, j int) bool { |
| return a.APICalls[i].Latency.Perc99 < a.APICalls[j].Latency.Perc99 |
| } |
| |
| // currentAPICallMetricsVersion is the current apicall performance metrics version. We should |
| // bump up the version each time we make incompatible change to the metrics. |
| const currentAPICallMetricsVersion = "v1" |
| |
| // APICallToPerfData transforms APIResponsiveness to PerfData. |
| func APICallToPerfData(apicalls *APIResponsiveness) *e2eperftype.PerfData { |
| perfData := &e2eperftype.PerfData{Version: currentAPICallMetricsVersion} |
| for _, apicall := range apicalls.APICalls { |
| item := e2eperftype.DataItem{ |
| Data: map[string]float64{ |
| "Perc50": float64(apicall.Latency.Perc50) / 1000000, // us -> ms |
| "Perc90": float64(apicall.Latency.Perc90) / 1000000, |
| "Perc99": float64(apicall.Latency.Perc99) / 1000000, |
| }, |
| Unit: "ms", |
| Labels: map[string]string{ |
| "Verb": apicall.Verb, |
| "Resource": apicall.Resource, |
| "Subresource": apicall.Subresource, |
| "Scope": apicall.Scope, |
| "Count": fmt.Sprintf("%v", apicall.Count), |
| }, |
| } |
| perfData.DataItems = append(perfData.DataItems, item) |
| } |
| return perfData |
| } |