metrics.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Contains the meters and timers used by the networking layer.
  2. package p2p
  3. import (
  4. "net"
  5. "github.com/rcrowley/go-metrics"
  6. )
  7. var (
  8. ingressConnectMeter = metrics.GetOrRegisterMeter("p2p/InboundConnects", metrics.DefaultRegistry)
  9. ingressTrafficMeter = metrics.GetOrRegisterMeter("p2p/InboundTraffic", metrics.DefaultRegistry)
  10. egressConnectMeter = metrics.GetOrRegisterMeter("p2p/OutboundConnects", metrics.DefaultRegistry)
  11. egressTrafficMeter = metrics.GetOrRegisterMeter("p2p/OutboundTraffic", metrics.DefaultRegistry)
  12. )
  13. // meteredConn is a wrapper around a network TCP connection that meters both the
  14. // inbound and outbound network traffic.
  15. type meteredConn struct {
  16. *net.TCPConn // Network connection to wrap with metering
  17. }
  18. // newMeteredConn creates a new metered connection, also bumping the ingress or
  19. // egress connection meter.
  20. func newMeteredConn(conn net.Conn, ingress bool) net.Conn {
  21. if ingress {
  22. ingressConnectMeter.Mark(1)
  23. } else {
  24. egressConnectMeter.Mark(1)
  25. }
  26. return &meteredConn{conn.(*net.TCPConn)}
  27. }
  28. // Read delegates a network read to the underlying connection, bumping the ingress
  29. // traffic meter along the way.
  30. func (c *meteredConn) Read(b []byte) (n int, err error) {
  31. n, err = c.TCPConn.Read(b)
  32. ingressTrafficMeter.Mark(int64(n))
  33. return
  34. }
  35. // Write delegates a network write to the underlying connection, bumping the
  36. // egress traffic meter along the way.
  37. func (c *meteredConn) Write(b []byte) (n int, err error) {
  38. n, err = c.TCPConn.Write(b)
  39. egressTrafficMeter.Mark(int64(n))
  40. return
  41. }