mirror of
https://github.com/fluxcd/flagger.git
synced 2026-02-14 18:10:00 +00:00
Signed-off-by: Tanner Altares <ta924@yahoo.com>
block panic when prom returns range vector
This commit is contained in:
committed by
Sanskar Jaiswal
parent
04f5c68a83
commit
e5dfbf4adc
@@ -19,5 +19,6 @@ package providers
|
||||
import "errors"
|
||||
|
||||
var (
|
||||
ErrNoValuesFound = errors.New("no values found")
|
||||
ErrNoValuesFound = errors.New("no values found")
|
||||
ErrMultipleValuesReturned = errors.New("query returned multiple values")
|
||||
)
|
||||
|
||||
@@ -51,7 +51,8 @@ type prometheusResponse struct {
|
||||
Metric struct {
|
||||
Name string `json:"name"`
|
||||
}
|
||||
Value []interface{} `json:"value"`
|
||||
Value []interface{} `json:"value"`
|
||||
Values []interface{} `json:"values"`
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -147,6 +148,9 @@ func (p *PrometheusProvider) RunQuery(query string) (float64, error) {
|
||||
|
||||
var value *float64
|
||||
for _, v := range result.Data.Result {
|
||||
if v.Values != nil {
|
||||
return 0, fmt.Errorf("%w", ErrMultipleValuesReturned)
|
||||
}
|
||||
metricValue := v.Value[1]
|
||||
switch metricValue.(type) {
|
||||
case string:
|
||||
|
||||
@@ -180,6 +180,39 @@ func TestPrometheusProvider_RunQueryWithBasicAuth(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
multipleResultTests := []struct {
|
||||
name string
|
||||
queryResult string
|
||||
}{
|
||||
{name: "values instead of value", queryResult: `{"status": "success","data": {"resultType": "matrix","result": [{"metric": {"__name__": "processTime_seconds:avg"},"values": [[1714404069.294,"NaN"],[1714404071.3,"NaN"],[1714404099.294,"NaN"],[1714404101.3,"NaN"]]},{"metric": {"__name__": "processTime_seconds:avg"},"values": [[1714404069.294,"NaN"],[1714404071.3,"NaN"],[1714404099.294,"NaN"],[1714404101.3,"NaN"]]}]}}`},
|
||||
}
|
||||
|
||||
for _, tt := range multipleResultTests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
json := tt.queryResult
|
||||
w.Write([]byte(json))
|
||||
}))
|
||||
defer ts.Close()
|
||||
|
||||
clients := prometheusFake()
|
||||
|
||||
template, err := clients.flaggerClient.FlaggerV1beta1().
|
||||
MetricTemplates("default").Get(context.TODO(), "prometheus", metav1.GetOptions{})
|
||||
require.NoError(t, err)
|
||||
template.Spec.Provider.Address = ts.URL
|
||||
|
||||
secret, err := clients.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "prometheus", metav1.GetOptions{})
|
||||
require.NoError(t, err)
|
||||
|
||||
prom, err := NewPrometheusProvider(template.Spec.Provider, secret.Data)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = prom.RunQuery(template.Spec.Query)
|
||||
require.True(t, errors.Is(err, ErrMultipleValuesReturned))
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestPrometheusProvider_RunQueryWithBearerAuth(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user