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.
This commit is contained in:
stefanprodan 2019-06-30 13:03:27 +03:00
parent 00fa5542f7
commit ad8d02f701
2 changed files with 19 additions and 8 deletions

View File

@ -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 // create observer based on the mesh provider
observer := c.observerFactory.Observer() observer := c.observerFactory.Observer(metricsProvider)
// run metrics checks // run metrics checks
for _, metric := range r.Spec.CanaryAnalysis.Metrics { for _, metric := range r.Spec.CanaryAnalysis.Metrics {

View File

@ -22,29 +22,29 @@ func NewFactory(metricsServer string, meshProvider string, timeout time.Duration
}, nil }, nil
} }
func (factory Factory) Observer() Interface { func (factory Factory) Observer(provider string) Interface {
switch { switch {
case factory.MeshProvider == "none": case provider == "none":
return &HttpObserver{ return &HttpObserver{
client: factory.Client, client: factory.Client,
} }
case factory.MeshProvider == "appmesh": case provider == "appmesh":
return &EnvoyObserver{ return &EnvoyObserver{
client: factory.Client, client: factory.Client,
} }
case factory.MeshProvider == "nginx": case provider == "nginx":
return &NginxObserver{ return &NginxObserver{
client: factory.Client, client: factory.Client,
} }
case strings.HasPrefix(factory.MeshProvider, "gloo"): case strings.HasPrefix(provider, "gloo"):
return &GlooObserver{ return &GlooObserver{
client: factory.Client, client: factory.Client,
} }
case factory.MeshProvider == "smi:linkerd": case provider == "smi:linkerd":
return &LinkerdObserver{ return &LinkerdObserver{
client: factory.Client, client: factory.Client,
} }
case factory.MeshProvider == "linkerd": case provider == "linkerd":
return &LinkerdObserver{ return &LinkerdObserver{
client: factory.Client, client: factory.Client,
} }