@@ -220,13 +220,133 @@ func TestOTLPConvertToPromTS(t *testing.T) {
220
220
}
221
221
}
222
222
223
+ func BenchmarkOTLPWriteHandler (b * testing.B ) {
224
+ cfg := distributor.OTLPConfig {
225
+ ConvertAllAttributes : false ,
226
+ DisableTargetInfo : false ,
227
+ }
228
+ overrides , err := validation .NewOverrides (querier .DefaultLimitsConfig (), nil )
229
+ require .NoError (b , err )
230
+
231
+ exportRequest := generateOTLPWriteRequest ()
232
+ mockPushFunc := func (context.Context , * cortexpb.WriteRequest ) (* cortexpb.WriteResponse , error ) {
233
+ return & cortexpb.WriteResponse {}, nil
234
+ }
235
+ handler := OTLPHandler (10000 , overrides , cfg , nil , mockPushFunc )
236
+
237
+ b .Run ("json with no compression" , func (b * testing.B ) {
238
+ ctx := context .Background ()
239
+ ctx = user .InjectOrgID (ctx , "user-1" )
240
+ body , err := exportRequest .MarshalJSON ()
241
+ require .NoError (b , err )
242
+ buf := bytes .NewBuffer (body ) // To reuse body
243
+
244
+ req , err := http .NewRequestWithContext (ctx , "" , "" , bytes .NewReader (buf .Bytes ()))
245
+ require .NoError (b , err )
246
+ req .Header .Set ("Content-Type" , jsonContentType )
247
+
248
+ b .ResetTimer ()
249
+ b .ReportAllocs ()
250
+ for i := 0 ; i < b .N ; i ++ {
251
+ recorder := httptest .NewRecorder ()
252
+ handler .ServeHTTP (recorder , req )
253
+
254
+ resp := recorder .Result ()
255
+ require .Equal (b , http .StatusOK , resp .StatusCode )
256
+ req .Body = io .NopCloser (bytes .NewReader (buf .Bytes ()))
257
+ }
258
+ })
259
+ b .Run ("json with gzip" , func (b * testing.B ) {
260
+ ctx := context .Background ()
261
+ ctx = user .InjectOrgID (ctx , "user-1" )
262
+ body , err := exportRequest .MarshalJSON ()
263
+ require .NoError (b , err )
264
+
265
+ var gzipBody bytes.Buffer
266
+ gz := gzip .NewWriter (& gzipBody )
267
+ _ , err = gz .Write (body )
268
+ require .NoError (b , err )
269
+ require .NoError (b , gz .Close ())
270
+ buf := bytes .NewBuffer (gzipBody .Bytes ()) // To reuse body
271
+
272
+ req , err := http .NewRequestWithContext (ctx , "" , "" , bytes .NewReader (buf .Bytes ()))
273
+ require .NoError (b , err )
274
+ req .Header .Set ("Content-Type" , jsonContentType )
275
+ req .Header .Set ("Content-Encoding" , "gzip" )
276
+
277
+ b .ResetTimer ()
278
+ b .ReportAllocs ()
279
+ for i := 0 ; i < b .N ; i ++ {
280
+ recorder := httptest .NewRecorder ()
281
+ handler .ServeHTTP (recorder , req )
282
+
283
+ resp := recorder .Result ()
284
+ require .Equal (b , http .StatusOK , resp .StatusCode )
285
+ req .Body = io .NopCloser (bytes .NewReader (buf .Bytes ()))
286
+ }
287
+ })
288
+ b .Run ("proto with no compression" , func (b * testing.B ) {
289
+ ctx := context .Background ()
290
+ ctx = user .InjectOrgID (ctx , "user-1" )
291
+ body , err := exportRequest .MarshalProto ()
292
+ require .NoError (b , err )
293
+ buf := bytes .NewBuffer (body ) // To reuse body
294
+
295
+ req , err := http .NewRequestWithContext (ctx , "" , "" , bytes .NewReader (buf .Bytes ()))
296
+ require .NoError (b , err )
297
+ req .Header .Set ("Content-Type" , pbContentType )
298
+
299
+ b .ResetTimer ()
300
+ b .ReportAllocs ()
301
+ for i := 0 ; i < b .N ; i ++ {
302
+
303
+ recorder := httptest .NewRecorder ()
304
+ handler .ServeHTTP (recorder , req )
305
+
306
+ resp := recorder .Result ()
307
+ require .Equal (b , http .StatusOK , resp .StatusCode )
308
+ req .Body = io .NopCloser (bytes .NewReader (buf .Bytes ()))
309
+ }
310
+ })
311
+ b .Run ("proto with gzip" , func (b * testing.B ) {
312
+ ctx := context .Background ()
313
+ ctx = user .InjectOrgID (ctx , "user-1" )
314
+ body , err := exportRequest .MarshalProto ()
315
+ require .NoError (b , err )
316
+
317
+ var gzipBody bytes.Buffer
318
+ gz := gzip .NewWriter (& gzipBody )
319
+ _ , err = gz .Write (body )
320
+ require .NoError (b , err )
321
+ require .NoError (b , gz .Close ())
322
+ buf := bytes .NewBuffer (gzipBody .Bytes ()) // To reuse body
323
+
324
+ req , err := http .NewRequestWithContext (ctx , "" , "" , bytes .NewReader (buf .Bytes ()))
325
+ require .NoError (b , err )
326
+ req .Header .Set ("Content-Type" , pbContentType )
327
+ req .Header .Set ("Content-Encoding" , "gzip" )
328
+
329
+ b .ResetTimer ()
330
+ b .ReportAllocs ()
331
+ for i := 0 ; i < b .N ; i ++ {
332
+
333
+ recorder := httptest .NewRecorder ()
334
+ handler .ServeHTTP (recorder , req )
335
+
336
+ resp := recorder .Result ()
337
+ require .Equal (b , http .StatusOK , resp .StatusCode )
338
+ req .Body = io .NopCloser (bytes .NewReader (buf .Bytes ()))
339
+ }
340
+ })
341
+ }
342
+
223
343
func TestOTLPWriteHandler (t * testing.T ) {
224
344
cfg := distributor.OTLPConfig {
225
345
ConvertAllAttributes : false ,
226
346
DisableTargetInfo : false ,
227
347
}
228
348
229
- exportRequest := generateOTLPWriteRequest (t )
349
+ exportRequest := generateOTLPWriteRequest ()
230
350
231
351
tests := []struct {
232
352
description string
@@ -368,7 +488,7 @@ func TestOTLPWriteHandler(t *testing.T) {
368
488
}
369
489
}
370
490
371
- func generateOTLPWriteRequest (t * testing. T ) pmetricotlp.ExportRequest {
491
+ func generateOTLPWriteRequest () pmetricotlp.ExportRequest {
372
492
d := pmetric .NewMetrics ()
373
493
374
494
// Generate One Counter, One Gauge, One Histogram, One Exponential-Histogram
0 commit comments