From fa97a44e8d0f5c70de4fd90a0796737a65214554 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sun, 20 Feb 2022 19:50:23 +0800 Subject: [PATCH] check: added new config `checklatencysamples` to support average latency calculating (#282) --- README.md | 6 +++--- config.go | 1 + rule/config.go | 22 ++++++++++++---------- rule/group.go | 16 +++++++++++++--- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 4aee5a9..c477a77 100644 --- a/README.md +++ b/README.md @@ -93,7 +93,7 @@ glider -config CONFIG_PATH glider -verbose -listen :8443 -forward SCHEME://HOST:PORT ``` -**Show help:** `glider -help` +**Help:** `glider -help`
click to see details @@ -222,7 +222,7 @@ glider 0.16.0, https://github.com/nadoo/glider
-**Show Schemes:** `glider -scheme all` +**Schemes:** `glider -scheme all`
click to see details @@ -337,7 +337,7 @@ TLS and Websocket with a specified proxy protocol:
-**Show Examples:** `glider -example` +**Examples:** `glider -example`
click to see details diff --git a/config.go b/config.go index 551cacd..271ec73 100644 --- a/config.go +++ b/config.go @@ -66,6 +66,7 @@ check=disable: disable health check`) 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.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.IntVar(&conf.Strategy.MaxFailures, "maxfailures", 3, "max failures to change forwarder status to disabled") flag.IntVar(&conf.Strategy.DialTimeout, "dialtimeout", 3, "dial timeout(seconds)") diff --git a/rule/config.go b/rule/config.go index b6885a7..82deaeb 100644 --- a/rule/config.go +++ b/rule/config.go @@ -24,16 +24,17 @@ type Config struct { // Strategy configurations. type Strategy struct { - Strategy string - Check string - CheckInterval int - CheckTimeout int - CheckTolerance int - CheckDisabledOnly bool - MaxFailures int - DialTimeout int - RelayTimeout int - IntFace string + Strategy string + Check string + CheckInterval int + CheckTimeout int + CheckTolerance int + CheckLatencySamples int + CheckDisabledOnly bool + MaxFailures int + DialTimeout int + RelayTimeout int + IntFace string } // 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.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.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.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") diff --git a/rule/group.go b/rule/group.go index bb046bf..dd3aa12 100644 --- a/rule/group.go +++ b/rule/group.go @@ -266,13 +266,23 @@ func (p *FwdrGroup) check(fwdr *Forwarder, checker Checker) { } wait = 1 - fwdr.SetLatency(int64(elapsed)) - log.F("[check] %s: %s(%d), SUCCESS. elapsed: %s", - p.name, fwdr.Addr(), fwdr.Priority(), elapsed) + p.setLatency(fwdr, elapsed) + log.F("[check] %s: %s(%d), SUCCESS. elapsed: %s, Latency: %s", + p.name, fwdr.Addr(), fwdr.Priority(), elapsed, time.Duration(fwdr.Latency())) 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. func (p *FwdrGroup) scheduleRR(dstAddr string) *Forwarder { return p.avail[atomic.AddUint32(&p.index, 1)%uint32(len(p.avail))]