<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>NBomber Blog</title>
        <link>https://nbomber.com/blog</link>
        <description>NBomber Blog</description>
        <lastBuildDate>Wed, 19 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[NBomber Studio 0.9.0]]></title>
            <link>https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0</link>
            <guid>https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0</guid>
            <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[NBomber Studio 0.9.0 is out! This release adds a Logs tab that shows the logs of every node of your test. It also adds a Data Transfer chart, a metric table under every chart, and a new navigation for scenarios and steps.]]></description>
            <content:encoded><![CDATA[<p><strong>NBomber Studio 0.9.0</strong> is out! This release adds a <strong>Logs tab</strong> that shows the logs of every node of your test. It also adds a <strong>Data Transfer chart</strong>, a <strong>metric table under every chart</strong>, and a new navigation for scenarios and steps.</p>
<div class="video-container"><!--$?--><template id="B:0"></template><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-logs-tab">New Logs tab<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#new-logs-tab" class="hash-link" aria-label="Direct link to New Logs tab" title="Direct link to New Logs tab" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/logs-0ae79869340d0d3cfcadd558bbf93e34.jpg" width="100%"></center>
<p>The Session Details view has a new <strong>Logs</strong> tab. Studio reads the logs of the session and shows them in the browser. You no longer download the artifacts archive and unpack it on your machine.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This functionality requires <a href="https://www.nuget.org/packages/NBomber/6.6.0" target="_blank" rel="noopener noreferrer" class="">NBomber v6.6.0</a> and <a href="https://www.nuget.org/packages/NBomber.Sinks.Timescale/0.14.0" target="_blank" rel="noopener noreferrer" class="">NBomber.Sinks.Timescale 0.14.0</a></p></div></div>
<p><strong>A console-style viewer.</strong> The selected file opens in a log console with line numbers, timestamps, and a color-coded level badge (<code>Verbose</code>, <code>Debug</code>, <code>Information</code>, <code>Warning</code>, <code>Error</code>, <code>Fatal</code>). A stack trace stays attached to the log entry that produced it. It does not break into separate unparsed lines.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="session-details-new-navigation">Session Details: new navigation<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#session-details-new-navigation" class="hash-link" aria-label="Direct link to Session Details: new navigation" title="Direct link to Session Details: new navigation" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/scenarios_navigation-aca2f9a234624f30e7ae947b8ad66e7c.jpg" width="100%"></center>
<p>The biggest visual change is the navigation of the Session Details view. We replaced the old sidebar with a <strong>resizable tree of your scenarios and their steps</strong>.</p>
<ul>
<li class="">When you select a scenario or a step in the tree, the tabs show the data of this selection only. This applies to the <strong>Summary</strong>, <strong>Status codes</strong>, <strong>Charts</strong>, <strong>Failures</strong>, and <strong>Custom Metrics</strong> tabs.</li>
<li class="">You can <strong>collapse</strong> the tree, or <strong>drag its border</strong> to change the width.</li>
</ul>
<p>The <strong>Logs</strong> tab uses the same control for its list of log files. The navigation is therefore consistent across the whole view.</p>
<p>We also corrected two problems of the old layout. The page no longer jumps when you switch tabs, and the navbar stays visible.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-data-transfer-chart">New Data Transfer chart<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#new-data-transfer-chart" class="hash-link" aria-label="Direct link to New Data Transfer chart" title="Direct link to New Data Transfer chart" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/data_transfer-86d63ccaceff9bcb371ecfc06e0c00d7.jpg" width="100%"></center>
<p>The <strong>Charts</strong> tab has a new <strong>Data Transfer</strong> chart. It shows the network throughput over time. The chart gives the amount of data per second for the successful (<code>Ok</code>) requests, the failed (<code>Fail</code>) requests, and all (<code>Total</code>) requests.</p>
<p>The data transfer metrics are also part of the <strong>Summary</strong> table now.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>To see this chart, update <code>NBomber.Sinks.Timescale</code> to version 0.14.0.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-metric-table-under-every-chart">A metric table under every chart<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#a-metric-table-under-every-chart" class="hash-link" aria-label="Direct link to A metric table under every chart" title="Direct link to A metric table under every chart" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/chart_table-f3698e95b91423bbe9d52d2b024732c4.jpg" width="100%"></center>
<p>The <strong>Throughput</strong>, <strong>Latency</strong>, and <strong>Data Transfer</strong> charts each have a table below the chart. One row is one scenario or one step. Each row has a color mark that matches the line on the chart, so you can map the numbers to the lines. You do not need the legend.</p>
<p>Every metric has two values:</p>
<ul>
<li class=""><strong>final</strong> - the value for the whole run. For an active session, it is the most recent data point.</li>
<li class=""><strong>peak</strong> - the highest value of the run.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tooltips-everywhere">Tooltips everywhere<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#tooltips-everywhere" class="hash-link" aria-label="Direct link to Tooltips everywhere" title="Direct link to Tooltips everywhere" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/tooltip-9cbdcd761cc6a256daff0dec16fa5994.jpg" width="40%"></center>
<p>An <strong>info icon near each chart title</strong> explains what the chart shows. Each <strong>column header of a metric table</strong> explains its metric. The .NET process metrics have the same tooltips: CPU usage, memory working set, GC heap size, GC LOH size, time in GC, thread pool queue length, thread count, and DNS lookups.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="better-chart-scale">Better chart scale<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#better-chart-scale" class="hash-link" aria-label="Direct link to Better chart scale" title="Direct link to Better chart scale" translate="no">​</a></h2>
<p>The charts now calculate the maximum of the Y axis from the peak value of the series. Before this change, a custom metric with large values made the main lines flat at the bottom of the chart.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-docker-image--helm-chart">📦 Docker image &amp; Helm chart<a href="https://nbomber.com/blog/2026/08/19/nbomber-studio-0.9.0#-docker-image--helm-chart" class="hash-link" aria-label="Direct link to 📦 Docker image &amp; Helm chart" title="Direct link to 📦 Docker image &amp; Helm chart" translate="no">​</a></h2>
<p>NBomber Studio is available as a Docker image and a Helm chart:</p>
<ul>
<li class="">Docker Hub: <a href="https://hub.docker.com/repository/docker/nbomberdocker/nbomber-studio/general" target="_blank" rel="noopener noreferrer" class="">nbomberdocker/nbomber-studio</a></li>
<li class="">Helm chart: <a href="https://artifacthub.io/packages/helm/nbomber-studio/nbomber-studio" target="_blank" rel="noopener noreferrer" class="">nbomber-studio</a> (<a href="https://github.com/PragmaticFlow/nbomber-studio-helm" target="_blank" rel="noopener noreferrer" class="">source</a>)</li>
</ul>]]></content:encoded>
            <category>nbomber-studio-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber 6.6.0]]></title>
            <link>https://nbomber.com/blog/2026/08/17/nbomber-6.6.0</link>
            <guid>https://nbomber.com/blog/2026/08/17/nbomber-6.6.0</guid>
            <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This release is mostly about stats and HTML reporting. We made these main changes:]]></description>
            <content:encoded><![CDATA[<p>This release is mostly about stats and HTML reporting. We made these main changes:</p>
<ul>
<li class="">We reworked how NBomber calculates the scenario-level stats.</li>
<li class="">We added the calculation of the data transfer throughput.</li>
<li class="">We improved HTML report with a new data transfer chart.</li>
<li class="">We made the console, TXT, and Markdown reports consistent.</li>
<li class="">We made NBomber Cluster much easier to troubleshoot.</li>
<li class="">We improved the logging.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-improvements">HTML report improvements<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#html-report-improvements" class="hash-link" aria-label="Direct link to HTML report improvements" title="Direct link to HTML report improvements" translate="no">​</a></h2>
<p>We reworked the layout, the charts, and the tables to match the reporting of NBomber Studio.</p>
<p>The main change is the navigation. The session page now has a resizable tree of your scenarios and their steps on the left side. You select a scenario or step. Then the summary table, the status codes, and the charts show the data of this selection only. You can collapse the tree, or drag its border to change the width.</p>
<center><img src="https://nbomber.com/assets/images/new_html_report-5db4196ae502bb49b79e67dfe32f971a.jpg" width="100%"></center>
<p>The other changes:</p>
<ul>
<li class=""><strong>A new Data Transfer chart.</strong> It shows the network throughput over time, for the total, the ok, and the fail requests. The chart selects the byte unit (KB, MB) from the peak value.</li>
</ul>
<center><img src="https://nbomber.com/assets/images/data_transfer-dcefe58f76fb5c79fbcfc222179bdc8b.jpg" width="100%"></center>
<ul>
<li class=""><strong>A metric table under every chart.</strong> The Throughput, Latency, and Data Transfer charts each have a table below the chart. One row is one scenario or one step, with a color mark that matches the line on the chart. Each metric has a <code>final</code> value for the whole run and a <code>peak</code> value for the highest point of the run.</li>
</ul>
<center><img src="https://nbomber.com/assets/images/metric_table-91adf132f19a0ce0754f2c6d3ec80056.jpg" width="100%"></center>
<ul>
<li class=""><strong>Tooltips.</strong> An info icon near each chart title explains the chart. Each column header of a metric table explains its metric.</li>
<li class=""><strong>A better chart scale.</strong> The charts calculate the maximum of the Y axis from the peak value. A custom metric with large values no longer flattens the main lines.</li>
</ul>
<p>We also corrected several defects. The NBomber icon is correct now. The tooltips no longer stay on the screen after you switch tabs. The sticky table headers keep their position. The report also keeps the scroll position when you move between scenarios.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-reports-formatting">Improved reports formatting<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#improved-reports-formatting" class="hash-link" aria-label="Direct link to Improved reports formatting" title="Direct link to Improved reports formatting" translate="no">​</a></h2>
<p>The console, TXT, and Markdown reports now use one consistent shape for the counters. The request counts and the RPS are on separate rows. Each row shows <code>total</code>, <code>ok</code>, and <code>fail</code> side by side:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">|           scenario name |test_scenario                                                            |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">|                requests |total = 6000, ok = 5980, fail = 20                                       |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">|           RPS (req/sec) |total = 200, ok = 199.3, fail = 0.7                                      |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">|            latency (ms) |min = 1.2, mean = 4.8, max = 120.5, StdDev = 6.1                         |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">| latency percentile (ms) |p50 = 4.1, p75 = 5.9, p95 = 12.4, p99 = 31.7                             |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">|      data transfer (KB) |min = 1.2, mean = 4.5, max = 9.1, throughput = 850.3 KB/s, total = 42 MB |</span><br></span></code></pre></div></div>
<p>These changes are small, but they remove the guesswork when you scan a report.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reworked-scenariostats">Reworked ScenarioStats<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#reworked-scenariostats" class="hash-link" aria-label="Direct link to Reworked ScenarioStats" title="Direct link to Reworked ScenarioStats" translate="no">​</a></h2>
<p>This is the most important change in this release. It changes the numbers that you see for a scenario that contains steps.</p>
<p>Before this release, NBomber built the scenario-level stats (<code>ScenarioStats.Ok</code> and <code>ScenarioStats.Fail</code>, printed as the <code>global information</code> row) from the scenario iteration measurements only. NBomber did not aggregate the step data. If your scenario had steps, all the work inside these steps was invisible at the scenario level:</p>
<ul>
<li class="">The scenario RPS counted the iterations, not the step requests.</li>
<li class="">The scenario latency was the duration of the whole scenario iteration.</li>
</ul>
<p>From version 6.6.0, when a scenario contains steps, the scenario-level stats <strong>aggregate all step measurements</strong>:</p>
<ul>
<li class=""><code>scnStats.Ok.Request.RPS</code> is the sum of the RPS of all steps in the scenario.</li>
<li class=""><code>scnStats.Ok.Request.Count</code> and <code>scnStats.Fail.Request.Count</code> are the sums of the ok and the fail step requests.</li>
<li class="">NBomber calculates the scenario latency and the percentiles from the step latencies, not from the scenario iteration duration.</li>
<li class="">NBomber merges the scenario status codes from the step status codes. When the scenario has steps, NBomber ignores the status code of the scenario body.</li>
<li class="">The scenario data transfer is the sum of the data transfer of all steps.</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This change does not affect <code>StepStats</code>. NBomber always reports each step separately.</p></div></div>
<p>This basic example shows the difference. The scenario has 2 steps. The load simulation represents a constant rate: 10 requests per second, for a duration of 10 seconds.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"test_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step_1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step_2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Delay</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">     </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithLoadSimulations</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Simulation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Inject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>The previous NBomber versions print this result. The scenario reports <code>10 RPS</code>, and the latency is the duration of one scenario iteration: <code>p99 = 2030.59</code>.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────────────┬─────────────────────────────────────────────────────────────┐</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│      scenario and steps │ ok stats                                                    │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├─────────────────────────┼─────────────────────────────────────────────────────────────┤</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           scenario name │ test_scenario                                               │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                requests │ total = 100, ok = 100, fail = 0                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           RPS (req/sec) │ total = 10/s, ok = 10/s, fail = 0/s                         │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│            latency (ms) │ min = 1999.67, mean = 2014.44, max = 2029.89, StdDev = 8.76 │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ latency percentile (ms) │ p50 = 2015.23, p75 = 2019.33, p95 = 2029.57, p99 = 2030.59  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                         │                                                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│               step name │ step_1                                                      │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                requests │ total = 100, ok = 100, fail = 0                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           RPS (req/sec) │ total = 10/s, ok = 10/s, fail = 0/s                         │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│            latency (ms) │ min = 999.2, mean = 1006.94, max = 1015.79, StdDev = 6.1    │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ latency percentile (ms) │ p50 = 1004.54, p75 = 1014.27, p95 = 1015.3, p99 = 1015.81   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                         │                                                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│               step name │ step_2                                                      │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                requests │ total = 100, ok = 100, fail = 0                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           RPS (req/sec) │ total = 10/s, ok = 10/s, fail = 0/s                         │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│            latency (ms) │ min = 999.39, mean = 1007.37, max = 1015.7, StdDev = 6.4    │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ latency percentile (ms) │ p50 = 1004.03, p75 = 1014.27, p95 = 1015.3, p99 = 1015.81   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─────────────────────────┴─────────────────────────────────────────────────────────────┘</span><br></span></code></pre></div></div>
<p>NBomber 6.6.0 prints a different result for the scenario stats.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">┌─────────────────────────┬────────────────────────────────────────────────────────────┐</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│      scenario and steps │ ok stats                                                   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├─────────────────────────┼────────────────────────────────────────────────────────────┤</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           scenario name │ test_scenario                                              │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                requests │ total = 200, ok = 200, fail = 0                            │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           RPS (req/sec) │ total = 20/s, ok = 20/s, fail = 0/s                        │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│            latency (ms) │ min = 999.3, mean = 1006.8, max = 1016.35, StdDev = 6.61   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ latency percentile (ms) │ p50 = 1003.01, p75 = 1014.27, p95 = 1015.3, p99 = 1016.32  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                         │                                                            │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│               step name │ step_1                                                     │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                requests │ total = 100, ok = 100, fail = 0                            │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           RPS (req/sec) │ total = 10/s, ok = 10/s, fail = 0/s                        │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│            latency (ms) │ min = 999.33, mean = 1005.97, max = 1016.15, StdDev = 6.44 │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ latency percentile (ms) │ p50 = 1001.98, p75 = 1014.27, p95 = 1015.3, p99 = 1015.3   │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                         │                                                            │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│               step name │ step_2                                                     │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│                requests │ total = 100, ok = 100, fail = 0                            │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│           RPS (req/sec) │ total = 10/s, ok = 10/s, fail = 0/s                        │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│            latency (ms) │ min = 999.3, mean = 1007.62, max = 1016.35, StdDev = 6.67  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ latency percentile (ms) │ p50 = 1004.03, p75 = 1014.27, p95 = 1015.3, p99 = 1016.32  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└─────────────────────────┴────────────────────────────────────────────────────────────┘</span><br></span></code></pre></div></div>
<p>The scenario now reports <code>20 RPS</code> (the aggregated RPS of the 2 steps) instead of <code>10 RPS</code>. This data is a true summary of the load that you produce, and the step stats add up to it.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This change does not affect the scenarios <strong>without</strong> steps. There are no steps, so there is nothing to aggregate.</p></div></div>
<p>If you want the previous behavior, you can enable it for each scenario separately:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"test_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithStatsBasedOnIterations</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>You can also set this option in the JSON config:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"GlobalSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"ScenariosSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token property" style="color:#36acaa">"ScenarioName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"test_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">                </span><span class="token property" style="color:#36acaa">"StatsBasedOnIterations"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Read the <a class="" href="https://nbomber.com/docs/nbomber/scenario#scenario-statsbasedoniterations">documentation of this option</a> for more information.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>This change may affect your assertions. If you assert on <code>ScenarioStats</code> (thresholds, custom checks), check your expectations again after you upgrade.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-transfer-throughput">Data transfer throughput<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#data-transfer-throughput" class="hash-link" aria-label="Direct link to Data transfer throughput" title="Direct link to Data transfer throughput" translate="no">​</a></h2>
<p>We added <code>BytesPerSecond</code> to <code>DataTransferStats</code> (<a href="https://github.com/PragmaticFlow/NBomber/issues/992" target="_blank" rel="noopener noreferrer" class="">#992</a>). Until now, NBomber reported only the total transferred size. To get the network throughput, you had to divide this size by the duration yourself.</p>
<p>This property is available on the DataTransfer stats:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> throughput </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioStats</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DataTransfer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">BytesPerSecond</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>NBomber also prints this value in the live status table and in the final reports:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">data transfer (KB): min = 1.2, mean = 4.5, max = 9.1, throughput = 850.3 KB/s, total = 42 MB</span><br></span></code></pre></div></div>
<p>The CSV report has two new columns: <code>data_transfer_bytes_per_sec</code> and <code>fail_data_transfer_bytes_per_sec</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-improvements">Cluster improvements<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#cluster-improvements" class="hash-link" aria-label="Direct link to Cluster improvements" title="Direct link to Cluster improvements" translate="no">​</a></h2>
<ul>
<li class=""><strong>Agent IDs are now numbers.</strong> The Coordinator assigns a short numeric ID to each Agent, instead of a GUID. The log files, the folders, and the cluster reports are now much easier to read and to correlate.</li>
<li class=""><strong>Fixed the early stop in cluster mode.</strong> When a session stopped before the planned duration, NBomber calculated the final RPS and throughput of an Agent against the <em>planned</em> duration. As a result, these values were too low. Now NBomber calculates them against the duration that the Agent executed.</li>
<li class="">The Coordinator can now gather every Agent's log files into one place. Logs land in <code>reportFolder/agents_logs/agentId</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="improved-logging">Improved logging<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#improved-logging" class="hash-link" aria-label="Direct link to Improved logging" title="Direct link to Improved logging" translate="no">​</a></h2>
<p>We reworked logging around a new internal <code>NBomberLogger</code>:</p>
<ul>
<li class="">Before the session starts, NBomber holds the log events in memory (configuration parsing, cluster connection, validation). NBomber then writes these events to the session log file. Before this release, these events went to a temporary session folder that you had to find separately.</li>
<li class="">The temporary session IDs and the temporary log folders are gone.</li>
<li class="">Each session writes one log file with a meaningful name: <code>nbomber-log-&lt;timestamp&gt;.txt</code> for a single node, <code>coordinator-log-&lt;timestamp&gt;.txt</code> for the Coordinator, and <code>agent-&lt;id&gt;-log-&lt;timestamp&gt;.txt</code> for an Agent. NBomber no longer rolls the log file every hour in one session.</li>
</ul>
<p>If you supply your own Serilog configuration, nothing changes for you. NBomber only enriches your logger with the session properties.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bug-fixes">Bug fixes<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#bug-fixes" class="hash-link" aria-label="Direct link to Bug fixes" title="Direct link to Bug fixes" translate="no">​</a></h2>
<ul>
<li class="">Fixed: the data transfer was lost for the failed scenario iterations, and it leaked into the next iteration. An iteration can end with an error, a timeout, or a restart. NBomber now attributes the measured bytes to that iteration.</li>
<li class="">Pinned <code>Serilog.Sinks.SpectreConsole</code> to <code>0.4.0</code>. A transitive update of this package broke the console rendering.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://nbomber.com/blog/2026/08/17/nbomber-6.6.0#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<ul>
<li class="">Follow our <a href="https://nbomber.com/docs/getting-started/roadmap" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> to see what we plan for the next release.</li>
</ul>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber Studio 0.8.2]]></title>
            <link>https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2</link>
            <guid>https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2</guid>
            <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[NBomber Studio 0.8.2 is out! This is a patch release focused on stability, with a few valuable fixes: Studio can now run fully air-gapped without reaching out to public CDNs, the Active Sessions table no longer gets stuck showing stale rows, and the C# script validator no longer hangs on large build output.]]></description>
            <content:encoded><![CDATA[<p><strong>NBomber Studio 0.8.2</strong> is out! This is a patch release focused on stability, with a few valuable fixes: Studio can now run fully air-gapped without reaching out to public CDNs, the Active Sessions table no longer gets stuck showing stale rows, and the C# script validator no longer hangs on large build output.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixes-and-improvements">Fixes and improvements<a href="https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2#fixes-and-improvements" class="hash-link" aria-label="Direct link to Fixes and improvements" title="Direct link to Fixes and improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="air-gapped--offline-deployment-support">Air-gapped / offline deployment support<a href="https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2#air-gapped--offline-deployment-support" class="hash-link" aria-label="Direct link to Air-gapped / offline deployment support" title="Direct link to Air-gapped / offline deployment support" translate="no">​</a></h3>
<p>NBomber Studio's UI used to pull a few assets from public CDNs at runtime: the theme stylesheet, jQuery, jQuery Slimscroll, and the Monaco Editor (used for script editing). That made it impossible to run Studio in fully air-gapped or restricted-network environments.</p>
<p>All of these dependencies are now bundled locally into the build:</p>
<ul>
<li class=""><code>theme.css</code> is vendored directly into the UI assets instead of being linked from jsDelivr.</li>
<li class="">jQuery / Slimscroll <code>&lt;script&gt;</code> tags removed from <code>index.html</code>.</li>
<li class="">Monaco Editor and its language workers (JSON, CSS, HTML, TypeScript) are now bundled via Vite (<code>monaco-editor</code> + local worker imports) instead of being loaded from a CDN path.</li>
</ul>
<p><strong>Impact:</strong> Studio now works in networks with no outbound internet access.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="active-sessions-table-not-clearing">Active Sessions table not clearing<a href="https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2#active-sessions-table-not-clearing" class="hash-link" aria-label="Direct link to Active Sessions table not clearing" title="Direct link to Active Sessions table not clearing" translate="no">​</a></h3>
<p>Fixed a bug where the "Active Sessions" table would keep showing stale rows after every running session finished — the table never cleared once all sessions left the <em>Active</em> state. The polling logic in <code>ActiveSessionsTable.vue</code> and the backend <code>active/lastupdate</code> endpoint were adjusted so an empty result now correctly refreshes the table instead of being ignored.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scriptvalidator-hang-on-large-build-output">ScriptValidator hang on large build output<a href="https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2#scriptvalidator-hang-on-large-build-output" class="hash-link" aria-label="Direct link to ScriptValidator hang on large build output" title="Direct link to ScriptValidator hang on large build output" translate="no">​</a></h3>
<p>The C# script validator could hang indefinitely when a <code>dotnet build</code> produced a large amount of stdout/stderr output — synchronous <code>ReadToEnd()</code> calls on the process streams could deadlock once the OS pipe buffer filled up. Switched to reading stdout/stderr asynchronously (<code>ReadToEndAsync</code>) in parallel with waiting for process exit, eliminating the deadlock.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-docker-image--helm-chart">📦 Docker image &amp; Helm chart<a href="https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2#-docker-image--helm-chart" class="hash-link" aria-label="Direct link to 📦 Docker image &amp; Helm chart" title="Direct link to 📦 Docker image &amp; Helm chart" translate="no">​</a></h2>
<p>NBomber Studio is available as a Docker image and a Helm chart for easy deployment:</p>
<ul>
<li class="">Docker Hub: <a href="https://hub.docker.com/repository/docker/nbomberdocker/nbomber-studio/general" target="_blank" rel="noopener noreferrer" class="">nbomberdocker/nbomber-studio</a></li>
<li class="">Helm chart: <a href="https://artifacthub.io/packages/helm/nbomber-studio/nbomber-studio" target="_blank" rel="noopener noreferrer" class="">nbomber-studio</a> (<a href="https://github.com/PragmaticFlow/nbomber-studio-helm" target="_blank" rel="noopener noreferrer" class="">source</a>)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://nbomber.com/blog/2026/07/10/nbomber-studio-0.8.2#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<ul>
<li class="">Follow our <a href="https://github.com/PragmaticFlow/NBomber.Studio/milestone/2" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> to see what's coming in the next release.</li>
</ul>]]></content:encoded>
            <category>nbomber-studio-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber Studio 0.8.0]]></title>
            <link>https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0</link>
            <guid>https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0</guid>
            <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[NBomber Studio 0.8.0 is out! This release brings Load Test Schedules — a long-requested feature that lets you run a load test automatically at specific times, so you no longer need to kick it off manually. We've also extended the Container Spec file, which now supports more standard Kubernetes settings and gives you the flexibility to pass secrets and other arguments via environment variables.]]></description>
            <content:encoded><![CDATA[<p><strong>NBomber Studio 0.8.0</strong> is out! This release brings <strong>Load Test Schedules</strong> — a long-requested feature that lets you run a load test automatically at specific times, so you no longer need to kick it off manually. We've also extended the <code>Container Spec</code> file, which now supports more standard Kubernetes settings and gives you the flexibility to pass secrets and other arguments via environment variables.</p>
<center><img src="https://nbomber.com/assets/images/nb-studio-schedules-6d71db306361f515dc2fbbcf5e61c8b9.jpg" width="80%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-test-schedules">Load Test Schedules<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#load-test-schedules" class="hash-link" aria-label="Direct link to Load Test Schedules" title="Direct link to Load Test Schedules" translate="no">​</a></h2>
<p>Load Test Schedules let you configure a load test to run automatically at specific times, so you no longer need to kick it off manually.</p>
<div class="video-container"><!--$?--><template id="B:0"></template><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="container-spec-settings">Container Spec Settings<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#container-spec-settings" class="hash-link" aria-label="Direct link to Container Spec Settings" title="Direct link to Container Spec Settings" translate="no">​</a></h2>
<p>We've also extended the <code>Container Spec</code> settings for running load tests in Kubernetes. The following standard options are now available: <code>volumeMounts</code>, <code>volumes</code>, <code>envFrom</code>, and <code>tolerations</code>. Here's an example:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">Container Spec</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"256Mi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"4"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1Gi"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">volumeMounts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> secret</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/etc/secrets"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">readOnly</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">envFrom</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">prefix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> APP_</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">configMapRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">optional</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">secretRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secret</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">optional</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">nodeSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">nodepool</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> loadtest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">disktype</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ssd</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tolerations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dedicated</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Equal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> loadtest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> NoSchedule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">volumes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> secret</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">volume</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">secret</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">secretName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> app</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">secret</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="auth-improvements">Auth Improvements<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#auth-improvements" class="hash-link" aria-label="Direct link to Auth Improvements" title="Direct link to Auth Improvements" translate="no">​</a></h2>
<p>We added more flexibility to auth configuration. Starting from this version, you can enable or disable a specific auth provider via the <code>Enabled: bool</code> property in <code>config.json</code>.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"Auth"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"Enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"JwtSecret"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_SECRET_KEY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"StaticUserAuth"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"Enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"Users"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"Email"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"user_email@test"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"Hash"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"$2a$11$7MTzvj3mTFWVhOryGcDARe9ir0lFc/RPUThoCYBtJWKNff29TPWFC"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// password is 'password'</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"UserName"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"user"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"OpenIDConnect"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"Enabled"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"Authority"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://accounts.google.com"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"ClientId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_CLIENT_ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"ClientSecret"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR_CLIENT_SECRET"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"CallbackPath"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/signin-oidc"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="uiux-improvements">UI/UX Improvements<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#uiux-improvements" class="hash-link" aria-label="Direct link to UI/UX Improvements" title="Direct link to UI/UX Improvements" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="auto-refresh-toggle">Auto refresh toggle<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#auto-refresh-toggle" class="hash-link" aria-label="Direct link to Auto refresh toggle" title="Direct link to Auto refresh toggle" translate="no">​</a></h3>
<p>Auto refresh toogle is now available on all views, giving you full control over real-time updates.</p>
<center><img src="https://nbomber.com/assets/images/nb-studio-auto-refresh-194f63f9db0f957a53f1f4d36a22ecf8.jpg" width="100%"></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-loadtest-tabs">New LoadTest tabs<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#new-loadtest-tabs" class="hash-link" aria-label="Direct link to New LoadTest tabs" title="Direct link to New LoadTest tabs" translate="no">​</a></h3>
<p>We added a few new tabs to the LoadTest view: History, Trends, and Schedule. They provide focused navigation and features specific to the selected load test.</p>
<center><img src="https://nbomber.com/assets/images/nb-studio-load-test-tabs-a60bd9aa1a30e2437535c369495dcbe9.jpg" width="100%"></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="license-info-tooltip">License info tooltip<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#license-info-tooltip" class="hash-link" aria-label="Direct link to License info tooltip" title="Direct link to License info tooltip" translate="no">​</a></h3>
<p>We added a handy license info tooltip that shows your license details, such as company name and expiration date.</p>
<center><img src="https://nbomber.com/assets/images/nb-studio-license-info-4bf403943f296c359c0051342c3dde6f.jpg" width="50%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://nbomber.com/blog/2026/06/19/nbomber-studio-0.8.0#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<ul>
<li class="">F# Script support</li>
<li class="">Follow our <a href="https://github.com/PragmaticFlow/NBomber.Studio/milestone/2" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> to see what's coming in the next release.</li>
</ul>]]></content:encoded>
            <category>nbomber-studio-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber Studio 0.7.1]]></title>
            <link>https://nbomber.com/blog/2026/05/18/nbomber-studio-v0.7.1</link>
            <guid>https://nbomber.com/blog/2026/05/18/nbomber-studio-v0.7.1</guid>
            <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The new 0.7.1 release introduces a powerful feature: Load Tests in Kubernetes.]]></description>
            <content:encoded><![CDATA[<p>The new <strong>0.7.1 release</strong> introduces a powerful feature: <strong>Load Tests in Kubernetes</strong>.</p>
<p><a href="https://nbomber.com/docs/nbomber-studio/loadtests-in-k8s/overview" target="_blank" rel="noopener noreferrer" class="">Load Tests in Kubernetes</a> give you a control plane for managing, deploying, and running load tests. With this feature, you can schedule and execute load tests in Kubernetes directly from NBomber Studio. It's a game changer that brings a SaaS-like experience while letting you run your tests inside your own private K8s cluster.</p>
<center><img src="https://nbomber.com/assets/images/nb-studio-load-test-in-k8s-149baf7c45ff21f613cfa7df3792796e.jpg" width="80%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-tests-in-kubernetes">Load Tests in Kubernetes<a href="https://nbomber.com/blog/2026/05/18/nbomber-studio-v0.7.1#load-tests-in-kubernetes" class="hash-link" aria-label="Direct link to Load Tests in Kubernetes" title="Direct link to Load Tests in Kubernetes" translate="no">​</a></h2>
<p>Starting with this release, NBomber Studio lets you deploy and run tests in K8s. When you start a test, Studio spins up everything it needs — the Pods that run your load test, along with a NATS message broker for cluster mode. It also propagates your license key, the connection string for TimescaleDB, your JSON configuration, the container spec, and any CLI arguments you want to pass into your test. Once the test finishes, Studio cleans up the environment by destroying every resource it created during the session.</p>
<p>Let's take a look at the new capabilities. To create and run your test, we've added support for two project types:</p>
<ul>
<li class="">
<p><strong>C# Script</strong> — best suited for simple load tests, demos, and dry runs where you want to test a few endpoints or a single microservice and get quick results. Its main benefit is that you can change the code on the fly without recompiling your scenario, which makes it ideal for trying out NBomber and iterating quickly.</p>
</li>
<li class="">
<p><strong>Docker</strong> — designed for production use cases. You provide a Docker image with your NBomber test, and Studio deploys it across as many Pods as you configure. You can also pass and dynamically edit the JSON configuration of your test scenarios.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="c-script">C# Script<a href="https://nbomber.com/blog/2026/05/18/nbomber-studio-v0.7.1#c-script" class="hash-link" aria-label="Direct link to C# Script" title="Direct link to C# Script" translate="no">​</a></h2>
<div class="video-container"><!--$--><youtube-video style="display:block;width:100%;height:auto;aspect-ratio:16/9" src="https://youtu.be/ZAHIvXZoqQM" controls="" loop=""><template shadowrootmode="open">
    <style>
      :host {
        display: inline-block;
        line-height: 0;
        position: relative;
        min-width: 300px;
        min-height: 150px;
      }
      iframe {
        position: absolute;
        top: 0;
        left: 0;
      }
    </style>
    <iframe src="https://www.youtube.com/embed/ZAHIvXZoqQM?loop=1&amp;preload=metadata&amp;enablejsapi=1&amp;cc_load_policy=1&amp;showinfo=0&amp;rel=0&amp;iv_load_policy=3&amp;modestbranding=1" frameborder="0" width="100%" height="100%" allow="accelerometer; fullscreen; autoplay; encrypted-media; gyroscope; picture-in-picture"></iframe>
  </template></youtube-video><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="docker">Docker<a href="https://nbomber.com/blog/2026/05/18/nbomber-studio-v0.7.1#docker" class="hash-link" aria-label="Direct link to Docker" title="Direct link to Docker" translate="no">​</a></h2>
<div class="video-container"><!--$?--><template id="B:0"></template><!--/$--></div>
<p>For more details, please check our <a href="https://nbomber.com/docs/nbomber-studio/loadtests-in-k8s/overview" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://nbomber.com/blog/2026/05/18/nbomber-studio-v0.7.1#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<ul>
<li class="">F# Script support.</li>
<li class="">We're going to release a calendar scheduler that lets you run load tests at a specific time or on a recurring schedule (daily, weekly, etc.).</li>
<li class="">Please follow our <a href="https://github.com/PragmaticFlow/NBomber.Studio/milestone/1" target="_blank" rel="noopener noreferrer" class="">Roadmap page</a> for the upcoming release.</li>
</ul>]]></content:encoded>
            <category>nbomber-studio-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber Studio 0.6.2]]></title>
            <link>https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2</link>
            <guid>https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2</guid>
            <pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The new 0.6.2 release introduces several powerful features: Compare Runs, Trend Analysis, Download HTML Report, and Stop Session.]]></description>
            <content:encoded><![CDATA[<p>The new <strong>0.6.2 release</strong> introduces several powerful features: <strong>Compare Runs</strong>, <strong>Trend Analysis</strong>, <strong>Download HTML Report</strong>, and <strong>Stop Session</strong>.</p>
<p>With these additions, <a href="https://nbomber.com/docs/nbomber-studio/overview" target="_blank" rel="noopener noreferrer" class="">NBomber Studio</a> is evolving beyond being just a UI for NBomber metrics into a full-fledged load testing platform. We are also working on the upcoming Load Testing in Kubernetes feature, which we expect to release in April.</p>
<center><img src="https://nbomber.com/assets/images/nbomber-studio-ad32008ecb6180b166380ca00c01bfa1.jpg" width="75%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authentication-enabled-by-default">Authentication enabled by default<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#authentication-enabled-by-default" class="hash-link" aria-label="Direct link to Authentication enabled by default" title="Direct link to Authentication enabled by default" translate="no">​</a></h2>
<p>Starting with this release, NBomber Studio enables authentication by default. You can configure authentication settings to add new members, disable authentication entirely, or enable OIDC for external identity providers.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>NBomber Studio doesn’t store user credentials.</p></div></div>
<div class="video-container"><!--$?--><template id="B:0"></template><!--/$--></div>
<p><em>For more info please refer to <a href="https://nbomber.com/docs/nbomber-studio/config/auth" target="_blank" rel="noopener noreferrer" class="">this page</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compare-runs">Compare Runs<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#compare-runs" class="hash-link" aria-label="Direct link to Compare Runs" title="Direct link to Compare Runs" translate="no">​</a></h2>
<p>Compare runs lets you select up to five load test sessions and compare them across multiple dimensions — latency, throughput, status codes, and more. You can quickly identify differences through percentage comparisons or explore detailed comparison charts for deeper analysis.</p>
<div class="video-container"><!--$?--><template id="B:1"></template><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="trend-analysis">Trend Analysis<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#trend-analysis" class="hash-link" aria-label="Direct link to Trend Analysis" title="Direct link to Trend Analysis" translate="no">​</a></h2>
<p>Trend analysis is particularly useful for teams that want to track load test performance over longer periods, such as several months or even a full year. You'll see a degradation curve based on load test metrics summarized per day and plotted across the entire period.</p>
<div class="video-container"><!--$?--><template id="B:2"></template><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="stop-session">Stop Session<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#stop-session" class="hash-link" aria-label="Direct link to Stop Session" title="Direct link to Stop Session" translate="no">​</a></h2>
<p>Sometimes you may start a load test and later decide to stop it to adjust settings or investigate an issue. Now you can simply select a session and click Stop.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This feature requires NBomber 6.3 and TimescaleSink 0.12 or later.</p></div></div>
<div class="video-container"><!--$?--><template id="B:3"></template><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="download-html-report">Download HTML Report<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#download-html-report" class="hash-link" aria-label="Direct link to Download HTML Report" title="Direct link to Download HTML Report" translate="no">​</a></h2>
<p>Sharing load test results previously required storing generated HTML reports separately. Now you can directly download an HTML report from NBomber Studio using the <strong>Download HTML Report</strong> option for any completed session.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>This feature requires NBomber 6.3 and TimescaleSink 0.12 or later.</p></div></div>
<div class="video-container"><!--$?--><template id="B:4"></template><!--/$--></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-charts">Helm Charts<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#helm-charts" class="hash-link" aria-label="Direct link to Helm Charts" title="Direct link to Helm Charts" translate="no">​</a></h2>
<p>We’ve published two Helm charts to simplify installation in Kubernetes:</p>
<ul>
<li class=""><a href="https://artifacthub.io/packages/helm/timescale/timescale" target="_blank" rel="noopener noreferrer" class="">TimescaleDB Chart</a> for running a single-node PostgreSQL (TimescaleDB OSS) used by NBomber Studio</li>
<li class=""><a href="https://artifacthub.io/packages/helm/nbomber-studio/nbomber-studio" target="_blank" rel="noopener noreferrer" class="">NBomber Studio Chart</a> for deploying a single-node instance of NBomber Studio</li>
</ul>
<p>These charts make it much easier to set up NBomber Studio in Kubernetes environments.
<em>You can find more info about installation on <a href="https://nbomber.com/docs/nbomber-studio/installation" target="_blank" rel="noopener noreferrer" class="">this page</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="load-testing-in-kubernetes">Load Testing in Kubernetes<a href="https://nbomber.com/blog/2026/03/18/nbomber-studio-v0.6.2#load-testing-in-kubernetes" class="hash-link" aria-label="Direct link to Load Testing in Kubernetes" title="Direct link to Load Testing in Kubernetes" translate="no">​</a></h3>
<p>We are putting the finishing touches on the feature: <strong>Load Testing in K8s</strong>. This will allow you to create and deploy load tests directly to Kubernetes from NBomber Studio, without requiring additional CI/CD jobs. We expect this to be released in April.</p>]]></content:encoded>
            <category>nbomber-studio-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber v6.2.0]]></title>
            <link>https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0</link>
            <guid>https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0</guid>
            <pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In the NBomber v6.2.0 release, we focused primarily on improvements to cluster mode, and we also introduced several useful enhancements to the HTML Report.]]></description>
            <content:encoded><![CDATA[<p>In the <a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v6.2.0" target="_blank" rel="noopener noreferrer" class="">NBomber v6.2.0 release</a>, we focused primarily on improvements to cluster mode, and we also introduced several useful enhancements to the HTML Report.</p>
<ul>
<li class=""><a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#html-report-improvements" class="">HTML Report improvements</a></li>
<li class=""><a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#nbomber-cluster-improvements" class="">NBomber Cluster improvements</a></li>
<li class=""><a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#opentelemetry-reporting-sink" class="">OpenTelemetry Reporting Sink</a></li>
<li class=""><a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#whats-next" class="">What's next</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-improvements">HTML Report improvements<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#html-report-improvements" class="hash-link" aria-label="Direct link to HTML Report improvements" title="Direct link to HTML Report improvements" translate="no">​</a></h2>
<p>One of the invisible but important changes in the <a href="https://nbomber.com/assets/reports/html_report.html" target="_blank" rel="noopener noreferrer" class="">new HTML Report</a> is that it has been completely rewritten in TypeScript. For a long time, we used vanilla JavaScript with Vue, but over time it became difficult to manage complexity, reason about the code, and maintain correctness. Moving to TypeScript gives us type safety and makes future development more sustainable.</p>
<p>Now, let’s look at the visible improvements 🙂</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="status-code-chart-colors">Status code chart colors<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#status-code-chart-colors" class="hash-link" aria-label="Direct link to Status code chart colors" title="Direct link to Status code chart colors" translate="no">​</a></h3>
<p>Previously, the colors for the status code chart were automatically selected by the charting library. This made it difficult to clearly distinguish successful responses from errors. In this release, we fixed that by introducing two distinct color groups—green for successful responses and red for errors—with slightly different shades.</p>
<p>This change significantly improves the clarity and readability of the status code chart.</p>
<div style="display:flex;justify-content:center;gap:20px"><div style="text-align:center"><img src="https://nbomber.com/assets/images/old_status_code-6efc97e48985fa4026b6c63458041b7c.jpg" width="70%"><p><em>Before: status codes chart </em></p></div><div style="text-align:center"><img src="https://nbomber.com/assets/images/new_status_code-03e4b67be28a7e15e3506863fa43e989.jpg" width="62%"><p><em>After: status codes chart </em></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advanced-options">Advanced options<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#advanced-options" class="hash-link" aria-label="Direct link to Advanced options" title="Direct link to Advanced options" translate="no">​</a></h3>
<p>This feature allows you to include custom metrics and plot them on the Throughput chart.</p>
<div class="video-container"><!--$?--><template id="B:0"></template><!--/$--></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="metrics-filter">Metrics filter<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#metrics-filter" class="hash-link" aria-label="Direct link to Metrics filter" title="Direct link to Metrics filter" translate="no">​</a></h3>
<p>The metrics filter provides a simple text box that allows you to quickly find and focus on the metrics you are interested in.</p>
<div class="video-container"><!--$?--><template id="B:1"></template><!--/$--></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="chart-size">Chart size<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#chart-size" class="hash-link" aria-label="Direct link to Chart size" title="Direct link to Chart size" translate="no">​</a></h3>
<p>With View mode, you can adjust the size of charts to make analysis more convenient and readable.</p>
<div class="video-container"><!--$?--><template id="B:2"></template><!--/$--></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="full-screen-mode">Full-screen mode<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#full-screen-mode" class="hash-link" aria-label="Direct link to Full-screen mode" title="Direct link to Full-screen mode" translate="no">​</a></h3>
<p>Full-screen mode allows you to open any chart in full-screen view for more detailed analysis.</p>
<div class="video-container"><!--$?--><template id="B:3"></template><!--/$--></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="failures-tab">Failures tab<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#failures-tab" class="hash-link" aria-label="Direct link to Failures tab" title="Direct link to Failures tab" translate="no">​</a></h3>
<p>To make failures more visible during test analysis, we added a red badge on the Failures tab that displays the aggregated failure count.</p>
<center><img src="https://nbomber.com/assets/images/failures_tab-ce09922445dec1359ec75d9513c1a073.jpg" width="75%"></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="aggregated-failure-counter">Aggregated failure counter<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#aggregated-failure-counter" class="hash-link" aria-label="Direct link to Aggregated failure counter" title="Direct link to Aggregated failure counter" translate="no">​</a></h3>
<p>In some cases, it’s useful not only to see the Fail RPS, but also the cumulative number of failures over time. Using the Advanced Options feature, you can now include the aggregated failure count directly on your chart.</p>
<center><img src="https://nbomber.com/assets/images/aggregated-fail-count-a158d28188767f2a73bed36a68dd2705.jpg" width="75%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nbomber-cluster-improvements">NBomber Cluster improvements<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#nbomber-cluster-improvements" class="hash-link" aria-label="Direct link to NBomber Cluster improvements" title="Direct link to NBomber Cluster improvements" translate="no">​</a></h2>
<p>As you may already know, NBomber supports cluster mode, which allows you to run load tests in a distributed fashion. In this release, we introduced two major improvements focused on simplicity and flexibility.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-via-cli-args">Cluster via CLI args<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#cluster-via-cli-args" class="hash-link" aria-label="Direct link to Cluster via CLI args" title="Direct link to Cluster via CLI args" translate="no">​</a></h3>
<p>Previously, creating a cluster required defining and loading a JSON Config file that described the cluster topology. For example, the following configuration defines a cluster with one Coordinator and two Agents, all running the test_scenario.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"ClusterSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"AutoCluster"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"ClusterId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"NATSServerURL"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nats://localhost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"Coordinator"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test_scenario"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"Agent"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test_scenario"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"AgentsCount"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>You then had to load this configuration on each NBomber node to form a cluster (in our example, three-node cluster: 1 Coordinator + 2 Agents):</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># start node 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start node 2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start node 3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json</span><br></span></code></pre></div></div>
<p>In v6.2.0, you can now configure the cluster via CLI arguments, without creating or loading a JSON configuration file. This is especially useful when you're preparing a CI/CD job and <strong>want to run your regular single-node NBomber test in cluster mode</strong> on K8s. No JSON config is required—just pass CLI arguments and you’re ready to go:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># --target sets TargetScenarios for both Coordinator and Agents</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># to start node 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--target</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">test_scenario --cluster-id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">default --cluster-agents-count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> --cluster-nats-url</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">nats://localhost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># to start node 2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--target</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">test_scenario --cluster-id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">default --cluster-agents-count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> --cluster-nats-url</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">nats://localhost</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># to start node 3</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--target</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">test_scenario --cluster-id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">default --cluster-agents-count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> --cluster-nats-url</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">nats://localhost</span><br></span></code></pre></div></div>
<p>All of the above commands can also be used to override settings loaded from <code>config.json</code>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>In this example, <code>--target</code> overrides TargetScenarios for both Coordinator and Agents, and <code>--cluster-agents-count</code> sets a new value for AgentsCount.</p></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json </span><span class="token parameter variable" style="color:#36acaa">--target</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">test_scenario --cluster-agents-count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><br></span></code></pre></div></div>
<p>If you want to run different scenarios on the Coordinator and Agents, this can also be done via CLI arguments. In the following example, <code>"scenario_1"</code> runs on the Coordinator and <code>"scenario_2"</code> runs on the Agents:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --cluster-coordinator-target</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">scenario_1 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --cluster-agent-target</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">scenario_2 </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --cluster-id</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">default </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --cluster-agents-count</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    --cluster-nats-url</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">nats://localhost</span><br></span></code></pre></div></div>
<p>A full list of available CLI options can be found at the <a href="https://nbomber.com/docs/nbomber/cli" target="_blank" rel="noopener noreferrer" class="">following link</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="simplification-of-manual-cluster-mode">Simplification of Manual cluster mode<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#simplification-of-manual-cluster-mode" class="hash-link" aria-label="Direct link to Simplification of Manual cluster mode" title="Direct link to Simplification of Manual cluster mode" translate="no">​</a></h3>
<p>For <strong>ManualCluster</strong> mode — which provides more flexibility than <strong>AutoCluster</strong> by allowing explicit control over scenario placement — we introduced a small but important simplification.</p>
<p>AgentGroups are now optional. If you don’t need fine-grained placement, you can simply specify TargetScenarios, making ManualCluster nearly as simple to configure as AutoCluster.</p>
<p>Here is the updated type definition for ManualCluster configuration:</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">ManualAgentSettings</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    AgentGroups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">AgentGroupSettings list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> option</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    TargetScenarios</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">string list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> option</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    AgentsCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">ManualClusterSettings</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ClusterId</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    NATSServerURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Coordinator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">ManualCordSettings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Agent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">ManualAgentSettings</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manualcluster-using-only-targetscenarios">ManualCluster using only TargetScenarios<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#manualcluster-using-only-targetscenarios" class="hash-link" aria-label="Direct link to ManualCluster using only TargetScenarios" title="Direct link to ManualCluster using only TargetScenarios" translate="no">​</a></h3>
<p>This configuration is similar to AutoCluster but gives you manual control over which node runs as Coordinator and which runs as an Agent. In AutoCluster, this role assignment is handled automatically via leader election.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"ClusterSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"ManualCluster"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"ClusterId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"test_cluster"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"NATSServerURL"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nats://localhost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"Coordinator"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test_scenario_1"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"Agent"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"test_scenario_2"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"AgentsCount"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># start Coordinator node</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">coordinator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start Agent node</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">agent</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manualcluster-with-agentgroups">ManualCluster with AgentGroups<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#manualcluster-with-agentgroups" class="hash-link" aria-label="Direct link to ManualCluster with AgentGroups" title="Direct link to ManualCluster with AgentGroups" translate="no">​</a></h3>
<p>If you need more flexible scenario placement, AgentGroups are still fully supported.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"ClusterSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"ManualCluster"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"ClusterId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"test_cluster"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"NATSServerURL"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"nats://localhost"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"Coordinator"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"publish_kafka_scenario"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"Agent"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"AgentGroups"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"AgentGroup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"readers"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"read_db_scenario"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"AgentGroup"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"writers"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"TargetScenarios"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"write_dbScenario"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token property" style="color:#36acaa">"AgentsCount"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># start Coordinator node</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">coordinator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start 2 Agent nodes under "readers" AgentGroup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">agent --cluster-agent-group</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">reads</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">agent --cluster-agent-group</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">reads</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># start 2 Agent nodes under "writers" AgentGroup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">agent --cluster-agent-group</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">writes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">dotnet my-nbomber-test.dll </span><span class="token parameter variable" style="color:#36acaa">--config</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">config.json --cluster-node-type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">agent --cluster-agent-group</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">writes</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="opentelemetry-reporting-sink">OpenTelemetry Reporting Sink<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#opentelemetry-reporting-sink" class="hash-link" aria-label="Direct link to OpenTelemetry Reporting Sink" title="Direct link to OpenTelemetry Reporting Sink" translate="no">​</a></h2>
<p>We released a new <a href="https://nbomber.com/docs/reporting/realtime/opentelemetry" target="_blank" rel="noopener noreferrer" class="">OpenTelemetry Reporting Sink</a> that allows you to stream real-time NBomber metrics to any observability platform that supports the OpenTelemetry (OTel) protocol.</p>
<p>This effectively enables integration with the vast majority of modern observability platforms. Previously, we had to implement a dedicated reporting sink for each platform individually. Now, if you want to store NBomber metrics in a system like Azure Monitor (or many others), you can simply use the OpenTelemetry sink.</p>
<center><img src="https://nbomber.com/assets/images/opentelemetry-83940fc3e993b7ce9457fe5213b34071.jpg" width="60%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's next<a href="https://nbomber.com/blog/2026/01/20/nbomber-v6.2.0#whats-next" class="hash-link" aria-label="Direct link to What's next" title="Direct link to What's next" translate="no">​</a></h2>
<ol>
<li class="">
<p>We are planning to release a new version of <a href="https://nbomber.com/docs/nbomber-studio/overview" target="_blank" rel="noopener noreferrer" class="">NBomber Studio</a> soon—hopefully in February. This release will include several exciting features such as Compare Runs and Trends.</p>
</li>
<li class="">
<p>In parallel, we are finishing work on a highly anticipated feature for NBomber Studio: <strong>Load Testing in K8s</strong>. This will allow you to create and deploy load tests directly to Kubernetes from NBomber Studio, without requiring additional CI/CD jobs. We expect this to be released in late February or early March.</p>
</li>
<li class="">
<p>We have also started working on <a href="https://github.com/PragmaticFlow/NBomber.YCSB" target="_blank" rel="noopener noreferrer" class="">NBomber.YCSB</a>, a port of the Yahoo Cloud Serving Benchmark (YCSB), which will allow you to generate popular synthetic workloads against your database and evaluate how well it handles load. Feel free to join and contribute! We have many exciting ideas ahead, and we believe this project will bring great value to the .NET community and beyond.</p>
</li>
</ol>
<ul>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v6.2.0" target="_blank" rel="noopener noreferrer" class="">Release Notes for v6.2.0</a></li>
<li class="">Please follow our <a href="https://nbomber.com/docs/getting-started/roadmap" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> page for upcoming releases.</li>
</ul>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber v6.0.1]]></title>
            <link>https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1</link>
            <guid>https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1</guid>
            <pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[In the new release, we are introducing Custom Metrics, one of the most requested features. Additionally, we've made several improvements related to thresholds, memory consumption, CSV, HTML reports, and more.]]></description>
            <content:encoded><![CDATA[<p>In the <a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v6.0.1" target="_blank" rel="noopener noreferrer" class="">new release</a>, we are introducing Custom Metrics, one of the most requested features. Additionally, we've made several improvements related to thresholds, memory consumption, CSV, HTML reports, and more.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-metrics">Custom Metrics<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#custom-metrics" class="hash-link" aria-label="Direct link to Custom Metrics" title="Direct link to Custom Metrics" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/custom_metrics-88b43ab290731fdbc5391e82910c8172.jpg" width="75%" height="75%"></center>
<p>Metrics are numerical measurements reported over time. By default, NBomber automatically collects built-in metrics: CPU, RAM (usage), Data (sent/receive), and more. Besides built-ins, now you can define your custom metrics.</p>
<p>NBomber provides different types of custom metrics that you can use, depending on what you want to measure. These include:</p>
<ul>
<li class=""><strong>Counter</strong>: a cumulative count of events, such as the number of successful or failed requests.</li>
</ul>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> counter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Metric</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateCounter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"my-counter"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token named-parameter punctuation" style="color:#393A34">unitOfMeasure</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"MB"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">counter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// tracks a value that may increase or decrease over time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">counter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Add</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<ul>
<li class=""><strong>Gauge</strong>: measures the last value recorded, such as memory usage or the number of active users at a given time.</li>
</ul>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> gauge </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Metric</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateGauge</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"my-gauge"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token named-parameter punctuation" style="color:#393A34">unitOfMeasure</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KB"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gauge</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">6.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gauge</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Set</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">7.3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// set the current value of the metric</span><br></span></code></pre></div></div>
<p>You can use your custom metrics with thresholds.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithThresholds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Threshold</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">metric </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> metric</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Counters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"my-counter"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Value </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Threshold</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">metric </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> metric</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Gauges</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"my-gauge"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Value </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6.5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Or define thresholds in the JSON config file:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"ThresholdSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"Metric"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"my-counter"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value &lt; 1000"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"Metric"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"my-gauge"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value &gt;= 6.5"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<p>All these capabilities open up new ways to validate specific conditions. After running a load test, you will be able to view and check custom metric values in the HTML report.</p>
<center><img src="https://nbomber.com/assets/images/custom_metrics_tab-49a9f23aea8814f5e19c3cd40f2969be.jpg" width="80%" height="80%"></center>
<p>You can also see them in the Console UI.</p>
<center><img src="https://nbomber.com/assets/images/console_ui-4c0c7a86655ea455f40b3b3c52283ddc.png" width="80%" height="80%"></center>
<p><em>For more information about this feature, please refer to our <a href="https://nbomber.com/docs/nbomber/custom-metrics" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-new-metrics-tabs">HTML Report: New Metrics Tabs<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#html-report-new-metrics-tabs" class="hash-link" aria-label="Direct link to HTML Report: New Metrics Tabs" title="Direct link to HTML Report: New Metrics Tabs" translate="no">​</a></h2>
<p>We've slightly rearranged the tabs in the HTML report to provide more convenient navigation based on the scenario context.</p>
<center><img src="https://nbomber.com/assets/images/html_new_tabs-b7a9d765ce9c1e9153fb8dba55b79c76.png" width="100%" height="100%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-printout-threshold-code-body">HTML Report: Printout Threshold code body<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#html-report-printout-threshold-code-body" class="hash-link" aria-label="Direct link to HTML Report: Printout Threshold code body" title="Direct link to HTML Report: Printout Threshold code body" translate="no">​</a></h2>
<p>In the previous v5.8 release, NBomber introduced a new feature called Runtime Thresholds. This feature allows you to define thresholds using C#/F# code or JSON expressions. Defining thresholds in JSON was a bit more complete as you could see the JSON expression text in your HTML report. The downside of defining a threshold using C#/F# code was that <code>checkExpression</code> wasn't displayed in the final HTML report.</p>
<center><img src="https://nbomber.com/assets/images/thresholds_no_code-ac7f39dfaf9ce96a93e8c2979b8fbbd9.png" width="80%" height="80%"></center>
<p>Well, we've fixed that! In the new release, we've added functionality that iterates over the code body and prints it.</p>
<center><img src="https://nbomber.com/assets/images/thresholds_with_code_body-a28cf42d1d3f27f194413921776eadd8.png" width="80%" height="80%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getscenariotimertime">GetScenarioTimerTime<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#getscenariotimertime" class="hash-link" aria-label="Direct link to GetScenarioTimerTime" title="Direct link to GetScenarioTimerTime" translate="no">​</a></h2>
<p>We've added a feature that allows you to get the current time of the scenario timer. This can be useful for scenarios that depend on time-based criteria within the scenario.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"hello_world_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> currentScenarioTime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetScenarioTimerTime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Logger</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Information</span><span class="token punctuation" style="color:#393A34">(</span><span class="token interpolation-string string" style="color:#e3116c">$"Current scenario time: </span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">{</span><span class="token interpolation-string interpolation expression language-csharp">currentScenarioTime</span><span class="token interpolation-string interpolation punctuation" style="color:#393A34">}</span><span class="token interpolation-string string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p><em>You can find the complete example by this <a href="https://github.com/PragmaticFlow/NBomber/blob/dev/examples/Demo/HelloWorld/ScenarioTimerTimeExample.cs" target="_blank" rel="noopener noreferrer" class="">link</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="custom-latency">Custom Latency<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#custom-latency" class="hash-link" aria-label="Direct link to Custom Latency" title="Direct link to Custom Latency" translate="no">​</a></h2>
<p>We've added an option to pass custom latency, which can be useful for streaming-based scenarios where you need to measure the latency between several independent processes that publish and consume data independently. In the future, we will describe this use case in our documentation and provide guidance on how to handle it.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token named-parameter punctuation" style="color:#393A34">customLatencyMs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">120</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-system-metrics">New System Metrics<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#new-system-metrics" class="hash-link" aria-label="Direct link to New System Metrics" title="Direct link to New System Metrics" translate="no">​</a></h2>
<p>We've expanded our standard list of system metrics by adding a few important ones:</p>
<ul>
<li class=""><code>dns-lookups-duration</code> - The average time taken for a DNS lookup</li>
<li class=""><code>dns-lookups-requested</code> - The number of DNS lookups requested since the process started</li>
<li class=""><code>gc:loh-size</code> - The number of bytes for the large object heap</li>
<li class=""><code>gc:time-in-gc</code> - The percent of time in GC since the last GC</li>
</ul>
<center><img src="https://nbomber.com/assets/images/new_metrics-65ece98dd2eab64a0a9180a3d917f73f.png" width="70%" height="70%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="csv-report-failures-stats">CSV Report: Failures Stats<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#csv-report-failures-stats" class="hash-link" aria-label="Direct link to CSV Report: Failures Stats" title="Direct link to CSV Report: Failures Stats" translate="no">​</a></h2>
<p>Previously, NBomber's CSV reports didn't include statistics on failures. The default way to get failure stats was by getting them from the final <code>NodeStats</code> record or by using <code>IReportingSink</code> and subscribing to real-time metrics. However, some of our clients still rely on CSV for extracting data to process further. To maintain consistency with other reports, we've now added failure statistics to the CSV report as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="logs-folder-change-for-nbomber-cluster">Logs folder change for NBomber Cluster<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#logs-folder-change-for-nbomber-cluster" class="hash-link" aria-label="Direct link to Logs folder change for NBomber Cluster" title="Direct link to Logs folder change for NBomber Cluster" translate="no">​</a></h2>
<p>When running NBomber Cluster, the Coordinator folder and Agent(s) folders are created at the same level. This can be inconvenient if you're storing logs in blob storage. We've addressed this by nesting the Agent logs under the same session folder path. The folder structure now looks like this:</p>
<ul>
<li class=""><code>sessionId/reports</code> - for Coordinator</li>
<li class=""><code>sessionId/reports/agentId</code> - for Agent</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="xml-documentation-link">XML documentation link<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#xml-documentation-link" class="hash-link" aria-label="Direct link to XML documentation link" title="Direct link to XML documentation link" translate="no">​</a></h2>
<p>Since day one, NBomber has provided documentation comments for IDE IntelliSense. While this works well, there were cases where a more detailed documentation page would be helpful. To address this, we've added a link to the Documentation page that describes specific features. Now, you can click the Documentation link in the pop-up window and navigate to the full page documentation.</p>
<center><img src="https://nbomber.com/assets/images/xml_docs-b2ae6fb5fa532935e12b7e6ec3ccd82a.png" width="60%" height="60%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-improvements">Performance improvements<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#performance-improvements" class="hash-link" aria-label="Direct link to Performance improvements" title="Direct link to Performance improvements" translate="no">​</a></h2>
<p>At NBomber, we are always striving to optimize performance, aiming to make our framework the fastest and most resource-efficient. This release is no exception.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mean-and-stddev">Mean and StdDev<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#mean-and-stddev" class="hash-link" aria-label="Direct link to Mean and StdDev" title="Direct link to Mean and StdDev" translate="no">​</a></h3>
<p>We made an optimization related to the calculation of <code>Mean</code> and <code>StdDev</code>. For real-time reporting, we need to calculate these values periodically (each 5 sec). Previously, we had to iterate through all items to calculate the <code>Mean</code>. However, we discovered that we can completely skip this step by tracking the <code>Mean</code> as we go. This optimization also contributed to the performance of <code>StdDev</code>, which depends on the <code>Mean</code> calculation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="json-serialization">JSON serialization<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#json-serialization" class="hash-link" aria-label="Direct link to JSON serialization" title="Direct link to JSON serialization" translate="no">​</a></h3>
<p>We found that for long-running scenarios, especially those lasting over 1-2 hours, generating the HTML report can be quite heavy. The main contributor to this is extra memory allocations that occur when serializing the metrics history in JSON for the HTML report. Historically, we used the <a href="https://github.com/PragmaticFlow/FSharp.Json.New" target="_blank" rel="noopener noreferrer" class="">F# JSON serializer</a>, which works well with F# types and also plays an important role in schema validation for JSON config parsing. F# JSON validates the JSON based on the types you pass, which is great. However, the downside is that this library was written a long time ago and isn't very memory-efficient. In the new release, we've limited the use of F# JSON, using it only for parsing the JSON config. For all other cases, we've switched to the standard .NET System.Text.Json, which delivers much better performance. In addtition, we conducted a benchmark using one hour of statistics for five concurrent scenarios.</p>
<center><img src="https://nbomber.com/assets/images/fsharp_json-69b6881767e802278f927aa7bb483187.png" width="100%" height="100%"></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="statistics-compression">Statistics compression<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#statistics-compression" class="hash-link" aria-label="Direct link to Statistics compression" title="Direct link to Statistics compression" translate="no">​</a></h3>
<p>We've started compressing statistics, which has reduced memory usage. While we hadn't encountered any issues with this in the past, we still decided to optimize it.</p>
<blockquote>
<p>Previously, storing one hour of stats for a single scenario required ~5MB of RAM. With the new optimizations, we've reduced it to just 360KB. In absolute numbers, the impact is minimal, but optimizations like this help reduce GC pressure, making them worthwhile.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nbomber-studio">NBomber Studio<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#nbomber-studio" class="hash-link" aria-label="Direct link to NBomber Studio" title="Direct link to NBomber Studio" translate="no">​</a></h2>
<p>Alongside NBomber, we released a new version of <a href="https://nbomber.com/docs/nbomber-studio/overview" target="_blank" rel="noopener noreferrer" class="">NBomber Studio</a>. This update includes bug fixes related to frontend session handling and improvements to the UI. We've removed manual steps, such as having to click the refresh or search button to get updates.</p>
<center><img src="https://nbomber.com/assets/images/nbomber_studio-3156d38ff72073f58b4cd473de62993c.png" width="100%" height="100%"></center>
<p>In the previous version, UI auto-updates only worked for an open session, but we've now expanded this functionality further. The search button has been removed from filtering, and now, when you change something—such as the date range or test name—requests are sent automatically. Additionally, we’ve added auto-updating for the History tab, as it's a useful feature.</p>
<center><img src="https://nbomber.com/assets/images/nbomber_studio_filter-87a28210f3bb1497c660feb3de02886d.png" width="100%" height="100%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-next">What is next<a href="https://nbomber.com/blog/2025/03/17/nbomber-v6.0.1#what-is-next" class="hash-link" aria-label="Direct link to What is next" title="Direct link to What is next" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v6.0.1" target="_blank" rel="noopener noreferrer" class="">Release Notes for v6.0.1</a></li>
<li class="">Please follow our <a href="https://nbomber.com/docs/getting-started/roadmap" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> page for the upcoming release.</li>
</ul>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber v5.8.0 - Scenario Weight, Runtime Thresholds]]></title>
            <link>https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0</link>
            <guid>https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0</guid>
            <pubDate>Mon, 28 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In the new release, we ship a few big features:]]></description>
            <content:encoded><![CDATA[<p>In the <a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v5.8.0" target="_blank" rel="noopener noreferrer" class="">new release</a>, we ship a few big features:</p>
<ul>
<li class="">Scenario Weight</li>
<li class="">Native extensions for probability distributions</li>
<li class="">Runtime Thresholds</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-weight">Scenario Weight<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#scenario-weight" class="hash-link" aria-label="Direct link to Scenario Weight" title="Direct link to Scenario Weight" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/scenario_weight-9cb183413ee90597989c12e955cd5ad4.jpg" width="80%" height="80%"></center>
<p>Previously, NBomber allowed introducing randomness, but primarily within a single Scenario or Step. There was no native way to introduce randomness across multiple scenarios. In the new version we’ve unlocked a highly requested feature - Scenario <strong>Weight</strong>. The <strong>Weight</strong> value allows you to control the relative frequency or probability of Scenario's execution. Scenarios with higher weights will run more frequently during the test, while those with lower weights will execute less often, providing flexible control over load distribution. NBomber uses the weights to determine the probability of each Scenario.</p>
<p>Example: In this case, the <code>"read_scenario"</code> probability is 80%, and <code>"write_scenario"</code> is 20%.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> readScenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"read_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithWeight</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">80</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// sets 80%</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> writeScenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"write_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithWeight</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// sets 20%</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">readScenario</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> writeScenario</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><em>For more information, please refer to our <a href="https://nbomber.com/docs/nbomber/dynamic-workloads" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="native-extensions-for-probability-distributions">Native extensions for probability distributions<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#native-extensions-for-probability-distributions" class="hash-link" aria-label="Direct link to Native extensions for probability distributions" title="Direct link to Native extensions for probability distributions" translate="no">​</a></h2>
<center><img src="https://nbomber.com/assets/images/distribution-744730cc1cdfb121cefa891cf6c580b6.jpg" width="70%" height="70%"></center>
<p>In our documentation, we referenced several popular probability distributions: Uniform, Zipfian, and Multinomial. To use them, we noted that you need to install the <strong>MathNet.Numerics</strong> package.</p>
<blockquote>
<p>To start working with probabilities, you should install <a href="https://www.nuget.org/packages/MathNet.Numerics" target="_blank" rel="noopener noreferrer" class="">MathNet.Numerics</a> package. It's a free package that <a href="https://numerics.mathdotnet.com/Probability" target="_blank" rel="noopener noreferrer" class="">contains</a> many useful probabilies.</p>
</blockquote>
<p>In the new version of NBomber, we decided it would be beneficial to have these distributions available out of the box. Since they will be included with NBomber, we aimed to ensure they are highly performant compared to MathNet.Numerics. One downside of MathNet.Numerics is that its API caused extra allocations, which we wanted to avoid in our implementation.</p>
<ul>
<li class="">We added native support for <strong>Zipf</strong> distribution, which allows us to choose an item according to the Zipfian distribution. For example, when choosing a record, some records will be extremely popular (the head) while most records will be unpopular (the tail). The Zipf distribution is a mathematical concept that describes the frequency of items ranked from most common to least common in a dataset, like word frequencies in a book or city populations. Also, this distribution can be used to describe hot keys/items (skewed key distributions) in database or popular tweets in Tweeter web service.</li>
</ul>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"zipfian_distribution"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> stepNumber </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Zipf</span><span class="token punctuation" style="color:#393A34">(</span><span class="token named-parameter punctuation" style="color:#393A34">n</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token named-parameter punctuation" style="color:#393A34">s</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stepNumber</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// run step 1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step_1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// run step 2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step_2"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<ul>
<li class="">We added native support for <strong>Multinomial</strong> distribution, which allows us to specify probabilities for each item. For example, assigning a probability of 0.95 to the Read operation, 0.05 to the Update operation, and 0 to Delete and Insert. This setup creates a read-heavy workload. To simulate Multinomial distribution we can use extension method Choice for Random object.</li>
</ul>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 70% for read, 20% for write, 10% for delete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> items </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">70</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"multinomial_distribution"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> randomItem </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Choice</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">items</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">randomItem</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"read"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 70% for read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"read"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"write"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 20% for write</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"write"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"delete"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 10% for delete</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"delete"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">break</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><em>For more information, please refer to our <a href="https://nbomber.com/docs/nbomber/dynamic-workloads" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="runtime-thresholds">Runtime Thresholds<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#runtime-thresholds" class="hash-link" aria-label="Direct link to Runtime Thresholds" title="Direct link to Runtime Thresholds" translate="no">​</a></h2>
<p>We're excited to announce that this feature has finally arrived for NBomber fans. Assertions and thresholds have been supported from day one. Typically, thresholds with assertions are applied after the active load test has finished, once all the available statistics have been provided. Here’s an example:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"http-scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenario</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// the test is finished, and we can now retrieve the final stats </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// to check against our thresholds.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scnStats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"http-scenario"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Assert</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">True</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scnStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Percent </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain">  </span><br></span></code></pre></div></div>
<p>However, there may be cases where you want to define thresholds that are active throughout the entire test run — we refer to these as <strong>Runtime Thresholds</strong>. Here is an example:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"http_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithThresholds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Threshold</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenarioStats </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> scenarioStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Percent </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Threshold</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step_1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stepStats </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> stepStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Percent </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>Runtime Thresholds</strong>, applied to real-time stats, help prevent the test from continuing execution if specific failure criteria are already met. Additionally, the results of these threshold checks are included in the HTML report, making them highly useful for performance analysis.</p><ul>
<li class="">Runtime Thresholds perform checks periodically, by default every 5 seconds.</li>
<li class="">The results of thresholds checks are included in the HTML report.</li>
<li class="">Runtime Thresholds can be defined in JSON Config.</li>
</ul></div></div>
<p>The key feature of Runtime Thresholds is that they can be defined in the JSON Config. Generally, Runtime Thresholds offer flexibility in terms of configuration: you can set them to run without causing early termination of the test or delay the start of the threshold check.</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token property" style="color:#36acaa">"ThresholdSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"OkRequest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"RPS &gt;= 80"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"FailRequest"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Percent &lt; 10"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"OkLatency"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"max &lt; 100"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"StatusCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"500"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Percent &lt; 5"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"StatusCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"400"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Percent &lt; 10"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"AbortWhenErrorCount"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"StatusCode"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"200"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Percent &gt;= 90"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"StartCheckAfter"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"00:00:20"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre></div></div>
<p>After completing a test that includes Runtime Thresholds, the results of the threshold checks will be available in the HTML report. This allows you to easily review and analyze how the system performed against the defined thresholds throughout the test run.</p>
<center><img src="https://nbomber.com/assets/images/runtime_thresholds-38e166790219b73da187979c5ba35811.jpg"></center>
<p><em>For more information, please refer to our <a href="https://nbomber.com/docs/nbomber/asserts_and_thresholds" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getfindexist-extensions-for-stats-data">Get/Find/Exist extensions for Stats data<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#getfindexist-extensions-for-stats-data" class="hash-link" aria-label="Direct link to Get/Find/Exist extensions for Stats data" title="Direct link to Get/Find/Exist extensions for Stats data" translate="no">​</a></h2>
<p>The Stats Extensions include the useful helper methods: <code>Get, Find, Exists</code>, which are used to work with <code>ScenarioStats, StepStats, StatusCodes</code>, and other similar data.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenario1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> scenario2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// gets scenario stats: </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// it throws exception if "scenario_1" is not found </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scnStats1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"scenario_1"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// finds scenario stats: </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// it returns null if "scenario_2" is not found </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scnStats2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Find</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"scenario_2"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// check that step "login" exist in the list</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">bool</span><span class="token plain"> isLoginExist </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scnStats1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StepStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Exists</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"login"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// gets "login" step stats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// it throws exception if "login" is not found </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> loginStats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scnStats1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StepStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"login"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// check that status code "503" exist in the list</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">bool</span><span class="token plain"> isExist </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scnStats1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StatusCodes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Exists</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"503"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// get stats of status code "503"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// in case of status not found, the exception will be thrown</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> statusCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scnStats1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StatusCodes</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"503"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report-improvements">HTML report improvements<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#html-report-improvements" class="hash-link" aria-label="Direct link to HTML report improvements" title="Direct link to HTML report improvements" translate="no">​</a></h2>
<p>We’ve improved the HTML report by updating the logic behind the latency indicators panel. Previously, this panel displayed cumulative results across all scenarios. Based on user feedback, we adjusted it to show data specific to the selected items. For instance, if you select a specific step to analyze, the panel will re-render to display data filtered specifically for that step or scenario.</p>
<p>Example: Scenario latency indicators panel.</p>
<center><img src="https://nbomber.com/assets/images/latency-indicators-scenario-cd00feb256bedbec8f2d252122c9cb7a.jpg" width="80%" height="80%"></center>
<p>Example: Step latency indicators panel.</p>
<center><img src="https://nbomber.com/assets/images/latency-indicators-step-48a26bebaadc1b12810757d3f5f79677.jpg" width="80%" height="80%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="disable-rendering-of-metrics-table-in-console">Disable rendering of Metrics Table in Console<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#disable-rendering-of-metrics-table-in-console" class="hash-link" aria-label="Direct link to Disable rendering of Metrics Table in Console" title="Direct link to Disable rendering of Metrics Table in Console" translate="no">​</a></h2>
<p>In certain cases, some of you may have noticed that using the console's stdout for debugging can be tricky, as the NBomber Metrics Table may overwrite your printouts. If you want to use the console for debugging purposes, you can now disable the rendering of the Metrics Table in the console.</p>
<p>In code:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenario</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">DisplayConsoleMetrics</span><span class="token punctuation" style="color:#393A34">(</span><span class="token boolean" style="color:#36acaa">false</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Also, via CLI args:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">dotnet MyLoadTest.dll --display-console-metrics</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">false</span><br></span></code></pre></div></div>
<p>Also, via JSON Config:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"GlobalSettings"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"DisplayConsoleMetrics"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">false</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="loadconfig-improvements">LoadConfig improvements<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#loadconfig-improvements" class="hash-link" aria-label="Direct link to LoadConfig improvements" title="Direct link to LoadConfig improvements" translate="no">​</a></h2>
<p>We have a method that loads JSON configuration. Previously, this method only supported loading data from a file or URL. We've extended it to allow loading JSON content as a string.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenario</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">LoadConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{ YOUR JSON }"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-next">What is next<a href="https://nbomber.com/blog/2024/10/28/nbomber-v5.8.0#what-is-next" class="hash-link" aria-label="Direct link to What is next" title="Direct link to What is next" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v5.8.0" target="_blank" rel="noopener noreferrer" class="">Release Notes for v5.8</a>.</li>
<li class="">Please follow our <a href="https://nbomber.com/docs/getting-started/roadmap" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> page for the upcoming release.</li>
</ul>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber v5.7.0 - Timescale, WebBrowser]]></title>
            <link>https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0</link>
            <guid>https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0</guid>
            <pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In the new release, we focused on TimescaleDB support and web browser testing capabilities. Some of our customers use PostgreSQL to store various data, so adding PostgreSQL support through the Timescale extension was a logical step for us. Additionally, we are developing NBomber.Cloud and use Timescale to store and query our metrics.]]></description>
            <content:encoded><![CDATA[<p>In the <a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v5.7.0" target="_blank" rel="noopener noreferrer" class="">new release</a>, we focused on TimescaleDB support and web browser testing capabilities. Some of our customers use PostgreSQL to store various data, so adding PostgreSQL support through the Timescale extension was a logical step for us. Additionally, we are developing NBomber.Cloud and use Timescale to store and query our metrics.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="timescaledb-support">TimescaleDB support<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#timescaledb-support" class="hash-link" aria-label="Direct link to TimescaleDB support" title="Direct link to TimescaleDB support" translate="no">​</a></h2>
<p><a href="https://www.timescale.com/" target="_blank" rel="noopener noreferrer" class="">TimescaleDB</a> is an open-source database designed to make SQL scalable for time-series data. It is engineered up from PostgreSQL and packaged as a PostgreSQL extension, providing automatic partitioning across time and space (partitioning key), as well as full SQL support. Using Reporting Sinks for TimescaleDB, you can store NBomber metrics into TimescaleDB and analyze your performance results with NBomber.MetricsUI (<em>in development</em>) or Grafana.</p>
<p>Example:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> timescaleDbSink </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">TimescaleDbSink</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenario</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithReportingInterval</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithReportingSinks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timescaleDbSink</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">LoadInfraConfig</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"infra-config.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">infra-config.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"TimescaleDbSink"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"ConnectionString"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Host=localhost;Port=5432;Database=metricsdb;Username=timescaledb;Password=timescaledb;Pooling=true;Maximum Pool Size=300;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>During the load test run, NBomber's metrics will appear in TimescaleDB, and you can query them.</p>
<center><img src="https://nbomber.com/assets/images/timescale-data-5c68ca0167007c9478bc7c9e66ed8d2f.jpg" width="100%" height="100%"></center>
<p><em>For more information, please refer to our <a href="https://nbomber.com/docs/reporting/realtime/timescale" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webbrowser-testing">WebBrowser testing<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#webbrowser-testing" class="hash-link" aria-label="Direct link to WebBrowser testing" title="Direct link to WebBrowser testing" translate="no">​</a></h2>
<p>The primary use case for the browser testing is to test performance at the browser level. Browser-level testing allows you to measure user experience and identify issues that are challenging to detect at the protocol level. You can interact with the browser to script tests much closer to the actual website experience. You'll get insight into what your user sees on a browser level and catch issues skipped from the protocol level. At the same time, you can adopt a hybrid approach to performance testing by leveraging the existing functionalities of NBomber and performing backend load testing on a protocol level, all in the same scenario. This gives you a full picture of how the user experience is under different load scenarios.</p>
<p><a href="https://nbomber.com/docs/protocols/webbrowser" target="_blank" rel="noopener noreferrer" class="">NBomber.WebBrowser</a> package adds a few useful extensions to the Playwright and Puppeteer libraries. <a href="https://playwright.dev/dotnet/docs/input" target="_blank" rel="noopener noreferrer" class="">Playwright</a> is a library which provides a high-level API to control Chrome or Firefox. Playwright was created specifically to accommodate the needs of end-to-end testing. Playwright supports all modern rendering engines including Chromium, WebKit, and Firefox. Test on Windows, Linux, and macOS, locally or on CI, headless or headed with native mobile emulation.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// downloading the Chrome</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> installedBrowser </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">BrowserFetcher</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SupportedBrowser</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Chrome</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">DownloadAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BrowserTag</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Stable</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> browserPath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> installedBrowser</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetExecutablePath</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> playwright </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Playwright</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CreateAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">using</span><span class="token plain"> </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> browser </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> playwright</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Chromium</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">LaunchAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token constructor-invocation class-name">BrowserTypeLaunchOptions</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Headless </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">true</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ExecutablePath </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> browserPath</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> scenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"playwright_scenario"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> page </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> browser</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">NewPageAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"open nbomber"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> pageResponse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GotoAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://nbomber.com/"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> html </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ContentAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> totalSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDataTransferSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token named-parameter punctuation" style="color:#393A34">sizeBytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> totalSize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"open bing"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> context</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> pageResponse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GotoAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"https://www.bing.com/maps"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WaitForSelectorAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">".searchbox input"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FocusAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">".searchbox input"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Keyboard</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">TypeAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"CN Tower, Toronto, Ontario, Canada"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Keyboard</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">PressAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Enter"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WaitForLoadStateAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">LoadState</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Load</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> totalSize </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetDataTransferSize</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token named-parameter punctuation" style="color:#393A34">sizeBytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> totalSize</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> page</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">CloseAsync</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithWarmUpDuration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithLoadSimulations</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Simulation</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">KeepConstant</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeSpan</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">FromSeconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">30</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><em>For more information, please refer to our <a href="https://nbomber.com/docs/protocols/webbrowser" target="_blank" rel="noopener noreferrer" class="">documentation</a>.</em></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nbomber-improvements">NBomber improvements<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#nbomber-improvements" class="hash-link" aria-label="Direct link to NBomber improvements" title="Direct link to NBomber improvements" translate="no">​</a></h2>
<p>In <a href="https://github.com/PragmaticFlow/NBomber/releases/tag/v5.7.0" target="_blank" rel="noopener noreferrer" class="">this release</a>, we added a list of imrovements.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sessionid-override">SessionId override<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#sessionid-override" class="hash-link" aria-label="Direct link to SessionId override" title="Direct link to SessionId override" translate="no">​</a></h3>
<p>For specific scenarios, it can be helpful to control the session-id fully. Now you can pass your custom session-id via F#/C# API or <a href="https://nbomber.com/docs/nbomber/cli" target="_blank" rel="noopener noreferrer" class="">CLI args</a>.</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token range operator" style="color:#393A34">..</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithSessionId</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"my-session-123"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">             </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>CLI args:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">--session-id=my-session-123</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manipulate-data-for-reports">Manipulate data for reports<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#manipulate-data-for-reports" class="hash-link" aria-label="Direct link to Manipulate data for reports" title="Direct link to Manipulate data for reports" translate="no">​</a></h3>
<p>Another feature that we added is the ability to manipulate data for reports. There could be cases when you need to filter out some of the metrics data from your report. One example can be a "pause step" or "hidden step" that you can create and use but don't want to see in final reports. For this, you can use a new method:</p>
<p>Example:</p>
<div class="language-csharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">RegisterScenarios</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">scenario</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">WithReportFinalizer</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">data </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name keyword" style="color:#00009f">var</span><span class="token plain"> stepsStats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetScenarioStats</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"mongo-read-write"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StepStats</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Where</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StepName </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"pause"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ToArray</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">GetScenarioStats</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"mongo-read-write"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StepStats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stepsStats</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Run</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cluster-info-for-html-report">Cluster info for HTML report<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#cluster-info-for-html-report" class="hash-link" aria-label="Direct link to Cluster info for HTML report" title="Direct link to Cluster info for HTML report" translate="no">​</a></h3>
<p>Also, we extended our HTML report by adding NBomberConfig and Cluster Info with a list of agents who participated in the cluster.</p>
<center><img src="https://nbomber.com/assets/images/cluster-info-189769c413d177a068b33137fa89b02d.jpg" width="100%" height="100%"></center>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-next">What is next<a href="https://nbomber.com/blog/2024/07/08/nbomber-v5.7.0#what-is-next" class="hash-link" aria-label="Direct link to What is next" title="Direct link to What is next" translate="no">​</a></h2>
<p>Please follow our <a href="https://nbomber.com/docs/getting-started/roadmap" target="_blank" rel="noopener noreferrer" class="">Roadmap</a> page for the upcoming release.</p>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[Load Testing HTTP API on C# with NBomber]]></title>
            <link>https://nbomber.com/blog/2023/08/16/load-testing-http-api</link>
            <guid>https://nbomber.com/blog/2023/08/16/load-testing-http-api</guid>
            <pubDate>Wed, 16 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[This article will demonstrate how to load test HTTP API using C# and the NBomber framework.]]></description>
            <content:encoded><![CDATA[<center><img src="https://nbomber.com/assets/images/bookstore-b327323fc229c14be5c67766fb7d7b72.jpg" width="80%" height="80%"></center>
<p>This article will demonstrate how to load test HTTP API using C# and the NBomber framework.</p>
<p><em>To read the full article please follow <a href="https://medium.com/@kostash23lena/load-testing-http-api-on-c-with-nbomber-96939511bdab" target="_blank" rel="noopener noreferrer" class="">this link</a>.</em></p>]]></content:encoded>
            <category>http</category>
            <category>web-api</category>
        </item>
        <item>
            <title><![CDATA[Deploying NBomber Cluster on Kubernetes]]></title>
            <link>https://nbomber.com/blog/2023/03/31/deploy-nbomber-cluster-on-k8s</link>
            <guid>https://nbomber.com/blog/2023/03/31/deploy-nbomber-cluster-on-k8s</guid>
            <pubDate>Fri, 31 Mar 2023 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<iframe width="100%" height="400" src="https://www.youtube.com/embed/3-Llhl8_Onc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"></iframe>]]></content:encoded>
            <category>k8s</category>
        </item>
        <item>
            <title><![CDATA[NBomber v4.1.2]]></title>
            <link>https://nbomber.com/blog/2023/03/31/nbomber-v4.1.2</link>
            <guid>https://nbomber.com/blog/2023/03/31/nbomber-v4.1.2</guid>
            <pubDate>Fri, 31 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[NBomber]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nbomber">NBomber<a href="https://nbomber.com/blog/2023/03/31/nbomber-v4.1.2#nbomber" class="hash-link" aria-label="Direct link to NBomber" title="Direct link to NBomber" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/549" target="_blank" rel="noopener noreferrer" class="">Scheduler timer calibration</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/552" target="_blank" rel="noopener noreferrer" class="">Fixed stopping process for scenarios</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/commit/ee7277710e86cd38322365ac64fd63545b26904d" target="_blank" rel="noopener noreferrer" class="">Add API method NBomberRunner.EnableStopTestForcibly</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/554" target="_blank" rel="noopener noreferrer" class="">Fixed. Incorrect handling of stop scenarios earlier blocks the console</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/562" target="_blank" rel="noopener noreferrer" class="">Fixed. Under the high load the console timer is desynchronize</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/563" target="_blank" rel="noopener noreferrer" class="">Added Log.CloseAndFlush</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/565" target="_blank" rel="noopener noreferrer" class="">Refactored functionality to stop Scenario actors</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/571" target="_blank" rel="noopener noreferrer" class="">Refactored measuring time to use time buckets</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/commit/46ce6d70406746abd1b59cbeaa59be455491d670" target="_blank" rel="noopener noreferrer" class="">Changed the default ReportingInterval to 5 sec</a></li>
<li class=""><a href="https://github.com/PragmaticFlow/NBomber/pull/566" target="_blank" rel="noopener noreferrer" class="">Adapted NBomber for int64 changes in NBomber.Contracts</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nbombercluster">NBomber.Cluster<a href="https://nbomber.com/blog/2023/03/31/nbomber-v4.1.2#nbombercluster" class="hash-link" aria-label="Direct link to NBomber.Cluster" title="Direct link to NBomber.Cluster" translate="no">​</a></h2>
<ul>
<li class="">[Fixed] Added auto reconnection for NATS clients on initialization phase</li>
<li class="">[Fixed] Coordinator should wait forever when MinAgentsCount is specified but not satisfied</li>
<li class="">[Fixed] Coordiantor fails in case when only EmptyScenario defined in TargetScenarios</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-contributors">New Contributors<a href="https://nbomber.com/blog/2023/03/31/nbomber-v4.1.2#new-contributors" class="hash-link" aria-label="Direct link to New Contributors" title="Direct link to New Contributors" translate="no">​</a></h2>
<ul>
<li class="">@candritzky made their first contribution in <a href="https://github.com/PragmaticFlow/NBomber/pull/566" target="_blank" rel="noopener noreferrer" class="">https://github.com/PragmaticFlow/NBomber/pull/566</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/PragmaticFlow/NBomber/compare/v4.1.0...v4.1.2" target="_blank" rel="noopener noreferrer" class="">https://github.com/PragmaticFlow/NBomber/compare/v4.1.0...v4.1.2</a></p>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
        <item>
            <title><![CDATA[NBomber 2.0]]></title>
            <link>https://nbomber.com/blog/2021/04/14/nbomber-2-0</link>
            <guid>https://nbomber.com/blog/2021/04/14/nbomber-2-0</guid>
            <pubDate>Wed, 14 Apr 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Hey folks, we were busy for nearly half a year working on a new big release of NBomber. I am so happy to announce that we finally completed it!]]></description>
            <content:encoded><![CDATA[<p>Hey folks, we were busy for nearly half a year working on a new big release of NBomber. I am so happy to announce that we finally completed it!</p>
<p>In this release, we focused on improving engine performance, fixing RAM consumption issues, improving UI/UX, including reporting, extending API to provide flexibility but keep it SIMPLE as before.</p>
<center><img src="https://nbomber.com/assets/images/nbomber_v2_twitter-c7808d2cfdfa0149fc0f92bf78d7f419.png" width="70%" height="70%"></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="console">Console<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#console" class="hash-link" aria-label="Direct link to Console" title="Direct link to Console" translate="no">​</a></h3>
<p>In the previous version, we always had a desire to improve the console output. The main pain point for us was the progress bar, which did not scale well while resizing the console, and sometimes it literally broke down when you are writing log messages to the console. The second most important problem for us was the table rendering, which was also displayed crookedly while resizing windows, and we wanted to fix this. We started considering <a href="https://github.com/spectreconsole/spectre.console" target="_blank" rel="noopener noreferrer" class="">Spectre.Console</a> project for a long time as a good candidate for replacement and then we started a smooth transition. It was good with tables, but we still had some problems with the progress bar. Since for logs, we use <a href="https://serilog.net/" target="_blank" rel="noopener noreferrer" class="">Serilog</a>, we figure out that we need to develop a proper integration between Serilog and Spectre.Console to fix our issue. After all, we developed <a href="https://github.com/PragmaticFlow/Serilog.Sinks.SpectreConsole" target="_blank" rel="noopener noreferrer" class="">Serilog.Sinks.SpectreConsole</a> that nicely integrates Serilog with Spectre.Console. It's open-source, and you can use it for your integrations too. Now our console UI is much more stable, and I hope more beautiful :)</p>
<center><img src="https://nbomber.com/assets/images/nbomber_v2_console-6a596abc247223cefefa397c62e620f4.gif" width="90%" height="90%"></center>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="html-report">HTML report<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#html-report" class="hash-link" aria-label="Direct link to HTML report" title="Direct link to HTML report" translate="no">​</a></h3>
<p>We use <a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer" class="">Vue.js</a>, which amazed us with its simplicity and minimalism for rendering HTML. Compared to the previous version, we have significantly expanded the functionality by adding: fail stats, status codes, hints analyzer results. You can take a look at the new HTML report <a href="https://nbomber.com/img/blog/nbomber-v2/nbomber_v2_report.html" target="_blank">here</a> Also, we switched to <a href="https://developers-dot-devsite-v2-prod.appspot.com/chart/interactive/docs/gallery" target="_blank" rel="noopener noreferrer" class="">Google Charts</a> for rendering charts since it's free and under Apache 2.0 license.</p>
<h1>Runtime Improvements</h1>
<p>In this section, we will discuss some internals of NBomber that improve the performance and stability of the system.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="stats-collecting">Stats collecting<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#stats-collecting" class="hash-link" aria-label="Direct link to Stats collecting" title="Direct link to Stats collecting" translate="no">​</a></h3>
<p>We refactored our stats collecting module to use the actor model via F# <a href="https://fsharpforfunandprofit.com/posts/concurrency-actor-model/" target="_blank" rel="noopener noreferrer" class="">MailboxProcessor</a> and to have one StatsScenarioActor per scenario. Also, we send metrics by batches to eliminate the overload of one actor by many concurrent ScenarioActors that execute steps and send metrics.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="minimizing-ram-usage">Minimizing RAM usage<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#minimizing-ram-usage" class="hash-link" aria-label="Direct link to Minimizing RAM usage" title="Direct link to Minimizing RAM usage" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="compression-of-stats-results">Compression of stats results<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#compression-of-stats-results" class="hash-link" aria-label="Direct link to Compression of stats results" title="Direct link to Compression of stats results" translate="no">​</a></h4>
<p>We refactored our statistics module to fix the issue with memory growing footprint for long-running tests. Now you can run tests that will work for years and have a stable (usually small) memory footprint. This is achieved essentially due to one important optimization: all results are located in memory but decomposed into buckets with the same or very similar results. Each such bucket has its own counter, which is monotonically growing. Due to this optimization, we got quite effective compression. Aside from this, such optimizations are often used in time-series databases where many metrics of the same value or very similar can arrive at one point in time.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="default-step-timeout">Default step timeout<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#default-step-timeout" class="hash-link" aria-label="Direct link to Default step timeout" title="Direct link to Default step timeout" translate="no">​</a></h4>
<p>Another important thing was introducing default timeout for steps. NBomber v1 did not support any timeouts out of the box, and this task shifted to the shoulders of the developers. For example, the HTTP plugin added its own timeout, which was quite sane. But on the other hand, everyone needs such a basic thing as a timeout, and forcing everyone to implement it is not a good idea. Also, newbies often weren't aware of this, and afterward, it led to the thread pool starvation problem. It especially was visible when testing very slow API using a big request rate, say 2-4K requests per sec from 1 node. It leads to many tasks (.NET Task) was activated, consumed RAM, and never finished but growing. In the new version, each step by default contains a timeout of 1 second and can be changed by the user.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="removed-uneccesary-memory-allocations">Removed uneccesary memory allocations<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#removed-uneccesary-memory-allocations" class="hash-link" aria-label="Direct link to Removed uneccesary memory allocations" title="Direct link to Removed uneccesary memory allocations" translate="no">​</a></h4>
<p>We refactored a few places where we did extra memory allocations on every step invocation. For example, StepContext was previously created on every invocation.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="task-computation-expression">Task computation expression<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#task-computation-expression" class="hash-link" aria-label="Direct link to Task computation expression" title="Direct link to Task computation expression" translate="no">​</a></h4>
<p>Internally, we use <a href="https://github.com/demystifyfp/FsToolkit.ErrorHandling" target="_blank" rel="noopener noreferrer" class="">FsToolkit.ErrorHandling</a> library that provides handy F# computation expressions and corresponding extensions. With the latest updates to this library for work with Task, we have automatically switched to using <a href="https://github.com/crowded/ply" target="_blank" rel="noopener noreferrer" class="">Ply</a> library, which provides a low overhead Task computation expression.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="low-level-optimizations">Low-level optimizations<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#low-level-optimizations" class="hash-link" aria-label="Direct link to Low-level optimizations" title="Direct link to Low-level optimizations" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gc-tuning">GC tuning<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#gc-tuning" class="hash-link" aria-label="Direct link to GC tuning" title="Direct link to GC tuning" translate="no">​</a></h4>
<p>Also, we tuned GC a bit. At runtime, we set:</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">GCSettings</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LatencyMode </span><span class="token operator" style="color:#393A34">&lt;-</span><span class="token plain"> GCLatencyMode</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SustainedLowLatency</span><br></span></code></pre></div></div>
<p>And also, for the project settings, we apply:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ServerGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ServerGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">ConcurrentGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">true</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">ConcurrentGarbageCollection</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h1>New Statistics</h1>
<p>One of the major changes we had been working on is the statistics module. Initially, we didn't really want to change it, but using NBomber v1 in production, we often ran into bottlenecks or questions regarding providing advanced statistics.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ok-and-fail-stats">Ok and Fail stats<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#ok-and-fail-stats" class="hash-link" aria-label="Direct link to Ok and Fail stats" title="Direct link to Ok and Fail stats" translate="no">​</a></h3>
<p>An important addition to the previous statistics was that we started tracking the fail stats with the full scope, including data transfer for fails, latency, and percentiles.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">OkStepStats</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RequestStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Latency</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">LatencyStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    DataTransfer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">DataTransferStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StatusCodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">StatusCodeStats</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">FailStepStats</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Request</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">RequestStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Latency</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">LatencyStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    DataTransfer</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">DataTransferStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StatusCodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">StatusCodeStats</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">StepStats</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StepName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Ok</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">OkStepStats</span><span class="token plain"></span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">    Fail</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">FailStepStats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Now you can write your assertions for fails stats too. Also, you will see them in reporting, including real-time reporting too.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// here is an example of assertion</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> step1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> scenarioStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StepStats</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ok stats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Count </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Latency</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MinMs </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">503.0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Latency</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Percent50 </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">505.0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DataTransfer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MinBytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// fail stats</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Request</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Latency</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MinMs </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Fail</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DataTransfer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MinBytes </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="unit-of-measure">Unit of measure<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#unit-of-measure" class="hash-link" aria-label="Direct link to Unit of measure" title="Direct link to Unit of measure" translate="no">​</a></h3>
<p>In the new version, we changed basic data types to represent latency and data transfer.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="latency">Latency<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#latency" class="hash-link" aria-label="Direct link to Latency" title="Direct link to Latency" translate="no">​</a></h4>
<p>We started using float instead of integer to expand the range of possible results for latency, for example: [0.2 ms, 1.5 ms, 9.3 ms]. We were pushed to this by the case of testing a high-speed in-memory database that had a latency of less than 1 ms, and in our reports, we saw it as 0 ms instead of 0.1 - 0.5 ms. Just for the record, most load test tools represent latency as integer, meaning using them, you cannot cover such cases since your results will be 0 ms.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">LatencyStats</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MinMs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MeanMs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MaxMs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent50</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent75</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent95</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent99</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StdDev</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    LatencyCount</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">LatencyCount</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="data-transfer">Data transfer<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#data-transfer" class="hash-link" aria-label="Direct link to Data transfer" title="Direct link to Data transfer" translate="no">​</a></h4>
<p>We switched to using Byte instead of KB to keep parity with standard tools for data transfer stats.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">DataTransferStats</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MinBytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MeanBytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    MaxBytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent50</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent75</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent95</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Percent99</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StdDev</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">float</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    AllBytes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int64</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>In addition, we provide helper functions for converting Byte to KB and MB. This can be useful when you want to assert on KB or MB.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ kb </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DataTransfer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MinBytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50.0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">test </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">@ mb </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">step1</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ok</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DataTransfer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">MinBytes</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50.0</span><span class="token plain"> @</span><span class="token operator" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hint-analyzer">Hint Analyzer<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#hint-analyzer" class="hash-link" aria-label="Direct link to Hint Analyzer" title="Direct link to Hint Analyzer" translate="no">​</a></h2>
<p>In this release, we have integrated a new HintAnalyzer feature that allows to analise the results of statistics and, based on this, displays hints. HintAnalyzer may refer not only to the statistics data but also to the use of certain plugins. Any NBomber plugin can add new analyzers. For example, PingPlugin pings the target host before starting any test, and after that, it analyzes received results and prints hints.</p>
<blockquote>
<p>plugin stats: <code>NBomber.Plugins.Network.PingPlugin</code></p>
</blockquote>
<table><thead><tr><th>Host</th><th>Status</th><th>Address</th><th>Round Trip Time</th><th>Time to Live</th><th>Don't Fragment</th><th>Buffer Size</th></tr></thead><tbody><tr><td>nbomber.com</td><td>Success</td><td>104.248.140.128</td><td>58 ms</td><td>128</td><td>False</td><td>32 bytes</td></tr></tbody></table>
<p>Here's a hint by PingPlugin.</p>
<table><thead><tr><th>source</th><th>name</th><th>hint</th></tr></thead><tbody><tr><td>WorkerPlugin</td><td>NBomber.Plugins.Network.PingPlugin</td><td>Physical latency to host: 'nbomber.com' is bigger than 2ms which is not appropriate for load testing. You should run your test in an environment with very small latency.</td></tr></tbody></table>
<p>Also, HintAnalyzer can suggest some other hints related to the usage of NBomber.</p>
<table><thead><tr><th>source</th><th>name</th><th>hint</th></tr></thead><tbody><tr><td>Scenario</td><td>simple_http</td><td>Step 'fetch_html_page' in scenario 'simple_http' didn't track data transfer. In order to track data transfer, you should use Response.Ok(sizeInBytes: value)</td></tr></tbody></table>
<p>You can disable HintAnalyzer if you want</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"simple_http"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">registerScenario</span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">disableHintsAnalyzer</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="new-api">New API<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#new-api" class="hash-link" aria-label="Direct link to New API" title="Direct link to New API" translate="no">​</a></h2>
<p>In the new version, we have added a couple of additions that improve the convenience of writing test scripts without adding new abstractions to NBomber itself. We are very scrupulous about adding any new features to NBomber as they can introduce additional abstractions and hence additional complexity. Our initial goal was to build an easy-to-use framework with as few abstractions as possible. Therefore, any new feature that we consider should be easy to understand and harmoniously fit into NBomber.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="status-code">Status code<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#status-code" class="hash-link" aria-label="Direct link to Status code" title="Direct link to Status code" translate="no">​</a></h3>
<p>We have added the ability to specify any status codes you want or your protocol, or your API service returns.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">statusCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Also, we provide statistics on status codes.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token class-name">StatusCodeStats</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    StatusCode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Message</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">string</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Count</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-invocation-count">Step invocation count<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#step-invocation-count" class="hash-link" aria-label="Direct link to Step invocation count" title="Direct link to Step invocation count" translate="no">​</a></h3>
<p>For certain tests, it may be necessary to understand the current step invocation count. For example, you want to change the behavior of your step execution when the step's invocation counter is reached 100 invocations. For such cases, you need to start a counter and manually increment it. NBomber now supports this out of the box.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> step </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token computation-expression keyword" style="color:#00009f">task</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// invocation count of the current step </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// (will be incremented on each invocation)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">InvocationCount </span><span class="token comment" style="color:#999988;font-style:italic">// int</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-timeout">Step timeout<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#step-timeout" class="hash-link" aria-label="Direct link to Step timeout" title="Direct link to Step timeout" translate="no">​</a></h3>
<p>In the new version, each step by default contains a timeout of 1 second and can be changed by the user.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> step </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><br></span><span class="token-line theme-code-block-highlighted-line" style="color:#393A34"><span class="token plain">                       timeout </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> seconds </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       execute </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token computation-expression keyword" style="color:#00009f">task</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dynamic-step-order">Dynamic step order<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#dynamic-step-order" class="hash-link" aria-label="Direct link to Dynamic step order" title="Direct link to Dynamic step order" translate="no">​</a></h3>
<p>We decided to provide the ability to change the order of the steps at runtime dynamically. Also, it allows changing the number of steps per scenario iteration. This feature opens up a new horizon of possibilities for writing load tests. We came up with this idea from a real case when we tested the database, and we needed to introduce a certain randomity into our tests. For a better understanding, I suggest looking at an example:</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// by default these steps will run sequentially</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"test_redis"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">step1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> step2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// in this case, only step2 will be invoked</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withDyncamicStepOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// in this case, we reversed the order of steps</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withDyncamicStepOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// in this case, we introduce randomity</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withDyncamicStepOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Next</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> index2 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> random</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">Next</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> index1</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> index2 </span><span class="token operator" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span></code></pre></div></div>
<p>Basically, with this feature, you can introduce convenient load distribution. For example, you can define a scenario where you will test Redis database with the following request distribution: 30% for write requests and 70% for read requests.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"test_redis"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">write_redis</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> read_redis</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withDyncamicStepOrder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// using a randomator you can specify:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//  - 30% will be write_redis</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">//  - 70% will be read_redis</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-info">Scenario info<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#scenario-info" class="hash-link" aria-label="Direct link to Scenario info" title="Direct link to Scenario info" translate="no">​</a></h3>
<p>It's a context property that contains info about the current Scenario. The main use case is to use ScenarioInfo.ThreadId as correlation id for your requests. Another one is to use ScenarioInfo.ThreadNumber for partition your requests. For example, you have a database, and you want to split all your requests into 4 partitions.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> step </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"step"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token computation-expression keyword" style="color:#00009f">task</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// gets the current scenario thread id</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// you can use it as correlation id</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioInfo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ThreadId</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioInfo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ThreadNumber</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioInfo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioName</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    context</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioInfo</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ScenarioDuration</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="timespan-extensions">TimeSpan extensions<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#timespan-extensions" class="hash-link" aria-label="Direct link to TimeSpan extensions" title="Direct link to TimeSpan extensions" translate="no">​</a></h3>
<p>We added TimeSpan extensions for F# and C# to have a more expressive API.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">milliseconds </span><span class="token number" style="color:#36acaa">500</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">seconds </span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">minutes </span><span class="token number" style="color:#36acaa">1</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="init-only-scenarios">Init-only scenarios<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#init-only-scenarios" class="hash-link" aria-label="Direct link to Init-only scenarios" title="Direct link to Init-only scenarios" translate="no">​</a></h3>
<p>NBomber had the ability to provide Scenario initialization via <em>Scenario.init</em> in the very first version. It had a mandatory restriction to create a Scenario you should provide at least one Step.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// you should provide at least one step</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"write_scenario"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">write_step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init populateKafka</span><br></span></code></pre></div></div>
<p>This was convenient until the moment when several scenarios had a dependency on the same initialization. In this case, only one initializer should be executed, and it's getting tricky since NBomber v1 didn't provide any functionality for this.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// both scenarios depend on populateKafka</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"write_scenario"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">write_step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init populateKafka</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"read_scenario"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">read_step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init populateKafka</span><br></span></code></pre></div></div>
<p>In NBomber v2, we can define Scenario without steps and have only the init or clean function.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> initScenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"init_scenario"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// no steps</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init populateKafka</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">clean cleanKafka</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> writeScenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"write_scenario"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">write_step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> readScenario </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"read_scenario"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">read_step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// now all scenarios will be executed</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">registerScenarios </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">initScenario</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> writeScenario</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> readScenario</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// now you can simply chnage scenarios</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">registerScenarios </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">initScenario</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> writeScenario</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// or</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">registerScenarios </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">initScenario</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> readScenario</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> NBomberRunner</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="loadsimulation-inject-random">LoadSimulation inject random<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#loadsimulation-inject-random" class="hash-link" aria-label="Direct link to LoadSimulation inject random" title="Direct link to LoadSimulation inject random" translate="no">​</a></h3>
<p>Injects a random number of scenario copies (threads) per 1 sec during a given duration. Use it when you want to maintain a random rate of requests without being affected by the target system's performance under test.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">create </span><span class="token string" style="color:#e3116c">"scenario_2"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">read_step</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Scenario</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">withLoadSimulation </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">InjectPerSecRandom</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">minRate </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> maxRate </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> during </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> seconds </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="logs">Logs<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#logs" class="hash-link" aria-label="Direct link to Logs" title="Direct link to Logs" translate="no">​</a></h3>
<p>In the new version, we write a log file to the current session folder.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">/{current_session_id}/nbomber-log-{date}.txt</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">/{current_session_id}/reports</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="http-plugin">HTTP plugin<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#http-plugin" class="hash-link" aria-label="Direct link to HTTP plugin" title="Direct link to HTTP plugin" translate="no">​</a></h3>
<p><a href="https://github.com/PragmaticFlow/NBomber.Http" target="_blank" rel="noopener noreferrer" class="">NBomber.Http</a> has been slightly modified to make it easier to be used. In the previous version, this plugin provided an HttpStep wrapper over the standard Step that hid many details and added extra magic. In the new version, we have reworked the approach with DSL plugins to use standard NBomber abstractions instead of creating new ones. Now, the HTTP plugin contains HttpClientFactory and has an HTTP module with functions for building HTTP requests.</p>
<div class="language-fsharp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-fsharp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> httpFactory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> HttpClientFactory</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> step </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Step</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"simple step"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       clientFactory </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> httpFactory</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                       execute </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> context </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">createRequest </span><span class="token string" style="color:#e3116c">"GET"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"https://nbomber.com"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">withHeader </span><span class="token string" style="color:#e3116c">"Accept"</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text/html"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withBody</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">StringContent</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"{ some JSON }"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">withCheck</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">fun</span><span class="token plain"> response </span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token computation-expression keyword" style="color:#00009f">task</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">IsSuccessStatusCode </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> Response</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">fail</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token operator" style="color:#393A34">|&gt;</span><span class="token plain"> Http</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">send context</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="influxdb-plugin">InfluxDb plugin<a href="https://nbomber.com/blog/2021/04/14/nbomber-2-0#influxdb-plugin" class="hash-link" aria-label="Direct link to InfluxDb plugin" title="Direct link to InfluxDb plugin" translate="no">​</a></h3>
<p><a href="https://github.com/PragmaticFlow/NBomber.Sinks.InfluxDB" target="_blank" rel="noopener noreferrer" class="">InfluxDb plugin</a> is supplemented with tracking fail stats and load simulation value. In Grafana, you can render your load simulation timeline and compare it with what your target system can handle.</p>]]></content:encoded>
            <category>nbomber-release</category>
            <category>load-testing</category>
        </item>
    </channel>
</rss>