PollyChaos 1.0.1
dotnet add package PollyChaos --version 1.0.1
NuGet\Install-Package PollyChaos -Version 1.0.1
<PackageReference Include="PollyChaos" Version="1.0.1" />
<PackageVersion Include="PollyChaos" Version="1.0.1" />
<PackageReference Include="PollyChaos" />
paket add PollyChaos --version 1.0.1
#r "nuget: PollyChaos, 1.0.1"
#:package PollyChaos@1.0.1
#addin nuget:?package=PollyChaos&version=1.0.1
#tool nuget:?package=PollyChaos&version=1.0.1
PollyChaos
<img src="icon.png" width="100" align="right" />
Chaos engineering for Polly v8. Inject faults and latency into your resilience pipelines to prove your system handles failures gracefully — before production does it for you.
The Simmy-compatible chaos companion for Polly v8. If you used Polly.Contrib.Simmy with Polly v7, this is what you have been waiting for.
Install
dotnet add package PollyChaos
Quick start
using PollyChaos;
// Throw an exception on 10% of calls
var pipeline = new ResiliencePipelineBuilder()
.AddChaosFault(injectionRate: 0.1)
.AddRetry(new RetryStrategyOptions { MaxRetryAttempts = 3 })
.Build();
await pipeline.ExecuteAsync(ct => httpClient.GetAsync("/api/orders", ct), cancellationToken);
Why PollyChaos?
| Feature | Polly.Contrib.Simmy (v7) | PollyChaos (v8) |
|---|---|---|
| Polly version | v7 only | v8 |
| Fault injection | ✅ | ✅ |
| Latency injection | ✅ | ✅ |
Enabled toggle |
✅ | ✅ |
Generic pipeline (Builder<T>) |
✅ | ✅ |
Callbacks (OnFaultInjected) |
❌ | ✅ |
| .NET 9 support | ❌ | ✅ |
| Zero extra dependencies | ❌ | ✅ |
Usage
Fault injection
// Throw ChaosException on 10% of calls
var pipeline = new ResiliencePipelineBuilder()
.AddChaosFault(injectionRate: 0.1)
.Build();
// Throw a custom exception
var pipeline = new ResiliencePipelineBuilder()
.AddChaosFault(injectionRate: 0.05, fault: new HttpRequestException("injected failure"))
.Build();
Latency injection
// Add a 2-second delay on 5% of calls
var pipeline = new ResiliencePipelineBuilder()
.AddChaosLatency(injectionRate: 0.05, latency: TimeSpan.FromSeconds(2))
.Build();
Combined chaos pipeline
var pipeline = new ResiliencePipelineBuilder<HttpResponseMessage>()
.AddChaosFault<HttpResponseMessage>(injectionRate: 0.05) // 5% exceptions
.AddChaosLatency<HttpResponseMessage>(injectionRate: 0.1) // 10% slow calls
.AddRetry(new RetryStrategyOptions<HttpResponseMessage> { MaxRetryAttempts = 3 })
.AddCircuitBreaker(new CircuitBreakerStrategyOptions<HttpResponseMessage>())
.Build();
Toggle via configuration (feature flag)
Flip chaos on/off without rebuilding the pipeline — ideal for integration test environments:
var chaosOptions = new ChaosFaultStrategyOptions
{
InjectionRate = 0.2,
Enabled = config.GetValue<bool>("ChaosEngineering:Enabled"),
FaultFactory = () => new TimeoutException("chaos: downstream timeout"),
OnFaultInjected = args =>
{
logger.LogWarning("Chaos fault injected for {Operation}", args.Context.OperationKey);
return ValueTask.CompletedTask;
},
};
var pipeline = new ResiliencePipelineBuilder()
.AddChaosFault(chaosOptions)
.Build();
ASP.NET Core integration
// Program.cs
builder.Services.AddResiliencePipeline("orders-client", (pipelineBuilder, context) =>
{
var config = context.ServiceProvider.GetRequiredService<IConfiguration>();
var chaosEnabled = config.GetValue<bool>("ChaosEngineering:Enabled");
pipelineBuilder
.AddChaosFault(new ChaosFaultStrategyOptions
{
InjectionRate = 0.1,
Enabled = chaosEnabled,
})
.AddChaosLatency(new ChaosLatencyStrategyOptions
{
InjectionRate = 0.05,
Latency = TimeSpan.FromSeconds(3),
Enabled = chaosEnabled,
})
.AddRetry(new RetryStrategyOptions { MaxRetryAttempts = 3 })
.AddCircuitBreaker(new CircuitBreakerStrategyOptions());
});
Pipeline order
Place chaos strategies outside (before) retry so injected faults are retried — just like real failures:
var pipeline = new ResiliencePipelineBuilder()
.AddChaosFault(injectionRate: 0.1) // 1. inject faults
.AddChaosLatency(injectionRate: 0.1) // 2. inject latency
.AddRetry(...) // 3. retry failures
.AddCircuitBreaker(...) // 4. trip if too many failures
.Build();
Related packages
| Package | Description |
|---|---|
| PollyBackoff | Backoff delay strategies |
| PollyHealthChecks | ASP.NET Core health check integration |
| PollyCaching | Caching resilience strategy |
| PollyBulkhead | Bulkhead isolation |
| PollyRateLimiter | Rate limiting strategies |
| PollyOpenTelemetry | OpenTelemetry metrics & tracing |
Support
If PollyChaos helps you ship more resilient software, consider supporting the project:
💼 Need .NET resilience help? Visit solidqualitysolutions.com for consulting and architecture services.
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net6.0
- Polly.Core (>= 8.7.0)
-
net8.0
- Polly.Core (>= 8.7.0)
-
net9.0
- Polly.Core (>= 8.7.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
1.0.0: Initial release. Fault injection (AddChaosFault) and latency injection (AddChaosLatency) for Polly v8 resilience pipelines. Supports net6.0, net8.0, and net9.0.