From e1bd004683db999fe2c1124acc0a13372a6dfdc9 Mon Sep 17 00:00:00 2001 From: brandoncate Date: Fri, 17 Jun 2022 10:07:00 -0500 Subject: [PATCH] fix contour prom query when service name is specified Signed-off-by: brandoncate --- pkg/metrics/observers/contour.go | 6 +-- pkg/metrics/observers/contour_test.go | 70 +++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/pkg/metrics/observers/contour.go b/pkg/metrics/observers/contour.go index 2ccadbc9a..f8f416c18 100644 --- a/pkg/metrics/observers/contour.go +++ b/pkg/metrics/observers/contour.go @@ -31,7 +31,7 @@ var contourQueries = map[string]string{ sum( rate( envoy_cluster_upstream_rq{ - envoy_cluster_name=~"{{ namespace }}_{{ target }}-canary_[0-9a-zA-Z-]+", + envoy_cluster_name=~"{{ namespace }}_{{ service }}-canary_[0-9a-zA-Z-]+", envoy_response_code!~"5.*" }[{{ interval }}] ) @@ -40,7 +40,7 @@ var contourQueries = map[string]string{ sum( rate( envoy_cluster_upstream_rq{ - envoy_cluster_name=~"{{ namespace }}_{{ target }}-canary_[0-9a-zA-Z-]+", + envoy_cluster_name=~"{{ namespace }}_{{ service }}-canary_[0-9a-zA-Z-]+", }[{{ interval }}] ) ) @@ -51,7 +51,7 @@ var contourQueries = map[string]string{ sum( rate( envoy_cluster_upstream_rq_time_bucket{ - envoy_cluster_name=~"{{ namespace }}_{{ target }}-canary_[0-9a-zA-Z-]+", + envoy_cluster_name=~"{{ namespace }}_{{ service }}-canary_[0-9a-zA-Z-]+", }[{{ interval }}] ) ) by (le) diff --git a/pkg/metrics/observers/contour_test.go b/pkg/metrics/observers/contour_test.go index 4c050b474..bc3b45ec7 100644 --- a/pkg/metrics/observers/contour_test.go +++ b/pkg/metrics/observers/contour_test.go @@ -64,6 +64,41 @@ func TestContourObserver_GetRequestSuccessRate(t *testing.T) { assert.Equal(t, float64(100), val) } +func TestContourObserver_CustomService_GetRequestSuccessRate(t *testing.T) { + expected := ` sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default_podinfo-service-canary_[0-9a-zA-Z-]+", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ envoy_cluster_name=~"default_podinfo-service-canary_[0-9a-zA-Z-]+", }[1m] ) ) * 100` + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + promql := r.URL.Query()["query"][0] + assert.Equal(t, expected, promql) + + json := `{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1,"100"]}]}}` + w.Write([]byte(json)) + })) + defer ts.Close() + + client, err := providers.NewPrometheusProvider(flaggerv1.MetricTemplateProvider{ + Type: "prometheus", + Address: ts.URL, + SecretRef: nil, + }, nil) + require.NoError(t, err) + + observer := &ContourObserver{ + client: client, + } + + val, err := observer.GetRequestSuccessRate(flaggerv1.MetricTemplateModel{ + Name: "podinfo", + Namespace: "default", + Target: "podinfo", + Service: "podinfo-service", + Interval: "1m", + }) + require.NoError(t, err) + + assert.Equal(t, float64(100), val) +} + func TestContourObserver_GetRequestDuration(t *testing.T) { expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ envoy_cluster_name=~"default_podinfo-canary_[0-9a-zA-Z-]+", }[1m] ) ) by (le) )` @@ -98,3 +133,38 @@ func TestContourObserver_GetRequestDuration(t *testing.T) { assert.Equal(t, 100*time.Millisecond, val) } + +func TestContourObserver_CustomService_GetRequestDuration(t *testing.T) { + expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ envoy_cluster_name=~"default_podinfo-service-canary_[0-9a-zA-Z-]+", }[1m] ) ) by (le) )` + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + promql := r.URL.Query()["query"][0] + assert.Equal(t, expected, promql) + + json := `{"status":"success","data":{"resultType":"vector","result":[{"metric":{},"value":[1,"100"]}]}}` + w.Write([]byte(json)) + })) + defer ts.Close() + + client, err := providers.NewPrometheusProvider(flaggerv1.MetricTemplateProvider{ + Type: "prometheus", + Address: ts.URL, + SecretRef: nil, + }, nil) + require.NoError(t, err) + + observer := &ContourObserver{ + client: client, + } + + val, err := observer.GetRequestDuration(flaggerv1.MetricTemplateModel{ + Name: "podinfo", + Namespace: "default", + Target: "podinfo", + Service: "podinfo-service", + Interval: "1m", + }) + require.NoError(t, err) + + assert.Equal(t, 100*time.Millisecond, val) +}