Skip to content

Commit 882a24e

Browse files
committed
improved ProgressBar:
- 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
1 parent 74501a0 commit 882a24e

File tree

3 files changed

+41
-45
lines changed

3 files changed

+41
-45
lines changed

Diff for: src/NBomber/Api/Shared.fs

+3
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ module Time =
3838

3939
[<CompiledName("Minutes")>]
4040
let inline minutes (value) = value |> float |> TimeSpan.FromMinutes
41+
42+
[<CompiledName("Hours")>]
43+
let inline hours (value) = value |> float |> TimeSpan.FromHours

Diff for: src/NBomber/DomainServices/TestHost/TestHostConsole.fs

+15-40
Original file line numberDiff line numberDiff line change
@@ -75,76 +75,51 @@ let displayBombingProgress (applicationType: ApplicationType, scnSchedulers: Sce
7575
|> ProgressBar.setDescription description
7676
|> ProgressBar.defaultTick
7777

78-
let createDescriptionForStoppedTask (scenarioName) =
79-
$"{scenarioName |> Console.errorColor}"
80-
8178
let displayProgressForConcurrentScenarios (schedulers: ScenarioScheduler list) =
8279
schedulers
8380
|> List.map createProgressTaskConfig
8481
|> List.append [
8582
{ Description = $"All Scenarios{MultilineColumn.NewLine}"; Ticks = schedulers |> calcTotalTickCount |> float }
8683
]
8784
|> ProgressBar.create
88-
(fun tasks ->
89-
let pbTotalTask = tasks.Head
85+
(fun progressTasks ->
86+
let pbTotalTask = progressTasks.Head
9087

91-
tasks
88+
progressTasks
9289
|> List.iteri(fun i pbTask ->
9390
if i > 0 then
9491
schedulers[i - 1].EventStream
9592
|> Observable.choose(function ProgressUpdated info -> Some info | _ -> None)
9693
|> Observable.subscribeWithCompletion
94+
9795
(fun progressInfo ->
9896
let scenarioName = schedulers[i - 1].Scenario.ScenarioName
9997
tickProgressTask pbTask scenarioName progressInfo
100-
pbTotalTask |> ProgressBar.defaultTick
101-
)
102-
(fun () ->
103-
let remainCount = ProgressBar.getRemainTicks pbTask
104-
105-
if remainCount > 0.0 then
106-
let desc =
107-
schedulers[i - 1].Scenario.ScenarioName
108-
|> createDescriptionForStoppedTask
109-
110-
pbTask
111-
|> ProgressBar.setDescription desc
112-
|> ProgressBar.stop
113-
114-
pbTotalTask |> ProgressBar.tick remainCount
115-
)
98+
pbTotalTask |> ProgressBar.defaultTick)
99+
100+
(fun () -> ProgressBar.stop pbTask)
101+
116102
|> ignore
117103
)
118-
)
104+
)
119105

120106
let displayProgressForOneScenario (scheduler: ScenarioScheduler) =
121107
scheduler
122108
|> createProgressTaskConfig
123109
|> List.singleton
124110
|> ProgressBar.create
125-
(fun tasks ->
111+
(fun tasks ->
126112
scheduler.EventStream
127113
|> Observable.choose(function ProgressUpdated info -> Some info | _ -> None)
128114
|> Observable.subscribeWithCompletion
129115
(fun progressInfo ->
130116
let scenarioName = scheduler.Scenario.ScenarioName
131-
tickProgressTask tasks.Head scenarioName progressInfo
132-
)
133-
(fun () ->
134-
let pbTask = tasks.Head
135-
let remainTicks = ProgressBar.getRemainTicks(pbTask)
136-
137-
if remainTicks > 0.0 then
138-
let desc =
139-
scheduler.Scenario.ScenarioName
140-
|> createDescriptionForStoppedTask
141-
142-
pbTask
143-
|> ProgressBar.setDescription desc
144-
|> ProgressBar.stop
145-
)
117+
tickProgressTask tasks.Head scenarioName progressInfo)
118+
119+
(fun () -> tasks |> List.iter ProgressBar.stop)
120+
146121
|> ignore
147-
)
122+
)
148123

149124
match applicationType with
150125
| ApplicationType.Console ->

Diff for: src/NBomber/Infra/ProgressBar.fs

+23-5
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,27 @@ type MultilineColumn () =
1717
let text = task.Description.Replace(MultilineColumn.NewLine, Environment.NewLine)
1818
Markup(text).RightAligned() :> IRenderable
1919

20+
type CustomElapsedTimeColumn () =
21+
inherit ProgressColumn()
22+
23+
override _.NoWrap = false
24+
25+
override _.Render(context: RenderContext, task: ProgressTask, deltaTime: TimeSpan) =
26+
let elapsedTime =
27+
task.ElapsedTime
28+
|> ValueOption.ofNullable
29+
|> ValueOption.map(fun x -> TimeSpan(days = x.Days, hours = x.Hours, minutes = x.Minutes, seconds = x.Seconds))
30+
|> ValueOption.defaultValue TimeSpan.Zero
31+
32+
let maxTime = TimeSpan.FromSeconds task.MaxValue
33+
34+
Markup($"{elapsedTime:g}-{maxTime:g}").RightAligned() :> IRenderable
35+
2036
let defaultColumns: ProgressColumn[] =
2137
[| MultilineColumn()
2238
ProgressBarColumn()
2339
PercentageColumn()
24-
ElapsedTimeColumn()
25-
SpinnerColumn() |]
40+
CustomElapsedTimeColumn() |]
2641

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

4762
AnsiConsole.Progress()
48-
|> fun progressBar -> ProgressExtensions.AutoRefresh(progressBar, true)
49-
|> fun progressBar -> ProgressExtensions.AutoClear(progressBar, false)
5063
|> fun progressBar -> ProgressExtensions.Columns(progressBar, defaultColumns)
64+
|> fun progressBar ->
65+
progressBar.AutoRefresh <- true
66+
progressBar.RefreshRate <- TimeSpan.FromSeconds 1
67+
progressBar.AutoClear <- false
68+
progressBar
5169
|> fun progressBar ->
5270
progressBar.StartAsync(fun ctx ->
5371
backgroundTask {
5472
config |> List.map(createProgressTask ctx) |> pbHandler
5573

5674
while not ctx.IsFinished do
57-
do! Task.Delay(TimeSpan.FromMilliseconds 1000.0)
75+
do! Task.Delay(TimeSpan.FromSeconds 1)
5876
}
5977
)
6078

0 commit comments

Comments
 (0)