[MM-60619] Annotate cluster logs messages (#28268)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
bd61f1484b
Коммит
2b426573cd
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Ссылка в новой задаче
Block a user