Package conntrack allows Go programs to keep track of active connections.
First, create a conntrack.Tracker.
tracker := conntrack.NewTracker()
To track incoming connections to a server, create and wrap a net.Listener.
baseListener, err := net.Listen("tcp", "127.0.0.1:8080")
// handle err
trackingListener := tracker.NewListener(baseListener, conntrack.ListenerConfig{
Category: "optional-category",
OnAccept: func(c net.Conn, err error) { /* optional callback */ },
OnRead: func(n int, err error) { /* optional callback */ },
OnWrite: func(n int, err error) { /* optional callback */ },
OnClose: func(c net.Conn, err error) { /* optional callback */ },
})
server := &http.Server{...}
server.Serve(trackingListener)
To track outgoing connections from a client, create and wrap a net.Dialer.
baseDialer := &net.Dialer{...}
trackingDialer := tracker.NewDialer(baseDialer, conntrack.DialerConfig{
Category: "optional-category",
OnDial: func(netw, addr string, c net.Conn, err error) { /* optional callback */ },
OnRead: func(n int, err error) { /* optional callback */ },
OnWrite: func(n int, err error) { /* optional callback */ },
OnClose: func(c net.Conn, err error) { /* optional callback */ },
})
client := &http.Client{
Transport: &http.Transport{
DialContext: trackingDialer.DialContext,
},
}
res, err := client.Get("http://zombo.com")
// ...
The conntrack.Tracker maintains metadata for each active connection.
infos := tracker.Connections()
for i, info := range infos {
fmt.Printf("%d/%d\n", i+1, len(infos))
fmt.Printf(" Category: %s\n", info.Category)
fmt.Printf(" ClientServer: %s\n", info.ClientServer)
fmt.Printf(" LocalAddr: %s\n", info.LocalAddr)
fmt.Printf(" RemoteAddr: %s\n", info.RemoteAddr)
fmt.Printf(" EstablishedFor: %s\n", info.EstablishedFor)
fmt.Printf(" ReadBytes: %d\n", info.ReadBytes)
fmt.Printf(" WriteBytes: %d\n", info.WriteBytes)
}