Skip to content

Commit cd439a9

Browse files
committed
Update telemetry benchmark
1 parent 476f354 commit cd439a9

File tree

3 files changed

+59
-27
lines changed

3 files changed

+59
-27
lines changed
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
``` ini
22

3-
BenchmarkDotNet=v0.13.5, OS=Windows 11 (10.0.22621.1702/22H2/2022Update/SunValley2)
4-
Intel Core i9-10885H CPU 2.40GHz, 1 CPU, 16 logical and 8 physical cores
5-
.NET SDK=7.0.203
6-
[Host] : .NET 7.0.5 (7.0.523.17405), X64 RyuJIT AVX2
3+
BenchmarkDotNet=v0.13.5, OS=Windows 11 (10.0.22621.1702/22H2/2022Update/SunValley2), VM=Hyper-V
4+
Intel Xeon Platinum 8370C CPU 2.80GHz, 1 CPU, 16 logical and 8 physical cores
5+
.NET SDK=7.0.304
6+
[Host] : .NET 7.0.7 (7.0.723.27404), X64 RyuJIT AVX2
77

88
Job=MediumRun Toolchain=InProcessEmitToolchain IterationCount=15
99
LaunchCount=2 WarmupCount=10
1010

1111
```
12-
| Method | Telemetry | Mean | Error | StdDev | Median | Gen0 | Allocated |
13-
|-------- |---------- |------------:|-----------:|-----------:|----------:|-------:|----------:|
14-
| **Execute** | **False** | **90.27 ns** | **0.823 ns** | **1.207 ns** | **90.34 ns** | **-** | **-** |
15-
| Retry | False | 435.25 ns | 8.593 ns | 12.595 ns | 433.63 ns | - | - |
16-
| **Execute** | **True** | **311.60 ns** | **4.107 ns** | **5.890 ns** | **311.37 ns** | **-** | **-** |
17-
| Retry | True | 1,004.07 ns | 106.845 ns | 159.921 ns | 922.31 ns | 0.0124 | 104 B |
12+
| Method | Telemetry | Enrichment | Mean | Error | StdDev | Gen0 | Allocated |
13+
|-------- |---------- |----------- |------------:|---------:|----------:|-------:|----------:|
14+
| **Execute** | **False** | **False** | **80.13 ns** | **0.324 ns** | **0.486 ns** | **-** | **-** |
15+
| **Execute** | **False** | **True** | **74.33 ns** | **0.286 ns** | **0.392 ns** | **-** | **-** |
16+
| **Execute** | **True** | **False** | **494.33 ns** | **3.973 ns** | **5.698 ns** | **0.0029** | **72 B** |
17+
| **Execute** | **True** | **True** | **1,157.27 ns** | **7.130 ns** | **10.450 ns** | **0.0286** | **728 B** |
Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
11
using Microsoft.Extensions.Logging.Abstractions;
2+
using Polly.Extensions.Telemetry;
3+
using Polly.Telemetry;
4+
using static System.Net.Mime.MediaTypeNames;
25

36
namespace Polly.Core.Benchmarks;
47

58
public 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
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace Polly.Core.Benchmarks.Utils;
2+
3+
internal sealed class EmptyResilienceOptions : ResilienceStrategyOptions
4+
{
5+
public override string StrategyType => "Empty";
6+
}

0 commit comments

Comments
 (0)