Skip to content

Commit

Permalink
added IWorkerPlugin.stats:NodeStats -> Task<DataSet>
Browse files Browse the repository at this point in the history
  • Loading branch information
AntyaDev committed Apr 20, 2022
1 parent ee0fa0b commit f7e19a1
Show file tree
Hide file tree
Showing 10 changed files with 37 additions and 35 deletions.
4 changes: 2 additions & 2 deletions src/NBomber.Contracts/Contracts.fs
Original file line number Diff line number Diff line change
Expand Up @@ -148,15 +148,15 @@ type IReportingSink =
abstract Init: context:IBaseContext * infraConfig:IConfiguration -> Task
abstract Start: unit -> Task
abstract SaveRealtimeStats: stats:ScenarioStats[] -> Task
abstract SaveFinalStats: stats:NodeStats[] -> Task
abstract SaveFinalStats: stats:NodeStats -> Task
abstract Stop: unit -> Task

type IWorkerPlugin =
inherit IDisposable
abstract PluginName: string
abstract Init: context:IBaseContext * infraConfig:IConfiguration -> Task
abstract Start: unit -> Task
abstract GetStats: currentOperation:OperationType -> Task<DataSet>
abstract GetStats: stats:NodeStats -> Task<DataSet>
abstract GetHints: unit -> string[]
abstract Stop: unit -> Task

Expand Down
5 changes: 2 additions & 3 deletions src/NBomber/Domain/Stats/Statistics.fs
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,7 @@ module ScenarioStats =

module NodeStats =

let create (testInfo: TestInfo) (nodeInfo: NodeInfo)
(scnStats: ScenarioStats[]) (pluginStats: DataSet[]) =
let create (testInfo: TestInfo) (nodeInfo: NodeInfo) (scnStats: ScenarioStats[]) =

let maxDuration = scnStats |> Array.maxBy(fun x -> x.Duration) |> fun scn -> scn.Duration

Expand All @@ -215,7 +214,7 @@ module NodeStats =
FailCount = scnStats |> Array.sumBy(fun x -> x.FailCount)
AllBytes = scnStats |> Array.sumBy(fun x -> x.AllBytes)
ScenarioStats = scnStats
PluginStats = pluginStats
PluginStats = Array.empty
NodeInfo = nodeInfo
TestInfo = testInfo
ReportFiles = Array.empty
Expand Down
2 changes: 1 addition & 1 deletion src/NBomber/DomainServices/NBomberRunner.fs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ let runSession (testInfo: TestInfo) (nodeInfo: NodeInfo) (context: NBomberContex
use testHost = new TestHost(dep, scenarios, Scenario.getStepOrder, RunningStep.execSteps)
let! result = testHost.RunSession(sessionArgs)

let finalStats =
let! finalStats =
Report.build dep.Logger result testHost.TargetScenarios
|> Report.save dep ctx result.FinalStats

Expand Down
14 changes: 7 additions & 7 deletions src/NBomber/DomainServices/Reports/Report.fs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ let saveToFolder (logger: ILogger, folder: string, fileName: string,
| ex -> logger.Error(ex, "Report.save failed")
Array.empty

let save (dep: IGlobalDependency) (context: NBomberContext) (stats: NodeStats) (report: ReportsContent) =
let save (dep: IGlobalDependency) (context: NBomberContext) (stats: NodeStats) (report: ReportsContent) = backgroundTask {

let fileName = context |> NBomberContext.getReportFileNameOrDefault DateTime.UtcNow
let folder = context |> NBomberContext.getReportFolderOrDefault stats.TestInfo.SessionId
Expand All @@ -102,11 +102,11 @@ let save (dep: IGlobalDependency) (context: NBomberContext) (stats: NodeStats) (
if formats.Length > 0 then
let reportFiles = saveToFolder(dep.Logger, folder, fileName, formats, report)
let finalStats = { stats with ReportFiles = reportFiles }
dep.ReportingSinks
|> List.map(fun x -> x.SaveFinalStats [| finalStats |])
|> Task.WhenAll
|> fun t -> t.Wait()
do! dep.ReportingSinks
|> List.map(fun x -> x.SaveFinalStats finalStats)
|> Task.WhenAll

finalStats
return finalStats
else
stats
return stats
}
2 changes: 1 addition & 1 deletion src/NBomber/DomainServices/TestHost/TestHost.fs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ type internal TestHost(dep: IGlobalDependency,
do! schedulers |> List.map(fun x -> x.Start isWarmUp) |> Task.WhenAll

// wait on final metrics and reporting tick
do! Task.Delay(Constants.ReportingTimerCompleteMs)
do! Task.Delay Constants.ReportingTimerCompleteMs

flushStatsTimer |> Option.iter(fun x -> x.Stop())
reportingTimer.Stop()
Expand Down
6 changes: 3 additions & 3 deletions src/NBomber/DomainServices/TestHost/TestHostPlugins.fs
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ let getHints (plugins: IWorkerPlugin list) =
)
|> Seq.toList

let getStats (logger: ILogger) (plugins: IWorkerPlugin list) (operation: OperationType) = backgroundTask {
let getStats (logger: ILogger) (plugins: IWorkerPlugin list) (stats: NodeStats) = backgroundTask {
try
let pluginStatusesTask =
plugins
|> List.map(fun plugin -> plugin.GetStats operation)
|> List.map(fun plugin -> plugin.GetStats stats)
|> Task.WhenAll

let! finishedTask = Task.WhenAny(pluginStatusesTask, Task.Delay(Constants.GetPluginStatsTimeout))
Expand All @@ -62,7 +62,7 @@ let getStats (logger: ILogger) (plugins: IWorkerPlugin list) (operation: Operati
return Array.empty
with
| ex ->
logger.Error(ex, "Getting plugin stats failed with the following error")
logger.Error("Getting plugin stats failed: {0}", ex.ToString())
return Array.empty
}

Expand Down
19 changes: 10 additions & 9 deletions src/NBomber/DomainServices/TestHost/TestHostReportingActor.fs
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ let getFinalScenarioStats (schedulers: ScenarioScheduler list) =
|> List.map(fun x -> x.GetFinalStats())
|> Task.WhenAll

let getPluginStats (dep: IGlobalDependency) (operation: OperationType) = backgroundTask {
let getPluginStats (dep: IGlobalDependency) (stats: NodeStats) = backgroundTask {
try
let pluginStatusesTask =
dep.WorkerPlugins
|> List.map(fun plugin -> plugin.GetStats operation)
|> List.map(fun plugin -> plugin.GetStats stats)
|> Task.WhenAll

let! finishedTask = Task.WhenAny(pluginStatusesTask, Task.Delay(Constants.GetPluginStatsTimeout))
let! finishedTask = Task.WhenAny(pluginStatusesTask, Task.Delay Constants.GetPluginStatsTimeout)
if finishedTask.Id = pluginStatusesTask.Id then return pluginStatusesTask.Result
else
dep.Logger.Error("Getting plugin stats failed with the timeout error")
Expand All @@ -57,12 +57,13 @@ let getFinalStats (dep: IGlobalDependency)
(testInfo: TestInfo)
(nodeInfo: NodeInfo) = backgroundTask {

let pluginStats = getPluginStats dep nodeInfo.CurrentOperation
let scenarioStats = getFinalScenarioStats schedulers
do! Task.WhenAll(pluginStats, scenarioStats)
let! scenarioStats = getFinalScenarioStats schedulers

return if Array.isEmpty scenarioStats.Result then None
else Some(NodeStats.create testInfo nodeInfo scenarioStats.Result pluginStats.Result)
if Array.isEmpty scenarioStats then return None
else
let nodeStats = NodeStats.create testInfo nodeInfo scenarioStats
let! pluginStats = getPluginStats dep nodeStats
return Some { nodeStats with PluginStats = pluginStats }
}

type ActorMessage =
Expand Down Expand Up @@ -104,7 +105,7 @@ type TestHostReportingActor(dep: IGlobalDependency, schedulers: ScenarioSchedule
|> TaskOption.map(NodeStats.round >> reply.TrySetResult)
|> Task.WaitAll
with
| ex -> dep.Logger.Error(ex, "TestHostReporting actor failed")
| ex -> dep.Logger.Error("TestHostReporting actor failed: {0}", ex.ToString())
}
:> Task
)
Expand Down
5 changes: 4 additions & 1 deletion src/NBomber/NBomber.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@
<PackageReference Include="FuncyDown" Version="1.3.0" />
<PackageReference Include="HdrHistogram" Version="2.5.0" />
<PackageReference Include="Json.Net.DataSetConverters" Version="1.1.0" />
<PackageReference Include="NBomber.Contracts" Version="[3.0.0-beta5]" />
<!-- <PackageReference Include="NBomber.Contracts" Version="[3.0.0-beta5]" />-->
<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.2.0" />
<PackageReference Include="Serilog.Enrichers.Thread" Version="3.1.0" />
Expand All @@ -109,4 +109,7 @@
<EmbeddedResource Include="Resources\HtmlReport\assets\css\index.css" />
<EmbeddedResource Include="Resources\HtmlReport\index.html" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBomber.Contracts\NBomber.Contracts.fsproj" />
</ItemGroup>
</Project>
5 changes: 2 additions & 3 deletions tests/NBomber.IntegrationTests/Plugins/PluginTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -154,9 +154,8 @@ let ``GetStats should be invoked only one time when final stats fetching`` () =
member _.Init(_, _) = Task.CompletedTask
member _.Start() = Task.CompletedTask

member _.GetStats(operation) =
if operation = OperationType.Complete then
pluginGetStatsInvokedCounter <- pluginGetStatsInvokedCounter + 1
member _.GetStats(stats) =
pluginGetStatsInvokedCounter <- pluginGetStatsInvokedCounter + 1
Task.FromResult(new DataSet())

member _.GetHints() = Array.empty
Expand Down
10 changes: 5 additions & 5 deletions tests/NBomber.IntegrationTests/StatisticsTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ module NodeStatsTests =
let scenario2 = { baseScenarioStats with RequestCount = requestCount2 }

let nodeStats =
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |] Array.empty
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |]

test <@ nodeStats.RequestCount = requestCount1 + requestCount2 @>

Expand All @@ -295,7 +295,7 @@ module NodeStatsTests =
let scenario2 = { baseScenarioStats with OkCount = okCount2 }

let nodeStats =
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |] Array.empty
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |]

test <@ nodeStats.OkCount = okCount1 + okCount2 @>

Expand All @@ -306,7 +306,7 @@ module NodeStatsTests =
let scenario2 = { baseScenarioStats with FailCount = failCount2 }

let nodeStats =
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |] Array.empty
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |]

test <@ nodeStats.FailCount = failCount1 + failCount2 @>

Expand All @@ -317,7 +317,7 @@ module NodeStatsTests =
let scenario2 = { baseScenarioStats with AllBytes = allBytes2 }

let nodeStats =
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |] Array.empty
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |]

test <@ nodeStats.AllBytes = allBytes1 + allBytes2 @>

Expand All @@ -327,7 +327,7 @@ module NodeStatsTests =
let scenario2 = { baseScenarioStats with Duration = seconds 20 }

let nodeStats =
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |] Array.empty
Statistics.NodeStats.create baseTestInfo baseNodeInfo [| scenario1; scenario2 |]

test <@ nodeStats.Duration = seconds 20 @>

Expand Down

0 comments on commit f7e19a1

Please sign in to comment.