From ad8d02f701500d4afcfebb892af56f40100c252d Mon Sep 17 00:00:00 2001 From: stefanprodan Date: Sun, 30 Jun 2019 13:03:27 +0300 Subject: [PATCH] Use Linkerd metrics when NGINX is the mesh ingress Set the metrics provider to Linkerd Prometheus when using NGINX as Linkerd Ingress. This mitigates the lack of canary metrics in the NGINX controller exporter. --- pkg/controller/scheduler.go | 13 ++++++++++++- pkg/metrics/factory.go | 14 +++++++------- 2 files changed, 19 insertions(+), 8 deletions(-) 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, }