diff --git a/app/web_conn.go b/app/web_conn.go index 5ffb4e7069..daa8ba08d2 100644 --- a/app/web_conn.go +++ b/app/web_conn.go @@ -34,6 +34,12 @@ const ( deadQueueSize = 128 // Approximated from /proc/sys/net/core/wmem_default / 2048 (avg msg size) ) +const ( + reconnectFound = "success" + reconnectNotFound = "failure" + reconnectLossless = "lossless" +) + type WebConnConfig struct { WebSocket *websocket.Conn Session model.Session @@ -304,11 +310,13 @@ func (wc *WebConn) writePump() { wc.logSocketErr("websocket.drainDeadQueue", err) return } + if m := wc.App.Metrics(); m != nil { + m.IncrementWebsocketReconnectEvent(reconnectFound) + } } else if wc.hasMsgLoss() { // If the seq number is not in dead queue, but it was supposed to be, // then generate a different connection ID, // and set sequence to 0, and clear dead queue. - // TODO: Add metrics for this. (both true and false cases) wc.clearDeadQueue() wc.SetConnectionID(model.NewId()) wc.Sequence = 0 @@ -320,6 +328,13 @@ func (wc *WebConn) writePump() { wc.logSocketErr("websocket.sendHello", err) return } + if m := wc.App.Metrics(); m != nil { + m.IncrementWebsocketReconnectEvent(reconnectNotFound) + } + } else { + if m := wc.App.Metrics(); m != nil { + m.IncrementWebsocketReconnectEvent(reconnectLossless) + } } } diff --git a/einterfaces/metrics.go b/einterfaces/metrics.go index 3ba92eef43..babea3b349 100644 --- a/einterfaces/metrics.go +++ b/einterfaces/metrics.go @@ -43,6 +43,7 @@ type MetricsInterface interface { DecrementWebSocketBroadcastBufferSize(hub string, amount float64) IncrementWebSocketBroadcastUsersRegistered(hub string, amount float64) DecrementWebSocketBroadcastUsersRegistered(hub string, amount float64) + IncrementWebsocketReconnectEvent(eventType string) AddMemCacheHitCounter(cacheName string, amount float64) AddMemCacheMissCounter(cacheName string, amount float64) diff --git a/einterfaces/mocks/MetricsInterface.go b/einterfaces/mocks/MetricsInterface.go index 7a4ef274f5..ba65347577 100644 --- a/einterfaces/mocks/MetricsInterface.go +++ b/einterfaces/mocks/MetricsInterface.go @@ -230,6 +230,11 @@ func (_m *MetricsInterface) IncrementWebsocketEvent(eventType string) { _m.Called(eventType) } +// IncrementWebsocketReconnectEvent provides a mock function with given fields: eventType +func (_m *MetricsInterface) IncrementWebsocketReconnectEvent(eventType string) { + _m.Called(eventType) +} + // ObserveApiEndpointDuration provides a mock function with given fields: endpoint, method, statusCode, elapsed func (_m *MetricsInterface) ObserveApiEndpointDuration(endpoint string, method string, statusCode string, elapsed float64) { _m.Called(endpoint, method, statusCode, elapsed)