-
-
Notifications
You must be signed in to change notification settings - Fork 56
/
statsconn.go
109 lines (93 loc) · 2.67 KB
/
statsconn.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package telemetry
// code adopted from github.com/livekit/pkg/telemetry
import (
"net"
)
// Listener is a net.Listener that knows how to report to Prometheus.
type Listener struct {
net.Listener
name string
connType ConnType
}
// NewListener creates a net.Listener that knows its name and type.
func NewListener(l net.Listener, n string, t ConnType) *Listener {
return &Listener{Listener: l, name: n, connType: t}
}
// Accept accepts a new connection on a Listener.
func (l *Listener) Accept() (net.Conn, error) {
conn, err := l.Listener.Accept()
if err != nil {
return nil, err
}
return NewConn(conn, l.name, l.connType), nil
}
// Conn is a net.Conn that knows how to report to Prometheus.
type Conn struct {
net.Conn
name string
connType ConnType
}
// NewConn allocates a stats conn that knows its name and type.
func NewConn(c net.Conn, n string, t ConnType) *Conn {
AddConnection(n, t)
return &Conn{Conn: c, name: n, connType: t}
}
// Read reads from the Conn.
func (c *Conn) Read(b []byte) (n int, err error) {
n, err = c.Conn.Read(b)
if n > 0 {
IncrementBytes(c.name, c.connType, Incoming, uint64(n))
IncrementPackets(c.name, c.connType, Incoming, 1)
}
return
}
// Write writes to the Conn.
func (c *Conn) Write(b []byte) (n int, err error) {
n, err = c.Conn.Write(b)
if n > 0 {
IncrementBytes(c.name, c.connType, Outgoing, uint64(n))
IncrementPackets(c.name, c.connType, Outgoing, 1)
}
return
}
// Close closes the Conn.
func (c *Conn) Close() error {
SubConnection(c.name, c.connType)
return c.Conn.Close()
}
// PacketConn is a net.PacketConn that knows how to report to Prometheus.
type PacketConn struct {
net.PacketConn
name string
connType ConnType
}
// NewPacketConn decorates a PacketConnn with metric reporting.
func NewPacketConn(c net.PacketConn, n string, t ConnType) *PacketConn {
AddConnection(n, t)
return &PacketConn{PacketConn: c, name: n, connType: t}
}
// ReadFrom reads from the PacketConn.
func (c *PacketConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) {
n, addr, err = c.PacketConn.ReadFrom(p)
if n > 0 {
IncrementBytes(c.name, c.connType, Incoming, uint64(n))
IncrementPackets(c.name, c.connType, Incoming, 1)
}
return
}
// WriteTo writes to the PacketConn.
func (c *PacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error) {
n, err = c.PacketConn.WriteTo(p, addr)
if n > 0 {
IncrementBytes(c.name, c.connType, Outgoing, uint64(n))
IncrementPackets(c.name, c.connType, Outgoing, 1)
}
return
}
// ReadFrom reads from the PacketConn.
// WriteTo writes to the PacketConn.
// Close closes the PacketConn.
func (c *PacketConn) Close() error {
SubConnection(c.name, c.connType)
return c.PacketConn.Close()
}