mirror of
https://github.com/kubernetes-sigs/prometheus-adapter.git
synced 2026-04-06 17:57:51 +00:00
Notable next steps include: * Intelligently select the aggregation method (rate/avg_over_time/etc). * Intelligenty select the aggregation window. * Figure out how to handle "namespace", if at all. * Fix the crazy type conversion in `sample_converter.go`.
58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
package provider
|
|
|
|
import (
|
|
"errors"
|
|
|
|
prom "github.com/directxman12/k8s-prometheus-adapter/pkg/client"
|
|
"github.com/prometheus/common/model"
|
|
"k8s.io/metrics/pkg/apis/external_metrics"
|
|
)
|
|
|
|
type vectorConverter struct {
|
|
SampleConverter SampleConverter
|
|
}
|
|
|
|
//NewVectorConverter creates a VectorConverter capable of converting
|
|
//vector Prometheus query results into external metric types.
|
|
func NewVectorConverter(sampleConverter *SampleConverter) MetricConverter {
|
|
return &vectorConverter{
|
|
SampleConverter: *sampleConverter,
|
|
}
|
|
}
|
|
|
|
func (c *vectorConverter) Convert(metadata QueryMetadata, queryResult prom.QueryResult) (*external_metrics.ExternalMetricValueList, error) {
|
|
if queryResult.Type != model.ValVector {
|
|
return nil, errors.New("vectorConverter can only convert scalar query results")
|
|
}
|
|
|
|
toConvert := *queryResult.Vector
|
|
|
|
if toConvert == nil {
|
|
return nil, errors.New("the provided input did not contain vector query results")
|
|
}
|
|
|
|
return c.convert(metadata, toConvert)
|
|
}
|
|
|
|
func (c *vectorConverter) convert(metadata QueryMetadata, result model.Vector) (*external_metrics.ExternalMetricValueList, error) {
|
|
items := []external_metrics.ExternalMetricValue{}
|
|
metricValueList := external_metrics.ExternalMetricValueList{
|
|
Items: items,
|
|
}
|
|
|
|
numSamples := result.Len()
|
|
if numSamples == 0 {
|
|
return &metricValueList, nil
|
|
}
|
|
|
|
for _, val := range result {
|
|
//TODO: Care about potential errors here.
|
|
singleMetric, _ := c.SampleConverter.Convert(metadata, val)
|
|
items = append(items, *singleMetric)
|
|
}
|
|
|
|
metricValueList = external_metrics.ExternalMetricValueList{
|
|
Items: items,
|
|
}
|
|
return &metricValueList, nil
|
|
}
|