From a3971a27bf816f706dd5ff7377d627f9db050b0a Mon Sep 17 00:00:00 2001 From: Kane York Date: Mon, 16 Nov 2015 13:07:02 -0800 Subject: [PATCH] Replace log.Println() with Statistics --- socketserver/internal/server/commands.go | 11 +++++---- socketserver/internal/server/handlecore.go | 18 +++++++-------- socketserver/internal/server/stats.go | 26 ++++++++++++++++++++++ socketserver/internal/server/utils.go | 2 +- 4 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 socketserver/internal/server/stats.go diff --git a/socketserver/internal/server/commands.go b/socketserver/internal/server/commands.go index 8552f768..4dcebd2d 100644 --- a/socketserver/internal/server/commands.go +++ b/socketserver/internal/server/commands.go @@ -48,6 +48,9 @@ func DispatchC2SCommand(conn *websocket.Conn, client *ClientInfo, msg ClientMess handler = C2SHandleRemoteCommand } + Statistics.CommandsIssuedTotal++ + Statistics.CommandsIssuedMap[msg.Command]++ + response, err := callHandler(handler, conn, client, msg) if err == nil { @@ -308,7 +311,7 @@ func doSendAggregateData() { followJSON, err := json.Marshal(follows) if err != nil { - log.Print(err) + log.Println("error reporting aggregate data:", err) } else { reportForm.Set("follows", string(followJSON)) } @@ -320,20 +323,20 @@ func doSendAggregateData() { } emoteJSON, err := json.Marshal(strEmoteUsage) if err != nil { - log.Print(err) + log.Println("error reporting aggregate data:", err) } else { reportForm.Set("emotes", string(emoteJSON)) } form, err := SealRequest(reportForm) if err != nil { - log.Print(err) + log.Println("error reporting aggregate data:", err) return } err = SendAggregatedData(form) if err != nil { - log.Print(err) + log.Println("error reporting aggregate data:", err) return } diff --git a/socketserver/internal/server/handlecore.go b/socketserver/internal/server/handlecore.go index 82ac446b..b296f490 100644 --- a/socketserver/internal/server/handlecore.go +++ b/socketserver/internal/server/handlecore.go @@ -72,7 +72,7 @@ func SetupServerAndHandle(config *ConfigFile, serveMux *http.ServeMux) { } resp, err := backendHTTPClient.PostForm(announceStartupURL, announceForm) if err != nil { - log.Println(err) + log.Println("could not announce startup to backend:", err) } else { resp.Body.Close() } @@ -158,7 +158,7 @@ var CloseFirstMessageNotHello = websocket.CloseError{ func RunSocketConnection(conn *websocket.Conn) { // websocket.Conn is a ReadWriteCloser - log.Println("Got socket connection from", conn.RemoteAddr()) + Statistics.ClientConnectsTotal++ var _closer sync.Once closer := func() { @@ -210,9 +210,6 @@ func RunSocketConnection(conn *websocket.Conn) { } _, isClose := err.(*websocket.CloseError) - if err != io.EOF && !isClose { - log.Println("Error while reading from client:", err) - } select { case errorChan <- err: case <-stoppedChan: @@ -255,8 +252,8 @@ RunLoop: case msg := <-clientChan: if client.Version == "" && msg.Command != HelloCommand { - log.Println("error - first message wasn't hello from", conn.RemoteAddr(), "-", msg) CloseConnection(conn, &CloseFirstMessageNotHello) + Statistics.FirstNotHelloDisconnects++ break RunLoop } @@ -300,7 +297,7 @@ RunLoop: // Close the channel so the draining goroutine can finish, too. close(_serverMessageChan) - log.Println("End socket connection from", conn.RemoteAddr()) + Statistics.ClientDisconnectsTotal++ } func getDeadline() time.Time { @@ -308,9 +305,9 @@ func getDeadline() time.Time { } func CloseConnection(conn *websocket.Conn, closeMsg *websocket.CloseError) { - if closeMsg != &CloseFirstMessageNotHello { - log.Println("Terminating connection with", conn.RemoteAddr(), "-", closeMsg.Text) - } + Statistics.DisconnectCodes[closeMsg.Code]++ + Statistics.DisconnectReasons[closeMsg.Text]++ + conn.WriteControl(websocket.CloseMessage, websocket.FormatCloseMessage(closeMsg.Code, closeMsg.Text), getDeadline()) conn.Close() } @@ -324,6 +321,7 @@ func SendMessage(conn *websocket.Conn, msg ClientMessage) { } conn.SetWriteDeadline(getDeadline()) conn.WriteMessage(messageType, packet) + Statistics.MessagesSent++ } // UnmarshalClientMessage unpacks websocket TextMessage into a ClientMessage provided in the `v` parameter. diff --git a/socketserver/internal/server/stats.go b/socketserver/internal/server/stats.go new file mode 100644 index 00000000..a917b160 --- /dev/null +++ b/socketserver/internal/server/stats.go @@ -0,0 +1,26 @@ +package server + +type StatsData struct { + ClientConnectsTotal int64 + ClientDisconnectsTotal int64 + FirstNotHelloDisconnects int64 + + DisconnectCodes map[int]int64 + DisconnectReasons map[string]int64 + + CommandsIssuedTotal int64 + CommandsIssuedMap map[Command]int64 + + MessagesSent int64 +} + +func newStatsData() *StatsData { + return &StatsData{ + CommandsIssuedMap: make(map[Command]int64), + DisconnectCodes: make(map[int]int64), + DisconnectReasons: make(map[string]int64), + } +} + +// Statistics is several variables that get incremented during normal operation of the server. +var Statistics = newStatsData() diff --git a/socketserver/internal/server/utils.go b/socketserver/internal/server/utils.go index 12c26ed0..07866e4b 100644 --- a/socketserver/internal/server/utils.go +++ b/socketserver/internal/server/utils.go @@ -89,7 +89,7 @@ func UnsealRequest(form url.Values) (url.Values, error) { retValues, err := url.ParseQuery(string(message)) if err != nil { // Assume that the signature was accidentally correct but the contents were garbage - log.Print(err) + log.Println("Error unsealing request:", err) return nil, ErrorInvalidSignature }