@@ -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,142 @@ 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 BenchmarkSplittingBasedOnItemCountManyLogs (b * testing.B ) {
256+ cfg := exporterbatcher.MaxSizeConfig {MaxSizeItems : 10 }
257+ for i := 0 ; i < b .N ; i ++ {
258+ lr1 := & logsRequest {ld : testdata .GenerateLogs (9 )}
259+ for j := 0 ; j < 1000 ; j ++ {
260+ lr2 := & logsRequest {ld : testdata .GenerateLogs (9 )}
261+ lr1 .MergeSplit (context .Background (), cfg , lr2 )
262+ }
263+ }
264+ }
265+
266+ func BenchmarkSplittingBasedOnByteSizeManyLogs (b * testing.B ) {
267+ cfg := exporterbatcher.MaxSizeConfig {MaxSizeBytes : 1010 }
268+ for i := 0 ; i < b .N ; i ++ {
269+ lr1 := & logsRequest {ld : testdata .GenerateLogs (9 )}
270+ for j := 0 ; j < 1000 ; j ++ {
271+ lr2 := & logsRequest {ld : testdata .GenerateLogs (9 )}
272+ lr1 .MergeSplit (context .Background (), cfg , lr2 )
273+ }
274+ }
275+ }
276+
277+ func BenchmarkSplittingBasedOnItemCountHugeLog (b * testing.B ) {
278+ cfg := exporterbatcher.MaxSizeConfig {MaxSizeItems : 10 }
279+ for i := 0 ; i < b .N ; i ++ {
280+ lr1 := & logsRequest {ld : testdata .GenerateLogs (1 )}
281+ lr2 := & logsRequest {ld : testdata .GenerateLogs (1000 )}
282+ lr1 .MergeSplit (context .Background (), cfg , lr2 )
283+ }
284+ }
285+
286+ func BenchmarkSplittingBasedOnByteSizeHugeLog (b * testing.B ) {
287+ cfg := exporterbatcher.MaxSizeConfig {MaxSizeBytes : 1010 }
288+ for i := 0 ; i < b .N ; i ++ {
289+ lr1 := & logsRequest {ld : testdata .GenerateLogs (1 )}
290+ lr2 := & logsRequest {ld : testdata .GenerateLogs (1000 )}
291+ lr1 .MergeSplit (context .Background (), cfg , lr2 )
292+ }
293+ }
0 commit comments