Skip to content

Commit

Permalink
don't compile metrics by default
Browse files Browse the repository at this point in the history
  • Loading branch information
dennwc committed Apr 11, 2019
1 parent 4851abd commit 6441f5d
Show file tree
Hide file tree
Showing 7 changed files with 140 additions and 110 deletions.
12 changes: 10 additions & 2 deletions README.md
Expand Up @@ -18,9 +18,17 @@ Else use:

## Compile proxy server

`git clone https://github.com/verlihub/tls-proxy.git`
```
git clone https://github.com/verlihub/tls-proxy.git
cd tls-proxy
go build proxy.go
```

`go build proxy.go`
With metrics:

```
go build --tags metrics proxy.go
```

## Start proxy server

Expand Down
16 changes: 1 addition & 15 deletions go.mod
Expand Up @@ -3,23 +3,9 @@ module github.com/Verlihub/tls-proxy
go 1.12

require (
github.com/go-logfmt/logfmt v0.4.0 // indirect
github.com/gogo/protobuf v1.2.1 // indirect
github.com/golang/protobuf v1.3.1 // indirect
github.com/kisielk/errcheck v1.2.0 // indirect
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
github.com/pkg/errors v0.8.1 // indirect
github.com/prometheus/client_golang v0.9.2 // indirect
github.com/prometheus/client_golang v0.9.2
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 // indirect
github.com/prometheus/common v0.2.0 // indirect
github.com/prometheus/procfs v0.0.0-20190403104016-ea9eea638872 // indirect
github.com/sirupsen/logrus v1.4.1 // indirect
github.com/stretchr/testify v1.3.0 // indirect
golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5 // indirect
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 // indirect
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 // indirect
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67 // indirect
golang.org/x/tools v0.0.0-20190406165526-0d5674b3111a // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/yaml.v2 v2.2.2 // indirect
)
25 changes: 0 additions & 25 deletions go.sum
Expand Up @@ -2,29 +2,21 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740=
Expand All @@ -40,32 +32,15 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R
github.com/prometheus/procfs v0.0.0-20190403104016-ea9eea638872 h1:0aNv3xC7DmQoy1/x1sMh18g+fihWW68LL13i8ao9kl4=
github.com/prometheus/procfs v0.0.0-20190403104016-ea9eea638872/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190406165526-0d5674b3111a/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
41 changes: 41 additions & 0 deletions metrics/common.go
@@ -0,0 +1,41 @@
package metrics

type Counter interface {
Add(v float64)
}

type Gauge interface {
Counter
}

type Observer interface {
Observe(v float64)
}

var (
_ Counter = noop{}
_ Gauge = noop{}
_ Observer = noop{}
)

type noop struct{}

func (noop) Add(v float64) {}
func (noop) Observe(v float64) {}

func ListenAndServe(addr string) error {
return listenAndServe(addr)
}

var (
ConnAccepted Counter = noop{}
ConnError Counter = noop{}
ConnOpen Gauge = noop{}
ConnInsecure Counter = noop{}
ConnOpenInsecure Gauge = noop{}
ConnTLS Counter = noop{}
ConnOpenTLS Gauge = noop{}
ConnTLSHandshake Observer = noop{}
ConnRx Counter = noop{}
ConnTx Counter = noop{}
)
7 changes: 7 additions & 0 deletions metrics/noop.go
@@ -0,0 +1,7 @@
// +build !metrics

package metrics

func listenAndServe(addr string) error {
return nil
}
58 changes: 58 additions & 0 deletions metrics/prometheus.go
@@ -0,0 +1,58 @@
// +build metrics

package metrics

import (
"net/http"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

func listenAndServe(addr string) error {
return http.ListenAndServe(addr, promhttp.Handler())
}

func init() {
ConnAccepted = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_accepted",
Help: "The total number of accepted connections",
})
ConnError = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_error",
Help: "The total number of connections failed with an error",
})
ConnOpen = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dc_conn_open",
Help: "The number of open connections",
})
ConnInsecure = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_insecure",
Help: "The total number of insecure connections",
})
ConnOpenInsecure = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dc_conn_insecure_open",
Help: "The number of open insecure connections",
})
ConnTLS = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_tls",
Help: "The total number of TLS connections",
})
ConnOpenTLS = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dc_conn_tls_open",
Help: "The number of open TLS connections",
})
ConnTLSHandshake = promauto.NewHistogram(prometheus.HistogramOpts{
Name: "dc_conn_tls_handshake_sec",
Help: "Time spent on TLS handshake",
})
ConnRx = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_rx_bytes",
Help: "Total bytes received from the client",
})
ConnTx = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_tx_bytes",
Help: "Total bytes sent to the client",
})
}
91 changes: 23 additions & 68 deletions proxy.go
Expand Up @@ -33,9 +33,7 @@ import (
"sync"
"time"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/Verlihub/tls-proxy/metrics"
)

var (
Expand Down Expand Up @@ -84,7 +82,7 @@ func run() error {
if *fMetrics != "" {
log.Println("serving metrics on", *fMetrics)
go func() {
if err := http.ListenAndServe(*fMetrics, promhttp.Handler()); err != nil {
if err := metrics.ListenAndServe(*fMetrics); err != nil {
log.Println("cannot serve metrics:", err)
}
}()
Expand Down Expand Up @@ -126,14 +124,14 @@ func acceptOn(l net.Listener) {
c, err := l.Accept()
if err != nil {
log.Println(err)
cntConnError.Add(1)
metrics.ConnError.Add(1)
continue
}
cntConnAccepted.Add(1)
metrics.ConnAccepted.Add(1)
go func() {
err := serve(c)
if err != nil && err != io.EOF {
cntConnError.Add(1)
metrics.ConnError.Add(1)
log.Println(c.RemoteAddr(), err)
}
}()
Expand All @@ -145,10 +143,10 @@ type timeoutErr interface {
}

func serve(c net.Conn) error {
cntConnOpen.Add(1)
metrics.ConnOpen.Add(1)
defer func() {
_ = c.Close()
cntConnOpen.Add(-1)
metrics.ConnOpen.Add(-1)
}()

addr := c.RemoteAddr().(*net.TCPAddr)
Expand All @@ -161,9 +159,9 @@ func serve(c net.Conn) error {

if tlsConfig == nil || *fWait <= 0 {
// no auto-detection
cntConnInsecure.Add(1)
cntConnOpenInsecure.Add(1)
defer cntConnOpenInsecure.Add(-1)
metrics.ConnInsecure.Add(1)
metrics.ConnOpenInsecure.Add(1)
defer metrics.ConnOpenInsecure.Add(-1)
return writeAndStream(buf[:i], c, i)
}

Expand All @@ -177,9 +175,9 @@ func serve(c net.Conn) error {
_ = c.SetReadDeadline(time.Time{})
if e, ok := err.(timeoutErr); ok && e.Timeout() {
// has to be plain NMDC
cntConnInsecure.Add(1)
cntConnOpenInsecure.Add(1)
defer cntConnOpenInsecure.Add(-1)
metrics.ConnInsecure.Add(1)
metrics.ConnOpenInsecure.Add(1)
defer metrics.ConnOpenInsecure.Add(-1)
return writeAndStream(buf[:i], c, i)
}
if err != nil {
Expand All @@ -199,15 +197,15 @@ func serve(c net.Conn) error {
return err
}
dt := time.Since(start).Seconds()
cntConnTLS.Add(1)
cntConnOpenTLS.Add(1)
defer cntConnOpenTLS.Add(-1)
durConnTLSHandshake.Observe(dt)
metrics.ConnTLS.Add(1)
metrics.ConnOpenTLS.Add(1)
defer metrics.ConnOpenTLS.Add(-1)
metrics.ConnTLSHandshake.Observe(dt)
return writeAndStream(buf, tc, i)
}
cntConnInsecure.Add(1)
cntConnOpenInsecure.Add(1)
defer cntConnOpenInsecure.Add(-1)
metrics.ConnInsecure.Add(1)
metrics.ConnOpenInsecure.Add(1)
defer metrics.ConnOpenInsecure.Add(-1)
return writeAndStream(buf, c, i)
}

Expand Down Expand Up @@ -252,14 +250,14 @@ func stream(c, h io.ReadWriteCloser) error {

go func() {
defer closeBoth()
_, _ = copyBuffer(h, c, cntConnRx)
_, _ = copyBuffer(h, c, metrics.ConnRx)
}()
_, _ = copyBuffer(c, h, cntConnTx)
_, _ = copyBuffer(c, h, metrics.ConnTx)
return nil
}

// copyBuffer was copied from io package and modified to add instrumentation.
func copyBuffer(dst io.Writer, src io.Reader, cnt prometheus.Counter) (written int64, err error) {
func copyBuffer(dst io.Writer, src io.Reader, cnt metrics.Counter) (written int64, err error) {
size := *fBuf * 1024
if l, ok := src.(*io.LimitedReader); ok && int64(size) > l.N {
if l.N < 1 {
Expand Down Expand Up @@ -296,47 +294,4 @@ func copyBuffer(dst io.Writer, src io.Reader, cnt prometheus.Counter) (written i
return written, err
}

var (
cntConnAccepted = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_accepted",
Help: "The total number of accepted connections",
})
cntConnError = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_error",
Help: "The total number of connections failed with an error",
})
cntConnOpen = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dc_conn_open",
Help: "The number of open connections",
})
cntConnInsecure = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_insecure",
Help: "The total number of insecure connections",
})
cntConnOpenInsecure = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dc_conn_insecure_open",
Help: "The number of open insecure connections",
})
cntConnTLS = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_tls",
Help: "The total number of TLS connections",
})
cntConnOpenTLS = promauto.NewGauge(prometheus.GaugeOpts{
Name: "dc_conn_tls_open",
Help: "The number of open TLS connections",
})
durConnTLSHandshake = promauto.NewHistogram(prometheus.HistogramOpts{
Name: "dc_conn_tls_handshake_sec",
Help: "Time spent on TLS handshake",
})
cntConnRx = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_rx_bytes",
Help: "Total bytes received from the client",
})
cntConnTx = promauto.NewCounter(prometheus.CounterOpts{
Name: "dc_conn_tx_bytes",
Help: "Total bytes sent to the client",
})
)

// end of file

0 comments on commit 6441f5d

Please sign in to comment.