diff --git a/examples/Demo/Demo.csproj b/examples/Demo/Demo.csproj index cf7109cd..0c5295ef 100644 --- a/examples/Demo/Demo.csproj +++ b/examples/Demo/Demo.csproj @@ -57,16 +57,15 @@ - - + - - - + + + - + diff --git a/examples/Demo/Features/DynamicWorkload/MultinomialDistributionExample.cs b/examples/Demo/Features/DynamicWorkload/MultinomialDistributionExample.cs index e528ca3e..260fd00c 100644 --- a/examples/Demo/Features/DynamicWorkload/MultinomialDistributionExample.cs +++ b/examples/Demo/Features/DynamicWorkload/MultinomialDistributionExample.cs @@ -1,5 +1,4 @@ -using MathNet.Numerics.Distributions; -using NBomber.CSharp; +using NBomber.CSharp; namespace Demo.Features.DynamicWorkload; @@ -7,34 +6,37 @@ public class MultinomialDistributionExample { public void Run() { - var ratios = new[] {0.7, 0.2, 0.1}; // 70%, 20%, 10% + // 70% for read, 20% for write, 10% for delete + var items = new [] { ("read", 70), ("write", 20), ("delete", 10) }; var scenario = Scenario.Create("multinomial_distribution", async context => { - int[] result = Multinomial.Sample(context.Random, ratios, 1); - if (result[0] == 1) // 70% for read + var randomItem = context.Random.Choice(items); + switch (randomItem) { - await Step.Run("read", context, async () => - { - await Task.Delay(100); - return Response.Ok(); - }); - } - else if (result[1] == 1) // 20% for write - { - await Step.Run("write", context, async () => - { - await Task.Delay(100); - return Response.Ok(); - }); - } - else // 10% for delete - { - await Step.Run("delete", context, async () => - { - await Task.Delay(100); - return Response.Ok(); - }); + case "read": // 70% for read + await Step.Run("read", context, async () => + { + await Task.Delay(100); + return Response.Ok(); + }); + break; + + case "write": // 20% for write + await Step.Run("write", context, async () => + { + await Task.Delay(100); + return Response.Ok(); + }); + break; + + case "delete": // 10% for delete + await Step.Run("delete", context, async () => + { + await Task.Delay(100); + return Response.Ok(); + }); + break; } return Response.Ok(); diff --git a/examples/Demo/Features/DynamicWorkload/ScenarioWeightExample.cs b/examples/Demo/Features/DynamicWorkload/ScenarioWeightExample.cs new file mode 100644 index 00000000..8d94c834 --- /dev/null +++ b/examples/Demo/Features/DynamicWorkload/ScenarioWeightExample.cs @@ -0,0 +1,37 @@ +using NBomber.CSharp; + +namespace Demo.Features.DynamicWorkload; + +public class ScenarioWeightExample +{ + public void Run() + { + var readScenario = Scenario.Create("read_scenario", async context => + { + await Task.Delay(100); + return Response.Ok(); + }) + .WithoutWarmUp() + .WithLoadSimulations( + // we use the same LoadSimulation settings + Simulation.Inject(rate: 10, interval: TimeSpan.FromSeconds(1), during: TimeSpan.FromSeconds(30)) + ) + .WithWeight(80); // sets 80% + + var writeScenario = Scenario.Create("write_scenario", async context => + { + await Task.Delay(100); + return Response.Ok(); + }) + .WithoutWarmUp() + .WithLoadSimulations( + // we use the same LoadSimulation settings + Simulation.Inject(rate: 10, interval: TimeSpan.FromSeconds(1), during: TimeSpan.FromSeconds(30)) + ) + .WithWeight(20); // sets 20% + + NBomberRunner + .RegisterScenarios(readScenario, writeScenario) + .Run(); + } +} diff --git a/examples/Demo/Features/DynamicWorkload/ZipfianDistributionExample.cs b/examples/Demo/Features/DynamicWorkload/ZipfianDistributionExample.cs index 570e8463..1b11dfed 100644 --- a/examples/Demo/Features/DynamicWorkload/ZipfianDistributionExample.cs +++ b/examples/Demo/Features/DynamicWorkload/ZipfianDistributionExample.cs @@ -1,5 +1,4 @@ -using MathNet.Numerics.Distributions; -using NBomber.CSharp; +using NBomber.CSharp; namespace Demo.Features.DynamicWorkload; @@ -9,7 +8,7 @@ public void Run() { var scenario = Scenario.Create("zipfian_distribution", async context => { - var stepNumber = Zipf.Sample(s: 1.3, n: 5, rnd: context.Random); + var stepNumber = context.Random.Zipf(n: 5, s: 1.3); if (stepNumber == 1) { await Step.Run("step_1", context, async () => diff --git a/examples/Demo/Features/RealtimeReporting/CustomReportingSink/CustomReportingSink.cs b/examples/Demo/Features/RealtimeReporting/CustomReportingSink/CustomReportingSink.cs index 48fd9a46..1ad3d04d 100644 --- a/examples/Demo/Features/RealtimeReporting/CustomReportingSink/CustomReportingSink.cs +++ b/examples/Demo/Features/RealtimeReporting/CustomReportingSink/CustomReportingSink.cs @@ -17,7 +17,7 @@ public Task Init(IBaseContext context, IConfiguration infraConfig) return Task.CompletedTask; } - public Task Start() => Task.CompletedTask; + public Task Start(SessionStartInfo sessionInfo) => Task.CompletedTask; public Task SaveRealtimeStats(ScenarioStats[] stats) => Task.CompletedTask; public Task SaveFinalStats(NodeStats stats) => Task.CompletedTask; public Task Stop() => Task.CompletedTask; @@ -44,4 +44,4 @@ public void Run() .WithReportingInterval(TimeSpan.FromSeconds(10)) .Run(); } -} \ No newline at end of file +} diff --git a/examples/Demo/Program.cs b/examples/Demo/Program.cs index 8121f75e..26a077a2 100644 --- a/examples/Demo/Program.cs +++ b/examples/Demo/Program.cs @@ -74,6 +74,7 @@ // new HttpWithTimeoutExample().Run(); // ---- Dynamic Workloads ---- +// new ScenarioWeightExample().Run(); // new InstanceNumberDistributionExample().Run(); // new UniformDistributionExample().Run(); // new ZipfianDistributionExample().Run();