Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

collect statistics on bytes read and written to sockets #1785

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 20 additions & 15 deletions irc/getters.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,17 @@ func (client *Client) Sessions() (sessions []*Session) {
}

type SessionData struct {
ctime time.Time
atime time.Time
ip net.IP
hostname string
certfp string
deviceID string
connInfo string
sessionID int64
caps []string
ctime time.Time
atime time.Time
ip net.IP
hostname string
certfp string
deviceID string
connInfo string
sessionID int64
caps []string
bytesRead uint64
bytesWritten uint64
}

func (client *Client) AllSessionData(currentSession *Session, hasPrivs bool) (data []SessionData, currentIndex int) {
Expand All @@ -76,13 +78,16 @@ func (client *Client) AllSessionData(currentSession *Session, hasPrivs bool) (da
if session == currentSession {
currentIndex = i
}
bytesRead, bytesWritten := session.socket.Stats()
data[i] = SessionData{
atime: session.lastActive,
ctime: session.ctime,
hostname: session.rawHostname,
certfp: session.certfp,
deviceID: session.deviceID,
sessionID: session.sessionID,
atime: session.lastActive,
ctime: session.ctime,
hostname: session.rawHostname,
certfp: session.certfp,
deviceID: session.deviceID,
sessionID: session.sessionID,
bytesRead: bytesRead,
bytesWritten: bytesWritten,
}
if session.proxiedIP != nil {
data[i].ip = session.proxiedIP
Expand Down
1 change: 1 addition & 0 deletions irc/nickserv.go
Original file line number Diff line number Diff line change
Expand Up @@ -1275,6 +1275,7 @@ func nsClientsListHandler(service *ircService, server *Server, client *Client, p
service.Notice(rb, fmt.Sprintf(client.t("IRCv3 CAPs: %s"), capStr))
}
}
service.Notice(rb, fmt.Sprintf(client.t("Bytes RX/TX: %d / %d"), session.bytesRead, session.bytesWritten))
}
}

Expand Down
18 changes: 18 additions & 0 deletions irc/socket.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ type Socket struct {
sendQExceeded bool
finalData []byte // what to send when we die
finalized bool

bytesRead uint64
bytesWritten uint64
}

// NewSocket returns a new Socket.
Expand All @@ -56,6 +59,12 @@ func (socket *Socket) Close() {
socket.wakeWriter()
}

func (socket *Socket) Stats() (bytesRead, bytesWritten uint64) {
socket.Lock()
defer socket.Unlock()
return socket.bytesRead, socket.bytesWritten
}

// Read returns a single IRC line from a Socket.
func (socket *Socket) Read() (string, error) {
// immediately fail if Close() has been called, even if there's
Expand All @@ -67,6 +76,10 @@ func (socket *Socket) Read() (string, error) {
lineBytes, err := socket.conn.ReadLine()
line := string(lineBytes)

socket.Lock()
socket.bytesRead += uint64(len(lineBytes))
socket.Unlock()

if err == io.EOF {
socket.Close()
}
Expand Down Expand Up @@ -96,6 +109,7 @@ func (socket *Socket) Write(data []byte) (err error) {
} else {
socket.buffers = append(socket.buffers, data)
socket.totalLength = prospectiveLen
socket.bytesWritten += uint64(len(data))
}
}
socket.Unlock()
Expand Down Expand Up @@ -136,6 +150,10 @@ func (socket *Socket) BlockingWrite(data []byte) (err error) {
return io.EOF
}

socket.Lock()
socket.bytesWritten += uint64(len(data))
socket.Unlock()

err = socket.conn.WriteLine(data)
if err != nil {
socket.finalize()
Expand Down