diff --git a/server/channels/api4/system.go b/server/channels/api4/system.go index de08e1a39a..2549ee84eb 100644 --- a/server/channels/api4/system.go +++ b/server/channels/api4/system.go @@ -378,9 +378,9 @@ func queryLogs(c *Context, w http.ResponseWriter, r *http.Request) { return } - logs, logerr := c.App.QueryLogs(c.AppContext, c.Params.Page, c.Params.LogsPerPage, logFilter) - if logerr != nil { - c.Err = logerr + logs, appErr := c.App.QueryLogs(c.AppContext, c.Params.Page, c.Params.LogsPerPage, logFilter) + if appErr != nil { + c.Err = appErr return } @@ -388,11 +388,11 @@ func queryLogs(c *Context, w http.ResponseWriter, r *http.Request) { var result interface{} for node, logLines := range logs { for _, log := range logLines { - err2 := json.Unmarshal([]byte(log), &result) - if err2 == nil { - logsJSON[node] = append(logsJSON[node], result) + err = json.Unmarshal([]byte(log), &result) + if err != nil { + c.Logger.Warn("Error parsing log line in Server Logs", mlog.String("from_node", node), mlog.Err(err)) } else { - c.Logger.Warn("Error parsing log line in Server Logs") + logsJSON[node] = append(logsJSON[node], result) } } } diff --git a/server/channels/app/admin.go b/server/channels/app/admin.go index f768b9097e..fce9a7f2b2 100644 --- a/server/channels/app/admin.go +++ b/server/channels/app/admin.go @@ -21,7 +21,7 @@ var latestVersionCache = cache.NewLRU(&cache.CacheOptions{ Size: 1, }) -func (s *Server) GetLogs(c request.CTX, page, perPage int) ([]string, *model.AppError) { +func (s *Server) GetLogs(rctx request.CTX, page, perPage int) ([]string, *model.AppError) { var lines []string license := s.License() @@ -33,11 +33,11 @@ func (s *Server) GetLogs(c request.CTX, page, perPage int) ([]string, *model.App lines = append(lines, "-----------------------------------------------------------------------------------------------------------") lines = append(lines, "-----------------------------------------------------------------------------------------------------------") } else { - c.Logger().Error("Could not get cluster info") + rctx.Logger().Error("Could not get cluster info") } } - melines, err := s.GetLogsSkipSend(page, perPage, &model.LogFilter{}) + melines, err := s.GetLogsSkipSend(rctx, page, perPage, &model.LogFilter{}) if err != nil { return nil, err } @@ -45,7 +45,7 @@ func (s *Server) GetLogs(c request.CTX, page, perPage int) ([]string, *model.App lines = append(lines, melines...) if s.platform.Cluster() != nil && *s.platform.Config().ClusterSettings.Enable { - clines, err := s.platform.Cluster().GetLogs(page, perPage) + clines, err := s.platform.Cluster().GetLogs(rctx, page, perPage) if err != nil { return nil, err } @@ -56,7 +56,7 @@ func (s *Server) GetLogs(c request.CTX, page, perPage int) ([]string, *model.App return lines, nil } -func (s *Server) QueryLogs(c request.CTX, page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { +func (s *Server) QueryLogs(rctx request.CTX, page, perPage int, logFilter *model.LogFilter) (map[string][]string, *model.AppError) { logData := make(map[string][]string) serverName := "default" @@ -66,7 +66,7 @@ func (s *Server) QueryLogs(c request.CTX, page, perPage int, logFilter *model.Lo if info := s.platform.Cluster().GetMyClusterInfo(); info != nil { serverName = info.Hostname } else { - c.Logger().Error("Could not get cluster info") + rctx.Logger().Error("Could not get cluster info") } } @@ -74,15 +74,15 @@ func (s *Server) QueryLogs(c request.CTX, page, perPage int, logFilter *model.Lo if len(serverNames) > 0 { for _, nodeName := range serverNames { if nodeName == "default" { - AddLocalLogs(logData, s, page, perPage, nodeName, logFilter) + AddLocalLogs(rctx, logData, s, page, perPage, nodeName, logFilter) } } } else { - AddLocalLogs(logData, s, page, perPage, serverName, logFilter) + AddLocalLogs(rctx, logData, s, page, perPage, serverName, logFilter) } if s.platform.Cluster() != nil && *s.Config().ClusterSettings.Enable { - clusterLogs, err := s.platform.Cluster().QueryLogs(page, perPage) + clusterLogs, err := s.platform.Cluster().QueryLogs(rctx, page, perPage) if err != nil { return nil, err } @@ -101,8 +101,8 @@ func (s *Server) QueryLogs(c request.CTX, page, perPage int, logFilter *model.Lo return logData, nil } -func AddLocalLogs(logData map[string][]string, s *Server, page, perPage int, serverName string, logFilter *model.LogFilter) *model.AppError { - currentServerLogs, err := s.GetLogsSkipSend(page, perPage, logFilter) +func AddLocalLogs(rctx request.CTX, logData map[string][]string, s *Server, page, perPage int, serverName string, logFilter *model.LogFilter) *model.AppError { + currentServerLogs, err := s.GetLogsSkipSend(rctx, page, perPage, logFilter) if err != nil { return err } @@ -119,12 +119,12 @@ func (a *App) GetLogs(rctx request.CTX, page, perPage int) ([]string, *model.App return a.Srv().GetLogs(rctx, page, perPage) } -func (s *Server) GetLogsSkipSend(page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) { - return s.platform.GetLogsSkipSend(page, perPage, logFilter) +func (s *Server) GetLogsSkipSend(rctx request.CTX, page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) { + return s.platform.GetLogsSkipSend(rctx, page, perPage, logFilter) } func (a *App) GetLogsSkipSend(rctx request.CTX, page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) { - return a.Srv().GetLogsSkipSend(page, perPage, logFilter) + return a.Srv().GetLogsSkipSend(rctx, page, perPage, logFilter) } func (a *App) GetClusterStatus(rctx request.CTX) []*model.ClusterInfo { diff --git a/server/channels/app/analytics.go b/server/channels/app/analytics.go index 57de39d6de..c2ccb8409e 100644 --- a/server/channels/app/analytics.go +++ b/server/channels/app/analytics.go @@ -157,7 +157,7 @@ func (a *App) getAnalytics(rctx request.CTX, name string, teamID string, forSupp // If in HA mode then aggregate all the stats if a.Cluster() != nil && *a.Config().ClusterSettings.Enable { - stats, err2 := a.Cluster().GetClusterStats() + stats, err2 := a.Cluster().GetClusterStats(rctx) if err2 != nil { return nil, err2 } diff --git a/server/channels/app/busy_test.go b/server/channels/app/busy_test.go index 960ff443a6..16d445ab2c 100644 --- a/server/channels/app/busy_test.go +++ b/server/channels/app/busy_test.go @@ -135,16 +135,18 @@ func (c *ClusterMock) StartInterNodeCommunication() {} func (c *ClusterMock) StopInterNodeCommunication() {} func (c *ClusterMock) RegisterClusterMessageHandler(event model.ClusterEvent, crm einterfaces.ClusterMessageHandler) { } -func (c *ClusterMock) GetClusterId() string { return "cluster_mock" } -func (c *ClusterMock) IsLeader() bool { return false } -func (c *ClusterMock) GetMyClusterInfo() *model.ClusterInfo { return nil } -func (c *ClusterMock) GetClusterInfos() []*model.ClusterInfo { return nil } -func (c *ClusterMock) NotifyMsg(buf []byte) {} -func (c *ClusterMock) GetClusterStats() ([]*model.ClusterStats, *model.AppError) { return nil, nil } -func (c *ClusterMock) GetLogs(page, perPage int) ([]string, *model.AppError) { +func (c *ClusterMock) GetClusterId() string { return "cluster_mock" } +func (c *ClusterMock) IsLeader() bool { return false } +func (c *ClusterMock) GetMyClusterInfo() *model.ClusterInfo { return nil } +func (c *ClusterMock) GetClusterInfos() []*model.ClusterInfo { return nil } +func (c *ClusterMock) NotifyMsg(buf []byte) {} +func (c *ClusterMock) GetClusterStats(rctx request.CTX) ([]*model.ClusterStats, *model.AppError) { return nil, nil } -func (c *ClusterMock) QueryLogs(page, perPage int) (map[string][]string, *model.AppError) { +func (c *ClusterMock) GetLogs(rctx request.CTX, page, perPage int) ([]string, *model.AppError) { + return nil, nil +} +func (c *ClusterMock) QueryLogs(rctx request.CTX, page, perPage int) (map[string][]string, *model.AppError) { return nil, nil } func (c *ClusterMock) GenerateSupportPacket(rctx request.CTX, options *model.SupportPacketOptions) (map[string][]model.FileData, error) { diff --git a/server/channels/app/platform/busy_test.go b/server/channels/app/platform/busy_test.go index 2e296040a9..9da384426c 100644 --- a/server/channels/app/platform/busy_test.go +++ b/server/channels/app/platform/busy_test.go @@ -135,14 +135,18 @@ func (c *ClusterMock) StartInterNodeCommunication() {} func (c *ClusterMock) StopInterNodeCommunication() {} func (c *ClusterMock) RegisterClusterMessageHandler(event model.ClusterEvent, crm einterfaces.ClusterMessageHandler) { } -func (c *ClusterMock) GetClusterId() string { return "cluster_mock" } -func (c *ClusterMock) IsLeader() bool { return false } -func (c *ClusterMock) GetMyClusterInfo() *model.ClusterInfo { return nil } -func (c *ClusterMock) GetClusterInfos() []*model.ClusterInfo { return nil } -func (c *ClusterMock) NotifyMsg(buf []byte) {} -func (c *ClusterMock) GetClusterStats() ([]*model.ClusterStats, *model.AppError) { return nil, nil } -func (c *ClusterMock) GetLogs(page, perPage int) ([]string, *model.AppError) { return nil, nil } -func (c *ClusterMock) QueryLogs(page, perPage int) (map[string][]string, *model.AppError) { +func (c *ClusterMock) GetClusterId() string { return "cluster_mock" } +func (c *ClusterMock) IsLeader() bool { return false } +func (c *ClusterMock) GetMyClusterInfo() *model.ClusterInfo { return nil } +func (c *ClusterMock) GetClusterInfos() []*model.ClusterInfo { return nil } +func (c *ClusterMock) NotifyMsg(buf []byte) {} +func (c *ClusterMock) GetClusterStats(rctx request.CTX) ([]*model.ClusterStats, *model.AppError) { + return nil, nil +} +func (c *ClusterMock) GetLogs(rctx request.CTX, page, perPage int) ([]string, *model.AppError) { + return nil, nil +} +func (c *ClusterMock) QueryLogs(rctx request.CTX, page, perPage int) (map[string][]string, *model.AppError) { return nil, nil } func (c *ClusterMock) GenerateSupportPacket(rctx request.CTX, options *model.SupportPacketOptions) (map[string][]model.FileData, error) { diff --git a/server/channels/app/platform/log.go b/server/channels/app/platform/log.go index 47826c9d24..0616755838 100644 --- a/server/channels/app/platform/log.go +++ b/server/channels/app/platform/log.go @@ -121,7 +121,7 @@ func (ps *PlatformService) RemoveUnlicensedLogTargets(license *model.License) { }) } -func (ps *PlatformService) GetLogsSkipSend(page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) { +func (ps *PlatformService) GetLogsSkipSend(rctx request.CTX, page, perPage int, logFilter *model.LogFilter) ([]string, *model.AppError) { var lines []string if *ps.Config().LogSettings.EnableFile { @@ -175,10 +175,10 @@ func (ps *PlatformService) GetLogsSkipSend(page, perPage int, logFilter *model.L var entry *model.LogEntry err = json.Unmarshal(line, &entry) if err != nil { - mlog.Debug("Failed to parse line, skipping") + rctx.Logger().Debug("Failed to parse line, skipping") } else { filtered = isLogFilteredByLevel(logFilter, entry) || filtered - filtered = isLogFilteredByDate(logFilter, entry) || filtered + filtered = isLogFilteredByDate(rctx, logFilter, entry) || filtered } if filtered { @@ -257,7 +257,7 @@ func isLogFilteredByLevel(logFilter *model.LogFilter, entry *model.LogEntry) boo return true } -func isLogFilteredByDate(logFilter *model.LogFilter, entry *model.LogEntry) bool { +func isLogFilteredByDate(rctx request.CTX, logFilter *model.LogFilter, entry *model.LogEntry) bool { if logFilter.DateFrom == "" && logFilter.DateTo == "" { return false } @@ -273,7 +273,7 @@ func isLogFilteredByDate(logFilter *model.LogFilter, entry *model.LogEntry) bool timestamp, err := time.Parse("2006-01-02 15:04:05.999 -07:00", entry.Timestamp) if err != nil { - mlog.Debug("Cannot parse timestamp, skipping") + rctx.Logger().Debug("Cannot parse timestamp, skipping") return false } diff --git a/server/channels/testlib/cluster.go b/server/channels/testlib/cluster.go index 9f27df90ce..2339f56e0c 100644 --- a/server/channels/testlib/cluster.go +++ b/server/channels/testlib/cluster.go @@ -52,15 +52,15 @@ func (c *FakeClusterInterface) SendClusterMessageToNode(nodeID string, message * func (c *FakeClusterInterface) NotifyMsg(buf []byte) {} -func (c *FakeClusterInterface) GetClusterStats() ([]*model.ClusterStats, *model.AppError) { +func (c *FakeClusterInterface) GetClusterStats(rctx request.CTX) ([]*model.ClusterStats, *model.AppError) { return nil, nil } -func (c *FakeClusterInterface) GetLogs(page, perPage int) ([]string, *model.AppError) { +func (c *FakeClusterInterface) GetLogs(rctx request.CTX, page, perPage int) ([]string, *model.AppError) { return []string{}, nil } -func (c *FakeClusterInterface) QueryLogs(page, perPage int) (map[string][]string, *model.AppError) { +func (c *FakeClusterInterface) QueryLogs(rctx request.CTX, page, perPage int) (map[string][]string, *model.AppError) { return make(map[string][]string), nil } diff --git a/server/einterfaces/cluster.go b/server/einterfaces/cluster.go index c92248b536..4c94b42068 100644 --- a/server/einterfaces/cluster.go +++ b/server/einterfaces/cluster.go @@ -25,9 +25,9 @@ type ClusterInterface interface { SendClusterMessage(msg *model.ClusterMessage) SendClusterMessageToNode(nodeID string, msg *model.ClusterMessage) error NotifyMsg(buf []byte) - GetClusterStats() ([]*model.ClusterStats, *model.AppError) - GetLogs(page, perPage int) ([]string, *model.AppError) - QueryLogs(page, perPage int) (map[string][]string, *model.AppError) + GetClusterStats(rctx request.CTX) ([]*model.ClusterStats, *model.AppError) + GetLogs(ctx request.CTX, page, perPage int) ([]string, *model.AppError) + QueryLogs(rctx request.CTX, page, perPage int) (map[string][]string, *model.AppError) GenerateSupportPacket(rctx request.CTX, options *model.SupportPacketOptions) (map[string][]model.FileData, error) GetPluginStatuses() (model.PluginStatuses, *model.AppError) ConfigChanged(previousConfig *model.Config, newConfig *model.Config, sendToOtherServer bool) *model.AppError diff --git a/server/einterfaces/mocks/ClusterInterface.go b/server/einterfaces/mocks/ClusterInterface.go index 4300fc76b0..a88ac82bee 100644 --- a/server/einterfaces/mocks/ClusterInterface.go +++ b/server/einterfaces/mocks/ClusterInterface.go @@ -106,9 +106,9 @@ func (_m *ClusterInterface) GetClusterInfos() []*model.ClusterInfo { return r0 } -// GetClusterStats provides a mock function with given fields: -func (_m *ClusterInterface) GetClusterStats() ([]*model.ClusterStats, *model.AppError) { - ret := _m.Called() +// GetClusterStats provides a mock function with given fields: rctx +func (_m *ClusterInterface) GetClusterStats(rctx request.CTX) ([]*model.ClusterStats, *model.AppError) { + ret := _m.Called(rctx) if len(ret) == 0 { panic("no return value specified for GetClusterStats") @@ -116,19 +116,19 @@ func (_m *ClusterInterface) GetClusterStats() ([]*model.ClusterStats, *model.App var r0 []*model.ClusterStats var r1 *model.AppError - if rf, ok := ret.Get(0).(func() ([]*model.ClusterStats, *model.AppError)); ok { - return rf() + if rf, ok := ret.Get(0).(func(request.CTX) ([]*model.ClusterStats, *model.AppError)); ok { + return rf(rctx) } - if rf, ok := ret.Get(0).(func() []*model.ClusterStats); ok { - r0 = rf() + if rf, ok := ret.Get(0).(func(request.CTX) []*model.ClusterStats); ok { + r0 = rf(rctx) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]*model.ClusterStats) } } - if rf, ok := ret.Get(1).(func() *model.AppError); ok { - r1 = rf() + if rf, ok := ret.Get(1).(func(request.CTX) *model.AppError); ok { + r1 = rf(rctx) } else { if ret.Get(1) != nil { r1 = ret.Get(1).(*model.AppError) @@ -138,9 +138,9 @@ func (_m *ClusterInterface) GetClusterStats() ([]*model.ClusterStats, *model.App return r0, r1 } -// GetLogs provides a mock function with given fields: page, perPage -func (_m *ClusterInterface) GetLogs(page int, perPage int) ([]string, *model.AppError) { - ret := _m.Called(page, perPage) +// GetLogs provides a mock function with given fields: ctx, page, perPage +func (_m *ClusterInterface) GetLogs(ctx request.CTX, page int, perPage int) ([]string, *model.AppError) { + ret := _m.Called(ctx, page, perPage) if len(ret) == 0 { panic("no return value specified for GetLogs") @@ -148,19 +148,19 @@ func (_m *ClusterInterface) GetLogs(page int, perPage int) ([]string, *model.App var r0 []string var r1 *model.AppError - if rf, ok := ret.Get(0).(func(int, int) ([]string, *model.AppError)); ok { - return rf(page, perPage) + if rf, ok := ret.Get(0).(func(request.CTX, int, int) ([]string, *model.AppError)); ok { + return rf(ctx, page, perPage) } - if rf, ok := ret.Get(0).(func(int, int) []string); ok { - r0 = rf(page, perPage) + if rf, ok := ret.Get(0).(func(request.CTX, int, int) []string); ok { + r0 = rf(ctx, page, perPage) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]string) } } - if rf, ok := ret.Get(1).(func(int, int) *model.AppError); ok { - r1 = rf(page, perPage) + if rf, ok := ret.Get(1).(func(request.CTX, int, int) *model.AppError); ok { + r1 = rf(ctx, page, perPage) } else { if ret.Get(1) != nil { r1 = ret.Get(1).(*model.AppError) @@ -263,9 +263,9 @@ func (_m *ClusterInterface) NotifyMsg(buf []byte) { _m.Called(buf) } -// QueryLogs provides a mock function with given fields: page, perPage -func (_m *ClusterInterface) QueryLogs(page int, perPage int) (map[string][]string, *model.AppError) { - ret := _m.Called(page, perPage) +// QueryLogs provides a mock function with given fields: rctx, page, perPage +func (_m *ClusterInterface) QueryLogs(rctx request.CTX, page int, perPage int) (map[string][]string, *model.AppError) { + ret := _m.Called(rctx, page, perPage) if len(ret) == 0 { panic("no return value specified for QueryLogs") @@ -273,19 +273,19 @@ func (_m *ClusterInterface) QueryLogs(page int, perPage int) (map[string][]strin var r0 map[string][]string var r1 *model.AppError - if rf, ok := ret.Get(0).(func(int, int) (map[string][]string, *model.AppError)); ok { - return rf(page, perPage) + if rf, ok := ret.Get(0).(func(request.CTX, int, int) (map[string][]string, *model.AppError)); ok { + return rf(rctx, page, perPage) } - if rf, ok := ret.Get(0).(func(int, int) map[string][]string); ok { - r0 = rf(page, perPage) + if rf, ok := ret.Get(0).(func(request.CTX, int, int) map[string][]string); ok { + r0 = rf(rctx, page, perPage) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(map[string][]string) } } - if rf, ok := ret.Get(1).(func(int, int) *model.AppError); ok { - r1 = rf(page, perPage) + if rf, ok := ret.Get(1).(func(request.CTX, int, int) *model.AppError); ok { + r1 = rf(rctx, page, perPage) } else { if ret.Get(1) != nil { r1 = ret.Get(1).(*model.AppError)