mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-01-13 11:25:19 +00:00
Add external metrics client to HPA rest client
This commit is contained in:
@@ -30,12 +30,14 @@ import (
|
||||
customapi "k8s.io/metrics/pkg/apis/custom_metrics/v1beta1"
|
||||
resourceclient "k8s.io/metrics/pkg/client/clientset_generated/clientset/typed/metrics/v1beta1"
|
||||
customclient "k8s.io/metrics/pkg/client/custom_metrics"
|
||||
externalclient "k8s.io/metrics/pkg/client/external_metrics"
|
||||
)
|
||||
|
||||
func NewRESTMetricsClient(resourceClient resourceclient.PodMetricsesGetter, customClient customclient.CustomMetricsClient) MetricsClient {
|
||||
func NewRESTMetricsClient(resourceClient resourceclient.PodMetricsesGetter, customClient customclient.CustomMetricsClient, externalClient externalclient.ExternalMetricsClient) MetricsClient {
|
||||
return &restMetricsClient{
|
||||
&resourceMetricsClient{resourceClient},
|
||||
&customMetricsClient{customClient},
|
||||
&externalMetricsClient{externalClient},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +47,7 @@ func NewRESTMetricsClient(resourceClient resourceclient.PodMetricsesGetter, cust
|
||||
type restMetricsClient struct {
|
||||
*resourceMetricsClient
|
||||
*customMetricsClient
|
||||
*externalMetricsClient
|
||||
}
|
||||
|
||||
// resourceMetricsClient implements the resource-metrics-related parts of MetricsClient,
|
||||
@@ -139,3 +142,29 @@ func (c *customMetricsClient) GetObjectMetric(metricName string, namespace strin
|
||||
|
||||
return metricValue.Value.MilliValue(), metricValue.Timestamp.Time, nil
|
||||
}
|
||||
|
||||
// externalMetricsClient implenets the external metrics related parts of MetricsClient,
|
||||
// using data from the external metrics API.
|
||||
type externalMetricsClient struct {
|
||||
client externalclient.ExternalMetricsClient
|
||||
}
|
||||
|
||||
// GetExternalMetric gets all the values of a given external metric
|
||||
// that match the specified selector.
|
||||
func (c *externalMetricsClient) GetExternalMetric(metricName, namespace string, selector labels.Selector) ([]int64, time.Time, error) {
|
||||
metrics, err := c.client.NamespacedMetrics(namespace).Get(metricName, selector)
|
||||
if err != nil {
|
||||
return []int64{}, time.Time{}, fmt.Errorf("unable to fetch metrics from external metrics API: %v", err)
|
||||
}
|
||||
|
||||
if len(metrics.Items) == 0 {
|
||||
return nil, time.Time{}, fmt.Errorf("no metrics returned from external metrics API")
|
||||
}
|
||||
|
||||
res := make([]int64, 0)
|
||||
for _, m := range metrics.Items {
|
||||
res = append(res, m.Value.MilliValue())
|
||||
}
|
||||
timestamp := metrics.Items[0].Timestamp.Time
|
||||
return res, timestamp, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user