diff --git a/pkg/metrics/observers/crossover.go b/pkg/metrics/observers/crossover.go deleted file mode 100644 index 0ecf3d15..00000000 --- a/pkg/metrics/observers/crossover.go +++ /dev/null @@ -1,77 +0,0 @@ -package observers - -import ( - "fmt" - "time" - - flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1" - "github.com/weaveworks/flagger/pkg/metrics/providers" -) - -var crossoverQueries = map[string]string{ - "request-success-rate": ` - sum( - rate( - envoy_cluster_upstream_rq{ - kubernetes_namespace="{{ namespace }}", - envoy_cluster_name=~"{{ target }}-canary", - envoy_response_code!~"5.*" - }[{{ interval }}] - ) - ) - / - sum( - rate( - envoy_cluster_upstream_rq{ - kubernetes_namespace="{{ namespace }}", - envoy_cluster_name=~"{{ target }}-canary" - }[{{ interval }}] - ) - ) - * 100`, - "request-duration": ` - histogram_quantile( - 0.99, - sum( - rate( - envoy_cluster_upstream_rq_time_bucket{ - kubernetes_namespace="{{ namespace }}", - envoy_cluster_name=~"{{ target }}-canary" - }[{{ interval }}] - ) - ) by (le) - )`, -} - -type CrossoverObserver struct { - client providers.Interface -} - -func (ob *CrossoverObserver) GetRequestSuccessRate(model flaggerv1.MetricTemplateModel) (float64, error) { - query, err := RenderQuery(crossoverQueries["request-success-rate"], model) - if err != nil { - return 0, err - } - - value, err := ob.client.RunQuery(query) - if err != nil { - return 0, err - } - - return value, nil -} - -func (ob *CrossoverObserver) GetRequestDuration(model flaggerv1.MetricTemplateModel) (time.Duration, error) { - query, err := RenderQuery(crossoverQueries["request-duration"], model) - if err != nil { - return 0, fmt.Errorf("rendering query failed: %w", err) - } - - value, err := ob.client.RunQuery(query) - if err != nil { - return 0, fmt.Errorf("running query failed: %w", err) - } - - ms := time.Duration(int64(value)) * time.Millisecond - return ms, nil -} diff --git a/pkg/metrics/observers/crossover_service.go b/pkg/metrics/observers/crossover_service.go deleted file mode 100644 index 0aa27a6a..00000000 --- a/pkg/metrics/observers/crossover_service.go +++ /dev/null @@ -1,77 +0,0 @@ -package observers - -import ( - "fmt" - "time" - - flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1" - "github.com/weaveworks/flagger/pkg/metrics/providers" -) - -var crossoverServiceQueries = map[string]string{ - "request-success-rate": ` - sum( - rate( - envoy_cluster_upstream_rq{ - kubernetes_namespace="{{ namespace }}", - envoy_cluster_name="{{ target }}-canary", - envoy_response_code!~"5.*" - }[{{ interval }}] - ) - ) - / - sum( - rate( - envoy_cluster_upstream_rq{ - kubernetes_namespace="{{ namespace }}", - envoy_cluster_name="{{ target }}-canary" - }[{{ interval }}] - ) - ) - * 100`, - "request-duration": ` - histogram_quantile( - 0.99, - sum( - rate( - envoy_cluster_upstream_rq_time_bucket{ - kubernetes_namespace="{{ namespace }}", - envoy_cluster_name="{{ target }}-canary" - }[{{ interval }}] - ) - ) by (le) - )`, -} - -type CrossoverServiceObserver struct { - client providers.Interface -} - -func (ob *CrossoverServiceObserver) GetRequestSuccessRate(model flaggerv1.MetricTemplateModel) (float64, error) { - query, err := RenderQuery(crossoverServiceQueries["request-success-rate"], model) - if err != nil { - return 0, fmt.Errorf("rendering query failed: %w", err) - } - - value, err := ob.client.RunQuery(query) - if err != nil { - return 0, fmt.Errorf("running query failed: %w", err) - } - - return value, nil -} - -func (ob *CrossoverServiceObserver) GetRequestDuration(model flaggerv1.MetricTemplateModel) (time.Duration, error) { - query, err := RenderQuery(crossoverServiceQueries["request-duration"], model) - if err != nil { - return 0, fmt.Errorf("rendering query failed: %w", err) - } - - value, err := ob.client.RunQuery(query) - if err != nil { - return 0, fmt.Errorf("running query failed: %w", err) - } - - ms := time.Duration(int64(value)) * time.Millisecond - return ms, nil -} diff --git a/pkg/metrics/observers/crossover_service_test.go b/pkg/metrics/observers/crossover_service_test.go deleted file mode 100644 index b0c9fc4e..00000000 --- a/pkg/metrics/observers/crossover_service_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package observers - -import ( - "net/http" - "net/http/httptest" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1" - "github.com/weaveworks/flagger/pkg/metrics/providers" -) - -func TestCrossoverServiceObserver_GetRequestSuccessRate(t *testing.T) { - expected := ` sum( rate( envoy_cluster_upstream_rq{ kubernetes_namespace="default", envoy_cluster_name="podinfo-canary", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ kubernetes_namespace="default", envoy_cluster_name="podinfo-canary" }[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 := &CrossoverServiceObserver{ - client: client, - } - - val, err := observer.GetRequestSuccessRate(flaggerv1.MetricTemplateModel{ - Name: "podinfo", - Namespace: "default", - Target: "podinfo", - Service: "podinfo", - Interval: "1m", - }) - require.NoError(t, err) - - assert.Equal(t, float64(100), val) -} - -func TestCrossoverServiceObserver_GetRequestDuration(t *testing.T) { - expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ kubernetes_namespace="default", envoy_cluster_name="podinfo-canary" }[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 := &CrossoverServiceObserver{ - client: client, - } - - val, err := observer.GetRequestDuration(flaggerv1.MetricTemplateModel{ - Name: "podinfo", - Namespace: "default", - Target: "podinfo", - Service: "podinfo", - Interval: "1m", - }) - require.NoError(t, err) - - assert.Equal(t, 100*time.Millisecond, val) -} diff --git a/pkg/metrics/observers/crossover_test.go b/pkg/metrics/observers/crossover_test.go deleted file mode 100644 index 7cf6ed65..00000000 --- a/pkg/metrics/observers/crossover_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package observers - -import ( - "net/http" - "net/http/httptest" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - flaggerv1 "github.com/weaveworks/flagger/pkg/apis/flagger/v1beta1" - "github.com/weaveworks/flagger/pkg/metrics/providers" -) - -func TestCrossoverObserver_GetRequestSuccessRate(t *testing.T) { - expected := ` sum( rate( envoy_cluster_upstream_rq{ kubernetes_namespace="default", envoy_cluster_name=~"podinfo-canary", envoy_response_code!~"5.*" }[1m] ) ) / sum( rate( envoy_cluster_upstream_rq{ kubernetes_namespace="default", envoy_cluster_name=~"podinfo-canary" }[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 := &CrossoverObserver{ - client: client, - } - - val, err := observer.GetRequestSuccessRate(flaggerv1.MetricTemplateModel{ - Name: "podinfo", - Namespace: "default", - Target: "podinfo", - Service: "podinfo", - Interval: "1m", - }) - require.NoError(t, err) - - assert.Equal(t, float64(100), val) -} - -func TestCrossoverObserver_GetRequestDuration(t *testing.T) { - expected := ` histogram_quantile( 0.99, sum( rate( envoy_cluster_upstream_rq_time_bucket{ kubernetes_namespace="default", envoy_cluster_name=~"podinfo-canary" }[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 := &CrossoverObserver{ - client: client, - } - - val, err := observer.GetRequestDuration(flaggerv1.MetricTemplateModel{ - Name: "podinfo", - Namespace: "default", - Target: "podinfo", - Service: "podinfo", - Interval: "1m", - }) - require.NoError(t, err) - - assert.Equal(t, 100*time.Millisecond, val) -} diff --git a/pkg/metrics/observers/factory.go b/pkg/metrics/observers/factory.go index f335354f..15824b19 100644 --- a/pkg/metrics/observers/factory.go +++ b/pkg/metrics/observers/factory.go @@ -28,44 +28,32 @@ func NewFactory(metricsServer string) (*Factory, error) { func (factory Factory) Observer(provider string) Interface { switch { - case provider == "none": - return &HttpObserver{ - client: factory.Client, - } - case provider == "kubernetes": - return &HttpObserver{ - client: factory.Client, - } - case provider == "appmesh": + case provider == flaggerv1.AppMeshProvider: return &AppMeshObserver{ client: factory.Client, } - case provider == "crossover": - return &CrossoverObserver{ + case provider == flaggerv1.LinkerdProvider: + return &LinkerdObserver{ client: factory.Client, } - case provider == "nginx": - return &NginxObserver{ + case provider == flaggerv1.IstioProvider: + return &IstioObserver{ client: factory.Client, } - case strings.HasPrefix(provider, "gloo"): + case provider == flaggerv1.ContourProvider: + return &ContourObserver{ + client: factory.Client, + } + case strings.HasPrefix(provider, flaggerv1.GlooProvider): return &GlooObserver{ client: factory.Client, } - case provider == "smi:linkerd": - return &LinkerdObserver{ + case provider == flaggerv1.NGINXProvider: + return &NginxObserver{ client: factory.Client, } - case provider == "crossover:service": - return &CrossoverServiceObserver{ - client: factory.Client, - } - case provider == "linkerd": - return &LinkerdObserver{ - client: factory.Client, - } - case provider == "contour": - return &ContourObserver{ + case provider == flaggerv1.KubernetesProvider: + return &HttpObserver{ client: factory.Client, } default: