Skip to content

peterbourgon/conntrack

Repository files navigation

conntrack go.dev reference Latest Release Build Status

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)
}