diff --git a/lib/usagereporter/teleport/aggregating/submitter.go b/lib/usagereporter/teleport/aggregating/submitter.go index d565de2fe9c62..682cb7c8dc79a 100644 --- a/lib/usagereporter/teleport/aggregating/submitter.go +++ b/lib/usagereporter/teleport/aggregating/submitter.go @@ -127,10 +127,13 @@ func submitOnce(ctx context.Context, c SubmitterConfig) { } freeBatchSize := submitBatchSize - len(userActivityReports) - resourcePresenceReports, err := svc.listResourcePresenceReports(ctx, freeBatchSize) - if err != nil { - c.Log.WithError(err).Error("Failed to load resource counts reports for submission.") - return + var resourcePresenceReports []*prehogv1.ResourcePresenceReport + if freeBatchSize > 0 { + resourcePresenceReports, err = svc.listResourcePresenceReports(ctx, freeBatchSize) + if err != nil { + c.Log.WithError(err).Error("Failed to load resource counts reports for submission.") + return + } } totalReportCount := len(userActivityReports) + len(resourcePresenceReports) diff --git a/lib/usagereporter/teleport/aggregating/submitter_test.go b/lib/usagereporter/teleport/aggregating/submitter_test.go index 2aae2e2a03b7f..da5069ae96d44 100644 --- a/lib/usagereporter/teleport/aggregating/submitter_test.go +++ b/lib/usagereporter/teleport/aggregating/submitter_test.go @@ -21,6 +21,7 @@ import ( "time" "github.com/google/uuid" + "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" @@ -48,8 +49,13 @@ func TestSubmitOnce(t *testing.T) { svc := reportService{bk} var submitted []*prehogv1.UserActivityReport + var submittedPresence []*prehogv1.ResourcePresenceReport submitOk := func(ctx context.Context, req *prehogv1.SubmitUsageReportsRequest) (uuid.UUID, error) { + if l := len(req.UserActivity) + len(req.ResourcePresence); l > submitBatchSize { + return uuid.Nil, trace.LimitExceeded("got %v reports, expected at most %v", l, submitBatchSize) + } submitted = append(submitted, req.UserActivity...) + submittedPresence = append(submittedPresence, req.ResourcePresence...) return uuid.New(), nil } submitErr := func(ctx context.Context, req *prehogv1.SubmitUsageReportsRequest) (uuid.UUID, error) { @@ -142,7 +148,9 @@ func TestSubmitOnce(t *testing.T) { // successful submission, no remaining events but the alert stays for one more cycle submitOnce(ctx, scfg) require.Len(t, submitted, 1) + require.Len(t, submittedPresence, 1) submitted = nil + submittedPresence = nil alerts, err = scfg.Status.GetClusterAlerts(ctx, types.GetClusterAlertsRequest{ AlertID: alertName, @@ -159,4 +167,21 @@ func TestSubmitOnce(t *testing.T) { }) require.NoError(t, err) require.Empty(t, alerts) + + for i := 0; i < 20; i++ { + require.NoError(t, svc.upsertUserActivityReport(ctx, newReport(time.Now().UTC().Add(time.Duration(i)*time.Second)), reportTTL)) + } + for i := 0; i < 15; i++ { + require.NoError(t, svc.upsertResourcePresenceReport(ctx, newResourcePresenceReport(time.Now().UTC().Add(time.Duration(i)*time.Second)), reportTTL)) + } + clk.Advance(submitLockDuration) + submitOnce(ctx, scfg) + clk.Advance(submitLockDuration) + submitOnce(ctx, scfg) + clk.Advance(submitLockDuration) + submitOnce(ctx, scfg) + clk.Advance(submitLockDuration) + submitOnce(ctx, scfg) + require.Len(t, submitted, 20) + require.Len(t, submittedPresence, 15) }