@@ -31,7 +31,7 @@ func TestMergeLogsInvalidInput(t *testing.T) {
31
31
require .Error (t , err )
32
32
}
33
33
34
- func TestMergeSplitLogs (t * testing.T ) {
34
+ func TestMergeSplitLogsBasedOnItemCount (t * testing.T ) {
35
35
tests := []struct {
36
36
name string
37
37
cfg exporterbatcher.MaxSizeConfig
@@ -152,3 +152,142 @@ func TestExtractLogs(t *testing.T) {
152
152
assert .Equal (t , 10 - i , ld .LogRecordCount ())
153
153
}
154
154
}
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