Skip to content

Commit

Permalink
Feature/sidecarproxy timeout (#30)
Browse files Browse the repository at this point in the history
* Separate main&canary and sidecar proxy client timeouts in config

* Add MultiHTTPClientConfig comment

* Remove duplicate log
  • Loading branch information
fahrinh authored Aug 16, 2019
1 parent 220f554 commit aabb9a8
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 20 deletions.
2 changes: 1 addition & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package main
import (
"log"

routerversion "github.com/tiket-libre/canary-router/version"
"github.com/juju/errors"
routerversion "github.com/tiket-libre/canary-router/version"
)

var (
Expand Down
15 changes: 11 additions & 4 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,17 @@ var defaultConfig = config.Config{
WriteTimeout: 15,
IdleTimeout: 120,
},
Client: config.HTTPClientConfig{
Timeout: 5,
MaxIdleConns: 100,
IdleConnTimeout: 30,
Client: config.MultiHTTPClientConfig{
MainAndCanary: config.HTTPClientConfig{
Timeout: 5,
MaxIdleConns: 1000,
IdleConnTimeout: 30,
},
Sidecar: config.HTTPClientConfig{
Timeout: 2,
MaxIdleConns: 1000,
IdleConnTimeout: 30,
},
},
}

Expand Down
15 changes: 12 additions & 3 deletions cmd/root_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,18 @@ import (
func Test_mergeConfig(t *testing.T) {
defaultConfig := config.Config{
Server: config.HTTPServerConfig{ReadTimeout: 5, WriteTimeout: 15, IdleTimeout: 120},
Client: config.HTTPClientConfig{Timeout: 5, MaxIdleConns: 100, IdleConnTimeout: 30},
Client: config.MultiHTTPClientConfig{
MainAndCanary: config.HTTPClientConfig{Timeout: 5, MaxIdleConns: 1000, IdleConnTimeout: 30},
Sidecar: config.HTTPClientConfig{Timeout: 2, MaxIdleConns: 1000, IdleConnTimeout: 30},
},
}

allSetConfig := config.Config{
Server: config.HTTPServerConfig{ReadTimeout: 6, WriteTimeout: 7, IdleTimeout: 130},
Client: config.HTTPClientConfig{Timeout: 8, MaxIdleConns: 200, IdleConnTimeout: 40},
Client: config.MultiHTTPClientConfig{
MainAndCanary: config.HTTPClientConfig{Timeout: 6, MaxIdleConns: 2000, IdleConnTimeout: 40},
Sidecar: config.HTTPClientConfig{Timeout: 8, MaxIdleConns: 3000, IdleConnTimeout: 50},
},
}

type args struct {
Expand All @@ -31,7 +37,10 @@ func Test_mergeConfig(t *testing.T) {
{name: "if not set, set default", args: args{
targetConfig: &config.Config{
Server: config.HTTPServerConfig{ReadTimeout: 0, WriteTimeout: 0, IdleTimeout: 0},
Client: config.HTTPClientConfig{Timeout: 0, MaxIdleConns: 0, IdleConnTimeout: 0},
Client: config.MultiHTTPClientConfig{
MainAndCanary: config.HTTPClientConfig{Timeout: 0, MaxIdleConns: 0, IdleConnTimeout: 0},
Sidecar: config.HTTPClientConfig{Timeout: 0, MaxIdleConns: 0, IdleConnTimeout: 0},
},
}, defaultConfig: defaultConfig,
}, wantConfig: defaultConfig},
{name: "if all set, leave it", args: args{
Expand Down
16 changes: 12 additions & 4 deletions config.template.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,17 @@
"idle-timeout": 120
},
"proxy-client": {
"timeout": 5,
"max-idle-conns": 100,
"idle-conn-timeout": 30,
"disable-compression": true
"to-main-and-canary": {
"timeout": 5,
"max-idle-conns": 1000,
"idle-conn-timeout": 30,
"disable-compression": true
},
"to-sidecar": {
"timeout": 2,
"max-idle-conns": 1000,
"idle-conn-timeout": 30,
"disable-compression": true
},
}
}
8 changes: 7 additions & 1 deletion config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type Config struct {
CircuitBreaker CircuitBreaker `mapstructure:"circuit-breaker"`
Instrumentation InstrumentationConfig `mapstructure:"instrumentation"`
Server HTTPServerConfig `mapstructure:"router-server"`
Client HTTPClientConfig `mapstructure:"proxy-client"`
Client MultiHTTPClientConfig `mapstructure:"proxy-client"`
}

// InstrumentationConfig holds the configuration values specific to the instrumentation aspect.
Expand All @@ -44,6 +44,12 @@ type HTTPServerConfig struct {
IdleTimeout int `mapstructure:"idle-timeout"`
}

// MultiHTTPClientConfig holds the configuration for instantiating main&canary and sidecar proxy http.Client
type MultiHTTPClientConfig struct {
MainAndCanary HTTPClientConfig `mapstructure:"to-main-and-canary"`
Sidecar HTTPClientConfig `mapstructure:"to-sidecar"`
}

// HTTPClientConfig holds the configuration for instantiating http.Client
type HTTPClientConfig struct {
Timeout int `mapstructure:"timeout"`
Expand Down
14 changes: 7 additions & 7 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,26 +42,26 @@ type Server struct {
func NewServer(config config.Config) (*Server, error) {
server := &Server{config: config}

proxies, err := canaryrouter.BuildProxies(config.Client, config.MainTarget, config.CanaryTarget)
proxies, err := canaryrouter.BuildProxies(config.Client.MainAndCanary, config.MainTarget, config.CanaryTarget)
if err != nil {
return nil, errors.Trace(err)
}
server.proxies = proxies

tr := &http.Transport{
MaxIdleConns: config.Client.MaxIdleConns,
IdleConnTimeout: time.Duration(config.Client.IdleConnTimeout) * time.Second,
DisableCompression: config.Client.DisableCompression,
sidecarTransport := &http.Transport{
ResponseHeaderTimeout: time.Duration(config.Client.Sidecar.Timeout) * time.Second,
MaxIdleConns: config.Client.Sidecar.MaxIdleConns,
IdleConnTimeout: time.Duration(config.Client.Sidecar.IdleConnTimeout) * time.Second,
DisableCompression: config.Client.Sidecar.DisableCompression,
}

sidecarURL, err := url.Parse(server.config.SidecarURL)
if err != nil {
return nil, fmt.Errorf("Failed when creating proxy to sidecar: %v", err)
}
server.sidecarProxy = httputil.NewSingleHostReverseProxy(sidecarURL)
server.sidecarProxy.Transport = tr
server.sidecarProxy.Transport = sidecarTransport
server.sidecarProxy.ErrorHandler = func(w http.ResponseWriter, req *http.Request, err error) {
log.Printf("sidecar proxy error: %+v", err)
w.WriteHeader(StatusSidecarError)
_, errWrite := w.Write([]byte(err.Error()))
if errWrite != nil {
Expand Down

0 comments on commit aabb9a8

Please sign in to comment.