Skip to content

Commit 5f54c36

Browse files
committed
Add CircuitTest
1 parent b36b007 commit 5f54c36

5 files changed

Lines changed: 115 additions & 44 deletions

File tree

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Polly;
2+
using Polly.CircuitBreaker;
3+
4+
namespace ConsolePollyTest;
5+
6+
public static class PollyCircuitTest
7+
{
8+
9+
#region Constants & Statics
10+
11+
public static async Task Circuit_3Per2sec_TestAsync()
12+
{
13+
var options = TestBase.GetTelemetry();
14+
var builder = new ResiliencePipelineBuilder().ConfigureTelemetry(options)
15+
.AddCircuitBreaker(
16+
new CircuitBreakerStrategyOptions
17+
{
18+
MinimumThroughput = 3,
19+
SamplingDuration = TimeSpan.FromSeconds(2),
20+
FailureRatio = 0.5,
21+
BreakDuration = TimeSpan.FromSeconds(1),
22+
ShouldHandle = static (args) =>
23+
{
24+
// Handle all exceptions
25+
return ValueTask.FromResult(true);
26+
},
27+
});
28+
var pipeline = builder.Build();
29+
30+
using var client = TestBase.GetClient();
31+
32+
var i = 0;
33+
while (i++ < 10)
34+
{
35+
try
36+
{
37+
var result = await pipeline.ExecuteAsync(
38+
async (token) =>
39+
{
40+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
41+
return r;
42+
},
43+
cancellationToken: default);
44+
45+
Console.WriteLine(i);
46+
Console.WriteLine(result);
47+
Console.WriteLine();
48+
}
49+
catch (BrokenCircuitException e)
50+
{
51+
Console.WriteLine(i);
52+
Console.WriteLine(e);
53+
Console.WriteLine();
54+
await Task.Delay(2_000);
55+
}
56+
}
57+
}
58+
59+
#endregion
60+
61+
}

src/plugins/ConsolePollyTest/PollyTest.cs renamed to src/plugins/ConsolePollyTest/PollyRetryTest.cs

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,24 @@
1-
using Microsoft.Extensions.Logging;
21
using Polly;
32
using Polly.Retry;
4-
using Polly.Telemetry;
53

64
namespace ConsolePollyTest;
75

8-
public static class PollyTest
6+
public static class PollyRetryTest
97
{
108

119
#region Constants & Statics
1210

13-
public static Uri Host { get; set; } = new Uri("http://localhost:5222");
14-
15-
private static HttpClient GetClient()
16-
{
17-
var client = new HttpClient { BaseAddress = Host };
18-
return client;
19-
}
20-
21-
private static Uri GetUri(string path)
22-
{
23-
return new Uri(Host, path);
24-
}
25-
26-
private static TelemetryOptions GetTelemetry()
27-
{
28-
var telemetryOptions = new TelemetryOptions
29-
{
30-
// Configure logging
31-
LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()),
32-
};
33-
telemetryOptions.TelemetryListeners.Add(new MyTelemetryListener());
34-
telemetryOptions.MeteringEnrichers.Add(new MyMeteringEnricher());
35-
36-
return telemetryOptions;
37-
}
38-
3911
public static async Task NoStrategy_TestAsync()
4012
{
4113
var builder = new ResiliencePipelineBuilder();
4214
var pipeline = builder.Build();
4315

44-
using var client = GetClient();
16+
using var client = TestBase.GetClient();
4517

4618
var result = await pipeline.ExecuteAsync(
4719
async (token) =>
4820
{
49-
var r = await client.GetAsync(GetUri("/weatherforecast/"), token);
21+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
5022
return r;
5123
},
5224
cancellationToken: default);
@@ -56,7 +28,7 @@ public static async Task NoStrategy_TestAsync()
5628

5729
public static async Task Retry_ExecThree_TestAsync()
5830
{
59-
var options = GetTelemetry();
31+
var options = TestBase.GetTelemetry();
6032
var builder = new ResiliencePipelineBuilder().ConfigureTelemetry(options)
6133
.AddRetry(
6234
new RetryStrategyOptions
@@ -79,12 +51,12 @@ public static async Task Retry_ExecThree_TestAsync()
7951
});
8052
var pipeline = builder.Build();
8153

82-
using var client = GetClient();
54+
using var client = TestBase.GetClient();
8355

8456
var result = await pipeline.ExecuteAsync(
8557
async (token) =>
8658
{
87-
var r = await client.GetAsync(GetUri("/weatherforecast/"), token);
59+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
8860
return r;
8961
},
9062
cancellationToken: default);
@@ -94,11 +66,10 @@ public static async Task Retry_ExecThree_TestAsync()
9466

9567
public static async Task Retry_UseOnePipeline_TestAsync()
9668
{
97-
var builder = new ResiliencePipelineBuilder().ConfigureTelemetry(GetTelemetry().LoggerFactory)
69+
var builder = new ResiliencePipelineBuilder().ConfigureTelemetry(TestBase.GetTelemetry().LoggerFactory)
9870
.AddRetry(
9971
new RetryStrategyOptions
10072
{
101-
10273
Delay = TimeSpan.FromSeconds(1),
10374
MaxRetryAttempts = 3,
10475
ShouldHandle = (args) =>
@@ -110,13 +81,13 @@ public static async Task Retry_UseOnePipeline_TestAsync()
11081

11182
var pipeline = builder.Build();
11283

113-
using var client = GetClient();
84+
using var client = TestBase.GetClient();
11485

11586
// retry three times
11687
var t1 = await pipeline.ExecuteAsync(
11788
async (token) =>
11889
{
119-
var r = await client.GetAsync(GetUri("/weatherforecast/"), token);
90+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
12091
return r;
12192
},
12293
cancellationToken: default);
@@ -125,7 +96,7 @@ public static async Task Retry_UseOnePipeline_TestAsync()
12596
var t2 = await pipeline.ExecuteAsync(
12697
async (token) =>
12798
{
128-
var r = await client.GetAsync(GetUri("/weatherforecast/"), token);
99+
var r = await client.GetAsync(TestBase.GetUri("/weatherforecast/GetWeatherForecast"), token);
129100
return r;
130101
},
131102
cancellationToken: default);

src/plugins/ConsolePollyTest/Program.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ internal static class Program
77

88
private static async Task Main(string[] args)
99
{
10-
//await PollyTest.NoStrategy_TestAsync();
10+
//await PollyRetryTest.NoStrategy_TestAsync();
11+
//await PollyRetryTest.Retry_ExecThree_TestAsync();
12+
//await PollyRetryTest.Retry_UseOnePipeline_TestAsync();
1113

12-
await PollyTest.Retry_ExecThree_TestAsync();
13-
14-
//await PollyTest.Retry_UseOnePipeline_TestAsync();
14+
await PollyCircuitTest.Circuit_3Per2sec_TestAsync();
1515

1616
_ = Console.ReadKey();
1717
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Microsoft.Extensions.Logging;
2+
using Polly.Telemetry;
3+
4+
namespace ConsolePollyTest;
5+
6+
public static class TestBase
7+
{
8+
public static Uri Host { get; set; } = new Uri("http://localhost:5222");
9+
10+
public static HttpClient GetClient()
11+
{
12+
var client = new HttpClient { BaseAddress = Host };
13+
return client;
14+
}
15+
16+
public static Uri GetUri(string path)
17+
{
18+
return new Uri(Host, path);
19+
}
20+
21+
public static TelemetryOptions GetTelemetry()
22+
{
23+
var telemetryOptions = new TelemetryOptions
24+
{
25+
// Configure logging
26+
LoggerFactory = LoggerFactory.Create(builder => builder.AddConsole()),
27+
};
28+
telemetryOptions.TelemetryListeners.Add(new MyTelemetryListener());
29+
telemetryOptions.MeteringEnrichers.Add(new MyMeteringEnricher());
30+
31+
return telemetryOptions;
32+
}
33+
}

src/plugins/WebPollyTest/Controllers/WeatherForecastController.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public WeatherForecastController(ILogger<WeatherForecastController> logger)
2525

2626
#region Methods
2727

28-
[HttpGet(Name = "GetWeatherForecast")]
28+
[HttpGet("GetWeatherForecast")]
2929
public IEnumerable<WeatherForecast> Get()
3030
{
3131
return Enumerable.Range(1, 5)
@@ -40,6 +40,12 @@ public IEnumerable<WeatherForecast> Get()
4040
.ToArray();
4141
}
4242

43+
[HttpGet("Hello")]
44+
public IActionResult Hello()
45+
{
46+
return Ok("Hello world!");
47+
}
48+
4349
#endregion
4450

4551
}

0 commit comments

Comments
 (0)