@@ -22,12 +22,14 @@ import (
22
22
"go.opentelemetry.io/collector/internal/memorylimiter/iruntime"
23
23
"go.opentelemetry.io/collector/pdata/plog"
24
24
"go.opentelemetry.io/collector/pdata/pmetric"
25
+ "go.opentelemetry.io/collector/pdata/pprofile"
25
26
"go.opentelemetry.io/collector/pdata/ptrace"
26
27
"go.opentelemetry.io/collector/processor"
27
28
"go.opentelemetry.io/collector/processor/memorylimiterprocessor/internal"
28
29
"go.opentelemetry.io/collector/processor/memorylimiterprocessor/internal/metadata"
29
30
"go.opentelemetry.io/collector/processor/memorylimiterprocessor/internal/metadatatest"
30
31
"go.opentelemetry.io/collector/processor/processorhelper"
32
+ "go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper"
31
33
"go.opentelemetry.io/collector/processor/processortest"
32
34
)
33
35
@@ -419,6 +421,96 @@ func TestLogMemoryPressureResponse(t *testing.T) {
419
421
})
420
422
}
421
423
424
+ // TestProfileMemoryPressureResponse manipulates results from querying memory and
425
+ // check expected side effects.
426
+ func TestProfileMemoryPressureResponse (t * testing.T ) {
427
+ pd := pprofile .NewProfiles ()
428
+ ctx := context .Background ()
429
+
430
+ tests := []struct {
431
+ name string
432
+ mlCfg * Config
433
+ memAlloc uint64
434
+ expectError bool
435
+ }{
436
+ {
437
+ name : "Below memAllocLimit" ,
438
+ mlCfg : & Config {
439
+ CheckInterval : time .Second ,
440
+ MemoryLimitPercentage : 50 ,
441
+ MemorySpikePercentage : 1 ,
442
+ },
443
+ memAlloc : 800 ,
444
+ expectError : false ,
445
+ },
446
+ {
447
+ name : "Above memAllocLimit" ,
448
+ mlCfg : & Config {
449
+ CheckInterval : time .Second ,
450
+ MemoryLimitPercentage : 50 ,
451
+ MemorySpikePercentage : 1 ,
452
+ },
453
+ memAlloc : 1800 ,
454
+ expectError : true ,
455
+ },
456
+ {
457
+ name : "Below memSpikeLimit" ,
458
+ mlCfg : & Config {
459
+ CheckInterval : time .Second ,
460
+ MemoryLimitPercentage : 50 ,
461
+ MemorySpikePercentage : 10 ,
462
+ },
463
+ memAlloc : 800 ,
464
+ expectError : false ,
465
+ },
466
+ {
467
+ name : "Above memSpikeLimit" ,
468
+ mlCfg : & Config {
469
+ CheckInterval : time .Second ,
470
+ MemoryLimitPercentage : 50 ,
471
+ MemorySpikePercentage : 11 ,
472
+ },
473
+ memAlloc : 800 ,
474
+ expectError : true ,
475
+ },
476
+ }
477
+ for _ , tt := range tests {
478
+ t .Run (tt .name , func (t * testing.T ) {
479
+ memorylimiter .GetMemoryFn = totalMemory
480
+ memorylimiter .ReadMemStatsFn = func (ms * runtime.MemStats ) {
481
+ ms .Alloc = tt .memAlloc
482
+ }
483
+
484
+ ml , err := newMemoryLimiterProcessor (processortest .NewNopSettingsWithType (metadata .Type ), tt .mlCfg )
485
+ require .NoError (t , err )
486
+ tp , err := xprocessorhelper .NewProfiles (
487
+ context .Background (),
488
+ processortest .NewNopSettingsWithType (metadata .Type ),
489
+ tt .mlCfg ,
490
+ consumertest .NewNop (),
491
+ ml .processProfiles ,
492
+ xprocessorhelper .WithCapabilities (processorCapabilities ),
493
+ xprocessorhelper .WithStart (ml .start ),
494
+ xprocessorhelper .WithShutdown (ml .shutdown ))
495
+ require .NoError (t , err )
496
+
497
+ assert .NoError (t , tp .Start (ctx , & host {}))
498
+ ml .memlimiter .CheckMemLimits ()
499
+ err = tp .ConsumeProfiles (ctx , pd )
500
+ if tt .expectError {
501
+ assert .Equal (t , memorylimiter .ErrDataRefused , err )
502
+ } else {
503
+ require .NoError (t , err )
504
+ }
505
+ assert .NoError (t , tp .Shutdown (ctx ))
506
+ })
507
+ }
508
+ t .Cleanup (func () {
509
+ memorylimiter .GetMemoryFn = iruntime .TotalMemory
510
+ memorylimiter .ReadMemStatsFn = runtime .ReadMemStats
511
+ })
512
+ }
513
+
422
514
type host struct {
423
515
component.Host
424
516
}
0 commit comments