3
0
mirror of https://github.com/ergochat/ergo.git synced 2024-11-22 03:49:27 +01:00

collect statistics on bytes read and written to sockets

Fixes #1296
This commit is contained in:
Shivaram Lingamneni 2021-08-25 23:06:18 -04:00
parent 8b2f6de3e0
commit baab8bf6c8
3 changed files with 39 additions and 15 deletions

View File

@ -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) {
@ -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

View File

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

View File

@ -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.
@ -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
@ -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()
}
@ -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()
@ -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()