check: added new config checklatencysamples to support average latency calculating (#282)

This commit is contained in:
nadoo 2022-02-20 19:50:23 +08:00
parent cb698713ee
commit fa97a44e8d
4 changed files with 29 additions and 16 deletions

View File

@ -93,7 +93,7 @@ glider -config CONFIG_PATH
glider -verbose -listen :8443 -forward SCHEME://HOST:PORT glider -verbose -listen :8443 -forward SCHEME://HOST:PORT
``` ```
**Show help:** `glider -help` **Help:** `glider -help`
<details> <details>
<summary>click to see details</summary> <summary>click to see details</summary>
@ -222,7 +222,7 @@ glider 0.16.0, https://github.com/nadoo/glider
</details> </details>
**Show Schemes:** `glider -scheme all` **Schemes:** `glider -scheme all`
<details> <details>
<summary>click to see details</summary> <summary>click to see details</summary>
@ -337,7 +337,7 @@ TLS and Websocket with a specified proxy protocol:
</details> </details>
**Show Examples:** `glider -example` **Examples:** `glider -example`
<details> <details>
<summary>click to see details</summary> <summary>click to see details</summary>

View File

@ -66,6 +66,7 @@ check=disable: disable health check`)
flag.IntVar(&conf.Strategy.CheckInterval, "checkinterval", 30, "fowarder check interval(seconds)") flag.IntVar(&conf.Strategy.CheckInterval, "checkinterval", 30, "fowarder check interval(seconds)")
flag.IntVar(&conf.Strategy.CheckTimeout, "checktimeout", 10, "fowarder check timeout(seconds)") flag.IntVar(&conf.Strategy.CheckTimeout, "checktimeout", 10, "fowarder check timeout(seconds)")
flag.IntVar(&conf.Strategy.CheckTolerance, "checktolerance", 0, "fowarder check tolerance(ms), switch only when new_latency < old_latency - tolerance, only used in lha mode") flag.IntVar(&conf.Strategy.CheckTolerance, "checktolerance", 0, "fowarder check tolerance(ms), switch only when new_latency < old_latency - tolerance, only used in lha mode")
flag.IntVar(&conf.Strategy.CheckLatencySamples, "checklatencysamples", 1, "use the average latency of the latest N checks")
flag.BoolVar(&conf.Strategy.CheckDisabledOnly, "checkdisabledonly", false, "check disabled fowarders only") flag.BoolVar(&conf.Strategy.CheckDisabledOnly, "checkdisabledonly", false, "check disabled fowarders only")
flag.IntVar(&conf.Strategy.MaxFailures, "maxfailures", 3, "max failures to change forwarder status to disabled") flag.IntVar(&conf.Strategy.MaxFailures, "maxfailures", 3, "max failures to change forwarder status to disabled")
flag.IntVar(&conf.Strategy.DialTimeout, "dialtimeout", 3, "dial timeout(seconds)") flag.IntVar(&conf.Strategy.DialTimeout, "dialtimeout", 3, "dial timeout(seconds)")

View File

@ -24,16 +24,17 @@ type Config struct {
// Strategy configurations. // Strategy configurations.
type Strategy struct { type Strategy struct {
Strategy string Strategy string
Check string Check string
CheckInterval int CheckInterval int
CheckTimeout int CheckTimeout int
CheckTolerance int CheckTolerance int
CheckDisabledOnly bool CheckLatencySamples int
MaxFailures int CheckDisabledOnly bool
DialTimeout int MaxFailures int
RelayTimeout int DialTimeout int
IntFace string RelayTimeout int
IntFace string
} }
// NewConfFromFile returns a new config from file. // NewConfFromFile returns a new config from file.
@ -46,6 +47,7 @@ func NewConfFromFile(ruleFile string) (*Config, error) {
f.StringVar(&p.Strategy.Check, "check", "http://www.msftconnecttest.com/connecttest.txt#expect=200", "check=tcp[://HOST:PORT]: tcp port connect check\ncheck=http://HOST[:PORT][/URI][#expect=STRING_IN_RESP_LINE]\ncheck=file://SCRIPT_PATH: run a check script, healthy when exitcode=0, environment variables: FORWARDER_ADDR\ncheck=disable: disable health check") f.StringVar(&p.Strategy.Check, "check", "http://www.msftconnecttest.com/connecttest.txt#expect=200", "check=tcp[://HOST:PORT]: tcp port connect check\ncheck=http://HOST[:PORT][/URI][#expect=STRING_IN_RESP_LINE]\ncheck=file://SCRIPT_PATH: run a check script, healthy when exitcode=0, environment variables: FORWARDER_ADDR\ncheck=disable: disable health check")
f.IntVar(&p.Strategy.CheckInterval, "checkinterval", 30, "fowarder check interval(seconds)") f.IntVar(&p.Strategy.CheckInterval, "checkinterval", 30, "fowarder check interval(seconds)")
f.IntVar(&p.Strategy.CheckTimeout, "checktimeout", 10, "fowarder check timeout(seconds)") f.IntVar(&p.Strategy.CheckTimeout, "checktimeout", 10, "fowarder check timeout(seconds)")
f.IntVar(&p.Strategy.CheckLatencySamples, "checklatencysamples", 1, "use the average latency of the latest N checks")
f.IntVar(&p.Strategy.CheckTolerance, "checktolerance", 0, "fowarder check tolerance(ms), switch only when new_latency < old_latency - tolerance, only used in lha mode") f.IntVar(&p.Strategy.CheckTolerance, "checktolerance", 0, "fowarder check tolerance(ms), switch only when new_latency < old_latency - tolerance, only used in lha mode")
f.BoolVar(&p.Strategy.CheckDisabledOnly, "checkdisabledonly", false, "check disabled fowarders only") f.BoolVar(&p.Strategy.CheckDisabledOnly, "checkdisabledonly", false, "check disabled fowarders only")
f.IntVar(&p.Strategy.MaxFailures, "maxfailures", 3, "max failures to change forwarder status to disabled") f.IntVar(&p.Strategy.MaxFailures, "maxfailures", 3, "max failures to change forwarder status to disabled")

View File

@ -266,13 +266,23 @@ func (p *FwdrGroup) check(fwdr *Forwarder, checker Checker) {
} }
wait = 1 wait = 1
fwdr.SetLatency(int64(elapsed)) p.setLatency(fwdr, elapsed)
log.F("[check] %s: %s(%d), SUCCESS. elapsed: %s", log.F("[check] %s: %s(%d), SUCCESS. elapsed: %s, Latency: %s",
p.name, fwdr.Addr(), fwdr.Priority(), elapsed) p.name, fwdr.Addr(), fwdr.Priority(), elapsed, time.Duration(fwdr.Latency()))
fwdr.Enable() fwdr.Enable()
} }
} }
func (p *FwdrGroup) setLatency(fwdr *Forwarder, elapsed time.Duration) {
newLatency := int64(elapsed)
if cnt := p.config.CheckLatencySamples; cnt > 1 {
if lastLagency := fwdr.Latency(); lastLagency > 0 {
newLatency = (lastLagency*(int64(cnt)-1) + int64(elapsed)) / int64(cnt)
}
}
fwdr.SetLatency(newLatency)
}
// Round Robin. // Round Robin.
func (p *FwdrGroup) scheduleRR(dstAddr string) *Forwarder { func (p *FwdrGroup) scheduleRR(dstAddr string) *Forwarder {
return p.avail[atomic.AddUint32(&p.index, 1)%uint32(len(p.avail))] return p.avail[atomic.AddUint32(&p.index, 1)%uint32(len(p.avail))]