From 38568b59b266b842c8ed3ed56a3f3f0bbe379b63 Mon Sep 17 00:00:00 2001 From: dkeysil Date: Tue, 6 Feb 2024 17:02:15 +0100 Subject: [PATCH] Use since instead of tail --- clients/docker/client.go | 4 ++-- clients/interfaces.go | 2 +- clients/mocks/mock_clients.go | 8 ++++---- services/components/lifecycle/bot_logger.go | 8 +++----- .../components/lifecycle/bot_logger_test.go | 20 +++++++++---------- services/supervisor/agent_logs.go | 2 +- services/supervisor/services_test.go | 8 ++++++-- 7 files changed, 27 insertions(+), 25 deletions(-) diff --git a/clients/docker/client.go b/clients/docker/client.go index 39271abf..f7c0042b 100644 --- a/clients/docker/client.go +++ b/clients/docker/client.go @@ -799,12 +799,12 @@ func (d *dockerClient) ListDigestReferences(ctx context.Context) (imgs []string, } // GetContainerLogs gets the container logs. -func (d *dockerClient) GetContainerLogs(ctx context.Context, containerID, tail string, truncate int) (string, error) { +func (d *dockerClient) GetContainerLogs(ctx context.Context, containerID, since string, truncate int) (string, error) { r, err := d.cli.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{ ShowStdout: true, ShowStderr: true, Timestamps: true, - Tail: tail, + Since: since, }) if err != nil { return "", err diff --git a/clients/interfaces.go b/clients/interfaces.go index e23b2cec..68671499 100644 --- a/clients/interfaces.go +++ b/clients/interfaces.go @@ -43,7 +43,7 @@ type DockerClient interface { EnsureLocalImage(ctx context.Context, name, ref string) error EnsureLocalImages(ctx context.Context, timeoutPerPull time.Duration, imagePulls []docker.ImagePull) []error ListDigestReferences(ctx context.Context) ([]string, error) - GetContainerLogs(ctx context.Context, containerID, tail string, truncate int) (string, error) + GetContainerLogs(ctx context.Context, containerID, since string, truncate int) (string, error) GetContainerFromRemoteAddr(ctx context.Context, hostPort string) (*types.Container, error) SetImagePullCooldown(threshold int, cooldownDuration time.Duration) Events(ctx context.Context, since time.Time) (<-chan events.Message, <-chan error) diff --git a/clients/mocks/mock_clients.go b/clients/mocks/mock_clients.go index 7865ddc4..20daf87a 100644 --- a/clients/mocks/mock_clients.go +++ b/clients/mocks/mock_clients.go @@ -203,18 +203,18 @@ func (mr *MockDockerClientMockRecorder) GetContainerFromRemoteAddr(ctx, hostPort } // GetContainerLogs mocks base method. -func (m *MockDockerClient) GetContainerLogs(ctx context.Context, containerID, tail string, truncate int) (string, error) { +func (m *MockDockerClient) GetContainerLogs(ctx context.Context, containerID, since string, truncate int) (string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetContainerLogs", ctx, containerID, tail, truncate) + ret := m.ctrl.Call(m, "GetContainerLogs", ctx, containerID, since, truncate) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } // GetContainerLogs indicates an expected call of GetContainerLogs. -func (mr *MockDockerClientMockRecorder) GetContainerLogs(ctx, containerID, tail, truncate interface{}) *gomock.Call { +func (mr *MockDockerClientMockRecorder) GetContainerLogs(ctx, containerID, since, truncate interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetContainerLogs", reflect.TypeOf((*MockDockerClient)(nil).GetContainerLogs), ctx, containerID, tail, truncate) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetContainerLogs", reflect.TypeOf((*MockDockerClient)(nil).GetContainerLogs), ctx, containerID, since, truncate) } // GetContainers mocks base method. diff --git a/services/components/lifecycle/bot_logger.go b/services/components/lifecycle/bot_logger.go index da7620ac..568f7a54 100644 --- a/services/components/lifecycle/bot_logger.go +++ b/services/components/lifecycle/bot_logger.go @@ -3,7 +3,6 @@ package lifecycle import ( "context" "fmt" - "strconv" "time" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -17,7 +16,7 @@ import ( // BotLogger manages bots logging. type BotLogger interface { - SendBotLogs(ctx context.Context) error + SendBotLogs(ctx context.Context, snapshotInterval time.Duration) error } type botLogger struct { @@ -47,12 +46,11 @@ func NewBotLogger( // adjust these better with auto-upgrade later const ( - defaultAgentLogSendInterval = time.Minute defaultAgentLogTailLines = 50 defaultAgentLogAvgMaxCharsPerLine = 200 ) -func (bl *botLogger) SendBotLogs(ctx context.Context) error { +func (bl *botLogger) SendBotLogs(ctx context.Context, snapshotInterval time.Duration) error { var ( sendLogs agentlogs.Agents keepLogs agentlogs.Agents @@ -69,7 +67,7 @@ func (bl *botLogger) SendBotLogs(ctx context.Context) error { } logs, err := bl.dockerClient.GetContainerLogs( ctx, container.ID, - strconv.Itoa(defaultAgentLogTailLines), + fmt.Sprintf("%ds", int64(snapshotInterval.Seconds())), defaultAgentLogAvgMaxCharsPerLine*defaultAgentLogTailLines, ) if err != nil { diff --git a/services/components/lifecycle/bot_logger_test.go b/services/components/lifecycle/bot_logger_test.go index 55e84946..e5cd3865 100644 --- a/services/components/lifecycle/bot_logger_test.go +++ b/services/components/lifecycle/bot_logger_test.go @@ -3,8 +3,8 @@ package lifecycle import ( "context" "errors" - "strconv" "testing" + "time" "github.com/docker/docker/api/types" "github.com/ethereum/go-ethereum/accounts/keystore" @@ -87,18 +87,18 @@ func (s *BotLoggerSuite) TestSendBotLogs() { } s.dockerClient.EXPECT().GetContainerLogs( ctx, "bot1", - strconv.Itoa(defaultAgentLogTailLines), + "60s", defaultAgentLogAvgMaxCharsPerLine*defaultAgentLogTailLines, ).Return("some log", nil).Times(1) s.dockerClient.EXPECT().GetContainerLogs( ctx, "bot2", - strconv.Itoa(defaultAgentLogTailLines), + "60s", defaultAgentLogAvgMaxCharsPerLine*defaultAgentLogTailLines, ).Return("some log", nil).Times(1) s.botClient.EXPECT().LoadBotContainers(ctx).Return(mockContainers, nil) - s.r.NoError(botLogger.SendBotLogs(ctx)) + s.r.NoError(botLogger.SendBotLogs(ctx, time.Minute)) } // should fail if there is an error loading @@ -115,7 +115,7 @@ func (s *BotLoggerSuite) TestLoadBotContainersError() { mockContainers := []types.Container{} s.botClient.EXPECT().LoadBotContainers(ctx).Return(mockContainers, errors.New("test")) - s.r.EqualError(botLogger.SendBotLogs(ctx), "failed to load the bot containers: test") + s.r.EqualError(botLogger.SendBotLogs(ctx, time.Minute), "failed to load the bot containers: test") } // Should not send agent logs if fails @@ -154,17 +154,17 @@ func (s *BotLoggerSuite) TestGetContainerLogsError() { s.dockerClient.EXPECT().GetContainerLogs( ctx, "bot1", - strconv.Itoa(defaultAgentLogTailLines), + "60s", defaultAgentLogAvgMaxCharsPerLine*defaultAgentLogTailLines, ).Return("", errors.New("test")).Times(1) s.dockerClient.EXPECT().GetContainerLogs( ctx, "bot2", - strconv.Itoa(defaultAgentLogTailLines), + "60s", defaultAgentLogAvgMaxCharsPerLine*defaultAgentLogTailLines, ).Return("some log", nil).Times(1) - s.r.NoError(botLogger.SendBotLogs(ctx)) + s.r.NoError(botLogger.SendBotLogs(ctx, time.Minute)) } // Fails sending agent logs @@ -192,9 +192,9 @@ func (s *BotLoggerSuite) TestFailsToSendLogs() { s.dockerClient.EXPECT().GetContainerLogs( ctx, "bot1", - strconv.Itoa(defaultAgentLogTailLines), + "60s", defaultAgentLogAvgMaxCharsPerLine*defaultAgentLogTailLines, ).Return("some log", nil).Times(1) - s.r.EqualError(botLogger.SendBotLogs(ctx), "failed to send agent logs: test") + s.r.EqualError(botLogger.SendBotLogs(ctx, time.Minute), "failed to send agent logs: test") } diff --git a/services/supervisor/agent_logs.go b/services/supervisor/agent_logs.go index 27352884..3498f989 100644 --- a/services/supervisor/agent_logs.go +++ b/services/supervisor/agent_logs.go @@ -10,7 +10,7 @@ func (sup *SupervisorService) syncAgentLogs() { interval := time.Duration(sup.botLifecycleConfig.Config.AgentLogsConfig.SendIntervalSeconds) * time.Second ticker := time.NewTicker(interval) for range ticker.C { - err := sup.botLifecycle.BotLogger.SendBotLogs(sup.ctx) + err := sup.botLifecycle.BotLogger.SendBotLogs(sup.ctx, interval) sup.lastAgentLogsRequest.Set() sup.lastAgentLogsRequestError.Set(err) if err != nil { diff --git a/services/supervisor/services_test.go b/services/supervisor/services_test.go index ebc923c6..0df9b12b 100644 --- a/services/supervisor/services_test.go +++ b/services/supervisor/services_test.go @@ -21,6 +21,7 @@ import ( "github.com/forta-network/forta-node/config" "github.com/forta-network/forta-node/services/components/containers" mock_containers "github.com/forta-network/forta-node/services/components/containers/mocks" + mock_lifecycle "github.com/forta-network/forta-node/services/components/lifecycle/mocks" "github.com/golang/mock/gomock" "github.com/stretchr/testify/require" "github.com/stretchr/testify/suite" @@ -53,8 +54,9 @@ type Suite struct { globalClient *mock_clients.MockDockerClient releaseClient *mrelease.MockClient - msgClient *mock_clients.MockMessageClient - botClient *mock_containers.MockBotClient + msgClient *mock_clients.MockMessageClient + botClient *mock_containers.MockBotClient + botLifeCycleManager *mock_lifecycle.MockBotLifecycleManager supervisor *SupervisorService @@ -104,6 +106,7 @@ func (s *Suite) SetupTest() { s.globalClient = mock_clients.NewMockDockerClient(ctrl) s.releaseClient = mrelease.NewMockClient(ctrl) s.botClient = mock_containers.NewMockBotClient(ctrl) + s.botLifeCycleManager = mock_lifecycle.NewMockBotLifecycleManager(ctrl) s.msgClient = mock_clients.NewMockMessageClient(ctrl) @@ -132,6 +135,7 @@ func (s *Suite) SetupTest() { supervisor.config.Config.AgentLogsConfig.SendIntervalSeconds = 1 supervisor.botLifecycleConfig.Config = supervisor.config.Config supervisor.botLifecycle.BotClient = s.botClient + supervisor.botLifecycle.BotManager = s.botLifeCycleManager s.supervisor = supervisor }