public void Run(CancellationToken cancellationToken = default) { _capture = new MessageMetricCapture(_settings.MessageCount); _transport.GetBusControl(ConfigureReceiveEndpoint); try { Console.WriteLine("Running Request Response Benchmark"); TaskUtil.Await(RunBenchmark, cancellationToken); Console.WriteLine("Message Count: {0}", _settings.MessageCount); Console.WriteLine("Clients: {0}", _settings.Clients); Console.WriteLine("Durable: {0}", _settings.Durable); Console.WriteLine("Prefetch Count: {0}", _settings.PrefetchCount); Console.WriteLine("Concurrency Limit: {0}", _settings.ConcurrencyLimit); Console.WriteLine("Total consume duration: {0:g}", _consumeDuration); Console.WriteLine("Consume message rate: {0:F2} (msg/s)", _settings.MessageCount * 1000 / _consumeDuration.TotalMilliseconds); Console.WriteLine("Total request duration: {0:g}", _requestDuration); Console.WriteLine("Request rate: {0:F2} (msg/s)", _settings.MessageCount * 1000 / _requestDuration.TotalMilliseconds); Console.WriteLine("Concurrent Consumer Count: {0}", RequestConsumer.MaxConsumerCount); MessageMetric[] messageMetrics = _capture.GetMessageMetrics(); Console.WriteLine("Avg Request Time: {0:F0}ms", messageMetrics.Average(x => x.RequestLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Min Request Time: {0:F0}ms", messageMetrics.Min(x => x.RequestLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Max Request Time: {0:F0}ms", messageMetrics.Max(x => x.RequestLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Med Request Time: {0:F0}ms", messageMetrics.Median(x => x.RequestLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("95t Request Time: {0:F0}ms", messageMetrics.Percentile(x => x.RequestLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Avg Consume Time: {0:F0}ms", messageMetrics.Average(x => x.ConsumeLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Min Consume Time: {0:F0}ms", messageMetrics.Min(x => x.ConsumeLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Max Consume Time: {0:F0}ms", messageMetrics.Max(x => x.ConsumeLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("Med Consume Time: {0:F0}ms", messageMetrics.Median(x => x.ConsumeLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine("95t Consume Time: {0:F0}ms", messageMetrics.Percentile(x => x.ConsumeLatency) * 1000 / Stopwatch.Frequency); Console.WriteLine(); Console.WriteLine("Request duration distribution"); DrawResponseTimeGraph(messageMetrics, x => x.RequestLatency); } finally { _transport.Dispose(); } }