Skip to content

Commit

Permalink
Merge pull request #1637 from ta924/matrixpanic
Browse files Browse the repository at this point in the history
block panic when prom returns range vector
  • Loading branch information
aryan9600 authored May 23, 2024
2 parents 04f5c68 + e5dfbf4 commit 8e86366
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 2 deletions.
3 changes: 2 additions & 1 deletion pkg/metrics/providers/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
)
6 changes: 5 additions & 1 deletion pkg/metrics/providers/prometheus.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
}
}
}
Expand Down Expand Up @@ -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:
Expand Down
33 changes: 33 additions & 0 deletions pkg/metrics/providers/prometheus_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 8e86366

Please sign in to comment.