Skip to content

Commit

Permalink
improved ProgressBar:
Browse files Browse the repository at this point in the history
- it displays the final load simulation time
- it displays days if duration is bigger than 24h
- set refresh rate to 1 sec instead of 100ms
  • Loading branch information
AntyaDev committed Jul 25, 2022
1 parent 74501a0 commit 882a24e
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 45 deletions.
3 changes: 3 additions & 0 deletions src/NBomber/Api/Shared.fs
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,6 @@ module Time =

[<CompiledName("Minutes")>]
let inline minutes (value) = value |> float |> TimeSpan.FromMinutes

[<CompiledName("Hours")>]
let inline hours (value) = value |> float |> TimeSpan.FromHours
55 changes: 15 additions & 40 deletions src/NBomber/DomainServices/TestHost/TestHostConsole.fs
Original file line number Diff line number Diff line change
Expand Up @@ -75,76 +75,51 @@ let displayBombingProgress (applicationType: ApplicationType, scnSchedulers: Sce
|> ProgressBar.setDescription description
|> ProgressBar.defaultTick

let createDescriptionForStoppedTask (scenarioName) =
$"{scenarioName |> Console.errorColor}"

let displayProgressForConcurrentScenarios (schedulers: ScenarioScheduler list) =
schedulers
|> List.map createProgressTaskConfig
|> List.append [
{ Description = $"All Scenarios{MultilineColumn.NewLine}"; Ticks = schedulers |> calcTotalTickCount |> float }
]
|> ProgressBar.create
(fun tasks ->
let pbTotalTask = tasks.Head
(fun progressTasks ->
let pbTotalTask = progressTasks.Head

tasks
progressTasks
|> List.iteri(fun i pbTask ->
if i > 0 then
schedulers[i - 1].EventStream
|> Observable.choose(function ProgressUpdated info -> Some info | _ -> None)
|> Observable.subscribeWithCompletion

(fun progressInfo ->
let scenarioName = schedulers[i - 1].Scenario.ScenarioName
tickProgressTask pbTask scenarioName progressInfo
pbTotalTask |> ProgressBar.defaultTick
)
(fun () ->
let remainCount = ProgressBar.getRemainTicks pbTask

if remainCount > 0.0 then
let desc =
schedulers[i - 1].Scenario.ScenarioName
|> createDescriptionForStoppedTask

pbTask
|> ProgressBar.setDescription desc
|> ProgressBar.stop

pbTotalTask |> ProgressBar.tick remainCount
)
pbTotalTask |> ProgressBar.defaultTick)

(fun () -> ProgressBar.stop pbTask)

|> ignore
)
)
)

let displayProgressForOneScenario (scheduler: ScenarioScheduler) =
scheduler
|> createProgressTaskConfig
|> List.singleton
|> ProgressBar.create
(fun tasks ->
(fun tasks ->
scheduler.EventStream
|> Observable.choose(function ProgressUpdated info -> Some info | _ -> None)
|> Observable.subscribeWithCompletion
(fun progressInfo ->
let scenarioName = scheduler.Scenario.ScenarioName
tickProgressTask tasks.Head scenarioName progressInfo
)
(fun () ->
let pbTask = tasks.Head
let remainTicks = ProgressBar.getRemainTicks(pbTask)

if remainTicks > 0.0 then
let desc =
scheduler.Scenario.ScenarioName
|> createDescriptionForStoppedTask

pbTask
|> ProgressBar.setDescription desc
|> ProgressBar.stop
)
tickProgressTask tasks.Head scenarioName progressInfo)

(fun () -> tasks |> List.iter ProgressBar.stop)

|> ignore
)
)

match applicationType with
| ApplicationType.Console ->
Expand Down
28 changes: 23 additions & 5 deletions src/NBomber/Infra/ProgressBar.fs
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,27 @@ type MultilineColumn () =
let text = task.Description.Replace(MultilineColumn.NewLine, Environment.NewLine)
Markup(text).RightAligned() :> IRenderable

type CustomElapsedTimeColumn () =
inherit ProgressColumn()

override _.NoWrap = false

override _.Render(context: RenderContext, task: ProgressTask, deltaTime: TimeSpan) =
let elapsedTime =
task.ElapsedTime
|> ValueOption.ofNullable
|> ValueOption.map(fun x -> TimeSpan(days = x.Days, hours = x.Hours, minutes = x.Minutes, seconds = x.Seconds))
|> ValueOption.defaultValue TimeSpan.Zero

let maxTime = TimeSpan.FromSeconds task.MaxValue

Markup($"{elapsedTime:g}-{maxTime:g}").RightAligned() :> IRenderable

let defaultColumns: ProgressColumn[] =
[| MultilineColumn()
ProgressBarColumn()
PercentageColumn()
ElapsedTimeColumn()
SpinnerColumn() |]
CustomElapsedTimeColumn() |]

type ProgressTaskConfig = {
Description: string
Expand All @@ -45,16 +60,19 @@ let private createProgressTask (ctx: ProgressContext) (config: ProgressTaskConfi
let create (pbHandler: ProgressTask list -> unit) (config: ProgressTaskConfig list) =

AnsiConsole.Progress()
|> fun progressBar -> ProgressExtensions.AutoRefresh(progressBar, true)
|> fun progressBar -> ProgressExtensions.AutoClear(progressBar, false)
|> fun progressBar -> ProgressExtensions.Columns(progressBar, defaultColumns)
|> fun progressBar ->
progressBar.AutoRefresh <- true
progressBar.RefreshRate <- TimeSpan.FromSeconds 1
progressBar.AutoClear <- false
progressBar
|> fun progressBar ->
progressBar.StartAsync(fun ctx ->
backgroundTask {
config |> List.map(createProgressTask ctx) |> pbHandler

while not ctx.IsFinished do
do! Task.Delay(TimeSpan.FromMilliseconds 1000.0)
do! Task.Delay(TimeSpan.FromSeconds 1)
}
)

Expand Down

0 comments on commit 882a24e

Please sign in to comment.