11using Microsoft . Extensions . Logging . Abstractions ;
2+ using Polly . Extensions . Telemetry ;
3+ using Polly . Telemetry ;
4+ using static System . Net . Mime . MediaTypeNames ;
25
36namespace Polly . Core . Benchmarks ;
47
58public class TelemetryBenchmark
69{
710 private ResilienceStrategy ? _strategy ;
8- private ResilienceStrategy ? _retryStrategy ;
911
1012 [ GlobalSetup ]
1113 public void Prepare ( )
1214 {
1315 _strategy = Build ( new ResilienceStrategyBuilder ( ) ) ;
14- _retryStrategy = Build ( new ResilienceStrategyBuilder ( ) . AddRetry ( new RetryStrategyOptions
15- {
16- ShouldRetry = _ => PredicateResult . True ,
17- RetryCount = 1 ,
18- BaseDelay = TimeSpan . Zero ,
19- BackoffType = RetryBackoffType . Constant
20- } ) ) ;
2116 }
2217
2318 [ Params ( true , false ) ]
2419 public bool Telemetry { get ; set ; }
2520
21+ [ Params ( true , false ) ]
22+ public bool Enrichment { get ; set ; }
23+
2624 [ Benchmark ]
2725 public async ValueTask Execute ( )
2826 {
@@ -31,21 +29,49 @@ public async ValueTask Execute()
3129 ResilienceContext . Return ( context ) ;
3230 }
3331
34- [ Benchmark ]
35- public async ValueTask Retry ( )
36- {
37- var context = ResilienceContext . Get ( ) ;
38- await _retryStrategy ! . ExecuteOutcomeAsync ( ( _ , _ ) => new ValueTask < Outcome < string > > ( new Outcome < string > ( "dummy" ) ) , context , "state" ) . ConfigureAwait ( false ) ;
39- ResilienceContext . Return ( context ) ;
40- }
41-
4232 private ResilienceStrategy Build ( ResilienceStrategyBuilder builder )
4333 {
34+ builder . AddStrategy ( context => new TelemetryEventStrategy ( context . Telemetry ) , new EmptyResilienceOptions ( ) ) ;
35+
4436 if ( Telemetry )
4537 {
46- builder . EnableTelemetry ( NullLoggerFactory . Instance ) ;
38+ TelemetryResilienceStrategyOptions options = new ( ) { LoggerFactory = NullLoggerFactory . Instance } ;
39+
40+ if ( Enrichment )
41+ {
42+ options . Enrichers . Add ( context =>
43+ {
44+ // The Microsoft.Extensions.Resilience library will add around 6 additional tags
45+ // https://github.com/dotnet/extensions/tree/main/src/Libraries/Microsoft.Extensions.Resilience
46+ context . Tags . Add ( new ( "dummy1" , "dummy" ) ) ;
47+ context . Tags . Add ( new ( "dummy2" , "dummy" ) ) ;
48+ context . Tags . Add ( new ( "dummy3" , "dummy" ) ) ;
49+ context . Tags . Add ( new ( "dummy4" , "dummy" ) ) ;
50+ context . Tags . Add ( new ( "dummy5" , "dummy" ) ) ;
51+ context . Tags . Add ( new ( "dummy6" , "dummy" ) ) ;
52+ } ) ;
53+ }
54+
55+ builder . EnableTelemetry ( options ) ;
4756 }
4857
4958 return builder . Build ( ) ;
5059 }
60+
61+ private class TelemetryEventStrategy : ResilienceStrategy
62+ {
63+ private readonly ResilienceStrategyTelemetry _telemetry ;
64+
65+ public TelemetryEventStrategy ( ResilienceStrategyTelemetry telemetry ) => _telemetry = telemetry ;
66+
67+ protected override ValueTask < Outcome < TResult > > ExecuteCoreAsync < TResult , TState > (
68+ Func < ResilienceContext , TState , ValueTask < Outcome < TResult > > > callback ,
69+ ResilienceContext context ,
70+ TState state )
71+ {
72+ _telemetry . Report ( "DummyEvent" , context , "dummy-args" ) ;
73+ return callback ( context , state ) ;
74+ }
75+ }
76+
5177}
0 commit comments