@@ -31,7 +31,7 @@ func TestMergeLogsInvalidInput(t *testing.T) {
3131 require .Error (t , err )
3232}
3333
34- func TestMergeSplitLogs (t * testing.T ) {
34+ func TestMergeSplitLogsBasedOnItemCount (t * testing.T ) {
3535 tests := []struct {
3636 name string
3737 cfg exporterbatcher.MaxSizeConfig
@@ -152,3 +152,122 @@ func TestExtractLogs(t *testing.T) {
152152 assert .Equal (t , 10 - i , ld .LogRecordCount ())
153153 }
154154}
155+
156+ func TestMergeSplitLogsBasedOnByteSize (t * testing.T ) {
157+ // Magic number is the byte size testdata.GenerateLogs(10)
158+ tests := []struct {
159+ name string
160+ cfg exporterbatcher.MaxSizeConfig
161+ lr1 internal.Request
162+ lr2 internal.Request
163+ expected []* logsRequest
164+ }{
165+ {
166+ name : "both_requests_empty" ,
167+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (10 ).ByteSize ()},
168+ lr1 : & logsRequest {ld : plog .NewLogs ()},
169+ lr2 : & logsRequest {ld : plog .NewLogs ()},
170+ expected : []* logsRequest {{ld : plog .NewLogs ()}},
171+ },
172+ {
173+ name : "first_request_empty" ,
174+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (10 ).ByteSize ()},
175+ lr1 : & logsRequest {ld : plog .NewLogs ()},
176+ lr2 : & logsRequest {ld : testdata .GenerateLogs (5 )},
177+ expected : []* logsRequest {{ld : testdata .GenerateLogs (5 )}},
178+ },
179+ {
180+ name : "first_empty_second_nil" ,
181+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (10 ).ByteSize ()},
182+ lr1 : & logsRequest {ld : plog .NewLogs ()},
183+ lr2 : nil ,
184+ expected : []* logsRequest {{ld : plog .NewLogs ()}},
185+ },
186+ {
187+ name : "merge_only" ,
188+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (11 ).ByteSize ()},
189+ lr1 : & logsRequest {ld : testdata .GenerateLogs (4 )},
190+ lr2 : & logsRequest {ld : testdata .GenerateLogs (6 )},
191+ expected : []* logsRequest {{ld : func () plog.Logs {
192+ logs := testdata .GenerateLogs (4 )
193+ testdata .GenerateLogs (6 ).ResourceLogs ().MoveAndAppendTo (logs .ResourceLogs ())
194+ return logs
195+ }()}},
196+ },
197+ {
198+ name : "split_only" ,
199+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (4 ).ByteSize ()},
200+ lr1 : & logsRequest {ld : plog .NewLogs ()},
201+ lr2 : & logsRequest {ld : testdata .GenerateLogs (10 )},
202+ expected : []* logsRequest {
203+ {ld : testdata .GenerateLogs (4 )},
204+ {ld : testdata .GenerateLogs (4 )},
205+ {ld : testdata .GenerateLogs (2 )},
206+ },
207+ },
208+ {
209+ name : "merge_and_split" ,
210+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : (testdata .GenerateLogs (10 ).ByteSize () + testdata .GenerateLogs (11 ).ByteSize ()) / 2 },
211+ lr1 : & logsRequest {ld : testdata .GenerateLogs (8 )},
212+ lr2 : & logsRequest {ld : testdata .GenerateLogs (20 )},
213+ expected : []* logsRequest {
214+ {ld : func () plog.Logs {
215+ logs := testdata .GenerateLogs (8 )
216+ testdata .GenerateLogs (2 ).ResourceLogs ().MoveAndAppendTo (logs .ResourceLogs ())
217+ return logs
218+ }()},
219+ {ld : testdata .GenerateLogs (10 )},
220+ {ld : testdata .GenerateLogs (8 )},
221+ },
222+ },
223+ {
224+ name : "scope_logs_split" ,
225+ cfg : exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (4 ).ByteSize ()},
226+ lr1 : & logsRequest {ld : func () plog.Logs {
227+ ld := testdata .GenerateLogs (4 )
228+ ld .ResourceLogs ().At (0 ).ScopeLogs ().AppendEmpty ().LogRecords ().AppendEmpty ().Body ().SetStr ("extra log" )
229+ return ld
230+ }()},
231+ lr2 : & logsRequest {ld : testdata .GenerateLogs (2 )},
232+ expected : []* logsRequest {
233+ {ld : testdata .GenerateLogs (4 )},
234+ {ld : func () plog.Logs {
235+ ld := testdata .GenerateLogs (0 )
236+ ld .ResourceLogs ().At (0 ).ScopeLogs ().At (0 ).LogRecords ().AppendEmpty ().Body ().SetStr ("extra log" )
237+ testdata .GenerateLogs (2 ).ResourceLogs ().MoveAndAppendTo (ld .ResourceLogs ())
238+ return ld
239+ }()},
240+ },
241+ },
242+ }
243+ for _ , tt := range tests {
244+ t .Run (tt .name , func (t * testing.T ) {
245+ res , err := tt .lr1 .MergeSplit (context .Background (), tt .cfg , tt .lr2 )
246+ require .NoError (t , err )
247+ assert .Equal (t , len (tt .expected ), len (res ))
248+ for i , r := range res {
249+ assert .Equal (t , tt .expected [i ], r .(* logsRequest ))
250+ }
251+ })
252+ }
253+ }
254+
255+ func BenchmarkSplittingBasedOnItemCount (b * testing.B ) {
256+ cfg := exporterbatcher.MaxSizeConfig {MaxSizeItems : 10 }
257+ for i := 0 ; i < b .N ; i ++ {
258+ lr1 := & logsRequest {ld : testdata .GenerateLogs (1000 )}
259+ lr2 := & logsRequest {ld : testdata .GenerateLogs (2000 )}
260+ _ , err := lr1 .MergeSplit (context .Background (), cfg , lr2 )
261+ require .NoError (b , err )
262+ }
263+ }
264+
265+ func BenchmarkSplittingBasedOnByteSize (b * testing.B ) {
266+ cfg := exporterbatcher.MaxSizeConfig {MaxSizeBytes : testdata .GenerateLogs (10 ).ByteSize ()}
267+ for i := 0 ; i < b .N ; i ++ {
268+ lr1 := & logsRequest {ld : testdata .GenerateLogs (1000 )}
269+ lr2 := & logsRequest {ld : testdata .GenerateLogs (2000 )}
270+ _ , err := lr1 .MergeSplit (context .Background (), cfg , lr2 )
271+ require .NoError (b , err )
272+ }
273+ }
0 commit comments