diff --git a/pkg/controller/scheduler.go b/pkg/controller/scheduler.go index 943a9809..5ed080ad 100644 --- a/pkg/controller/scheduler.go +++ b/pkg/controller/scheduler.go @@ -567,8 +567,19 @@ func (c *Controller) analyseCanary(r *flaggerv1.Canary) bool { } } + // override the global provider if one is specified in the canary spec + metricsProvider := c.meshProvider + if r.Spec.Provider != "" { + metricsProvider = r.Spec.Provider + + // set the metrics provider to Linkerd Prometheus when using NGINX as Linkerd Ingress + if r.Spec.Provider == "nginx" && strings.Contains(c.meshProvider, "linkerd") { + metricsProvider = "linkerd" + } + } + // create observer based on the mesh provider - observer := c.observerFactory.Observer() + observer := c.observerFactory.Observer(metricsProvider) // run metrics checks for _, metric := range r.Spec.CanaryAnalysis.Metrics { diff --git a/pkg/metrics/factory.go b/pkg/metrics/factory.go index c145af94..8e77f2df 100644 --- a/pkg/metrics/factory.go +++ b/pkg/metrics/factory.go @@ -22,29 +22,29 @@ func NewFactory(metricsServer string, meshProvider string, timeout time.Duration }, nil } -func (factory Factory) Observer() Interface { +func (factory Factory) Observer(provider string) Interface { switch { - case factory.MeshProvider == "none": + case provider == "none": return &HttpObserver{ client: factory.Client, } - case factory.MeshProvider == "appmesh": + case provider == "appmesh": return &EnvoyObserver{ client: factory.Client, } - case factory.MeshProvider == "nginx": + case provider == "nginx": return &NginxObserver{ client: factory.Client, } - case strings.HasPrefix(factory.MeshProvider, "gloo"): + case strings.HasPrefix(provider, "gloo"): return &GlooObserver{ client: factory.Client, } - case factory.MeshProvider == "smi:linkerd": + case provider == "smi:linkerd": return &LinkerdObserver{ client: factory.Client, } - case factory.MeshProvider == "linkerd": + case provider == "linkerd": return &LinkerdObserver{ client: factory.Client, }