add metrics

This commit is contained in:
ginuerzh 2022-04-05 17:56:36 +08:00
parent 6aa1cc7401
commit 1444ebc1ee
26 changed files with 405 additions and 29 deletions

4
go.mod
View File

@ -7,7 +7,7 @@ require (
github.com/docker/libcontainer v2.2.1+incompatible github.com/docker/libcontainer v2.2.1+incompatible
github.com/gin-contrib/cors v1.3.1 github.com/gin-contrib/cors v1.3.1
github.com/gin-gonic/gin v1.7.7 github.com/gin-gonic/gin v1.7.7
github.com/go-gost/core v0.0.0-20220404033031-04f6ed470873 github.com/go-gost/core v0.0.0-20220405095520-c2f49e94443c
github.com/go-gost/gosocks4 v0.0.1 github.com/go-gost/gosocks4 v0.0.1
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7 github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7
@ -18,6 +18,7 @@ require (
github.com/lucas-clemente/quic-go v0.25.0 github.com/lucas-clemente/quic-go v0.25.0
github.com/miekg/dns v1.1.47 github.com/miekg/dns v1.1.47
github.com/milosgajdos/tenus v0.0.3 github.com/milosgajdos/tenus v0.0.3
github.com/prometheus/client_golang v1.12.1
github.com/rs/xid v1.3.0 github.com/rs/xid v1.3.0
github.com/shadowsocks/go-shadowsocks2 v0.1.5 github.com/shadowsocks/go-shadowsocks2 v0.1.5
github.com/shadowsocks/shadowsocks-go v0.0.0-20200409064450-3e585ff90601 github.com/shadowsocks/shadowsocks-go v0.0.0-20200409064450-3e585ff90601
@ -69,7 +70,6 @@ require (
github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/ginkgo v1.16.5 // indirect
github.com/pelletier/go-toml v1.9.4 // indirect github.com/pelletier/go-toml v1.9.4 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.12.1 // indirect
github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/common v0.32.1 // indirect github.com/prometheus/common v0.32.1 // indirect
github.com/prometheus/procfs v0.7.3 // indirect github.com/prometheus/procfs v0.7.3 // indirect

4
go.sum
View File

@ -119,8 +119,8 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gost/core v0.0.0-20220404033031-04f6ed470873 h1:u+g28xvN00bW5ivbhb2GGo0R+JIBy5arxy5R+rKesqk= github.com/go-gost/core v0.0.0-20220405095520-c2f49e94443c h1:TzDyqefjnUVgdT6piHZgeXrVKXevawsMs0kmSZZhDR4=
github.com/go-gost/core v0.0.0-20220404033031-04f6ed470873/go.mod h1:/LzdiQ+0+3FMhyqw0phjFjXFdOa1fcQR5/bL/7ripCs= github.com/go-gost/core v0.0.0-20220405095520-c2f49e94443c/go.mod h1:/LzdiQ+0+3FMhyqw0phjFjXFdOa1fcQR5/bL/7ripCs=
github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s= github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s=
github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc= github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc=
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04= github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04=

View File

@ -6,11 +6,11 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
"github.com/go-gost/gosocks4" "github.com/go-gost/gosocks4"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -8,9 +8,9 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -8,9 +8,9 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -17,10 +17,10 @@ import (
"github.com/asaskevich/govalidator" "github.com/asaskevich/govalidator"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -8,8 +8,8 @@ import (
"net/http/httputil" "net/http/httputil"
"time" "time"
"github.com/go-gost/core/common/net/relay"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/x/internal/net/udp"
"github.com/go-gost/x/internal/util/socks" "github.com/go-gost/x/internal/util/socks"
) )
@ -65,7 +65,7 @@ func (h *httpHandler) handleUDP(ctx context.Context, conn net.Conn, log logger.L
return err return err
} }
relay := relay.NewUDPRelay(socks.UDPTunServerConn(conn), pc). relay := udp.NewRelay(socks.UDPTunServerConn(conn), pc).
WithBypass(h.options.Bypass). WithBypass(h.options.Bypass).
WithLogger(log) WithLogger(log)

View File

@ -19,10 +19,10 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -14,11 +14,11 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
dissector "github.com/go-gost/tls-dissector" dissector "github.com/go-gost/tls-dissector"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -7,9 +7,9 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -6,10 +6,10 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
net_relay "github.com/go-gost/core/common/net/relay"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/relay" "github.com/go-gost/relay"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/internal/net/udp"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
relay_util "github.com/go-gost/x/internal/util/relay" relay_util "github.com/go-gost/x/internal/util/relay"
) )
@ -113,7 +113,7 @@ func (h *relayHandler) bindUDP(ctx context.Context, conn net.Conn, network, addr
}) })
log.Debugf("bind on %s OK", pc.LocalAddr()) log.Debugf("bind on %s OK", pc.LocalAddr())
r := net_relay.NewUDPRelay(relay_util.UDPTunServerConn(conn), pc). r := udp.NewRelay(relay_util.UDPTunServerConn(conn), pc).
WithBypass(h.options.Bypass). WithBypass(h.options.Bypass).
WithLogger(log) WithLogger(log)
r.SetBufferSize(h.md.udpBufferSize) r.SetBufferSize(h.md.udpBufferSize)

View File

@ -7,9 +7,9 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/relay" "github.com/go-gost/relay"
netpkg "github.com/go-gost/x/internal/net"
) )
func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { func (h *relayHandler) handleConnect(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error {

View File

@ -7,9 +7,9 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/relay" "github.com/go-gost/relay"
netpkg "github.com/go-gost/x/internal/net"
) )
func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network string, log logger.Logger) error { func (h *relayHandler) handleForward(ctx context.Context, conn net.Conn, network string, log logger.Logger) error {

View File

@ -13,10 +13,10 @@ import (
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
"github.com/go-gost/core/common/bufpool" "github.com/go-gost/core/common/bufpool"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
dissector "github.com/go-gost/tls-dissector" dissector "github.com/go-gost/tls-dissector"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -7,11 +7,11 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
"github.com/go-gost/gosocks4" "github.com/go-gost/gosocks4"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
) )

View File

@ -6,9 +6,9 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
netpkg "github.com/go-gost/x/internal/net"
) )
func (h *socks5Handler) handleBind(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { func (h *socks5Handler) handleBind(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error {

View File

@ -6,9 +6,9 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
netpkg "github.com/go-gost/x/internal/net"
) )
func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error { func (h *socks5Handler) handleConnect(ctx context.Context, conn net.Conn, network, address string, log logger.Logger) error {

View File

@ -6,9 +6,9 @@ import (
"net" "net"
"time" "time"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/internal/util/mux" "github.com/go-gost/x/internal/util/mux"
) )

View File

@ -9,9 +9,9 @@ import (
"net" "net"
"time" "time"
"github.com/go-gost/core/common/net/relay"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
"github.com/go-gost/x/internal/net/udp"
"github.com/go-gost/x/internal/util/socks" "github.com/go-gost/x/internal/util/socks"
) )
@ -68,7 +68,7 @@ func (h *socks5Handler) handleUDP(ctx context.Context, conn net.Conn, log logger
return err return err
} }
r := relay.NewUDPRelay(socks.UDPConn(cc, h.md.udpBufferSize), pc). r := udp.NewRelay(socks.UDPConn(cc, h.md.udpBufferSize), pc).
WithBypass(h.options.Bypass). WithBypass(h.options.Bypass).
WithLogger(log) WithLogger(log)
r.SetBufferSize(h.md.udpBufferSize) r.SetBufferSize(h.md.udpBufferSize)

View File

@ -5,9 +5,9 @@ import (
"net" "net"
"time" "time"
"github.com/go-gost/core/common/net/relay"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
"github.com/go-gost/x/internal/net/udp"
"github.com/go-gost/x/internal/util/socks" "github.com/go-gost/x/internal/util/socks"
) )
@ -56,7 +56,7 @@ func (h *socks5Handler) handleUDPTun(ctx context.Context, conn net.Conn, network
log.Debug(reply) log.Debug(reply)
log.Debugf("bind on %s OK", pc.LocalAddr()) log.Debugf("bind on %s OK", pc.LocalAddr())
r := relay.NewUDPRelay(socks.UDPTunServerConn(conn), pc). r := udp.NewRelay(socks.UDPTunServerConn(conn), pc).
WithBypass(h.options.Bypass). WithBypass(h.options.Bypass).
WithLogger(log) WithLogger(log)
r.SetBufferSize(h.md.udpBufferSize) r.SetBufferSize(h.md.udpBufferSize)

View File

@ -8,10 +8,10 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
"github.com/go-gost/gosocks5" "github.com/go-gost/gosocks5"
netpkg "github.com/go-gost/x/internal/net"
"github.com/go-gost/x/internal/util/ss" "github.com/go-gost/x/internal/util/ss"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"github.com/shadowsocks/go-shadowsocks2/core" "github.com/shadowsocks/go-shadowsocks2/core"

View File

@ -10,10 +10,10 @@ import (
"time" "time"
"github.com/go-gost/core/chain" "github.com/go-gost/core/chain"
netpkg "github.com/go-gost/core/common/net"
"github.com/go-gost/core/handler" "github.com/go-gost/core/handler"
"github.com/go-gost/core/logger" "github.com/go-gost/core/logger"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
netpkg "github.com/go-gost/x/internal/net"
sshd_util "github.com/go-gost/x/internal/util/sshd" sshd_util "github.com/go-gost/x/internal/util/sshd"
"github.com/go-gost/x/registry" "github.com/go-gost/x/registry"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"

50
internal/net/transport.go Normal file
View File

@ -0,0 +1,50 @@
package net
import (
"bufio"
"io"
"net"
"github.com/go-gost/core/common/bufpool"
)
func Transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1)
go func() {
errc <- copyBuffer(rw1, rw2)
}()
go func() {
errc <- copyBuffer(rw2, rw1)
}()
err := <-errc
if err != nil && err == io.EOF {
err = nil
}
return err
}
func copyBuffer(dst io.Writer, src io.Reader) error {
buf := bufpool.Get(32 * 1024)
defer bufpool.Put(buf)
_, err := io.CopyBuffer(dst, src, *buf)
return err
}
type bufferReaderConn struct {
net.Conn
br *bufio.Reader
}
func NewBufferReaderConn(conn net.Conn, br *bufio.Reader) net.Conn {
return &bufferReaderConn{
Conn: conn,
br: br,
}
}
func (c *bufferReaderConn) Read(b []byte) (int, error) {
return c.br.Read(b)
}

126
internal/net/udp/relay.go Normal file
View File

@ -0,0 +1,126 @@
package udp
import (
"net"
"github.com/go-gost/core/bypass"
"github.com/go-gost/core/common/bufpool"
"github.com/go-gost/core/logger"
)
type Relay struct {
pc1 net.PacketConn
pc2 net.PacketConn
bypass bypass.Bypass
bufferSize int
logger logger.Logger
}
func NewRelay(pc1, pc2 net.PacketConn) *Relay {
return &Relay{
pc1: pc1,
pc2: pc2,
}
}
func (r *Relay) WithBypass(bp bypass.Bypass) *Relay {
r.bypass = bp
return r
}
func (r *Relay) WithLogger(logger logger.Logger) *Relay {
r.logger = logger
return r
}
func (r *Relay) SetBufferSize(n int) {
r.bufferSize = n
}
func (r *Relay) Run() (err error) {
bufSize := r.bufferSize
if bufSize <= 0 {
bufSize = 1500
}
errc := make(chan error, 2)
go func() {
for {
err := func() error {
b := bufpool.Get(bufSize)
defer bufpool.Put(b)
n, raddr, err := r.pc1.ReadFrom(*b)
if err != nil {
return err
}
if r.bypass != nil && r.bypass.Contains(raddr.String()) {
if r.logger != nil {
r.logger.Warn("bypass: ", raddr)
}
return nil
}
if _, err := r.pc2.WriteTo((*b)[:n], raddr); err != nil {
return err
}
if r.logger != nil {
r.logger.Debugf("%s >>> %s data: %d",
r.pc2.LocalAddr(), raddr, n)
}
return nil
}()
if err != nil {
errc <- err
return
}
}
}()
go func() {
for {
err := func() error {
b := bufpool.Get(bufSize)
defer bufpool.Put(b)
n, raddr, err := r.pc2.ReadFrom(*b)
if err != nil {
return err
}
if r.bypass != nil && r.bypass.Contains(raddr.String()) {
if r.logger != nil {
r.logger.Warn("bypass: ", raddr)
}
return nil
}
if _, err := r.pc1.WriteTo((*b)[:n], raddr); err != nil {
return err
}
if r.logger != nil {
r.logger.Debugf("%s <<< %s data: %d",
r.pc2.LocalAddr(), raddr, n)
}
return nil
}()
if err != nil {
errc <- err
return
}
}
}()
return <-errc
}

135
metrics/metrics.go Normal file
View File

@ -0,0 +1,135 @@
package metrics
import (
"os"
"github.com/go-gost/core/metrics"
"github.com/prometheus/client_golang/prometheus"
)
type promMetrics struct {
host string
gauges map[metrics.MetricName]*prometheus.GaugeVec
counters map[metrics.MetricName]*prometheus.CounterVec
histograms map[metrics.MetricName]*prometheus.HistogramVec
}
func NewMetrics() metrics.Metrics {
host, _ := os.Hostname()
m := &promMetrics{
host: host,
gauges: map[metrics.MetricName]*prometheus.GaugeVec{
metrics.MetricServicesGauge: prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: string(metrics.MetricServicesGauge),
Help: "Current number of services",
},
[]string{"host"}),
metrics.MetricServiceRequestsInFlightGauge: prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: string(metrics.MetricServiceRequestsInFlightGauge),
Help: "Current in-flight requests",
},
[]string{"host", "service"}),
},
counters: map[metrics.MetricName]*prometheus.CounterVec{
metrics.MetricServiceRequestsCounter: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: string(metrics.MetricServiceRequestsCounter),
Help: "Total number of requests",
},
[]string{"host", "service"}),
metrics.MetricServiceTransferInputBytesCounter: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: string(metrics.MetricServiceTransferInputBytesCounter),
Help: "Total service input data transfer size in bytes",
},
[]string{"host", "service"}),
metrics.MetricServiceTransferOutputBytesCounter: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: string(metrics.MetricServiceTransferOutputBytesCounter),
Help: "Total service output data transfer size in bytes",
},
[]string{"host", "service"}),
metrics.MetricServiceHandlerErrorsCounter: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: string(metrics.MetricServiceHandlerErrorsCounter),
Help: "Total service handler errors",
},
[]string{"host", "service"}),
metrics.MetricChainErrorsCounter: prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: string(metrics.MetricChainErrorsCounter),
Help: "Total chain errors",
},
[]string{"host", "chain"}),
},
histograms: map[metrics.MetricName]*prometheus.HistogramVec{
metrics.MetricServiceRequestsDurationObserver: prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: string(metrics.MetricServiceRequestsDurationObserver),
Help: "Distribution of request latencies",
Buckets: []float64{
.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10, 15, 30, 60,
},
},
[]string{"host", "service"}),
metrics.MetricNodeConnectDurationObserver: prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: string(metrics.MetricNodeConnectDurationObserver),
Help: "Distribution of chain node connect latencies",
Buckets: []float64{
.01, .05, .1, .25, .5, 1, 1.5, 2, 5, 10, 15, 30, 60,
},
},
[]string{"host", "chain", "node"}),
},
}
for k := range m.gauges {
prometheus.MustRegister(m.gauges[k])
}
for k := range m.counters {
prometheus.MustRegister(m.counters[k])
}
for k := range m.histograms {
prometheus.MustRegister(m.histograms[k])
}
return m
}
func (m *promMetrics) Gauge(name metrics.MetricName, labels metrics.Labels) metrics.Gauge {
v, ok := m.gauges[name]
if !ok {
return nil
}
if labels == nil {
labels = metrics.Labels{}
}
labels["host"] = m.host
return v.With(prometheus.Labels(labels))
}
func (m *promMetrics) Counter(name metrics.MetricName, labels metrics.Labels) metrics.Counter {
v, ok := m.counters[name]
if !ok {
return nil
}
if labels == nil {
labels = metrics.Labels{}
}
labels["host"] = m.host
return v.With(prometheus.Labels(labels))
}
func (m *promMetrics) Observer(name metrics.MetricName, labels metrics.Labels) metrics.Observer {
v, ok := m.histograms[name]
if !ok {
return nil
}
if labels == nil {
labels = metrics.Labels{}
}
labels["host"] = m.host
return v.With(prometheus.Labels(labels))
}

View File

@ -0,0 +1,65 @@
package service
import (
"net"
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
const (
DefaultPath = "/metrics"
)
type options struct {
path string
}
type Option func(*options)
func PathOption(path string) Option {
return func(o *options) {
o.path = path
}
}
type Service struct {
s *http.Server
ln net.Listener
}
func NewService(addr string, opts ...Option) (*Service, error) {
ln, err := net.Listen("tcp", addr)
if err != nil {
return nil, err
}
var options options
for _, opt := range opts {
opt(&options)
}
if options.path == "" {
options.path = DefaultPath
}
mux := http.NewServeMux()
mux.Handle(options.path, promhttp.Handler())
return &Service{
s: &http.Server{
Handler: mux,
},
ln: ln,
}, nil
}
func (s *Service) Serve() error {
return s.s.Serve(s.ln)
}
func (s *Service) Addr() net.Addr {
return s.ln.Addr()
}
func (s *Service) Close() error {
return s.s.Close()
}