Merge pull request #1095 from ashokhein/main

Fix for when Prometheus returns NaN
This commit is contained in:
Stefan Prodan
2022-02-07 13:53:32 +02:00
committed by GitHub
2 changed files with 31 additions and 19 deletions
+2 -1
View File
@@ -22,6 +22,7 @@ import (
"encoding/json"
"fmt"
"io"
"math"
"net/http"
"net/url"
"path"
@@ -148,7 +149,7 @@ func (p *PrometheusProvider) RunQuery(query string) (float64, error) {
value = &f
}
}
if value == nil {
if value == nil || math.IsNaN(*value) {
return 0, fmt.Errorf("%w", ErrNoValuesFound)
}
+29 -18
View File
@@ -134,29 +134,40 @@ func TestPrometheusProvider_RunQueryWithBasicAuth(t *testing.T) {
assert.Equal(t, float64(100), val)
})
t.Run("no values", func(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json := `{"status":"success","data":{"resultType":"vector","result":[]}}`
w.Write([]byte(json))
}))
defer ts.Close()
noResultTests := []struct {
name string
queryResult string
}{
{name: "no values result", queryResult: `{"status":"success","data":{"resultType":"vector","result":[]}}`},
{name: "NaN result", queryResult: `{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1643023250.379,"NaN"]}]}}`},
}
clients := prometheusFake()
for _, tt := range noResultTests {
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()
template, err := clients.flaggerClient.FlaggerV1beta1().
MetricTemplates("default").Get(context.TODO(), "prometheus", metav1.GetOptions{})
require.NoError(t, err)
template.Spec.Provider.Address = ts.URL
clients := prometheusFake()
secret, err := clients.kubeClient.CoreV1().Secrets("default").Get(context.TODO(), "prometheus", metav1.GetOptions{})
require.NoError(t, err)
template, err := clients.flaggerClient.FlaggerV1beta1().
MetricTemplates("default").Get(context.TODO(), "prometheus", metav1.GetOptions{})
require.NoError(t, err)
template.Spec.Provider.Address = ts.URL
prom, err := NewPrometheusProvider(template.Spec.Provider, secret.Data)
require.NoError(t, err)
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, ErrNoValuesFound))
})
}
_, err = prom.RunQuery(template.Spec.Query)
require.True(t, errors.Is(err, ErrNoValuesFound))
})
}
func TestPrometheusProvider_IsOnline(t *testing.T) {