diff --git a/config/config.go b/config/config.go index 4bf32e896..5eb517da6 100644 --- a/config/config.go +++ b/config/config.go @@ -126,19 +126,20 @@ type File struct { } type Consul struct { - Addr string - Scheme string - Token string - KVPath string - NoRouteHTMLPath string - TagPrefix string - Register bool - ServiceAddr string - ServiceName string - ServiceTags []string - ServiceStatus []string - CheckInterval time.Duration - CheckTimeout time.Duration - CheckScheme string - CheckTLSSkipVerify bool + Addr string + Scheme string + Token string + KVPath string + NoRouteHTMLPath string + TagPrefix string + Register bool + ServiceAddr string + ServiceName string + ServiceTags []string + ServiceStatus []string + CheckInterval time.Duration + CheckTimeout time.Duration + CheckScheme string + CheckTLSSkipVerify bool + CheckDeregisterCriticalServiceAfter string } diff --git a/config/default.go b/config/default.go index c01b22914..dc8008623 100644 --- a/config/default.go +++ b/config/default.go @@ -47,18 +47,19 @@ var defaultConfig = &Config{ Registry: Registry{ Backend: "consul", Consul: Consul{ - Addr: "localhost:8500", - Scheme: "http", - KVPath: "/fabio/config", - NoRouteHTMLPath: "/fabio/noroute.html", - TagPrefix: "urlprefix-", - Register: true, - ServiceAddr: ":9998", - ServiceName: "fabio", - ServiceStatus: []string{"passing"}, - CheckInterval: time.Second, - CheckTimeout: 3 * time.Second, - CheckScheme: "http", + Addr: "localhost:8500", + Scheme: "http", + KVPath: "/fabio/config", + NoRouteHTMLPath: "/fabio/noroute.html", + TagPrefix: "urlprefix-", + Register: true, + ServiceAddr: ":9998", + ServiceName: "fabio", + ServiceStatus: []string{"passing"}, + CheckInterval: time.Second, + CheckTimeout: 3 * time.Second, + CheckScheme: "http", + CheckDeregisterCriticalServiceAfter: "90m", }, Timeout: 10 * time.Second, Retry: 500 * time.Millisecond, diff --git a/config/load.go b/config/load.go index 4529693f5..43c3f0fd9 100644 --- a/config/load.go +++ b/config/load.go @@ -175,7 +175,8 @@ func load(cmdline, environ, envprefix []string, props *properties.Properties) (c f.StringSliceVar(&cfg.Registry.Consul.ServiceStatus, "registry.consul.service.status", defaultConfig.Registry.Consul.ServiceStatus, "valid service status values") f.DurationVar(&cfg.Registry.Consul.CheckInterval, "registry.consul.register.checkInterval", defaultConfig.Registry.Consul.CheckInterval, "service check interval") f.DurationVar(&cfg.Registry.Consul.CheckTimeout, "registry.consul.register.checkTimeout", defaultConfig.Registry.Consul.CheckTimeout, "service check timeout") - f.BoolVar(&cfg.Registry.Consul.CheckTLSSkipVerify, "registry.consul.register.checkTLSSkipVerify", defaultConfig.Registry.Consul.CheckTLSSkipVerify, "service check TLS verifcation") + f.BoolVar(&cfg.Registry.Consul.CheckTLSSkipVerify, "registry.consul.register.checkTLSSkipVerify", defaultConfig.Registry.Consul.CheckTLSSkipVerify, "service check TLS verification") + f.StringVar(&cfg.Registry.Consul.CheckDeregisterCriticalServiceAfter, "registry.consul.register.checkDeregisterCriticalServiceAfter", defaultConfig.Registry.Consul.CheckDeregisterCriticalServiceAfter, "critical service deregistration timeout") f.IntVar(&cfg.Runtime.GOGC, "runtime.gogc", defaultConfig.Runtime.GOGC, "sets runtime.GOGC") f.IntVar(&cfg.Runtime.GOMAXPROCS, "runtime.gomaxprocs", defaultConfig.Runtime.GOMAXPROCS, "sets runtime.GOMAXPROCS") f.StringVar(&cfg.UI.Access, "ui.access", defaultConfig.UI.Access, "access mode, one of [ro, rw]") diff --git a/fabio.properties b/fabio.properties index 5b302a3e5..12933cc82 100644 --- a/fabio.properties +++ b/fabio.properties @@ -718,6 +718,19 @@ # registry.consul.register.checkTLSSkipVerify = false +# registry.consul.register.checkDeregisterCriticalServiceAfter configures +# automatic deregistration of a service after the health check is critical for +# this length of time. +# +# Fabio registers an http health check on http(s)://${ui.addr}/health +# and this value tells consul to deregister the associated service if the check +# is critical for the specified duration. +# +# The default is +# +# registry.consul.register.checkDeregisterCriticalServiceAfter = 90m + + # metrics.target configures the backend the metrics values are # sent to. # diff --git a/registry/consul/register.go b/registry/consul/register.go index e84c4adf1..e8aca4834 100644 --- a/registry/consul/register.go +++ b/registry/consul/register.go @@ -116,10 +116,11 @@ func serviceRegistration(cfg *config.Consul, serviceName string) (*api.AgentServ Port: port, Tags: cfg.ServiceTags, Check: &api.AgentServiceCheck{ - HTTP: checkURL, - Interval: cfg.CheckInterval.String(), - Timeout: cfg.CheckTimeout.String(), - TLSSkipVerify: cfg.CheckTLSSkipVerify, + HTTP: checkURL, + Interval: cfg.CheckInterval.String(), + Timeout: cfg.CheckTimeout.String(), + TLSSkipVerify: cfg.CheckTLSSkipVerify, + DeregisterCriticalServiceAfter: cfg.CheckDeregisterCriticalServiceAfter, }, }