diff --git a/api/client/output.proto b/api/client/output.proto index 258b05956..09c8d9aad 100644 --- a/api/client/output.proto +++ b/api/client/output.proto @@ -14,7 +14,10 @@ message Counter { } message Percentile { - google.protobuf.Duration duration = 1; + oneof duration_type { + google.protobuf.Duration duration = 1; + double raw_value = 4; + } double percentile = 2; uint64 count = 3; } @@ -22,9 +25,23 @@ message Percentile { message Statistic { uint64 count = 1; string id = 2; - google.protobuf.Duration mean = 3; - google.protobuf.Duration pstdev = 4; + oneof mean_type { + google.protobuf.Duration mean = 3; + double raw_mean = 8; + } + oneof pstdev_type { + google.protobuf.Duration pstdev = 4; + double raw_pstdev = 10; + } repeated Percentile percentiles = 5; + oneof min_type { + google.protobuf.Duration min = 6; + uint64 raw_min = 12; + } + oneof max_type { + google.protobuf.Duration max = 7; + uint64 raw_max = 13; + } } message Result { diff --git a/api/client/transform/fortio.proto b/api/client/transform/fortio.proto index 84914979f..8ec8ff106 100644 --- a/api/client/transform/fortio.proto +++ b/api/client/transform/fortio.proto @@ -24,37 +24,66 @@ message FortioResult { // concatenated into this field, using ' ' as a separator. string Labels = 1; + // Start time of the load test execution. google.protobuf.Timestamp StartTime = 2; + // Configured qps uint32 RequestedQPS = 3; + // Configured duration google.protobuf.Duration RequestedDuration = 4; + // Effective qps double ActualQPS = 5; + // Effective duration double ActualDuration = 6; + // The configured number of used connections uint32 NumThreads = 7; + // Latency histogram DurationHistogram DurationHistogram = 8; + // Fortio tracks per-return-code. We group by 2xx,3xx, etc. map RetCodes = 11; + // Effective URI. string URL = 12; + // (Unstructured) version. We serialize a representation of the Nighthawk version into this field. string Version = 13; + // Was jitter used Y/N. bool Jitter = 14; + // Run type. Can be "HTTP", "GRPC", and an empty string has also been observed. + // We only set HTTP for now. string RunType = 15; - // Exactly can be used to stop fortio after a fixed amount of replies. + // Sizes and HeaderSizes seems to mean different things in Fortio depending on if the go stdclient + // or DIY fastclient was used. We populate this field with response body sizes, and HeaderSizes + // with header sizes. Both are tracked in bytes. Note: we don't use full histograms here, but + // rather rely on StreamingStatistic. This means we don't populate percentiles, and only populate + // min/mean/max/etc with respect to DurationHistogram. + DurationHistogram Sizes = 16; + + // See the 'Sizes' field for detals. + DurationHistogram HeaderSizes = 17; + + // Some notes on fields that we do not populate today: + + // "Exactly" can be used to stop fortio after a fixed amount of replies. // We don't seem to need this, and going forward it might be hard/annoying to // translate this field as Nighthawk's concepts diverge a bit. If end up // needing to we can probably inspect the main phase and then figure out if there's a // termination predicate configured for a fixed number of responses observed // via stats. For now, however, skip this field. - // uint64 Exactly = 16; + + // We don't populate SocketCount (sometimes used to track #connections) + + // We don't populate AbortOn (a status code that may abort termination) for reasons + // similar to Exactly. } message DurationHistogram { diff --git a/include/nighthawk/common/statistic.h b/include/nighthawk/common/statistic.h index 6bd230716..85b88e082 100644 --- a/include/nighthawk/common/statistic.h +++ b/include/nighthawk/common/statistic.h @@ -25,18 +25,51 @@ using StatisticPtrMap = std::map; */ class Statistic : Envoy::NonCopyable { public: + enum class SerializationDomain { RAW, DURATION }; + virtual ~Statistic() = default; + /** * Method for adding a sample value. * @param value the value of the sample to add */ virtual void addValue(uint64_t sample_value) PURE; + /** + * @return uint64_t The number of sampled values. + */ virtual uint64_t count() const PURE; + + /** + * @return double Mean derived from the sampled values. + */ virtual double mean() const PURE; + + /** + * @return double Variance derived from the sampled values. + */ virtual double pvariance() const PURE; + + /** + * @return double Standard deviation derived from the sampled values. + */ virtual double pstdev() const PURE; + /** + * @return uint64_t The smallest sampled value. + */ + virtual uint64_t min() const PURE; + + /** + * @return uint64_t The largest sampled value. + */ + virtual uint64_t max() const PURE; + + /** + * @return StatisticPtr Yields a new instance of the same type as the instance this is called on. + */ + virtual StatisticPtr createNewInstanceOfSameType() const PURE; + /** * Only used in tests to match expectations to the right precision level. * @return uint64_t the number of significant digits. 0 is assumed to be max precision. @@ -51,14 +84,15 @@ class Statistic : Envoy::NonCopyable { virtual bool resistsCatastrophicCancellation() const { return false; } /** - * @return std::string a representation of the statistic as a std::string. + * @return std::string Gets a string representation of the statistic as a std::string. */ virtual std::string toString() const PURE; /** + * @param domain Used to indicate if serialization should represent durations or raw values. * @return nighthawk::client::Statistic a representation of the statistic as a protobuf message. */ - virtual nighthawk::client::Statistic toProto() PURE; + virtual nighthawk::client::Statistic toProto(SerializationDomain domain) const PURE; /** * Combines two Statistics into one, and returns a new, merged, Statistic. diff --git a/source/client/benchmark_client_impl.cc b/source/client/benchmark_client_impl.cc index cf9ece7b9..dfdae66db 100644 --- a/source/client/benchmark_client_impl.cc +++ b/source/client/benchmark_client_impl.cc @@ -92,19 +92,24 @@ void Http2PoolImpl::checkForDrained() { BenchmarkClientHttpImpl::BenchmarkClientHttpImpl( Envoy::Api::Api& api, Envoy::Event::Dispatcher& dispatcher, Envoy::Stats::Scope& scope, - StatisticPtr&& connect_statistic, StatisticPtr&& response_statistic, bool use_h2, - Envoy::Upstream::ClusterManagerPtr& cluster_manager, Envoy::Tracing::HttpTracerPtr& http_tracer, - absl::string_view cluster_name, RequestGenerator request_generator, - const bool provide_resource_backpressure) + StatisticPtr&& connect_statistic, StatisticPtr&& response_statistic, + StatisticPtr&& response_header_size_statistic, StatisticPtr&& response_body_size_statistic, + bool use_h2, Envoy::Upstream::ClusterManagerPtr& cluster_manager, + Envoy::Tracing::HttpTracerPtr& http_tracer, absl::string_view cluster_name, + RequestGenerator request_generator, const bool provide_resource_backpressure) : api_(api), dispatcher_(dispatcher), scope_(scope.createScope("benchmark.")), connect_statistic_(std::move(connect_statistic)), - response_statistic_(std::move(response_statistic)), use_h2_(use_h2), + response_statistic_(std::move(response_statistic)), + response_header_size_statistic_(std::move(response_header_size_statistic)), + response_body_size_statistic_(std::move(response_body_size_statistic)), use_h2_(use_h2), benchmark_client_stats_({ALL_BENCHMARK_CLIENT_STATS(POOL_COUNTER(*scope_))}), cluster_manager_(cluster_manager), http_tracer_(http_tracer), cluster_name_(std::string(cluster_name)), request_generator_(std::move(request_generator)), provide_resource_backpressure_(provide_resource_backpressure) { connect_statistic_->setId("benchmark_http_client.queue_to_connect"); response_statistic_->setId("benchmark_http_client.request_to_response"); + response_header_size_statistic_->setId("benchmark_http_client.response_header_size"); + response_body_size_statistic_->setId("benchmark_http_client.response_body_size"); } void BenchmarkClientHttpImpl::terminate() { @@ -119,6 +124,8 @@ StatisticPtrMap BenchmarkClientHttpImpl::statistics() const { StatisticPtrMap statistics; statistics[connect_statistic_->id()] = connect_statistic_.get(); statistics[response_statistic_->id()] = response_statistic_.get(); + statistics[response_header_size_statistic_->id()] = response_header_size_statistic_.get(); + statistics[response_body_size_statistic_->id()] = response_body_size_statistic_.get(); return statistics; }; @@ -157,8 +164,9 @@ bool BenchmarkClientHttpImpl::tryStartRequest(CompletionCallback caller_completi std::string x_request_id = generator_.uuid(); auto stream_decoder = new StreamDecoder( dispatcher_, api_.timeSource(), *this, std::move(caller_completion_callback), - *connect_statistic_, *response_statistic_, request->header(), measureLatencies(), - content_length, x_request_id, http_tracer_); + *connect_statistic_, *response_statistic_, *response_header_size_statistic_, + *response_body_size_statistic_, request->header(), measureLatencies(), content_length, + x_request_id, http_tracer_); requests_initiated_++; pool_ptr->newStream(*stream_decoder, *stream_decoder); return true; diff --git a/source/client/benchmark_client_impl.h b/source/client/benchmark_client_impl.h index 9a00d01d9..863cfd2e6 100644 --- a/source/client/benchmark_client_impl.h +++ b/source/client/benchmark_client_impl.h @@ -116,7 +116,9 @@ class BenchmarkClientHttpImpl : public BenchmarkClient, public: BenchmarkClientHttpImpl(Envoy::Api::Api& api, Envoy::Event::Dispatcher& dispatcher, Envoy::Stats::Scope& scope, StatisticPtr&& connect_statistic, - StatisticPtr&& response_statistic, bool use_h2, + StatisticPtr&& response_statistic, + StatisticPtr&& response_header_size_statistic, + StatisticPtr&& response_body_size_statistic, bool use_h2, Envoy::Upstream::ClusterManagerPtr& cluster_manager, Envoy::Tracing::HttpTracerPtr& http_tracer, absl::string_view cluster_name, RequestGenerator request_generator, @@ -161,6 +163,8 @@ class BenchmarkClientHttpImpl : public BenchmarkClient, // destruction when tls has been involved during usage. StatisticPtr connect_statistic_; StatisticPtr response_statistic_; + StatisticPtr response_header_size_statistic_; + StatisticPtr response_body_size_statistic_; const bool use_h2_; std::chrono::seconds timeout_{5s}; uint32_t connection_limit_{1}; diff --git a/source/client/factories_impl.cc b/source/client/factories_impl.cc index 28bbfdac3..11444d824 100644 --- a/source/client/factories_impl.cc +++ b/source/client/factories_impl.cc @@ -31,8 +31,15 @@ BenchmarkClientPtr BenchmarkClientFactoryImpl::create( Envoy::Upstream::ClusterManagerPtr& cluster_manager, Envoy::Tracing::HttpTracerPtr& http_tracer, absl::string_view cluster_name, RequestSource& request_generator) const { StatisticFactoryImpl statistic_factory(options_); + // While we lack options to configure which statistic backend goes where, we directly pass + // StreamingStatistic for the stats that track response sizes. Ideally we would have options + // for this to route the right stat to the right backend (HdrStatistic, SimpleStatistic, + // NullStatistic). + // TODO(#292): Create options and have the StatisticFactory consider those when instantiating + // statistics. auto benchmark_client = std::make_unique( - api, dispatcher, scope, statistic_factory.create(), statistic_factory.create(), options_.h2(), + api, dispatcher, scope, statistic_factory.create(), statistic_factory.create(), + std::make_unique(), std::make_unique(), options_.h2(), cluster_manager, http_tracer, cluster_name, request_generator.get(), !options_.openLoop()); auto request_options = options_.toCommandLineOptions()->request_options(); benchmark_client->setConnectionLimit(options_.connections()); diff --git a/source/client/output_collector_impl.cc b/source/client/output_collector_impl.cc index f76071c59..2303c164a 100644 --- a/source/client/output_collector_impl.cc +++ b/source/client/output_collector_impl.cc @@ -30,7 +30,14 @@ void OutputCollectorImpl::addResult(absl::string_view name, auto result = output_.add_results(); result->set_name(name.data(), name.size()); for (auto& statistic : statistics) { - *(result->add_statistics()) = statistic->toProto(); + // TODO(#292): Looking at if the statistic id ends with "_size" to determine how it should be + // serialized is kind of hacky. Maybe we should have a lookup table of sorts, to determine how + // statistics should we serialized. Doing so may give us a canonical place to consolidate their + // ids as well too. + Statistic::SerializationDomain serialization_domain = + absl::EndsWith(statistic->id(), "_size") ? Statistic::SerializationDomain::RAW + : Statistic::SerializationDomain::DURATION; + *(result->add_statistics()) = statistic->toProto(serialization_domain); } for (const auto& counter : counters) { auto new_counters = result->add_counters(); diff --git a/source/client/output_formatter_impl.cc b/source/client/output_formatter_impl.cc index 52245cef5..4d8cba3fa 100644 --- a/source/client/output_formatter_impl.cc +++ b/source/client/output_formatter_impl.cc @@ -56,20 +56,46 @@ std::string ConsoleOutputFormatterImpl::formatProto(const nighthawk::client::Out for (const auto& result : output.results()) { if (result.name() == "global") { for (const auto& statistic : result.statistics()) { + // Don't show output for statistics that have no samples. if (statistic.count() == 0) { continue; } - ss << fmt::format("{}", statIdtoFriendlyStatName(statistic.id())) << std::endl; - ss << fmt::format(" samples: {}", statistic.count()) << std::endl; - ss << fmt::format(" mean: {}", formatProtoDuration(statistic.mean())) << std::endl; - ss << fmt::format(" pstdev: {}", formatProtoDuration(statistic.pstdev())) << std::endl; - ss << std::endl; - ss << fmt::format(" {:<{}}{:<{}}{:<{}}", "Percentile", 12, "Count", 12, "Latency", 15) + const std::string s_min = statistic.has_min() ? formatProtoDuration(statistic.min()) + : fmt::format("{}", statistic.raw_min()); + const std::string s_max = statistic.has_max() ? formatProtoDuration(statistic.max()) + : fmt::format("{}", statistic.raw_max()); + const std::string s_mean = statistic.has_mean() ? formatProtoDuration(statistic.mean()) + : fmt::format("{}", statistic.raw_mean()); + const std::string s_pstdev = statistic.has_pstdev() + ? formatProtoDuration(statistic.pstdev()) + : fmt::format("{}", statistic.raw_pstdev()); + + ss << fmt::format("{} ({} samples)", statIdtoFriendlyStatName(statistic.id()), + statistic.count()) << std::endl; - iteratePercentiles(statistic, [&ss, this](const nighthawk::client::Percentile& percentile) { - ss << fmt::format(" {:<{}}{:<{}}{:<{}}", percentile.percentile(), 12, percentile.count(), - 12, formatProtoDuration(percentile.duration()), 15) - << std::endl; + ss << fmt::format(" min: {} | ", s_min); + ss << fmt::format("mean: {} | ", s_mean); + ss << fmt::format("max: {} | ", s_max); + ss << fmt::format("pstdev: {}", s_pstdev) << std::endl; + + bool header_written = false; + iteratePercentiles(statistic, [&ss, this, &header_written]( + const nighthawk::client::Percentile& percentile) { + const auto p = percentile.percentile(); + // Don't show the min / max, as we already show that above. + if (p > 0 && p < 1) { + if (!header_written) { + ss << std::endl + << fmt::format(" {:<{}}{:<{}}{:<{}}", "Percentile", 12, "Count", 12, "Value", 15) + << std::endl; + header_written = true; + } + ss << fmt::format(" {:<{}}{:<{}}{:<{}}", p, 12, percentile.count(), 12, + percentile.has_duration() ? formatProtoDuration(percentile.duration()) + : fmt::format("{}", percentile.raw_value()), + 15) + << std::endl; + } }); ss << std::endl; } @@ -104,7 +130,12 @@ std::string ConsoleOutputFormatterImpl::statIdtoFriendlyStatName(absl::string_vi return "Initiation to completion"; } else if (stat_id == "sequencer.blocking") { return "Blocking. Results are skewed when significant numbers are reported here."; + } else if (stat_id == "benchmark_http_client.response_body_size") { + return "Response body size in bytes"; + } else if (stat_id == "benchmark_http_client.response_header_size") { + return "Response header size in bytes"; } + return std::string(stat_id); } @@ -122,23 +153,45 @@ DottedStringOutputFormatterImpl::formatProto(const nighthawk::client::Output& ou for (const auto& result : output.results()) { for (const auto& statistic : result.statistics()) { const std::string prefix = fmt::format("{}.{}", result.name(), statistic.id()); + const std::string s_min = + statistic.has_min() + ? fmt::format( + "{}", Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(statistic.min())) + : fmt::format("{}", statistic.raw_min()); + const std::string s_max = + statistic.has_max() + ? fmt::format( + "{}", Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(statistic.max())) + : fmt::format("{}", statistic.raw_max()); + const std::string s_mean = + statistic.has_mean() + ? fmt::format( + "{}", Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(statistic.mean())) + : fmt::format("{}", statistic.raw_mean()); + const std::string s_pstdev = + statistic.has_pstdev() + ? fmt::format("{}", Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds( + statistic.pstdev())) + : fmt::format("{}", statistic.raw_pstdev()); ss << fmt::format("{}.samples: {}", prefix, statistic.count()) << std::endl; - ss << fmt::format("{}.mean: {}", prefix, - Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(statistic.mean())) - << std::endl; - ss << fmt::format("{}.pstdev: {}", prefix, - Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(statistic.pstdev())) - << std::endl; + ss << fmt::format("{}.mean: {}", prefix, s_mean) << std::endl; + ss << fmt::format("{}.pstdev: {}", prefix, s_pstdev) << std::endl; + ss << fmt::format("{}.min: {}", prefix, s_min) << std::endl; + ss << fmt::format("{}.max: {}", prefix, s_max) << std::endl; iteratePercentiles(statistic, [&ss, prefix](const nighthawk::client::Percentile& percentile) { const std::string percentile_prefix = fmt::format("{}.permilles-{:.{}f}", prefix, percentile.percentile() * 1000, 0); ss << fmt::format("{}.count: {}", percentile_prefix, percentile.count()) << std::endl; - ss << fmt::format( - "{}.microseconds: {}", percentile_prefix, - Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(percentile.duration())) - << std::endl; + if (percentile.has_duration()) { + ss << fmt::format( + "{}.microseconds: {}", percentile_prefix, + Envoy::Protobuf::util::TimeUtil::DurationToMicroseconds(percentile.duration())); + } else { + ss << fmt::format("{}.value: {}", percentile_prefix, percentile.raw_value()); + } + ss << std::endl; }); } for (const auto& counter : result.counters()) { @@ -173,16 +226,15 @@ FortioOutputFormatterImpl::getCounterByName(const nighthawk::client::Result& res "Nighthawk result was malformed, contains no counter with name: ", counter_name)); } -const nighthawk::client::Statistic& FortioOutputFormatterImpl::getRequestResponseStatistic( - const nighthawk::client::Result& result) const { +const nighthawk::client::Statistic* +FortioOutputFormatterImpl::findStatistic(const nighthawk::client::Result& result, + absl::string_view stat_id) const { for (auto const& nh_stat : result.statistics()) { - if (nh_stat.id() == "benchmark_http_client.request_to_response") { - return nh_stat; + if (nh_stat.id() == stat_id) { + return &nh_stat; } } - - throw NighthawkException("Nighthawk result was malformed, contains no " - "'benchmark_http_client.request_to_response' statistic."); + return nullptr; } std::chrono::nanoseconds FortioOutputFormatterImpl::getAverageExecutionDuration( @@ -263,9 +315,26 @@ std::string FortioOutputFormatterImpl::formatProto(const nighthawk::client::Outp fortio_output.mutable_retcodes()->at("200") = 0; } - // The core of the transformation is here: All the percentiles to display the dashboard - const auto& nh_stat = this->getRequestResponseStatistic(nh_global_result); + auto* statistic = + this->findStatistic(nh_global_result, "benchmark_http_client.request_to_response"); + if (statistic == nullptr) { + throw NighthawkException("Nighthawk result was malformed, contains no " + "'benchmark_http_client.request_to_response' statistic."); + } + fortio_output.mutable_durationhistogram()->CopyFrom(renderFortioDurationHistogram(*statistic)); + statistic = this->findStatistic(nh_global_result, "benchmark_http_client.response_body_size"); + if (statistic != nullptr) { + fortio_output.mutable_sizes()->CopyFrom(renderFortioDurationHistogram(*statistic)); + } + statistic = this->findStatistic(nh_global_result, "benchmark_http_client.response_header_size"); + if (statistic != nullptr) { + fortio_output.mutable_headersizes()->CopyFrom(renderFortioDurationHistogram(*statistic)); + } + return Envoy::MessageUtil::getJsonStringFromMessage(fortio_output, true, true); +} +const nighthawk::client::DurationHistogram FortioOutputFormatterImpl::renderFortioDurationHistogram( + const nighthawk::client::Statistic& nh_stat) const { nighthawk::client::DurationHistogram fortio_histogram; uint64_t prev_fortio_count = 0; double prev_fortio_end = 0; @@ -279,20 +348,26 @@ std::string FortioOutputFormatterImpl::formatProto(const nighthawk::client::Outp fortio_data_entry.set_count(nh_percentile.count() - prev_fortio_count); // fortio_end = nh_duration (need to convert formats) - const double nh_percentile_duration_sec = durationToSeconds(nh_percentile.duration()); - fortio_data_entry.set_end(nh_percentile_duration_sec); + double value; + if (nh_percentile.has_duration()) { + // fortio_end = nh_duration (need to convert formats) + value = durationToSeconds(nh_percentile.duration()); + } else { + value = nh_percentile.raw_value(); + } + fortio_data_entry.set_end(value); // fortio_start = prev_fortio_end if (i++ == 0) { // If this is the first entry, force the start and end time to be the same. // This prevents it from starting at 0, making it disproportionally big in the UI. - prev_fortio_end = nh_percentile_duration_sec; + prev_fortio_end = value; } fortio_data_entry.set_start(prev_fortio_end); // Update tracking variables prev_fortio_count = nh_percentile.count(); - prev_fortio_end = nh_percentile_duration_sec; + prev_fortio_end = value; // Set the data entry in the histogram only if it's not the first entry fortio_histogram.add_data()->CopyFrom(fortio_data_entry); @@ -300,30 +375,33 @@ std::string FortioOutputFormatterImpl::formatProto(const nighthawk::client::Outp // Set the count (number of data points) fortio_histogram.set_count(nh_stat.count()); - fortio_histogram.set_avg(durationToSeconds(nh_stat.mean())); + fortio_histogram.set_avg(nh_stat.has_mean() ? durationToSeconds(nh_stat.mean()) + : nh_stat.raw_mean()); + fortio_histogram.set_min(nh_stat.has_min() ? durationToSeconds(nh_stat.min()) + : nh_stat.raw_min()); fortio_histogram.set_sum(nh_stat.count() * fortio_histogram.avg()); + fortio_histogram.set_max(nh_stat.has_max() ? durationToSeconds(nh_stat.max()) + : nh_stat.raw_max()); // Note that Nighthawk tracks pstdev whereas fortio seems to use stdev. - fortio_histogram.set_stddev(durationToSeconds(nh_stat.pstdev())); + fortio_histogram.set_stddev(nh_stat.has_pstdev() ? durationToSeconds(nh_stat.pstdev()) + : nh_stat.raw_pstdev()); iteratePercentiles(nh_stat, [this, &fortio_histogram](const nighthawk::client::Percentile& percentile) { - if (percentile.percentile() == 0) { - fortio_histogram.set_min(durationToSeconds(percentile.duration())); - } else if (percentile.percentile() == 1) { - fortio_histogram.set_max(durationToSeconds(percentile.duration())); - } else { + if (percentile.percentile() > 0 && percentile.percentile() < 1) { auto* p = fortio_histogram.add_percentiles(); // We perform some rounding on the percentiles for a better UX while we use // HdrHistogram. HDR-Histogram uses base-2 arithmetic behind the scenes // which yields percentiles close to what fortio has, but not perfectly // on-spot, e.g. 0.990625 and 0.9990234375. p->set_percentile(std::floor(percentile.percentile() * 1000) / 10); - p->set_value(durationToSeconds(percentile.duration())); + if (percentile.has_duration()) { + p->set_value(durationToSeconds(percentile.duration())); + } else { + p->set_value(percentile.raw_value()); + } } }); - - // Set the histogram in main fortio output - fortio_output.mutable_durationhistogram()->CopyFrom(fortio_histogram); - return Envoy::MessageUtil::getJsonStringFromMessage(fortio_output, true, true); + return fortio_histogram; } } // namespace Client diff --git a/source/client/output_formatter_impl.h b/source/client/output_formatter_impl.h index 9177af29d..6233b7a67 100644 --- a/source/client/output_formatter_impl.h +++ b/source/client/output_formatter_impl.h @@ -9,6 +9,7 @@ #include "external/envoy/source/common/protobuf/protobuf.h" #include "api/client/output.pb.h" +#include "api/client/transform/fortio.pb.h" #include "absl/strings/string_view.h" @@ -78,11 +79,15 @@ class FortioOutputFormatterImpl : public OutputFormatterImpl { * Return the statistic that represents the request/response round-trip times. * * @param result a single Nighthawk result, preferably the global result - * @return the corresponding request/response statistic - * @throws NighthawkException if request/response statistic is not found + * @param stat_id the id of the statistic that we are looking for + * @return a pointer to the corresponding request/response statistic, or + * nullptr if no statistic with the request id was found */ - const nighthawk::client::Statistic& - getRequestResponseStatistic(const nighthawk::client::Result& result) const; + const nighthawk::client::Statistic* findStatistic(const nighthawk::client::Result& result, + absl::string_view stat_id) const; + + const nighthawk::client::DurationHistogram + renderFortioDurationHistogram(const nighthawk::client::Statistic& statistic) const; /** * Gets the average execution duration based on averaging all worker sequencer execution diff --git a/source/client/process_impl.cc b/source/client/process_impl.cc index fda495d60..1dde53260 100644 --- a/source/client/process_impl.cc +++ b/source/client/process_impl.cc @@ -206,11 +206,12 @@ uint32_t ProcessImpl::determineConcurrency() const { } std::vector -ProcessImpl::vectorizeStatisticPtrMap(const StatisticFactory& statistic_factory, - const StatisticPtrMap& statistics) const { +ProcessImpl::vectorizeStatisticPtrMap(const StatisticPtrMap& statistics) const { std::vector v; for (const auto& statistic : statistics) { - auto new_statistic = statistic_factory.create()->combine(*(statistic.second)); + // Clone the orinal statistic into a new one. + auto new_statistic = + statistic.second->createNewInstanceOfSameType()->combine(*(statistic.second)); new_statistic->setId(statistic.first); v.push_back(std::move(new_statistic)); } @@ -218,8 +219,7 @@ ProcessImpl::vectorizeStatisticPtrMap(const StatisticFactory& statistic_factory, } std::vector -ProcessImpl::mergeWorkerStatistics(const StatisticFactory& statistic_factory, - const std::vector& workers) const { +ProcessImpl::mergeWorkerStatistics(const std::vector& workers) const { // First we init merged_statistics with newly created statistics instances. // We do that by adding the same amount of Statistic instances that the first worker has. // (We always have at least one worker, and all workers have the same number of Statistic @@ -227,7 +227,7 @@ ProcessImpl::mergeWorkerStatistics(const StatisticFactory& statistic_factory, std::vector merged_statistics; StatisticPtrMap w0_statistics = workers[0]->statistics(); for (const auto& w0_statistic : w0_statistics) { - auto new_statistic = statistic_factory.create(); + auto new_statistic = w0_statistic.second->createNewInstanceOfSameType(); new_statistic->setId(w0_statistic.first); merged_statistics.push_back(std::move(new_statistic)); } @@ -467,7 +467,7 @@ bool ProcessImpl::run(OutputCollector& collector) { if (workers_.size() > 1) { StatisticFactoryImpl statistic_factory(options_); collector.addResult(fmt::format("worker_{}", i), - vectorizeStatisticPtrMap(statistic_factory, worker->statistics()), + vectorizeStatisticPtrMap(worker->statistics()), worker->threadLocalCounterValues(), sequencer_execution_duration); } total_execution_duration += sequencer_execution_duration; @@ -481,7 +481,7 @@ bool ProcessImpl::run(OutputCollector& collector) { const auto& counters = Utility().mapCountersFromStore( store_root_, [](absl::string_view, uint64_t value) { return value > 0; }); StatisticFactoryImpl statistic_factory(options_); - collector.addResult("global", mergeWorkerStatistics(statistic_factory, workers), counters, + collector.addResult("global", mergeWorkerStatistics(workers), counters, total_execution_duration / workers_.size()); return counters.find("sequencer.failed_terminations") == counters.end(); } diff --git a/source/client/process_impl.h b/source/client/process_impl.h index 0fd3a803f..f0284a2c5 100644 --- a/source/client/process_impl.h +++ b/source/client/process_impl.h @@ -89,11 +89,9 @@ class ProcessImpl : public Process, public Envoy::Logger::Loggable& createWorkers(const uint32_t concurrency); - std::vector vectorizeStatisticPtrMap(const StatisticFactory& statistic_factory, - const StatisticPtrMap& statistics) const; + std::vector vectorizeStatisticPtrMap(const StatisticPtrMap& statistics) const; std::vector - mergeWorkerStatistics(const StatisticFactory& statistic_factory, - const std::vector& workers) const; + mergeWorkerStatistics(const std::vector& workers) const; void setupForHRTimers(); Envoy::ProcessWide process_wide_; Envoy::PlatformImpl platform_impl_; diff --git a/source/client/stream_decoder.cc b/source/client/stream_decoder.cc index a016689ab..b6afd97d7 100644 --- a/source/client/stream_decoder.cc +++ b/source/client/stream_decoder.cc @@ -14,6 +14,7 @@ void StreamDecoder::decodeHeaders(Envoy::Http::HeaderMapPtr&& headers, bool end_ upstream_timing_.onFirstUpstreamRxByteReceived(time_source_); complete_ = end_stream; response_headers_ = std::move(headers); + response_header_sizes_statistic_.addValue(response_headers_->byteSize()); const uint64_t response_code = Envoy::Http::Utility::getResponseStatus(*response_headers_); stream_info_.response_code_ = static_cast(response_code); if (complete_) { @@ -48,6 +49,7 @@ void StreamDecoder::onComplete(bool success) { latency_statistic_.addValue((time_source_.monotonicTime() - request_start_).count()); } upstream_timing_.onLastUpstreamRxByteReceived(time_source_); + response_body_sizes_statistic_.addValue(stream_info_.bytesSent()); stream_info_.onRequestComplete(); stream_info_.setUpstreamTiming(upstream_timing_); decoder_completion_callback_.onComplete(success, *response_headers_); diff --git a/source/client/stream_decoder.h b/source/client/stream_decoder.h index 7df29b048..86fa56646 100644 --- a/source/client/stream_decoder.h +++ b/source/client/stream_decoder.h @@ -40,13 +40,16 @@ class StreamDecoder : public Envoy::Http::StreamDecoder, StreamDecoder(Envoy::Event::Dispatcher& dispatcher, Envoy::TimeSource& time_source, StreamDecoderCompletionCallback& decoder_completion_callback, OperationCallback caller_completion_callback, Statistic& connect_statistic, - Statistic& latency_statistic, HeaderMapPtr request_headers, bool measure_latencies, - uint32_t request_body_size, std::string x_request_id, + Statistic& latency_statistic, Statistic& response_header_sizes_statistic, + Statistic& response_body_sizes_statistic, HeaderMapPtr request_headers, + bool measure_latencies, uint32_t request_body_size, std::string x_request_id, Envoy::Tracing::HttpTracerPtr& http_tracer) : dispatcher_(dispatcher), time_source_(time_source), decoder_completion_callback_(decoder_completion_callback), caller_completion_callback_(std::move(caller_completion_callback)), connect_statistic_(connect_statistic), latency_statistic_(latency_statistic), + response_header_sizes_statistic_(response_header_sizes_statistic), + response_body_sizes_statistic_(response_body_sizes_statistic), request_headers_(std::move(request_headers)), connect_start_(time_source_.monotonicTime()), complete_(false), measure_latencies_(measure_latencies), request_body_size_(request_body_size), stream_info_(time_source_), @@ -95,6 +98,8 @@ class StreamDecoder : public Envoy::Http::StreamDecoder, OperationCallback caller_completion_callback_; Statistic& connect_statistic_; Statistic& latency_statistic_; + Statistic& response_header_sizes_statistic_; + Statistic& response_body_sizes_statistic_; HeaderMapPtr request_headers_; Envoy::Http::HeaderMapPtr response_headers_; Envoy::Http::HeaderMapPtr trailer_headers_; diff --git a/source/common/BUILD b/source/common/BUILD index 019e14ed3..56121fcba 100644 --- a/source/common/BUILD +++ b/source/common/BUILD @@ -102,6 +102,7 @@ envoy_cc_library( "@envoy//source/common/common:version_includes_with_external_headers", "@envoy//source/common/http:utility_lib_with_external_headers", "@envoy//source/common/network:utility_lib_with_external_headers", + "@envoy//source/common/protobuf:utility_lib_with_external_headers", "@envoy//source/common/stats:stats_lib_with_external_headers", "@envoy//source/exe:envoy_common_lib_with_external_headers", "@envoy//source/server/config_validation:server_lib_with_external_headers", diff --git a/source/common/statistic_impl.cc b/source/common/statistic_impl.cc index 1fc975aef..bd5750467 100644 --- a/source/common/statistic_impl.cc +++ b/source/common/statistic_impl.cc @@ -5,27 +5,49 @@ #include #include "external/envoy/source/common/common/assert.h" +#include "external/envoy/source/common/protobuf/utility.h" namespace Nighthawk { +namespace { + +/** + * @param mutable_duration The proto duration that will be updated to reflect the passed in nanos. + * @param nanos The number of nanoseconds. + */ +static void setDurationFromNanos(Envoy::ProtobufWkt::Duration& mutable_duration, + const uint64_t nanos) { + constexpr uint64_t one_billion = 1e9; + mutable_duration.set_seconds(nanos / one_billion); + mutable_duration.set_nanos(nanos % one_billion); +} + +} // namespace + std::string StatisticImpl::toString() const { - return fmt::format("Count: {}. Mean: {:.{}f} μs. pstdev: {:.{}f} μs.\n", count(), mean() / 1000, - 2, pstdev() / 1000, 2); + return toProto(SerializationDomain::RAW).DebugString(); } -nighthawk::client::Statistic StatisticImpl::toProto() { +nighthawk::client::Statistic StatisticImpl::toProto(SerializationDomain domain) const { nighthawk::client::Statistic statistic; statistic.set_id(id()); statistic.set_count(count()); - - int64_t nanos = count() == 0 ? 0 : static_cast(std::round(mean())); - statistic.mutable_mean()->set_seconds(nanos / 1000000000); - statistic.mutable_mean()->set_nanos(nanos % 1000000000); - - nanos = count() == 0 ? 0 : static_cast(std::round(std::isnan(pstdev()) ? 0 : pstdev())); - statistic.mutable_pstdev()->set_seconds(nanos / 1000000000); - statistic.mutable_pstdev()->set_nanos(nanos % 1000000000); + if (domain == Statistic::SerializationDomain::DURATION) { + int64_t nanos; + nanos = count() == 0 ? 0 : static_cast(std::round(mean())); + setDurationFromNanos(*statistic.mutable_mean(), nanos); + nanos = + count() == 0 ? 0 : static_cast(std::round(std::isnan(pstdev()) ? 0 : pstdev())); + setDurationFromNanos(*statistic.mutable_pstdev(), nanos); + setDurationFromNanos(*statistic.mutable_min(), min() == UINT64_MAX ? 0 : min()); + setDurationFromNanos(*statistic.mutable_max(), max()); + } else { + statistic.set_raw_mean(mean()); + statistic.set_raw_pstdev(pstdev()); + statistic.set_raw_min(min()); + statistic.set_raw_max(max()); + } return statistic; } @@ -34,16 +56,24 @@ std::string StatisticImpl::id() const { return id_; }; void StatisticImpl::setId(absl::string_view id) { id_ = std::string(id); }; -SimpleStatistic::SimpleStatistic() : count_(0), sum_x_(0), sum_x2_(0) {} +void StatisticImpl::addValue(uint64_t value) { + min_ = std::min(min_, value); + max_ = std::max(max_, value); + count_++; +}; + +uint64_t StatisticImpl::count() const { return count_; } + +uint64_t StatisticImpl::min() const { return min_; }; + +uint64_t StatisticImpl::max() const { return max_; }; void SimpleStatistic::addValue(uint64_t value) { - count_++; + StatisticImpl::addValue(value); sum_x_ += value; sum_x2_ += 1.0 * value * value; } -uint64_t SimpleStatistic::count() const { return count_; } - double SimpleStatistic::mean() const { return count() == 0 ? std::nan("") : sum_x_ / count_; } double SimpleStatistic::pvariance() const { @@ -56,26 +86,23 @@ StatisticPtr SimpleStatistic::combine(const Statistic& statistic) const { const SimpleStatistic& a = *this; const auto& b = dynamic_cast(statistic); auto combined = std::make_unique(); - + combined->min_ = std::min(a.min(), b.min()); + combined->max_ = std::max(a.max(), b.max()); combined->count_ = a.count() + b.count(); combined->sum_x_ = a.sum_x_ + b.sum_x_; combined->sum_x2_ = a.sum_x2_ + b.sum_x2_; return combined; } -StreamingStatistic::StreamingStatistic() : count_(0), mean_(0), accumulated_variance_(0) {} - void StreamingStatistic::addValue(uint64_t value) { double delta, delta_n; - count_++; + StatisticImpl::addValue(value); delta = value - mean_; delta_n = delta / count_; mean_ += delta_n; accumulated_variance_ += delta * delta_n * (count_ - 1.0); } -uint64_t StreamingStatistic::count() const { return count_; } - double StreamingStatistic::mean() const { return count_ == 0 ? std::nan("") : mean_; } double StreamingStatistic::pvariance() const { @@ -91,25 +118,28 @@ StatisticPtr StreamingStatistic::combine(const Statistic& statistic) const { const auto& b = dynamic_cast(statistic); auto combined = std::make_unique(); + combined->min_ = std::min(a.min(), b.min()); + combined->max_ = std::max(a.max(), b.max()); combined->count_ = a.count() + b.count(); - combined->mean_ = ((a.count() * a.mean()) + (b.count() * b.mean())) / combined->count_; + // A statistic instance with zero samples will return std::isnan() as its mean. + // For the the merge we are doing here we need to treat that as 0. + auto a_mean = std::isnan(a.mean()) ? 0 : a.mean(); + auto b_mean = std::isnan(b.mean()) ? 0 : b.mean(); + combined->mean_ = ((a.count() * a_mean) + (b.count() * b_mean)) / combined->count_; combined->accumulated_variance_ = a.accumulated_variance_ + b.accumulated_variance_ + - pow(a.mean() - b.mean(), 2) * a.count() * b.count() / combined->count(); + pow(a_mean - b_mean, 2) * a.count() * b.count() / combined->count(); return combined; } InMemoryStatistic::InMemoryStatistic() : streaming_stats_(std::make_unique()) {} void InMemoryStatistic::addValue(uint64_t sample_value) { + StatisticImpl::addValue(sample_value); samples_.push_back(sample_value); streaming_stats_->addValue(sample_value); } -uint64_t InMemoryStatistic::count() const { - ASSERT(streaming_stats_->count() == samples_.size()); - return streaming_stats_->count(); -} double InMemoryStatistic::mean() const { return streaming_stats_->mean(); } double InMemoryStatistic::pvariance() const { return streaming_stats_->pvariance(); } double InMemoryStatistic::pstdev() const { return streaming_stats_->pstdev(); } @@ -118,9 +148,12 @@ StatisticPtr InMemoryStatistic::combine(const Statistic& statistic) const { auto combined = std::make_unique(); const auto& b = dynamic_cast(statistic); + combined->min_ = std::min(this->min(), b.min()); + combined->max_ = std::max(this->max(), b.max()); combined->samples_.insert(combined->samples_.end(), this->samples_.begin(), this->samples_.end()); combined->samples_.insert(combined->samples_.end(), b.samples_.begin(), b.samples_.end()); combined->streaming_stats_ = this->streaming_stats_->combine(*b.streaming_stats_); + combined->count_ = combined->samples_.size(); return combined; } @@ -148,13 +181,21 @@ void HdrStatistic::addValue(uint64_t value) { // or maximum value we passed when initializing histogram_. if (!hdr_record_value(histogram_, value)) { ENVOY_LOG(warn, "Failed to record value into HdrHistogram."); + } else { + StatisticImpl::addValue(value); } } +// We override count for the Hdr statistics, because it may have dropped +// out of range values. hence our own tracking may be inaccurate. uint64_t HdrStatistic::count() const { return histogram_->total_count; } double HdrStatistic::mean() const { return count() == 0 ? std::nan("") : hdr_mean(histogram_); } double HdrStatistic::pvariance() const { return pstdev() * pstdev(); } double HdrStatistic::pstdev() const { return count() == 0 ? std::nan("") : hdr_stddev(histogram_); } +uint64_t HdrStatistic::min() const { + return count() == 0 ? UINT64_MAX : hdr_value_at_percentile(histogram_, 0); +} +uint64_t HdrStatistic::max() const { return hdr_value_at_percentile(histogram_, 100); } StatisticPtr HdrStatistic::combine(const Statistic& statistic) const { auto combined = std::make_unique(); @@ -171,24 +212,8 @@ StatisticPtr HdrStatistic::combine(const Statistic& statistic) const { return combined; } -std::string HdrStatistic::toString() const { - std::stringstream stream; - - stream << StatisticImpl::toString(); - stream << fmt::format("{:>12} {:>14} (usec)", "Percentile", "Value") << std::endl; - - std::vector percentiles{50.0, 75.0, 90.0, 99.0, 99.9, 99.99, 99.999, 100.0}; - for (double p : percentiles) { - const int64_t n = hdr_value_at_percentile(histogram_, p); - - // We scale from nanoseconds to microseconds in the output. - stream << fmt::format("{:>12}% {:>14}", p, n / 1000.0) << std::endl; - } - return stream.str(); -} - -nighthawk::client::Statistic HdrStatistic::toProto() { - nighthawk::client::Statistic proto = StatisticImpl::toProto(); +nighthawk::client::Statistic HdrStatistic::toProto(SerializationDomain domain) const { + nighthawk::client::Statistic proto = StatisticImpl::toProto(domain); struct hdr_iter iter; struct hdr_iter_percentiles* percentiles; @@ -199,10 +224,11 @@ nighthawk::client::Statistic HdrStatistic::toProto() { nighthawk::client::Percentile* percentile; percentile = proto.add_percentiles(); - - percentile->mutable_duration()->set_seconds(iter.highest_equivalent_value / 1000000000); - percentile->mutable_duration()->set_nanos(iter.highest_equivalent_value % 1000000000); - + if (domain == Statistic::SerializationDomain::DURATION) { + setDurationFromNanos(*percentile->mutable_duration(), iter.highest_equivalent_value); + } else { + percentile->set_raw_value(iter.highest_equivalent_value); + } percentile->set_percentile(percentiles->percentile / 100.0); percentile->set_count(iter.cumulative_count); } diff --git a/source/common/statistic_impl.h b/source/common/statistic_impl.h index 4ec77e8fa..981133b44 100644 --- a/source/common/statistic_impl.h +++ b/source/common/statistic_impl.h @@ -12,13 +12,43 @@ namespace Nighthawk { +/** + * Base class for all statistics implementations. + */ class StatisticImpl : public Statistic, public Envoy::Logger::Loggable { public: + void addValue(uint64_t value) override; std::string toString() const override; - nighthawk::client::Statistic toProto() override; + nighthawk::client::Statistic toProto(SerializationDomain domain) const override; std::string id() const override; void setId(absl::string_view id) override; + uint64_t count() const override; + uint64_t max() const override; + uint64_t min() const override; + +protected: std::string id_; + uint64_t min_{UINT64_MAX}; + uint64_t max_{0}; + uint64_t count_{0}; +}; + +/** + * Dummy statistic for future use. + * Intended be plugged into the system as a no-op in cases where statistic tracking + * is not desired. + */ +class NullStatistic : public StatisticImpl { +public: + void addValue(uint64_t) override {} + double mean() const override { return 0.0; } + double pvariance() const override { return 0.0; } + double pstdev() const override { return 0.0; } + StatisticPtr combine(const Statistic&) const override { return createNewInstanceOfSameType(); }; + uint64_t significantDigits() const override { return 0; } + StatisticPtr createNewInstanceOfSameType() const override { + return std::make_unique(); + }; }; /** @@ -27,19 +57,19 @@ class StatisticImpl : public Statistic, public Envoy::Logger::Loggable(); + }; private: - uint64_t count_; - double sum_x_; - double sum_x2_; + double sum_x_{0}; + double sum_x2_{0}; }; /** @@ -52,19 +82,19 @@ class SimpleStatistic : public StatisticImpl { */ class StreamingStatistic : public StatisticImpl { public: - StreamingStatistic(); void addValue(uint64_t value) override; - uint64_t count() const override; double mean() const override; double pvariance() const override; double pstdev() const override; StatisticPtr combine(const Statistic& statistic) const override; bool resistsCatastrophicCancellation() const override { return true; } + StatisticPtr createNewInstanceOfSameType() const override { + return std::make_unique(); + }; private: - uint64_t count_; - double mean_; - double accumulated_variance_; + double mean_{0}; + double accumulated_variance_{0}; }; /** @@ -76,7 +106,6 @@ class InMemoryStatistic : public StatisticImpl { public: InMemoryStatistic(); void addValue(uint64_t sample_value) override; - uint64_t count() const override; double mean() const override; double pvariance() const override; double pstdev() const override; @@ -85,6 +114,9 @@ class InMemoryStatistic : public StatisticImpl { return streaming_stats_->resistsCatastrophicCancellation(); } uint64_t significantDigits() const override { return streaming_stats_->significantDigits(); } + StatisticPtr createNewInstanceOfSameType() const override { + return std::make_unique(); + }; private: std::vector samples_; @@ -103,11 +135,15 @@ class HdrStatistic : public StatisticImpl { double mean() const override; double pvariance() const override; double pstdev() const override; + uint64_t max() const override; + uint64_t min() const override; StatisticPtr combine(const Statistic& statistic) const override; - std::string toString() const override; - nighthawk::client::Statistic toProto() override; + nighthawk::client::Statistic toProto(SerializationDomain domain) const override; uint64_t significantDigits() const override { return SignificantDigits; } + StatisticPtr createNewInstanceOfSameType() const override { + return std::make_unique(); + }; private: static const int SignificantDigits; diff --git a/source/common/version_info.h b/source/common/version_info.h index 0e05ee7a7..86ed38b19 100644 --- a/source/common/version_info.h +++ b/source/common/version_info.h @@ -13,8 +13,21 @@ namespace Nighthawk { */ class VersionInfo { public: + /** + * @return const std::string& a representation of the current version. + */ static const std::string& version(); + /** + * @return const envoy::config::core::v3alpha::BuildVersion& a representation of the current + * version. + */ static const envoy::config::core::v3alpha::BuildVersion& buildVersion(); + /** + * @brief Transforms a proto representation of a build version into a string representation. + * + * @param build_version proto build-version input that should be transformed. + * @return const std::string representation of the transformed proto input. + */ static const std::string toVersionString(const envoy::config::core::v3alpha::BuildVersion& build_version); diff --git a/test/benchmark_http_client_test.cc b/test/benchmark_http_client_test.cc index f7f928e73..03a619362 100644 --- a/test/benchmark_http_client_test.cc +++ b/test/benchmark_http_client_test.cc @@ -124,6 +124,7 @@ class BenchmarkClientHttpTest : public Test { void setupBenchmarkClient() { client_ = std::make_unique( *api_, *dispatcher_, store_, std::make_unique(), + std::make_unique(), std::make_unique(), std::make_unique(), false, cluster_manager_, http_tracer_, "benchmark", request_generator_, true); } @@ -188,6 +189,7 @@ TEST_F(BenchmarkClientHttpTest, StatusTrackingInOnComplete) { auto store = std::make_unique(); client_ = std::make_unique( *api_, *dispatcher_, *store, std::make_unique(), + std::make_unique(), std::make_unique(), std::make_unique(), false, cluster_manager_, http_tracer_, "foo", request_generator_, true); Envoy::Http::HeaderMapImpl header; diff --git a/test/integration/test_integration_basics.py b/test/integration/test_integration_basics.py index 069017f07..7dddacb24 100644 --- a/test/integration/test_integration_basics.py +++ b/test/integration/test_integration_basics.py @@ -34,6 +34,19 @@ def test_http_h1(http_test_server_fixture): assertCounterEqual(counters, "upstream_rq_pending_total", 1) assertCounterEqual(counters, "upstream_rq_total", 25) assertCounterEqual(counters, "default.total_match_count", 1) + + global_histograms = http_test_server_fixture.getNighthawkGlobalHistogramsbyIdFromJson(parsed_json) + assertEqual(int(global_histograms["benchmark_http_client.response_body_size"]["count"]), 25) + assertEqual(int(global_histograms["benchmark_http_client.response_header_size"]["count"]), 25) + assertEqual(int(global_histograms["benchmark_http_client.response_body_size"]["raw_mean"]), 10) + assertEqual(int(global_histograms["benchmark_http_client.response_header_size"]["raw_mean"]), 97) + assertEqual(int(global_histograms["benchmark_http_client.response_body_size"]["raw_min"]), 10) + assertEqual(int(global_histograms["benchmark_http_client.response_header_size"]["raw_min"]), 97) + assertEqual(int(global_histograms["benchmark_http_client.response_body_size"]["raw_max"]), 10) + assertEqual(int(global_histograms["benchmark_http_client.response_header_size"]["raw_max"]), 97) + assertEqual(int(global_histograms["benchmark_http_client.response_body_size"]["raw_pstdev"]), 0) + assertEqual(int(global_histograms["benchmark_http_client.response_header_size"]["raw_pstdev"]), 0) + assertEqual(len(counters), 12) diff --git a/test/output_formatter_test.cc b/test/output_formatter_test.cc index 15a265c8e..e1f14233c 100644 --- a/test/output_formatter_test.cc +++ b/test/output_formatter_test.cc @@ -33,12 +33,31 @@ class OutputCollectorTest : public Test { OutputCollectorTest() { StatisticPtr used_statistic = std::make_unique(); StatisticPtr empty_statistic = std::make_unique(); + StatisticPtr size_statistic = std::make_unique(); + StatisticPtr latency_statistic = std::make_unique(); + used_statistic->setId("stat_id"); used_statistic->addValue(1000000); used_statistic->addValue(2000000); used_statistic->addValue(3000000); + + size_statistic->addValue(14); + size_statistic->addValue(15); + size_statistic->addValue(16); + size_statistic->addValue(17); + size_statistic->setId("foo_size"); + + latency_statistic->addValue(180000); + latency_statistic->addValue(190000); + latency_statistic->addValue(200000); + latency_statistic->addValue(210000); + latency_statistic->setId("foo_latency"); + statistics_.push_back(std::move(used_statistic)); statistics_.push_back(std::move(empty_statistic)); + statistics_.push_back(std::move(size_statistic)); + statistics_.push_back(std::move(latency_statistic)); + counters_["foo"] = 1; counters_["bar"] = 2; time_system_.setSystemTime(std::chrono::milliseconds(1234567891567)); @@ -170,7 +189,6 @@ class MediumOutputCollectorTest : public OutputCollectorTest { TEST_F(MediumOutputCollectorTest, FortioFormatter) { const auto input_proto = loadProtoFromFile("test/test_data/output_formatter.medium.proto.gold"); - FortioOutputFormatterImpl formatter; expectEqualToGoldFile(formatter.formatProto(input_proto), "test/test_data/output_formatter.medium.fortio.gold"); @@ -183,7 +201,10 @@ TEST_F(StatidToNameTest, TestTranslations) { EXPECT_EQ(ConsoleOutputFormatterImpl::statIdtoFriendlyStatName("foo"), "foo"); const std::vector ids = {"benchmark_http_client.queue_to_connect", "benchmark_http_client.request_to_response", - "sequencer.callback", "sequencer.blocking"}; + "benchmark_http_client.response_body_size", + "benchmark_http_client.response_header_size", + "sequencer.callback", + "sequencer.blocking"}; for (const std::string& id : ids) { EXPECT_NE(ConsoleOutputFormatterImpl::statIdtoFriendlyStatName(id), id); } diff --git a/test/statistic_test.cc b/test/statistic_test.cc index 824e7fc1e..c36faeb47 100644 --- a/test/statistic_test.cc +++ b/test/statistic_test.cc @@ -57,11 +57,18 @@ TYPED_TEST(TypedStatisticTest, Simple) { a.addValue(value); } EXPECT_EQ(3, a.count()); + EXPECT_EQ(1, a.min()); + EXPECT_EQ(3, a.max()); for (int value : b_values) { b.addValue(value); } EXPECT_EQ(3, b.count()); + EXPECT_EQ(1234, b.min()); + // We substract one from the expected precision with respect to significant digits for + // HdrHistogram. (More context in comments over at the the HdrStatisticProtoOutputLargeValues test + // below). + Helper::expectNear(6543456, b.max(), b.significantDigits() - 1); Helper::expectNear(2.0, a.mean(), a.significantDigits()); Helper::expectNear(0.6666666666666666, a.pvariance(), a.significantDigits()); @@ -73,9 +80,25 @@ TYPED_TEST(TypedStatisticTest, Simple) { auto c = a.combine(b); EXPECT_EQ(6, c->count()); + EXPECT_EQ(1, c->min()); + Helper::expectNear(6543456, c->max(), c->significantDigits() - 1); Helper::expectNear(1147838.5, c->mean(), c->significantDigits()); Helper::expectNear(5838135311072.917, c->pvariance(), c->significantDigits()); Helper::expectNear(2416223.357033227, c->pstdev(), c->significantDigits()); + + // A reverse combine should be exactly equivalent. + auto d = b.combine(a); + EXPECT_EQ(c->count(), d->count()); + EXPECT_EQ(c->min(), d->min()); + EXPECT_EQ(c->max(), d->max()); + EXPECT_EQ(c->mean(), d->mean()); + EXPECT_EQ(c->pvariance(), d->pvariance()); + EXPECT_EQ(c->pstdev(), d->pstdev()); +} + +TYPED_TEST(TypedStatisticTest, createNewInstanceOfSameType) { + TypeParam a; + EXPECT_NE(a.createNewInstanceOfSameType(), nullptr); } TYPED_TEST(TypedStatisticTest, Empty) { @@ -84,6 +107,8 @@ TYPED_TEST(TypedStatisticTest, Empty) { EXPECT_TRUE(std::isnan(a.mean())); EXPECT_TRUE(std::isnan(a.pvariance())); EXPECT_TRUE(std::isnan(a.pstdev())); + EXPECT_EQ(a.min(), UINT64_MAX); + EXPECT_EQ(a.max(), 0); } TYPED_TEST(TypedStatisticTest, SingleAndDoubleValue) { @@ -164,7 +189,7 @@ TYPED_TEST(TypedStatisticTest, ProtoOutput) { a.addValue(6543456); a.addValue(342335); - const nighthawk::client::Statistic proto = a.toProto(); + const nighthawk::client::Statistic proto = a.toProto(Statistic::SerializationDomain::DURATION); EXPECT_EQ("foo", proto.id()); EXPECT_EQ(2, proto.count()); @@ -174,7 +199,7 @@ TYPED_TEST(TypedStatisticTest, ProtoOutput) { TYPED_TEST(TypedStatisticTest, ProtoOutputEmptyStats) { TypeParam a; - const nighthawk::client::Statistic proto = a.toProto(); + const nighthawk::client::Statistic proto = a.toProto(Statistic::SerializationDomain::DURATION); EXPECT_EQ(proto.count(), 0); EXPECT_EQ(proto.mean().nanos(), 0); @@ -188,9 +213,11 @@ TYPED_TEST(TypedStatisticTest, StringOutput) { a.addValue(342335); std::string s = a.toString(); - EXPECT_NE(std::string::npos, s.find("Count: 2.")); - EXPECT_NE(std::string::npos, s.find("Mean: 3442.9")); - EXPECT_NE(std::string::npos, s.find("pstdev: 3100.5")); + std::vector matches{ + "count: ", "raw_mean: ", "raw_pstdev: ", "raw_min: ", "raw_max: "}; + for (const auto& match : matches) { + EXPECT_NE(std::string::npos, s.find(match)); + } } class StatisticTest : public Test {}; @@ -202,7 +229,7 @@ TEST(StatisticTest, SimpleStatisticProtoOutputLargeValues) { uint64_t value = 100ul + 0xFFFFFFFF; // 100 + the max for uint32_t a.addValue(value); a.addValue(value); - const nighthawk::client::Statistic proto = a.toProto(); + const nighthawk::client::Statistic proto = a.toProto(Statistic::SerializationDomain::DURATION); EXPECT_EQ(proto.count(), 2); Helper::expectNear(((1.0 * proto.mean().seconds() * 1000 * 1000 * 1000) + proto.mean().nanos()), @@ -216,7 +243,7 @@ TEST(StatisticTest, HdrStatisticProtoOutputLargeValues) { uint64_t value = 100ul + 0xFFFFFFFF; a.addValue(value); a.addValue(value); - const nighthawk::client::Statistic proto = a.toProto(); + const nighthawk::client::Statistic proto = a.toProto(Statistic::SerializationDomain::DURATION); EXPECT_EQ(proto.count(), 2); // TODO(oschaaf): hdr doesn't seem to the promised precision in this scenario. @@ -232,7 +259,7 @@ TEST(StatisticTest, StreamingStatProtoOutputLargeValues) { uint64_t value = 100ul + 0xFFFFFFFF; a.addValue(value); a.addValue(value); - const nighthawk::client::Statistic proto = a.toProto(); + const nighthawk::client::Statistic proto = a.toProto(Statistic::SerializationDomain::DURATION); EXPECT_EQ(proto.count(), 2); @@ -254,7 +281,12 @@ TEST(StatisticTest, HdrStatisticPercentilesProto) { util.loadFromJson(Envoy::Filesystem::fileSystemForTest().fileReadToEnd( TestEnvironment::runfilesPath("test/test_data/hdr_proto_json.gold")), parsed_json_proto, Envoy::ProtobufMessage::getStrictValidationVisitor()); - EXPECT_TRUE(util(parsed_json_proto, statistic.toProto())); + // Instead of comparing proto's, we perform a string-based comparison, because that emits a + // helpful diff when this fails. + const std::string json = util.getJsonStringFromMessage( + statistic.toProto(Statistic::SerializationDomain::DURATION), true, true); + const std::string golden_json = util.getJsonStringFromMessage(parsed_json_proto, true, true); + EXPECT_EQ(json, golden_json); } TEST(StatisticTest, CombineAcrossTypesFails) { @@ -284,4 +316,11 @@ TEST(StatisticTest, HdrStatisticOutOfRange) { EXPECT_EQ(0, a.count()); } +TEST(StatisticTest, NullStatistic) { + NullStatistic stat; + EXPECT_EQ(0, stat.count()); + stat.addValue(1); + EXPECT_EQ(0, stat.count()); +} + } // namespace Nighthawk diff --git a/test/stream_decoder_test.cc b/test/stream_decoder_test.cc index 279f219eb..9cd276733 100644 --- a/test/stream_decoder_test.cc +++ b/test/stream_decoder_test.cc @@ -47,6 +47,8 @@ class StreamDecoderTest : public Test, public StreamDecoderCompletionCallback { Envoy::Event::DispatcherPtr dispatcher_; StreamingStatistic connect_statistic_; StreamingStatistic latency_statistic_; + StreamingStatistic response_header_size_statistic_; + StreamingStatistic response_body_size_statistic_; HeaderMapPtr request_headers_; uint64_t stream_decoder_completion_callbacks_{0}; uint64_t pool_failures_{0}; @@ -58,8 +60,8 @@ TEST_F(StreamDecoderTest, HeaderOnlyTest) { bool is_complete = false; auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [&is_complete](bool, bool) { is_complete = true; }, - connect_statistic_, latency_statistic_, request_headers_, false, 0, TEST_TRACER_UID, - http_tracer_); + connect_statistic_, latency_statistic_, response_header_size_statistic_, + response_body_size_statistic_, request_headers_, false, 0, TEST_TRACER_UID, http_tracer_); decoder->decodeHeaders(std::move(test_header_), true); EXPECT_TRUE(is_complete); EXPECT_EQ(1, stream_decoder_completion_callbacks_); @@ -69,8 +71,8 @@ TEST_F(StreamDecoderTest, HeaderWithBodyTest) { bool is_complete = false; auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [&is_complete](bool, bool) { is_complete = true; }, - connect_statistic_, latency_statistic_, request_headers_, false, 0, TEST_TRACER_UID, - http_tracer_); + connect_statistic_, latency_statistic_, response_header_size_statistic_, + response_body_size_statistic_, request_headers_, false, 0, TEST_TRACER_UID, http_tracer_); decoder->decodeHeaders(std::move(test_header_), false); EXPECT_FALSE(is_complete); Envoy::Buffer::OwnedImpl buf(std::string(1, 'a')); @@ -85,8 +87,8 @@ TEST_F(StreamDecoderTest, TrailerTest) { bool is_complete = false; auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [&is_complete](bool, bool) { is_complete = true; }, - connect_statistic_, latency_statistic_, request_headers_, false, 0, TEST_TRACER_UID, - http_tracer_); + connect_statistic_, latency_statistic_, response_header_size_statistic_, + response_body_size_statistic_, request_headers_, false, 0, TEST_TRACER_UID, http_tracer_); Envoy::Http::HeaderMapPtr headers{new Envoy::Http::TestHeaderMapImpl{{":status", "200"}}}; decoder->decodeHeaders(std::move(headers), false); auto trailers = std::make_unique(); @@ -98,7 +100,8 @@ TEST_F(StreamDecoderTest, TrailerTest) { TEST_F(StreamDecoderTest, LatencyIsNotMeasured) { auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [](bool, bool) {}, connect_statistic_, latency_statistic_, - request_headers_, false, 0, TEST_TRACER_UID, http_tracer_); + response_header_size_statistic_, response_body_size_statistic_, request_headers_, false, 0, + TEST_TRACER_UID, http_tracer_); Envoy::Http::MockStreamEncoder stream_encoder; EXPECT_CALL(stream_encoder, getStream()); Envoy::Upstream::HostDescriptionConstSharedPtr ptr; @@ -135,7 +138,8 @@ TEST_F(StreamDecoderTest, LatencyIsMeasured) { {{":method", "GET"}, {":path", "/"}, {"x-client-trace-id", TEST_TRACER_UID_BIT_SET}})); auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [](bool, bool) {}, connect_statistic_, latency_statistic_, - request_header, true, 0, TEST_TRACER_UID, http_tracer_); + response_header_size_statistic_, response_body_size_statistic_, request_header, true, 0, + TEST_TRACER_UID, http_tracer_); Envoy::Http::MockStreamEncoder stream_encoder; EXPECT_CALL(stream_encoder, getStream()); @@ -155,8 +159,8 @@ TEST_F(StreamDecoderTest, StreamResetTest) { bool is_complete = false; auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [&is_complete](bool, bool) { is_complete = true; }, - connect_statistic_, latency_statistic_, request_headers_, false, 0, TEST_TRACER_UID, - http_tracer_); + connect_statistic_, latency_statistic_, response_header_size_statistic_, + response_body_size_statistic_, request_headers_, false, 0, TEST_TRACER_UID, http_tracer_); decoder->decodeHeaders(std::move(test_header_), false); decoder->onResetStream(Envoy::Http::StreamResetReason::LocalReset, "fooreason"); EXPECT_TRUE(is_complete); // these do get reported. @@ -167,8 +171,8 @@ TEST_F(StreamDecoderTest, PoolFailureTest) { bool is_complete = false; auto decoder = new StreamDecoder( *dispatcher_, time_system_, *this, [&is_complete](bool, bool) { is_complete = true; }, - connect_statistic_, latency_statistic_, request_headers_, false, 0, TEST_TRACER_UID, - http_tracer_); + connect_statistic_, latency_statistic_, response_header_size_statistic_, + response_body_size_statistic_, request_headers_, false, 0, TEST_TRACER_UID, http_tracer_); Envoy::Upstream::HostDescriptionConstSharedPtr ptr; decoder->onPoolFailure(Envoy::Http::ConnectionPool::PoolFailureReason::Overflow, "fooreason", ptr); diff --git a/test/test_data/hdr_proto_json.gold b/test/test_data/hdr_proto_json.gold index 36ad205eb..434ac4f93 100644 --- a/test/test_data/hdr_proto_json.gold +++ b/test/test_data/hdr_proto_json.gold @@ -1 +1,110 @@ -{"count":"10","mean":"0.000000006s","pstdev":"0.000000003s","percentiles":[{"duration":"0.000000001s","count":"1"},{"duration":"0.000000001s","percentile":0.1,"count":"1"},{"duration":"0.000000002s","percentile":0.2,"count":"2"},{"duration":"0.000000003s","percentile":0.3,"count":"3"},{"duration":"0.000000004s","percentile":0.4,"count":"4"},{"duration":"0.000000005s","percentile":0.5,"count":"5"},{"duration":"0.000000006s","percentile":0.55,"count":"6"},{"duration":"0.000000006s","percentile":0.6,"count":"6"},{"duration":"0.000000007s","percentile":0.65,"count":"7"},{"duration":"0.000000007s","percentile":0.7,"count":"7"},{"duration":"0.000000008s","percentile":0.75,"count":"8"},{"duration":"0.000000008s","percentile":0.775,"count":"8"},{"duration":"0.000000008s","percentile":0.8,"count":"8"},{"duration":"0.000000009s","percentile":0.825,"count":"9"},{"duration":"0.000000009s","percentile":0.85,"count":"9"},{"duration":"0.000000009s","percentile":0.875,"count":"9"},{"duration":"0.000000009s","percentile":0.8875,"count":"9"},{"duration":"0.000000009s","percentile":0.9,"count":"9"},{"duration":"0.000000010s","percentile":0.9125,"count":"10"},{"duration":"0.000000010s","percentile":1,"count":"10"}]} \ No newline at end of file +{ + "count": "10", + "id": "", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "duration": "0.000000001s" + }, + { + "percentile": 0.1, + "count": "1", + "duration": "0.000000001s" + }, + { + "percentile": 0.2, + "count": "2", + "duration": "0.000000002s" + }, + { + "percentile": 0.3, + "count": "3", + "duration": "0.000000003s" + }, + { + "percentile": 0.4, + "count": "4", + "duration": "0.000000004s" + }, + { + "percentile": 0.5, + "count": "5", + "duration": "0.000000005s" + }, + { + "percentile": 0.55, + "count": "6", + "duration": "0.000000006s" + }, + { + "percentile": 0.6, + "count": "6", + "duration": "0.000000006s" + }, + { + "percentile": 0.65, + "count": "7", + "duration": "0.000000007s" + }, + { + "percentile": 0.7, + "count": "7", + "duration": "0.000000007s" + }, + { + "percentile": 0.75, + "count": "8", + "duration": "0.000000008s" + }, + { + "percentile": 0.775, + "count": "8", + "duration": "0.000000008s" + }, + { + "percentile": 0.8, + "count": "8", + "duration": "0.000000008s" + }, + { + "percentile": 0.825, + "count": "9", + "duration": "0.000000009s" + }, + { + "percentile": 0.85, + "count": "9", + "duration": "0.000000009s" + }, + { + "percentile": 0.875, + "count": "9", + "duration": "0.000000009s" + }, + { + "percentile": 0.8875, + "count": "9", + "duration": "0.000000009s" + }, + { + "percentile": 0.9, + "count": "9", + "duration": "0.000000009s" + }, + { + "percentile": 0.9125, + "count": "10", + "duration": "0.000000010s" + }, + { + "percentile": 1, + "count": "10", + "duration": "0.000000010s" + } + ], + "mean": "0.000000006s", + "pstdev": "0.000000003s", + "min": "0.000000001s", + "max": "0.000000010s" +} \ No newline at end of file diff --git a/test/test_data/output_formatter.dotted.gold b/test/test_data/output_formatter.dotted.gold index 1f38cbd18..43152655a 100644 --- a/test/test_data/output_formatter.dotted.gold +++ b/test/test_data/output_formatter.dotted.gold @@ -1,24 +1,114 @@ worker_0.stat_id.samples: 3 worker_0.stat_id.mean: 2000 worker_0.stat_id.pstdev: 816 +worker_0.stat_id.min: 1000 +worker_0.stat_id.max: 3000 worker_0..samples: 0 worker_0..mean: 0 worker_0..pstdev: 0 +worker_0..min: 0 +worker_0..max: 0 +worker_0.foo_size.samples: 4 +worker_0.foo_size.mean: 15.5 +worker_0.foo_size.pstdev: 1.11803 +worker_0.foo_size.min: 14 +worker_0.foo_size.max: 17 +worker_0.foo_size.permilles-0.count: 1 +worker_0.foo_size.permilles-0.value: 14 +worker_0.foo_size.permilles-500.count: 2 +worker_0.foo_size.permilles-500.value: 15 +worker_0.foo_size.permilles-750.count: 3 +worker_0.foo_size.permilles-750.value: 16 +worker_0.foo_size.permilles-1000.count: 4 +worker_0.foo_size.permilles-1000.value: 17 +worker_0.foo_latency.samples: 4 +worker_0.foo_latency.mean: 195 +worker_0.foo_latency.pstdev: 11 +worker_0.foo_latency.min: 180 +worker_0.foo_latency.max: 210 +worker_0.foo_latency.permilles-0.count: 1 +worker_0.foo_latency.permilles-0.microseconds: 180 +worker_0.foo_latency.permilles-500.count: 2 +worker_0.foo_latency.permilles-500.microseconds: 190 +worker_0.foo_latency.permilles-750.count: 3 +worker_0.foo_latency.permilles-750.microseconds: 200 +worker_0.foo_latency.permilles-1000.count: 4 +worker_0.foo_latency.permilles-1000.microseconds: 210 worker_0.bar:2 worker_0.foo:1 worker_1.stat_id.samples: 3 worker_1.stat_id.mean: 2000 worker_1.stat_id.pstdev: 816 +worker_1.stat_id.min: 1000 +worker_1.stat_id.max: 3000 worker_1..samples: 0 worker_1..mean: 0 worker_1..pstdev: 0 +worker_1..min: 0 +worker_1..max: 0 +worker_1.foo_size.samples: 4 +worker_1.foo_size.mean: 15.5 +worker_1.foo_size.pstdev: 1.11803 +worker_1.foo_size.min: 14 +worker_1.foo_size.max: 17 +worker_1.foo_size.permilles-0.count: 1 +worker_1.foo_size.permilles-0.value: 14 +worker_1.foo_size.permilles-500.count: 2 +worker_1.foo_size.permilles-500.value: 15 +worker_1.foo_size.permilles-750.count: 3 +worker_1.foo_size.permilles-750.value: 16 +worker_1.foo_size.permilles-1000.count: 4 +worker_1.foo_size.permilles-1000.value: 17 +worker_1.foo_latency.samples: 4 +worker_1.foo_latency.mean: 195 +worker_1.foo_latency.pstdev: 11 +worker_1.foo_latency.min: 180 +worker_1.foo_latency.max: 210 +worker_1.foo_latency.permilles-0.count: 1 +worker_1.foo_latency.permilles-0.microseconds: 180 +worker_1.foo_latency.permilles-500.count: 2 +worker_1.foo_latency.permilles-500.microseconds: 190 +worker_1.foo_latency.permilles-750.count: 3 +worker_1.foo_latency.permilles-750.microseconds: 200 +worker_1.foo_latency.permilles-1000.count: 4 +worker_1.foo_latency.permilles-1000.microseconds: 210 worker_1.bar:2 worker_1.foo:1 global.stat_id.samples: 3 global.stat_id.mean: 2000 global.stat_id.pstdev: 816 +global.stat_id.min: 1000 +global.stat_id.max: 3000 global..samples: 0 global..mean: 0 global..pstdev: 0 +global..min: 0 +global..max: 0 +global.foo_size.samples: 4 +global.foo_size.mean: 15.5 +global.foo_size.pstdev: 1.11803 +global.foo_size.min: 14 +global.foo_size.max: 17 +global.foo_size.permilles-0.count: 1 +global.foo_size.permilles-0.value: 14 +global.foo_size.permilles-500.count: 2 +global.foo_size.permilles-500.value: 15 +global.foo_size.permilles-750.count: 3 +global.foo_size.permilles-750.value: 16 +global.foo_size.permilles-1000.count: 4 +global.foo_size.permilles-1000.value: 17 +global.foo_latency.samples: 4 +global.foo_latency.mean: 195 +global.foo_latency.pstdev: 11 +global.foo_latency.min: 180 +global.foo_latency.max: 210 +global.foo_latency.permilles-0.count: 1 +global.foo_latency.permilles-0.microseconds: 180 +global.foo_latency.permilles-500.count: 2 +global.foo_latency.permilles-500.microseconds: 190 +global.foo_latency.permilles-750.count: 3 +global.foo_latency.permilles-750.microseconds: 200 +global.foo_latency.permilles-1000.count: 4 +global.foo_latency.permilles-1000.microseconds: 210 global.bar:2 global.foo:1 diff --git a/test/test_data/output_formatter.json.gold b/test/test_data/output_formatter.json.gold index a56e7d5d4..69b50ba3f 100644 --- a/test/test_data/output_formatter.json.gold +++ b/test/test_data/output_formatter.json.gold @@ -15,14 +15,168 @@ "id": "stat_id", "percentiles": [], "mean": "0.002s", - "pstdev": "0.000816497s" + "pstdev": "0.000816497s", + "min": "0.001s", + "max": "0.003s" }, { "count": "0", "id": "", "percentiles": [], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" + }, + { + "count": "4", + "id": "foo_size", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.1, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.2, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.3, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.4, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.5, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.55, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.6, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.65, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.7, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.75, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.775, + "count": "4", + "raw_value": 17 + }, + { + "percentile": 1, + "count": "4", + "raw_value": 17 + } + ], + "raw_mean": 15.5, + "raw_pstdev": 1.1180339887498949, + "raw_min": "14", + "raw_max": "17" + }, + { + "count": "4", + "id": "foo_latency", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.1, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.2, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.3, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.4, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.5, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.55, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.6, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.65, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.7, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.75, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.775, + "count": "4", + "duration": "0.000210007s" + }, + { + "percentile": 1, + "count": "4", + "duration": "0.000210007s" + } + ], + "mean": "0.000195004s", + "pstdev": "0.000011180s", + "min": "0.000180007s", + "max": "0.000210007s" } ], "counters": [ @@ -45,14 +199,168 @@ "id": "stat_id", "percentiles": [], "mean": "0.002s", - "pstdev": "0.000816497s" + "pstdev": "0.000816497s", + "min": "0.001s", + "max": "0.003s" }, { "count": "0", "id": "", "percentiles": [], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" + }, + { + "count": "4", + "id": "foo_size", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.1, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.2, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.3, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.4, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.5, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.55, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.6, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.65, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.7, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.75, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.775, + "count": "4", + "raw_value": 17 + }, + { + "percentile": 1, + "count": "4", + "raw_value": 17 + } + ], + "raw_mean": 15.5, + "raw_pstdev": 1.1180339887498949, + "raw_min": "14", + "raw_max": "17" + }, + { + "count": "4", + "id": "foo_latency", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.1, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.2, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.3, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.4, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.5, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.55, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.6, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.65, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.7, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.75, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.775, + "count": "4", + "duration": "0.000210007s" + }, + { + "percentile": 1, + "count": "4", + "duration": "0.000210007s" + } + ], + "mean": "0.000195004s", + "pstdev": "0.000011180s", + "min": "0.000180007s", + "max": "0.000210007s" } ], "counters": [ @@ -75,14 +383,168 @@ "id": "stat_id", "percentiles": [], "mean": "0.002s", - "pstdev": "0.000816497s" + "pstdev": "0.000816497s", + "min": "0.001s", + "max": "0.003s" }, { "count": "0", "id": "", "percentiles": [], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" + }, + { + "count": "4", + "id": "foo_size", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.1, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.2, + "count": "1", + "raw_value": 14 + }, + { + "percentile": 0.3, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.4, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.5, + "count": "2", + "raw_value": 15 + }, + { + "percentile": 0.55, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.6, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.65, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.7, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.75, + "count": "3", + "raw_value": 16 + }, + { + "percentile": 0.775, + "count": "4", + "raw_value": 17 + }, + { + "percentile": 1, + "count": "4", + "raw_value": 17 + } + ], + "raw_mean": 15.5, + "raw_pstdev": 1.1180339887498949, + "raw_min": "14", + "raw_max": "17" + }, + { + "count": "4", + "id": "foo_latency", + "percentiles": [ + { + "percentile": 0, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.1, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.2, + "count": "1", + "duration": "0.000180007s" + }, + { + "percentile": 0.3, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.4, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.5, + "count": "2", + "duration": "0.000190007s" + }, + { + "percentile": 0.55, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.6, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.65, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.7, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.75, + "count": "3", + "duration": "0.000200007s" + }, + { + "percentile": 0.775, + "count": "4", + "duration": "0.000210007s" + }, + { + "percentile": 1, + "count": "4", + "duration": "0.000210007s" + } + ], + "mean": "0.000195004s", + "pstdev": "0.000011180s", + "min": "0.000180007s", + "max": "0.000210007s" } ], "counters": [ diff --git a/test/test_data/output_formatter.medium.fortio.gold b/test/test_data/output_formatter.medium.fortio.gold index 133222dc5..258b4dd50 100644 --- a/test/test_data/output_formatter.medium.fortio.gold +++ b/test/test_data/output_formatter.medium.fortio.gold @@ -1,234 +1,481 @@ { - "Labels": "Nighthawk", - "RequestedQPS": 12, - "ActualQPS": 12.000240004800096, - "ActualDuration": 4999900000, - "NumThreads": 12, + "Labels": "label-a label-b Nighthawk", + "RequestedQPS": 30, + "ActualQPS": 27.99999399400129, + "ActualDuration": 2000000429, + "NumThreads": 300, "DurationHistogram": { - "Count": "48", + "Count": "53", "Data": [ { - "Start": 0.055568383, - "End": 0.055568383, + "Start": 0.053798911, + "End": 0.053798911, "Percent": 0, "Count": "1" }, { - "Start": 0.055568383, - "End": 0.056922111, + "Start": 0.053798911, + "End": 0.056340479, "Percent": 10, - "Count": "4" + "Count": "5" }, { - "Start": 0.056922111, - "End": 0.057884671, + "Start": 0.056340479, + "End": 0.057706495, "Percent": 20, "Count": "5" }, { - "Start": 0.057884671, - "End": 0.059041791, + "Start": 0.057706495, + "End": 0.060055551, "Percent": 30, "Count": "5" }, { - "Start": 0.059041791, - "End": 0.060086271, + "Start": 0.060055551, + "End": 0.062949375, "Percent": 40, - "Count": "5" + "Count": "6" }, { - "Start": 0.060086271, - "End": 0.060903423, + "Start": 0.062949375, + "End": 0.065077247, "Percent": 50, - "Count": "4" + "Count": "5" }, { - "Start": 0.060903423, - "End": 0.061583359, + "Start": 0.065077247, + "End": 0.066666495, "Percent": 55.000000000000007, "Count": "3" }, { - "Start": 0.061583359, - "End": 0.061976575, + "Start": 0.066666495, + "End": 0.067948543, "Percent": 60, "Count": "2" }, { - "Start": 0.061976575, - "End": 0.063830015, + "Start": 0.067948543, + "End": 0.068751359, "Percent": 65, "Count": "3" }, { - "Start": 0.063830015, - "End": 0.064684031, + "Start": 0.068751359, + "End": 0.072949759, "Percent": 70, - "Count": "2" + "Count": "3" }, { - "Start": 0.064684031, - "End": 0.065679359, + "Start": 0.072949759, + "End": 0.074465279, "Percent": 75, "Count": "2" }, { - "Start": 0.065679359, - "End": 0.066537471, + "Start": 0.074465279, + "End": 0.075792383, "Percent": 77.5, "Count": "2" }, { - "Start": 0.066537471, - "End": 0.066994175, + "Start": 0.075792383, + "End": 0.078065663, "Percent": 80, "Count": "1" }, { - "Start": 0.066994175, - "End": 0.067194879, + "Start": 0.078065663, + "End": 0.078168063, "Percent": 82.5, "Count": "1" }, { - "Start": 0.067194879, - "End": 0.067563519, + "Start": 0.078168063, + "End": 0.080400383, "Percent": 85, - "Count": "1" + "Count": "2" }, { - "Start": 0.067563519, - "End": 0.067862527, + "Start": 0.080400383, + "End": 0.082427903, "Percent": 87.5, "Count": "1" }, { - "Start": 0.067862527, - "End": 0.068161535, + "Start": 0.082427903, + "End": 0.085045247, "Percent": 88.75, "Count": "1" }, { - "Start": 0.068161535, - "End": 0.068657151, + "Start": 0.085045247, + "End": 0.085045247, "Percent": 90, - "Count": "1" + "Count": "0" }, { - "Start": 0.068657151, - "End": 0.068657151, + "Start": 0.085045247, + "End": 0.085626879, "Percent": 91.25, - "Count": "0" + "Count": "1" }, { - "Start": 0.068657151, - "End": 0.069509119, + "Start": 0.085626879, + "End": 0.090656767, "Percent": 92.5, "Count": "1" }, { - "Start": 0.069509119, - "End": 0.069509119, + "Start": 0.090656767, + "End": 0.090656767, "Percent": 93.75, "Count": "0" }, { - "Start": 0.069509119, - "End": 0.073601023, + "Start": 0.090656767, + "End": 0.247513087, "Percent": 94.375, "Count": "1" }, { - "Start": 0.073601023, - "End": 0.073601023, + "Start": 0.247513087, + "End": 0.247513087, "Percent": 95, "Count": "0" }, { - "Start": 0.073601023, - "End": 0.073601023, + "Start": 0.247513087, + "End": 0.247513087, "Percent": 95.625, "Count": "0" }, { - "Start": 0.073601023, - "End": 0.079327231, + "Start": 0.247513087, + "End": 0.281362431, "Percent": 96.25, "Count": "1" }, { - "Start": 0.079327231, - "End": 0.079327231, + "Start": 0.281362431, + "End": 0.281362431, "Percent": 96.875, "Count": "0" }, { - "Start": 0.079327231, - "End": 0.079327231, + "Start": 0.281362431, + "End": 0.281362431, "Percent": 97.1875, "Count": "0" }, { - "Start": 0.079327231, - "End": 0.079327231, + "Start": 0.281362431, + "End": 0.281362431, "Percent": 97.5, "Count": "0" }, { - "Start": 0.079327231, - "End": 0.079327231, + "Start": 0.281362431, + "End": 0.281362431, "Percent": 97.8125, "Count": "0" }, { - "Start": 0.079327231, - "End": 0.084357119, + "Start": 0.281362431, + "End": 0.310886399, "Percent": 98.125, "Count": "1" }, { - "Start": 0.084357119, - "End": 0.084357119, + "Start": 0.310886399, + "End": 0.310886399, "Percent": 100, "Count": "0" } ], - "Min": 0.055568383, - "Max": 0.084357119, - "Sum": 3.0043125600000002, - "Avg": 0.062589845, - "StdDev": 0.005785869, + "Min": 0.053798911, + "Max": 0.310886399, + "Sum": 4.156954618, + "Avg": 0.078433106, + "StdDev": 0.05052302, "Percentiles": [ { "Percentile": 50, - "Value": 0.060903423 + "Value": 0.065077247 }, { "Percentile": 75, - "Value": 0.065679359 + "Value": 0.074465279 }, { "Percentile": 80, - "Value": 0.066994175 + "Value": 0.078065663 }, { "Percentile": 90, - "Value": 0.068657151 + "Value": 0.085045247 }, { "Percentile": 95, - "Value": 0.073601023 + "Value": 0.247513087 } ] }, "RetCodes": { - "200": "48" + "200": "53" }, - "URL": "http://127.0.0.1:10000/", - "Version": "9.9.9", + "URL": "https://www.google.com/", + "Version": "0.0.0", "Jitter": true, "RunType": "HTTP", - "StartTime": "2019-10-16T00:30:12.911078318Z", - "RequestedDuration": "5s" + "Sizes": { + "Count": "56", + "Data": [ + { + "Start": 847, + "End": 847, + "Percent": 0, + "Count": "56" + }, + { + "Start": 847, + "End": 847, + "Percent": 100, + "Count": "0" + } + ], + "Min": 847, + "Max": 847, + "Sum": 47432, + "Avg": 847, + "StdDev": 0, + "Percentiles": [] + }, + "HeaderSizes": { + "Count": "56", + "Data": [ + { + "Start": 47257, + "End": 47257, + "Percent": 0, + "Count": "1" + }, + { + "Start": 47257, + "End": 47289, + "Percent": 10, + "Count": "5" + }, + { + "Start": 47289, + "End": 47299, + "Percent": 20, + "Count": "6" + }, + { + "Start": 47299, + "End": 47305, + "Percent": 30, + "Count": "5" + }, + { + "Start": 47305, + "End": 47311, + "Percent": 40, + "Count": "7" + }, + { + "Start": 47311, + "End": 47317, + "Percent": 50, + "Count": "7" + }, + { + "Start": 47317, + "End": 47317, + "Percent": 55.000000000000007, + "Count": "0" + }, + { + "Start": 47317, + "End": 47321, + "Percent": 60, + "Count": "4" + }, + { + "Start": 47321, + "End": 47323, + "Percent": 65, + "Count": "2" + }, + { + "Start": 47323, + "End": 47327, + "Percent": 70, + "Count": "5" + }, + { + "Start": 47327, + "End": 47327, + "Percent": 75, + "Count": "0" + }, + { + "Start": 47327, + "End": 47329, + "Percent": 77.5, + "Count": "2" + }, + { + "Start": 47329, + "End": 47331, + "Percent": 80, + "Count": "3" + }, + { + "Start": 47331, + "End": 47331, + "Percent": 82.5, + "Count": "0" + }, + { + "Start": 47331, + "End": 47333, + "Percent": 85, + "Count": "2" + }, + { + "Start": 47333, + "End": 47333, + "Percent": 87.5, + "Count": "0" + }, + { + "Start": 47333, + "End": 47335, + "Percent": 88.75, + "Count": "1" + }, + { + "Start": 47335, + "End": 47339, + "Percent": 90, + "Count": "1" + }, + { + "Start": 47339, + "End": 47341, + "Percent": 91.25, + "Count": "1" + }, + { + "Start": 47341, + "End": 47341, + "Percent": 92.5, + "Count": "0" + }, + { + "Start": 47341, + "End": 47347, + "Percent": 93.75, + "Count": "1" + }, + { + "Start": 47347, + "End": 47347, + "Percent": 94.375, + "Count": "0" + }, + { + "Start": 47347, + "End": 47353, + "Percent": 95, + "Count": "2" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 95.625, + "Count": "0" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 96.25, + "Count": "0" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 96.875, + "Count": "0" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 97.1875, + "Count": "0" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 97.5, + "Count": "0" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 97.8125, + "Count": "0" + }, + { + "Start": 47353, + "End": 47353, + "Percent": 98.125, + "Count": "0" + }, + { + "Start": 47353, + "End": 47357, + "Percent": 98.4375, + "Count": "1" + }, + { + "Start": 47357, + "End": 47357, + "Percent": 100, + "Count": "0" + } + ], + "Min": 47257, + "Max": 47357, + "Sum": 2649612, + "Avg": 47314.5, + "StdDev": 20.799210149838451, + "Percentiles": [ + { + "Percentile": 50, + "Value": 47317 + }, + { + "Percentile": 75, + "Value": 47327 + }, + { + "Percentile": 80, + "Value": 47331 + }, + { + "Percentile": 90, + "Value": 47339 + }, + { + "Percentile": 95, + "Value": 47353 + } + ] + }, + "StartTime": "2020-01-11T12:47:57.259885200Z", + "RequestedDuration": "2s" } diff --git a/test/test_data/output_formatter.medium.proto.gold b/test/test_data/output_formatter.medium.proto.gold index 3138b4b4d..6ee44e3d1 100644 --- a/test/test_data/output_formatter.medium.proto.gold +++ b/test/test_data/output_formatter.medium.proto.gold @@ -14,6 +14,7 @@ "request_headers": [], "request_body_size": 0 }, + "labels": ["label-a","label-b"], "tls_context": { "sni": "", "allow_renegotiation": false @@ -21,19 +22,31 @@ "sequencer_idle_strategy": { "value": "SPIN" }, - "requests_per_second": 1, - "connections": 1, - "duration": "5s", + "experimental_h1_connection_reuse_strategy": { + "value": "MRU" + }, + "termination_predicates": {}, + "failure_predicates": { + "benchmark.http_4xx": "0", + "benchmark.http_5xx": "0", + "benchmark.pool_connection_failure": "0" + }, + "labels": [], + "requests_per_second": 10, + "connections": 100, + "duration": "2s", "timeout": "30s", "h2": false, - "concurrency": "auto", + "concurrency": "3", "prefetch_connections": false, "burst_size": 0, - "max_pending_requests": 1, - "max_active_requests": 4294937295, + "max_pending_requests": 0, + "max_active_requests": 100, "max_requests_per_connection": 4294937295, - "uri": "http://127.0.0.1:10000/", + "uri": "https://www.google.com/", "trace": "", + "open_loop": false, + "experimental_h2_use_multiple_connections": false, "labels": "Nighthawk", "jitter_uniform": "0.000000494s", }, @@ -42,393 +55,404 @@ "name": "worker_0", "statistics": [ { - "count": "4", + "count": "17", "id": "benchmark_http_client.queue_to_connect", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.000031494s" + "duration": "0.000015223s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.000031494s" + "count": "2", + "duration": "0.000015299s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.000031494s" + "count": "4", + "duration": "0.000015807s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.000032591s" + "count": "6", + "duration": "0.000016523s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.000032591s" + "count": "7", + "duration": "0.000016530s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.000032591s" + "count": "9", + "duration": "0.000020383s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.000048189s" + "count": "10", + "duration": "0.000020396s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.000048189s" + "count": "11", + "duration": "0.000020599s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.000048189s" + "count": "12", + "duration": "0.000022170s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.000048189s" + "count": "12", + "duration": "0.000022170s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.000048189s" + "count": "13", + "duration": "0.000023820s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.000117091s" + "count": "14", + "duration": "0.000028563s" + }, + { + "percentile": 0.8, + "count": "14", + "duration": "0.000028563s" + }, + { + "percentile": 0.825, + "count": "15", + "duration": "0.000035737s" + }, + { + "percentile": 0.85, + "count": "15", + "duration": "0.000035737s" + }, + { + "percentile": 0.875, + "count": "15", + "duration": "0.000035737s" + }, + { + "percentile": 0.8875, + "count": "16", + "duration": "0.000041053s" + }, + { + "percentile": 0.9, + "count": "16", + "duration": "0.000041053s" + }, + { + "percentile": 0.9125, + "count": "16", + "duration": "0.000041053s" + }, + { + "percentile": 0.925, + "count": "16", + "duration": "0.000041053s" + }, + { + "percentile": 0.9375, + "count": "16", + "duration": "0.000041053s" + }, + { + "percentile": 0.94375, + "count": "17", + "duration": "0.210903039s" }, { "percentile": 1, - "count": "4", - "duration": "0.000117091s" + "count": "17", + "duration": "0.210903039s" } ], - "mean": "0.000057341s", - "pstdev": "0.000035122s" + "mean": "0.012425896s", + "pstdev": "0.049618263s", + "min": "0.000015223s", + "max": "0.210903039s" }, { - "count": "4", + "count": "17", "id": "benchmark_http_client.request_to_response", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.059297791s" + "duration": "0.054640639s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.059297791s" + "count": "2", + "duration": "0.056340479s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.059297791s" + "count": "4", + "duration": "0.056823807s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.059312127s" + "count": "6", + "duration": "0.059262975s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.059312127s" + "count": "7", + "duration": "0.059432959s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.059312127s" + "count": "9", + "duration": "0.062140415s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.061976575s" + "count": "10", + "duration": "0.064509951s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.061976575s" + "count": "11", + "duration": "0.065652735s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.061976575s" + "count": "12", + "duration": "0.067420159s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.061976575s" + "count": "12", + "duration": "0.067420159s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.061976575s" + "count": "13", + "duration": "0.072949759s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.084357119s" + "count": "14", + "duration": "0.075493375s" }, { - "percentile": 1, - "count": "4", - "duration": "0.084357119s" - } - ], - "mean": "0.066234624s", - "pstdev": "0.010518547s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.059402239s" + "percentile": 0.8, + "count": "14", + "duration": "0.075493375s" }, { - "percentile": 0.1, - "count": "1", - "duration": "0.059402239s" + "percentile": 0.825, + "count": "15", + "duration": "0.078065663s" }, { - "percentile": 0.2, - "count": "1", - "duration": "0.059402239s" + "percentile": 0.85, + "count": "15", + "duration": "0.078065663s" }, { - "percentile": 0.3, - "count": "2", - "duration": "0.059541503s" + "percentile": 0.875, + "count": "15", + "duration": "0.078065663s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.059541503s" + "percentile": 0.8875, + "count": "16", + "duration": "0.082427903s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.059541503s" + "percentile": 0.9, + "count": "16", + "duration": "0.082427903s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.062064639s" + "percentile": 0.9125, + "count": "16", + "duration": "0.082427903s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.062064639s" + "percentile": 0.925, + "count": "16", + "duration": "0.082427903s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.062064639s" + "percentile": 0.9375, + "count": "16", + "duration": "0.082427903s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.062064639s" + "percentile": 0.94375, + "count": "17", + "duration": "0.310886399s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.062064639s" - }, + "percentile": 1, + "count": "17", + "duration": "0.310886399s" + } + ], + "mean": "0.078798788s", + "pstdev": "0.058588866s", + "min": "0.054640639s", + "max": "0.310886399s" + }, + { + "count": "18", + "id": "benchmark_http_client.response_body_size", + "percentiles": [ { - "percentile": 0.775, - "count": "4", - "duration": "0.084479999s" + "percentile": 0, + "count": "18", + "raw_value": 847 }, { "percentile": 1, - "count": "4", - "duration": "0.084479999s" + "count": "18", + "raw_value": 847 } ], - "mean": "0.066370816s", - "pstdev": "0.010507725s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_1", - "statistics": [ + "raw_mean": 847, + "raw_pstdev": 0, + "raw_min": "847", + "raw_max": "847" + }, { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", + "count": "18", + "id": "benchmark_http_client.response_header_size", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.000033313s" + "raw_value": 47281 }, { "percentile": 0.1, - "count": "1", - "duration": "0.000033313s" + "count": "2", + "raw_value": 47295 }, { "percentile": 0.2, - "count": "1", - "duration": "0.000033313s" + "count": "4", + "raw_value": 47305 }, { "percentile": 0.3, - "count": "2", - "duration": "0.000035465s" + "count": "6", + "raw_value": 47313 }, { "percentile": 0.4, - "count": "2", - "duration": "0.000035465s" + "count": "8", + "raw_value": 47319 }, { "percentile": 0.5, - "count": "2", - "duration": "0.000035465s" + "count": "9", + "raw_value": 47323 }, { "percentile": 0.55, - "count": "3", - "duration": "0.000051897s" + "count": "10", + "raw_value": 47325 }, { "percentile": 0.6, - "count": "3", - "duration": "0.000051897s" + "count": "11", + "raw_value": 47327 }, { "percentile": 0.65, - "count": "3", - "duration": "0.000051897s" + "count": "12", + "raw_value": 47329 }, { "percentile": 0.7, - "count": "3", - "duration": "0.000051897s" + "count": "14", + "raw_value": 47331 }, { "percentile": 0.75, - "count": "3", - "duration": "0.000051897s" + "count": "14", + "raw_value": 47331 }, { "percentile": 0.775, - "count": "4", - "duration": "0.000070355s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000070355s" - } - ], - "mean": "0.000047757s", - "pstdev": "0.000014895s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.064684031s" + "count": "14", + "raw_value": 47331 }, { - "percentile": 0.1, - "count": "1", - "duration": "0.064684031s" + "percentile": 0.8, + "count": "15", + "raw_value": 47335 }, { - "percentile": 0.2, - "count": "1", - "duration": "0.064684031s" + "percentile": 0.825, + "count": "15", + "raw_value": 47335 }, { - "percentile": 0.3, - "count": "2", - "duration": "0.065081343s" + "percentile": 0.85, + "count": "16", + "raw_value": 47339 }, { - "percentile": 0.4, - "count": "2", - "duration": "0.065081343s" + "percentile": 0.875, + "count": "16", + "raw_value": 47339 }, { - "percentile": 0.5, - "count": "2", - "duration": "0.065081343s" + "percentile": 0.8875, + "count": "16", + "raw_value": 47339 }, { - "percentile": 0.55, - "count": "3", - "duration": "0.066537471s" + "percentile": 0.9, + "count": "17", + "raw_value": 47341 }, { - "percentile": 0.6, - "count": "3", - "duration": "0.066537471s" + "percentile": 0.9125, + "count": "17", + "raw_value": 47341 }, { - "percentile": 0.65, - "count": "3", - "duration": "0.066537471s" + "percentile": 0.925, + "count": "17", + "raw_value": 47341 }, { - "percentile": 0.7, - "count": "3", - "duration": "0.066537471s" + "percentile": 0.9375, + "count": "17", + "raw_value": 47341 }, { - "percentile": 0.75, - "count": "3", - "duration": "0.066537471s" + "percentile": 0.94375, + "count": "17", + "raw_value": 47341 }, { - "percentile": 0.775, - "count": "4", - "duration": "0.068657151s" + "percentile": 0.95, + "count": "18", + "raw_value": 47347 }, { "percentile": 1, - "count": "4", - "duration": "0.068657151s" + "count": "18", + "raw_value": 47347 } ], - "mean": "0.066238720s", - "pstdev": "0.001556413s" + "raw_mean": 47320.333333333336, + "raw_pstdev": 16.996731711975951, + "raw_min": "47281", + "raw_max": "47347" }, { "count": "0", @@ -441,480 +465,625 @@ } ], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" }, { - "count": "4", + "count": "19", "id": "sequencer.callback", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.064784383s" + "duration": "0.000025572s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.064784383s" + "count": "2", + "duration": "0.000026533s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.064784383s" + "count": "4", + "duration": "0.056373247s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.065179647s" + "count": "6", + "duration": "0.056858623s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.065179647s" + "count": "8", + "duration": "0.059303935s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.065179647s" + "count": "10", + "duration": "0.060092415s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.066721791s" + "count": "11", + "duration": "0.062197759s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.066721791s" + "count": "12", + "duration": "0.064542719s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.066721791s" + "count": "13", + "duration": "0.065714175s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.066721791s" + "count": "14", + "duration": "0.067452927s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.066721791s" + "count": "15", + "duration": "0.072994815s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.068780031s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.068780031s" - } - ], - "mean": "0.066365184s", - "pstdev": "0.001569883s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_2", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.000031796s" + "count": "15", + "duration": "0.072994815s" }, { - "percentile": 0.1, - "count": "1", - "duration": "0.000031796s" + "percentile": 0.8, + "count": "16", + "duration": "0.075526143s" }, { - "percentile": 0.2, - "count": "1", - "duration": "0.000031796s" + "percentile": 0.825, + "count": "16", + "duration": "0.075526143s" }, { - "percentile": 0.3, - "count": "2", - "duration": "0.000040337s" + "percentile": 0.85, + "count": "17", + "duration": "0.078168063s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.000040337s" + "percentile": 0.875, + "count": "17", + "duration": "0.078168063s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.000040337s" + "percentile": 0.8875, + "count": "17", + "duration": "0.078168063s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.000042679s" + "percentile": 0.9, + "count": "18", + "duration": "0.293371903s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.000042679s" + "percentile": 0.9125, + "count": "18", + "duration": "0.293371903s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.000042679s" + "percentile": 0.925, + "count": "18", + "duration": "0.293371903s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.000042679s" + "percentile": 0.9375, + "count": "18", + "duration": "0.293371903s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.000042679s" + "percentile": 0.94375, + "count": "18", + "duration": "0.293371903s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.000053019s" + "percentile": 0.95, + "count": "19", + "duration": "0.310935551s" }, { "percentile": 1, - "count": "4", - "duration": "0.000053019s" + "count": "19", + "duration": "0.310935551s" } ], - "mean": "0.000041958s", - "pstdev": "0.000007562s" + "mean": "0.081648149s", + "pstdev": "0.078351068s", + "min": "0.000025572s", + "max": "0.310935551s" + } + ], + "counters": [ + { + "name": "benchmark.http_2xx", + "value": "18" }, { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.058099711s" - }, - { - "percentile": 0.1, + "name": "benchmark.pool_overflow", + "value": "2" + }, + { + "name": "default.total_match_count", + "value": "1" + }, + { + "name": "membership_change", + "value": "1" + }, + { + "name": "ssl.ciphers.ECDHE-RSA-AES128-GCM-SHA256", + "value": "2" + }, + { + "name": "ssl.curves.X25519", + "value": "2" + }, + { + "name": "ssl.handshake", + "value": "2" + }, + { + "name": "ssl.session_reused", + "value": "1" + }, + { + "name": "ssl.sigalgs.rsa_pss_rsae_sha256", + "value": "2" + }, + { + "name": "ssl.versions.TLSv1.2", + "value": "2" + }, + { + "name": "upstream_cx_http1_total", + "value": "2" + }, + { + "name": "upstream_cx_rx_bytes_total", + "value": "868631" + }, + { + "name": "upstream_cx_total", + "value": "2" + }, + { + "name": "upstream_cx_tx_bytes_total", + "value": "1134" + }, + { + "name": "upstream_rq_pending_overflow", + "value": "2" + }, + { + "name": "upstream_rq_pending_total", + "value": "2" + }, + { + "name": "upstream_rq_total", + "value": "18" + } + ], + "execution_duration": "1.999999950s" + }, + { + "name": "worker_1", + "statistics": [ + { + "count": "18", + "id": "benchmark_http_client.queue_to_connect", + "percentiles": [ + { + "percentile": 0, "count": "1", - "duration": "0.058099711s" + "duration": "0.000015953s" + }, + { + "percentile": 0.1, + "count": "2", + "duration": "0.000016106s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.058099711s" + "count": "4", + "duration": "0.000016664s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.058902527s" + "count": "6", + "duration": "0.000017434s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.058902527s" + "count": "8", + "duration": "0.000017869s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.058902527s" + "count": "9", + "duration": "0.000018072s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.061583359s" + "count": "10", + "duration": "0.000018518s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.061583359s" + "count": "11", + "duration": "0.000018829s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.061583359s" + "count": "12", + "duration": "0.000020925s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.061583359s" + "count": "13", + "duration": "0.000022794s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.061583359s" + "count": "14", + "duration": "0.000028375s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.067194879s" + "count": "14", + "duration": "0.000028375s" }, { - "percentile": 1, - "count": "4", - "duration": "0.067194879s" - } - ], - "mean": "0.061443840s", - "pstdev": "0.003561025s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ + "percentile": 0.8, + "count": "15", + "duration": "0.000031623s" + }, + { + "percentile": 0.825, + "count": "15", + "duration": "0.000031623s" + }, + { + "percentile": 0.85, + "count": "16", + "duration": "0.000036293s" + }, + { + "percentile": 0.875, + "count": "16", + "duration": "0.000036293s" + }, + { + "percentile": 0.8875, + "count": "16", + "duration": "0.000036293s" + }, + { + "percentile": 0.9, + "count": "17", + "duration": "0.000040295s" + }, + { + "percentile": 0.9125, + "count": "17", + "duration": "0.000040295s" + }, + { + "percentile": 0.925, + "count": "17", + "duration": "0.000040295s" + }, + { + "percentile": 0.9375, + "count": "17", + "duration": "0.000040295s" + }, + { + "percentile": 0.94375, + "count": "17", + "duration": "0.000040295s" + }, + { + "percentile": 0.95, + "count": "18", + "duration": "0.181387263s" + }, { "percentile": 1, - "count": "0", - "duration": "0s" + "count": "18", + "duration": "0.181387263s" } ], - "mean": "0s", - "pstdev": "0s" + "mean": "0.010097459s", + "pstdev": "0.041542887s", + "min": "0.000015953s", + "max": "0.181387263s" }, { - "count": "4", - "id": "sequencer.callback", + "count": "18", + "id": "benchmark_http_client.request_to_response", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.058212351s" + "duration": "0.053798911s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.058212351s" + "count": "2", + "duration": "0.055005183s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.058212351s" + "count": "4", + "duration": "0.058863615s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.059029503s" + "count": "6", + "duration": "0.061591551s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.059029503s" + "count": "8", + "duration": "0.065077247s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.059029503s" + "count": "9", + "duration": "0.066506751s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.061698047s" + "count": "10", + "duration": "0.067948543s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.061698047s" + "count": "11", + "duration": "0.068075519s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.061698047s" + "count": "12", + "duration": "0.068517887s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.061698047s" + "count": "13", + "duration": "0.073727999s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.061698047s" + "count": "14", + "duration": "0.078712831s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.067289087s" + "count": "14", + "duration": "0.078712831s" }, { - "percentile": 1, - "count": "4", - "duration": "0.067289087s" - } - ], - "mean": "0.061555968s", - "pstdev": "0.003551052s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_3", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.000032588s" + "percentile": 0.8, + "count": "15", + "duration": "0.080400383s" }, { - "percentile": 0.1, - "count": "1", - "duration": "0.000032588s" + "percentile": 0.825, + "count": "15", + "duration": "0.080400383s" }, { - "percentile": 0.2, - "count": "1", - "duration": "0.000032588s" + "percentile": 0.85, + "count": "16", + "duration": "0.085045247s" }, { - "percentile": 0.3, - "count": "2", - "duration": "0.000040265s" + "percentile": 0.875, + "count": "16", + "duration": "0.085045247s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.000040265s" + "percentile": 0.8875, + "count": "16", + "duration": "0.085045247s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.000040265s" + "percentile": 0.9, + "count": "17", + "duration": "0.085626879s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.000041157s" + "percentile": 0.9125, + "count": "17", + "duration": "0.085626879s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.000041157s" + "percentile": 0.925, + "count": "17", + "duration": "0.085626879s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.000041157s" + "percentile": 0.9375, + "count": "17", + "duration": "0.085626879s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.000041157s" + "percentile": 0.94375, + "count": "17", + "duration": "0.085626879s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.000041157s" + "percentile": 0.95, + "count": "18", + "duration": "0.281362431s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.000043807s" + "percentile": 1, + "count": "18", + "duration": "0.281362431s" + } + ], + "mean": "0.079610937s", + "pstdev": "0.049821561s", + "min": "0.053798911s", + "max": "0.281362431s" + }, + { + "count": "19", + "id": "benchmark_http_client.response_body_size", + "percentiles": [ + { + "percentile": 0, + "count": "19", + "raw_value": 847 }, { "percentile": 1, - "count": "4", - "duration": "0.000043807s" + "count": "19", + "raw_value": 847 } ], - "mean": "0.000039454s", - "pstdev": "0.000004173s" + "raw_mean": 847, + "raw_pstdev": 0, + "raw_min": "847", + "raw_max": "847" }, { - "count": "4", - "id": "benchmark_http_client.request_to_response", + "count": "19", + "id": "benchmark_http_client.response_header_size", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.056578047s" + "raw_value": 47257 }, { "percentile": 0.1, - "count": "1", - "duration": "0.056578047s" + "count": "2", + "raw_value": 47259 }, { "percentile": 0.2, - "count": "1", - "duration": "0.056578047s" + "count": "4", + "raw_value": 47289 }, { "percentile": 0.3, - "count": "2", - "duration": "0.058265599s" + "count": "7", + "raw_value": 47301 }, { "percentile": 0.4, - "count": "2", - "duration": "0.058265599s" + "count": "9", + "raw_value": 47305 }, { "percentile": 0.5, - "count": "2", - "duration": "0.058265599s" + "count": "11", + "raw_value": 47309 }, { "percentile": 0.55, - "count": "3", - "duration": "0.061620223s" + "count": "11", + "raw_value": 47309 }, { "percentile": 0.6, - "count": "3", - "duration": "0.061620223s" + "count": "12", + "raw_value": 47311 }, { "percentile": 0.65, - "count": "3", - "duration": "0.061620223s" + "count": "13", + "raw_value": 47313 }, { "percentile": 0.7, - "count": "3", - "duration": "0.061620223s" + "count": "14", + "raw_value": 47315 }, { "percentile": 0.75, - "count": "3", - "duration": "0.061620223s" + "count": "15", + "raw_value": 47317 }, { "percentile": 0.775, - "count": "4", - "duration": "0.079327231s" + "count": "15", + "raw_value": 47317 + }, + { + "percentile": 0.8, + "count": "16", + "raw_value": 47325 + }, + { + "percentile": 0.825, + "count": "16", + "raw_value": 47325 + }, + { + "percentile": 0.85, + "count": "17", + "raw_value": 47329 + }, + { + "percentile": 0.875, + "count": "17", + "raw_value": 47329 + }, + { + "percentile": 0.8875, + "count": "17", + "raw_value": 47329 + }, + { + "percentile": 0.9, + "count": "18", + "raw_value": 47333 + }, + { + "percentile": 0.9125, + "count": "18", + "raw_value": 47333 + }, + { + "percentile": 0.925, + "count": "18", + "raw_value": 47333 + }, + { + "percentile": 0.9375, + "count": "18", + "raw_value": 47333 + }, + { + "percentile": 0.94375, + "count": "18", + "raw_value": 47333 + }, + { + "percentile": 0.95, + "count": "19", + "raw_value": 47353 }, { "percentile": 1, - "count": "4", - "duration": "0.079327231s" + "count": "19", + "raw_value": 47353 } ], - "mean": "0.063946496s", - "pstdev": "0.009062473s" + "raw_mean": 47305.105263157893, + "raw_pstdev": 23.516835485382323, + "raw_min": "47257", + "raw_max": "47353" }, { "count": "0", @@ -927,1695 +1096,625 @@ } ], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" }, { - "count": "4", + "count": "19", "id": "sequencer.callback", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.056690687s" + "duration": "0.000028082s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.056690687s" + "count": "2", + "duration": "0.053833727s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.056690687s" + "count": "4", + "duration": "0.057116671s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.058374143s" + "count": "6", + "duration": "0.061333503s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.058374143s" + "count": "8", + "duration": "0.064466943s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.058374143s" + "count": "10", + "duration": "0.066576383s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.061712383s" + "count": "11", + "duration": "0.067985407s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.061712383s" + "count": "12", + "duration": "0.068108287s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.061712383s" + "count": "13", + "duration": "0.068554751s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.061712383s" + "count": "14", + "duration": "0.073768959s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.061712383s" + "count": "15", + "duration": "0.080437247s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.079437823s" + "count": "15", + "duration": "0.080437247s" }, { - "percentile": 1, - "count": "4", - "duration": "0.079437823s" - } - ], - "mean": "0.064052480s", - "pstdev": "0.009063565s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_4", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ + "percentile": 0.8, + "count": "16", + "duration": "0.085082111s" + }, { - "percentile": 0, - "count": "1", - "duration": "0.000033859s" + "percentile": 0.825, + "count": "16", + "duration": "0.085082111s" }, { - "percentile": 0.1, - "count": "1", - "duration": "0.000033859s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.000033859s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.000035493s" + "percentile": 0.85, + "count": "17", + "duration": "0.085680127s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.000035493s" + "percentile": 0.875, + "count": "17", + "duration": "0.085680127s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.000035493s" + "percentile": 0.8875, + "count": "17", + "duration": "0.085680127s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.000048117s" + "percentile": 0.9, + "count": "18", + "duration": "0.260120575s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.000048117s" + "percentile": 0.9125, + "count": "18", + "duration": "0.260120575s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.000048117s" + "percentile": 0.925, + "count": "18", + "duration": "0.260120575s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.000048117s" + "percentile": 0.9375, + "count": "18", + "duration": "0.260120575s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.000048117s" + "percentile": 0.94375, + "count": "18", + "duration": "0.260120575s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.000051953s" + "percentile": 0.95, + "count": "19", + "duration": "0.281395199s" }, { "percentile": 1, - "count": "4", - "duration": "0.000051953s" + "count": "19", + "duration": "0.281395199s" } ], - "mean": "0.000042356s", - "pstdev": "0.000007820s" + "mean": "0.085009485s", + "pstdev": "0.066108238s", + "min": "0.000028082s", + "max": "0.281395199s" + } + ], + "counters": [ + { + "name": "benchmark.http_2xx", + "value": "19" }, { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.056150015s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.056150015s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.056150015s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.056334335s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.056334335s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.056334335s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.058064895s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.058064895s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.058064895s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.058064895s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.058064895s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.061089791s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.061089791s" - } - ], - "mean": "0.057908736s", - "pstdev": "0.001982128s" + "name": "benchmark.pool_overflow", + "value": "1" }, { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" + "name": "default.total_match_count", + "value": "1" }, { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.056272895s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.056272895s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.056272895s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.056432639s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.056432639s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.056432639s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.058183679s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.058183679s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.058183679s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.058183679s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.058183679s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.061186047s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.061186047s" - } - ], - "mean": "0.058017792s", - "pstdev": "0.001976280s" - } - ], - "counters": [ + "name": "membership_change", + "value": "1" + }, { - "name": "benchmark.http_2xx", - "value": "5" + "name": "ssl.ciphers.ECDHE-RSA-AES128-GCM-SHA256", + "value": "2" + }, + { + "name": "ssl.curves.X25519", + "value": "2" + }, + { + "name": "ssl.handshake", + "value": "2" + }, + { + "name": "ssl.session_reused", + "value": "1" + }, + { + "name": "ssl.sigalgs.rsa_pss_rsae_sha256", + "value": "2" + }, + { + "name": "ssl.versions.TLSv1.2", + "value": "2" + }, + { + "name": "upstream_cx_http1_total", + "value": "2" + }, + { + "name": "upstream_cx_rx_bytes_total", + "value": "916623" + }, + { + "name": "upstream_cx_total", + "value": "2" + }, + { + "name": "upstream_cx_tx_bytes_total", + "value": "1197" + }, + { + "name": "upstream_rq_pending_overflow", + "value": "1" + }, + { + "name": "upstream_rq_pending_total", + "value": "2" + }, + { + "name": "upstream_rq_total", + "value": "19" } - ] + ], + "execution_duration": "2.000000703s" }, { - "name": "worker_5", + "name": "worker_2", "statistics": [ { - "count": "4", + "count": "18", "id": "benchmark_http_client.queue_to_connect", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.000031978s" + "duration": "0.000015754s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.000031978s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.000031978s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.000035205s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.000035205s" - }, - { - "percentile": 0.5, "count": "2", - "duration": "0.000035205s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.000051767s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.000051767s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.000051767s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.000051767s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.000051767s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.000054551s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000054551s" - } - ], - "mean": "0.000043375s", - "pstdev": "0.000009899s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.057862143s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.057862143s" + "duration": "0.000016422s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.057862143s" + "count": "4", + "duration": "0.000016908s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.063868927s" + "count": "6", + "duration": "0.000017122s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.063868927s" + "count": "8", + "duration": "0.000018110s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.063868927s" + "count": "9", + "duration": "0.000018833s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.065679359s" + "count": "10", + "duration": "0.000021578s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.065679359s" + "count": "11", + "duration": "0.000023597s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.065679359s" + "count": "12", + "duration": "0.000024429s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.065679359s" + "count": "13", + "duration": "0.000025402s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.065679359s" + "count": "14", + "duration": "0.000025633s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.067862527s" + "count": "14", + "duration": "0.000025633s" }, { - "percentile": 1, - "count": "4", - "duration": "0.067862527s" - } - ], - "mean": "0.063816960s", - "pstdev": "0.003717842s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.057999359s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.057999359s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.057999359s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.063999999s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.063999999s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.063999999s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.065777663s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.065777663s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.065777663s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.065777663s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.065777663s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.067960831s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.067960831s" - } - ], - "mean": "0.063933184s", - "pstdev": "0.003702382s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_6", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.000032893s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.000032893s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.000032893s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.000033521s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.000033521s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.000033521s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.000038597s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.000038597s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.000038597s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.000038597s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.000038597s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.000039201s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000039201s" - } - ], - "mean": "0.000036053s", - "pstdev": "0.000002863s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.056922111s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.056922111s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.056922111s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.057616383s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.057616383s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.057616383s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.060835839s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.060835839s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.060835839s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.060835839s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.060835839s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.060927999s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.060927999s" - } - ], - "mean": "0.059074560s", - "pstdev": "0.001823229s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.057012223s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.057012223s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.057012223s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.057716735s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.057716735s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.057716735s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.060936191s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.060936191s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.060936191s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.060936191s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.060936191s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.061034495s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.061034495s" - } - ], - "mean": "0.059173888s", - "pstdev": "0.001827817s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_7", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.000031752s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.000031752s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.000031752s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.000032747s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.000032747s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.000032747s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.000044159s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.000044159s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.000044159s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.000044159s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.000044159s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.000057509s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000057509s" - } - ], - "mean": "0.000041542s", - "pstdev": "0.000010428s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.055568383s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.055568383s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.055568383s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.059650047s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.059650047s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.059650047s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.067563519s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.067563519s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.067563519s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.067563519s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.067563519s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.069509119s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.069509119s" - } - ], - "mean": "0.063071232s", - "pstdev": "0.005692141s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.055662591s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.055662591s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.055662591s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.059742207s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.059742207s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.059742207s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.067682303s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.067682303s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.067682303s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.067682303s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.067682303s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.069631999s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.069631999s" - } - ], - "mean": "0.063178240s", - "pstdev": "0.005705402s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_8", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.000031168s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.000031168s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.000031168s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.000033925s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.000033925s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.000033925s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.000037663s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.000037663s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.000037663s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.000037663s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.000037663s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.000051237s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000051237s" - } - ], - "mean": "0.000038498s", - "pstdev": "0.000007707s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.056958975s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.056958975s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.056958975s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.059041791s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.059041791s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.059041791s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.060012543s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.060012543s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.060012543s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.060012543s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.060012543s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.063830015s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.063830015s" - } - ], - "mean": "0.059959808s", - "pstdev": "0.002491437s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.057055231s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.057055231s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.057055231s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.059162623s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.059162623s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.059162623s" - }, - { - "percentile": 0.55, - "count": "3", - "duration": "0.060102655s" - }, - { - "percentile": 0.6, - "count": "3", - "duration": "0.060102655s" - }, - { - "percentile": 0.65, - "count": "3", - "duration": "0.060102655s" - }, - { - "percentile": 0.7, - "count": "3", - "duration": "0.060102655s" - }, - { - "percentile": 0.75, - "count": "3", - "duration": "0.060102655s" - }, - { - "percentile": 0.775, - "count": "4", - "duration": "0.063930367s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.063930367s" - } - ], - "mean": "0.060061696s", - "pstdev": "0.002490756s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_9", - "statistics": [ - { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.000031853s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.000031853s" + "percentile": 0.8, + "count": "15", + "duration": "0.000025857s" }, { - "percentile": 0.2, - "count": "1", - "duration": "0.000031853s" + "percentile": 0.825, + "count": "15", + "duration": "0.000025857s" }, { - "percentile": 0.3, - "count": "2", - "duration": "0.000035839s" + "percentile": 0.85, + "count": "16", + "duration": "0.000026027s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.000035839s" + "percentile": 0.875, + "count": "16", + "duration": "0.000026027s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.000035839s" + "percentile": 0.8875, + "count": "16", + "duration": "0.000026027s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.000037101s" + "percentile": 0.9, + "count": "17", + "duration": "0.000026137s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.000037101s" + "percentile": 0.9125, + "count": "17", + "duration": "0.000026137s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.000037101s" + "percentile": 0.925, + "count": "17", + "duration": "0.000026137s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.000037101s" + "percentile": 0.9375, + "count": "17", + "duration": "0.000026137s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.000037101s" + "percentile": 0.94375, + "count": "17", + "duration": "0.000026137s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.000042849s" + "percentile": 0.95, + "count": "18", + "duration": "0.147341311s" }, { "percentile": 1, - "count": "4", - "duration": "0.000042849s" + "count": "18", + "duration": "0.147341311s" } ], - "mean": "0.000036911s", - "pstdev": "0.000003938s" + "mean": "0.008205027s", + "pstdev": "0.033744513s", + "min": "0.000015754s", + "max": "0.147341311s" }, { - "count": "4", + "count": "18", "id": "benchmark_http_client.request_to_response", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.057884671s" + "duration": "0.055316479s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.057884671s" + "count": "2", + "duration": "0.055648255s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.057884671s" + "count": "4", + "duration": "0.059131903s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.060086271s" + "count": "6", + "duration": "0.062095359s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.060086271s" + "count": "8", + "duration": "0.063219711s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.060086271s" + "count": "9", + "duration": "0.064016383s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.062291967s" + "count": "10", + "duration": "0.066666495s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.062291967s" + "count": "11", + "duration": "0.068751359s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.062291967s" + "count": "12", + "duration": "0.070029311s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.062291967s" + "count": "13", + "duration": "0.071561215s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.062291967s" + "count": "14", + "duration": "0.074465279s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.068161535s" + "count": "14", + "duration": "0.074465279s" }, { - "percentile": 1, - "count": "4", - "duration": "0.068161535s" - } - ], - "mean": "0.062104832s", - "pstdev": "0.003827225s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.057980927s" + "percentile": 0.8, + "count": "15", + "duration": "0.075792383s" }, { - "percentile": 0.1, - "count": "1", - "duration": "0.057980927s" + "percentile": 0.825, + "count": "15", + "duration": "0.075792383s" }, { - "percentile": 0.2, - "count": "1", - "duration": "0.057980927s" + "percentile": 0.85, + "count": "16", + "duration": "0.078168063s" }, { - "percentile": 0.3, - "count": "2", - "duration": "0.060186623s" + "percentile": 0.875, + "count": "16", + "duration": "0.078168063s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.060186623s" + "percentile": 0.8875, + "count": "16", + "duration": "0.078168063s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.060186623s" + "percentile": 0.9, + "count": "17", + "duration": "0.090656767s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.062402559s" + "percentile": 0.9125, + "count": "17", + "duration": "0.090656767s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.062402559s" + "percentile": 0.925, + "count": "17", + "duration": "0.090656767s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.062402559s" + "percentile": 0.9375, + "count": "17", + "duration": "0.090656767s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.062402559s" + "percentile": 0.94375, + "count": "17", + "duration": "0.090656767s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.062402559s" + "percentile": 0.95, + "count": "18", + "duration": "0.247513087s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.068259839s" + "percentile": 1, + "count": "18", + "duration": "0.247513087s" + } + ], + "mean": "0.076909909s", + "pstdev": "0.042284076s", + "min": "0.055316479s", + "max": "0.247513087s" + }, + { + "count": "19", + "id": "benchmark_http_client.response_body_size", + "percentiles": [ + { + "percentile": 0, + "count": "19", + "raw_value": 847 }, { "percentile": 1, - "count": "4", - "duration": "0.068259839s" + "count": "19", + "raw_value": 847 } ], - "mean": "0.062206208s", - "pstdev": "0.003827673s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "worker_10", - "statistics": [ + "raw_mean": 847, + "raw_pstdev": 0, + "raw_min": "847", + "raw_max": "847" + }, { - "count": "4", - "id": "benchmark_http_client.queue_to_connect", + "count": "19", + "id": "benchmark_http_client.response_header_size", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.000031242s" + "raw_value": 47289 }, { "percentile": 0.1, - "count": "1", - "duration": "0.000031242s" + "count": "2", + "raw_value": 47293 }, { "percentile": 0.2, - "count": "1", - "duration": "0.000031242s" + "count": "4", + "raw_value": 47299 }, { "percentile": 0.3, - "count": "2", - "duration": "0.000035537s" + "count": "7", + "raw_value": 47309 }, { "percentile": 0.4, - "count": "2", - "duration": "0.000035537s" + "count": "9", + "raw_value": 47317 }, { "percentile": 0.5, - "count": "2", - "duration": "0.000035537s" + "count": "10", + "raw_value": 47319 }, { "percentile": 0.55, - "count": "3", - "duration": "0.000037795s" + "count": "12", + "raw_value": 47321 }, { "percentile": 0.6, - "count": "3", - "duration": "0.000037795s" + "count": "12", + "raw_value": 47321 }, { "percentile": 0.65, - "count": "3", - "duration": "0.000037795s" + "count": "13", + "raw_value": 47323 }, { "percentile": 0.7, - "count": "3", - "duration": "0.000037795s" + "count": "15", + "raw_value": 47327 }, { "percentile": 0.75, - "count": "3", - "duration": "0.000037795s" + "count": "15", + "raw_value": 47327 }, { "percentile": 0.775, - "count": "4", - "duration": "0.000051885s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000051885s" - } - ], - "mean": "0.000039115s", - "pstdev": "0.000007740s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.057714687s" + "count": "15", + "raw_value": 47327 }, { - "percentile": 0.1, - "count": "1", - "duration": "0.057714687s" + "percentile": 0.8, + "count": "16", + "raw_value": 47331 }, { - "percentile": 0.2, - "count": "1", - "duration": "0.057714687s" + "percentile": 0.825, + "count": "16", + "raw_value": 47331 }, { - "percentile": 0.3, - "count": "2", - "duration": "0.060903423s" + "percentile": 0.85, + "count": "17", + "raw_value": 47333 }, { - "percentile": 0.4, - "count": "2", - "duration": "0.060903423s" + "percentile": 0.875, + "count": "17", + "raw_value": 47333 }, { - "percentile": 0.5, - "count": "2", - "duration": "0.060903423s" + "percentile": 0.8875, + "count": "17", + "raw_value": 47333 }, { - "percentile": 0.55, - "count": "3", - "duration": "0.065888255s" + "percentile": 0.9, + "count": "18", + "raw_value": 47353 }, { - "percentile": 0.6, - "count": "3", - "duration": "0.065888255s" + "percentile": 0.9125, + "count": "18", + "raw_value": 47353 }, { - "percentile": 0.65, - "count": "3", - "duration": "0.065888255s" + "percentile": 0.925, + "count": "18", + "raw_value": 47353 }, { - "percentile": 0.7, - "count": "3", - "duration": "0.065888255s" + "percentile": 0.9375, + "count": "18", + "raw_value": 47353 }, { - "percentile": 0.75, - "count": "3", - "duration": "0.065888255s" + "percentile": 0.94375, + "count": "18", + "raw_value": 47353 }, { - "percentile": 0.775, - "count": "4", - "duration": "0.073601023s" + "percentile": 0.95, + "count": "19", + "raw_value": 47357 }, { "percentile": 1, - "count": "4", - "duration": "0.073601023s" + "count": "19", + "raw_value": 47357 } ], - "mean": "0.064525568s", - "pstdev": "0.005993960s" + "raw_mean": 47318.368421052633, + "raw_pstdev": 17.687969525301028, + "raw_min": "47289", + "raw_max": "47357" }, { "count": "0", @@ -2628,661 +1727,735 @@ } ], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" }, { - "count": "4", + "count": "19", "id": "sequencer.callback", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.057802751s" + "duration": "0.000046843s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.057802751s" + "count": "2", + "duration": "0.055355391s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.057802751s" + "count": "4", + "duration": "0.057753599s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.061003775s" + "count": "6", + "duration": "0.060782591s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.061003775s" + "count": "8", + "duration": "0.063002623s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.061003775s" + "count": "10", + "duration": "0.064075775s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.066009087s" + "count": "11", + "duration": "0.066703359s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.066009087s" + "count": "12", + "duration": "0.068796415s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.066009087s" + "count": "13", + "duration": "0.070062079s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.066009087s" + "count": "14", + "duration": "0.071589887s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.066009087s" + "count": "15", + "duration": "0.074502143s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.073703423s" + "count": "15", + "duration": "0.074502143s" + }, + { + "percentile": 0.8, + "count": "16", + "duration": "0.075849727s" + }, + { + "percentile": 0.825, + "count": "16", + "duration": "0.075849727s" + }, + { + "percentile": 0.85, + "count": "17", + "duration": "0.078221311s" + }, + { + "percentile": 0.875, + "count": "17", + "duration": "0.078221311s" + }, + { + "percentile": 0.8875, + "count": "17", + "duration": "0.078221311s" + }, + { + "percentile": 0.9, + "count": "18", + "duration": "0.238026751s" + }, + { + "percentile": 0.9125, + "count": "18", + "duration": "0.238026751s" + }, + { + "percentile": 0.925, + "count": "18", + "duration": "0.238026751s" + }, + { + "percentile": 0.9375, + "count": "18", + "duration": "0.238026751s" + }, + { + "percentile": 0.94375, + "count": "18", + "duration": "0.238026751s" + }, + { + "percentile": 0.95, + "count": "19", + "duration": "0.247554047s" }, { "percentile": 1, - "count": "4", - "duration": "0.073703423s" + "count": "19", + "duration": "0.247554047s" } ], - "mean": "0.064628480s", - "pstdev": "0.005999399s" + "mean": "0.080659065s", + "pstdev": "0.057852211s", + "min": "0.000046843s", + "max": "0.247554047s" } ], "counters": [ { "name": "benchmark.http_2xx", - "value": "5" + "value": "19" + }, + { + "name": "benchmark.pool_overflow", + "value": "1" + }, + { + "name": "default.total_match_count", + "value": "1" + }, + { + "name": "membership_change", + "value": "1" + }, + { + "name": "ssl.ciphers.ECDHE-RSA-AES128-GCM-SHA256", + "value": "2" + }, + { + "name": "ssl.curves.X25519", + "value": "2" + }, + { + "name": "ssl.handshake", + "value": "2" + }, + { + "name": "ssl.session_reused", + "value": "1" + }, + { + "name": "ssl.sigalgs.rsa_pss_rsae_sha256", + "value": "2" + }, + { + "name": "ssl.versions.TLSv1.2", + "value": "2" + }, + { + "name": "upstream_cx_http1_total", + "value": "2" + }, + { + "name": "upstream_cx_rx_bytes_total", + "value": "916888" + }, + { + "name": "upstream_cx_total", + "value": "2" + }, + { + "name": "upstream_cx_tx_bytes_total", + "value": "1197" + }, + { + "name": "upstream_rq_pending_overflow", + "value": "1" + }, + { + "name": "upstream_rq_pending_total", + "value": "2" + }, + { + "name": "upstream_rq_total", + "value": "19" } - ] + ], + "execution_duration": "2.000000635s" }, { - "name": "worker_11", + "name": "global", "statistics": [ { - "count": "4", + "count": "53", "id": "benchmark_http_client.queue_to_connect", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.000029928s" + "duration": "0.000015223s" }, { "percentile": 0.1, - "count": "1", - "duration": "0.000029928s" + "count": "6", + "duration": "0.000015953s" }, { "percentile": 0.2, - "count": "1", - "duration": "0.000029928s" + "count": "11", + "duration": "0.000016530s" }, { "percentile": 0.3, - "count": "2", - "duration": "0.000032191s" + "count": "16", + "duration": "0.000016976s" }, { "percentile": 0.4, - "count": "2", - "duration": "0.000032191s" + "count": "22", + "duration": "0.000017719s" }, { "percentile": 0.5, - "count": "2", - "duration": "0.000032191s" + "count": "27", + "duration": "0.000018829s" }, { "percentile": 0.55, - "count": "3", - "duration": "0.000034547s" + "count": "30", + "duration": "0.000020396s" }, { "percentile": 0.6, - "count": "3", - "duration": "0.000034547s" + "count": "32", + "duration": "0.000020925s" }, { "percentile": 0.65, - "count": "3", - "duration": "0.000034547s" + "count": "35", + "duration": "0.000022794s" }, { "percentile": 0.7, - "count": "3", - "duration": "0.000034547s" + "count": "38", + "duration": "0.000024429s" }, { "percentile": 0.75, - "count": "3", - "duration": "0.000034547s" + "count": "40", + "duration": "0.000025633s" }, { "percentile": 0.775, - "count": "4", - "duration": "0.000041621s" - }, - { - "percentile": 1, - "count": "4", - "duration": "0.000041621s" - } - ], - "mean": "0.000034572s", - "pstdev": "0.000004385s" - }, - { - "count": "4", - "id": "benchmark_http_client.request_to_response", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.060487679s" - }, - { - "percentile": 0.1, - "count": "1", - "duration": "0.060487679s" - }, - { - "percentile": 0.2, - "count": "1", - "duration": "0.060487679s" - }, - { - "percentile": 0.3, - "count": "2", - "duration": "0.060641279s" - }, - { - "percentile": 0.4, - "count": "2", - "duration": "0.060641279s" - }, - { - "percentile": 0.5, - "count": "2", - "duration": "0.060641279s" + "count": "42", + "duration": "0.000026027s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.062892031s" + "percentile": 0.8, + "count": "43", + "duration": "0.000026137s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.062892031s" + "percentile": 0.825, + "count": "44", + "duration": "0.000028375s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.062892031s" + "percentile": 0.85, + "count": "46", + "duration": "0.000031623s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.062892031s" + "percentile": 0.875, + "count": "47", + "duration": "0.000035737s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.062892031s" + "percentile": 0.8875, + "count": "48", + "duration": "0.000036293s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.066994175s" + "percentile": 0.9, + "count": "48", + "duration": "0.000036293s" }, { - "percentile": 1, - "count": "4", - "duration": "0.066994175s" - } - ], - "mean": "0.062752768s", - "pstdev": "0.002626687s" - }, - { - "count": "0", - "id": "sequencer.blocking", - "percentiles": [ - { - "percentile": 1, - "count": "0", - "duration": "0s" - } - ], - "mean": "0s", - "pstdev": "0s" - }, - { - "count": "4", - "id": "sequencer.callback", - "percentiles": [ - { - "percentile": 0, - "count": "1", - "duration": "0.060577791s" + "percentile": 0.9125, + "count": "49", + "duration": "0.000040295s" }, { - "percentile": 0.1, - "count": "1", - "duration": "0.060577791s" + "percentile": 0.925, + "count": "50", + "duration": "0.000041053s" }, { - "percentile": 0.2, - "count": "1", - "duration": "0.060577791s" + "percentile": 0.9375, + "count": "50", + "duration": "0.000041053s" }, { - "percentile": 0.3, - "count": "2", - "duration": "0.060735487s" + "percentile": 0.94375, + "count": "51", + "duration": "0.147341311s" }, { - "percentile": 0.4, - "count": "2", - "duration": "0.060735487s" + "percentile": 0.95, + "count": "51", + "duration": "0.147341311s" }, { - "percentile": 0.5, - "count": "2", - "duration": "0.060735487s" + "percentile": 0.95625, + "count": "51", + "duration": "0.147341311s" }, { - "percentile": 0.55, - "count": "3", - "duration": "0.062975999s" + "percentile": 0.9625, + "count": "52", + "duration": "0.181387263s" }, { - "percentile": 0.6, - "count": "3", - "duration": "0.062975999s" + "percentile": 0.96875, + "count": "52", + "duration": "0.181387263s" }, { - "percentile": 0.65, - "count": "3", - "duration": "0.062975999s" + "percentile": 0.971875, + "count": "52", + "duration": "0.181387263s" }, { - "percentile": 0.7, - "count": "3", - "duration": "0.062975999s" + "percentile": 0.975, + "count": "52", + "duration": "0.181387263s" }, { - "percentile": 0.75, - "count": "3", - "duration": "0.062975999s" + "percentile": 0.978125, + "count": "52", + "duration": "0.181387263s" }, { - "percentile": 0.775, - "count": "4", - "duration": "0.067102719s" + "percentile": 0.98125, + "count": "53", + "duration": "0.210903039s" }, { "percentile": 1, - "count": "4", - "duration": "0.067102719s" + "count": "53", + "duration": "0.210903039s" } ], - "mean": "0.062846976s", - "pstdev": "0.002633229s" - } - ], - "counters": [ - { - "name": "benchmark.http_2xx", - "value": "5" - } - ] - }, - { - "name": "global", - "execution_duration": "4.9999s", - "statistics": [ + "mean": "0.010201603s", + "pstdev": "0.042017661s", + "min": "0.000015223s", + "max": "0.210903039s" + }, { - "count": "48", - "id": "benchmark_http_client.queue_to_connect", + "count": "53", + "id": "benchmark_http_client.request_to_response", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.000029928s" + "duration": "0.053798911s" }, { "percentile": 0.1, - "count": "5", - "duration": "0.000031752s" + "count": "6", + "duration": "0.056340479s" }, { "percentile": 0.2, - "count": "10", - "duration": "0.000032588s" + "count": "11", + "duration": "0.057706495s" }, { "percentile": 0.3, - "count": "15", - "duration": "0.000033521s" + "count": "16", + "duration": "0.060055551s" }, { "percentile": 0.4, - "count": "20", - "duration": "0.000035465s" + "count": "22", + "duration": "0.062949375s" }, { "percentile": 0.5, - "count": "24", - "duration": "0.000037101s" + "count": "27", + "duration": "0.065077247s" }, { "percentile": 0.55, - "count": "27", - "duration": "0.000038597s" + "count": "30", + "duration": "0.066666495s" }, { "percentile": 0.6, - "count": "29", - "duration": "0.000040265s" + "count": "32", + "duration": "0.067948543s" }, { "percentile": 0.65, - "count": "32", - "duration": "0.000041621s" + "count": "35", + "duration": "0.068751359s" }, { "percentile": 0.7, - "count": "34", - "duration": "0.000042849s" + "count": "38", + "duration": "0.072949759s" }, { "percentile": 0.75, - "count": "36", - "duration": "0.000044159s" + "count": "40", + "duration": "0.074465279s" }, { "percentile": 0.775, - "count": "38", - "duration": "0.000048189s" + "count": "42", + "duration": "0.075792383s" }, { "percentile": 0.8, - "count": "39", - "duration": "0.000051237s" + "count": "43", + "duration": "0.078065663s" }, { "percentile": 0.825, - "count": "40", - "duration": "0.000051767s" + "count": "44", + "duration": "0.078168063s" }, { "percentile": 0.85, - "count": "41", - "duration": "0.000051885s" + "count": "46", + "duration": "0.080400383s" }, { "percentile": 0.875, - "count": "42", - "duration": "0.000051897s" + "count": "47", + "duration": "0.082427903s" }, { "percentile": 0.8875, - "count": "43", - "duration": "0.000051953s" + "count": "48", + "duration": "0.085045247s" }, { "percentile": 0.9, - "count": "44", - "duration": "0.000053019s" + "count": "48", + "duration": "0.085045247s" }, { "percentile": 0.9125, - "count": "44", - "duration": "0.000053019s" + "count": "49", + "duration": "0.085626879s" }, { "percentile": 0.925, - "count": "45", - "duration": "0.000054551s" + "count": "50", + "duration": "0.090656767s" }, { "percentile": 0.9375, - "count": "45", - "duration": "0.000054551s" + "count": "50", + "duration": "0.090656767s" }, { "percentile": 0.94375, - "count": "46", - "duration": "0.000057509s" + "count": "51", + "duration": "0.247513087s" }, { "percentile": 0.95, - "count": "46", - "duration": "0.000057509s" + "count": "51", + "duration": "0.247513087s" }, { "percentile": 0.95625, - "count": "46", - "duration": "0.000057509s" + "count": "51", + "duration": "0.247513087s" }, { "percentile": 0.9625, - "count": "47", - "duration": "0.000070355s" + "count": "52", + "duration": "0.281362431s" }, { "percentile": 0.96875, - "count": "47", - "duration": "0.000070355s" + "count": "52", + "duration": "0.281362431s" }, { "percentile": 0.971875, - "count": "47", - "duration": "0.000070355s" + "count": "52", + "duration": "0.281362431s" }, { "percentile": 0.975, - "count": "47", - "duration": "0.000070355s" + "count": "52", + "duration": "0.281362431s" }, { "percentile": 0.978125, - "count": "47", - "duration": "0.000070355s" + "count": "52", + "duration": "0.281362431s" }, { "percentile": 0.98125, - "count": "48", - "duration": "0.000117091s" + "count": "53", + "duration": "0.310886399s" }, { "percentile": 1, - "count": "48", - "duration": "0.000117091s" + "count": "53", + "duration": "0.310886399s" } ], - "mean": "0.000041578s", - "pstdev": "0.000014060s" + "mean": "0.078433106s", + "pstdev": "0.050523020s", + "min": "0.053798911s", + "max": "0.310886399s" }, { - "count": "48", - "id": "benchmark_http_client.request_to_response", + "count": "56", + "id": "benchmark_http_client.response_body_size", + "percentiles": [ + { + "percentile": 0, + "count": "56", + "raw_value": 847 + }, + { + "percentile": 1, + "count": "56", + "raw_value": 847 + } + ], + "raw_mean": 847, + "raw_pstdev": 0, + "raw_min": "847", + "raw_max": "847" + }, + { + "count": "56", + "id": "benchmark_http_client.response_header_size", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.055568383s" + "raw_value": 47257 }, { "percentile": 0.1, - "count": "5", - "duration": "0.056922111s" + "count": "6", + "raw_value": 47289 }, { "percentile": 0.2, - "count": "10", - "duration": "0.057884671s" + "count": "12", + "raw_value": 47299 }, { "percentile": 0.3, - "count": "15", - "duration": "0.059041791s" + "count": "17", + "raw_value": 47305 }, { "percentile": 0.4, - "count": "20", - "duration": "0.060086271s" + "count": "24", + "raw_value": 47311 }, { "percentile": 0.5, - "count": "24", - "duration": "0.060903423s" + "count": "31", + "raw_value": 47317 }, { "percentile": 0.55, - "count": "27", - "duration": "0.061583359s" + "count": "31", + "raw_value": 47317 }, { "percentile": 0.6, - "count": "29", - "duration": "0.061976575s" + "count": "35", + "raw_value": 47321 }, { "percentile": 0.65, - "count": "32", - "duration": "0.063830015s" + "count": "37", + "raw_value": 47323 }, { "percentile": 0.7, - "count": "34", - "duration": "0.064684031s" + "count": "42", + "raw_value": 47327 }, { "percentile": 0.75, - "count": "36", - "duration": "0.065679359s" + "count": "42", + "raw_value": 47327 }, { "percentile": 0.775, - "count": "38", - "duration": "0.066537471s" + "count": "44", + "raw_value": 47329 }, { "percentile": 0.8, - "count": "39", - "duration": "0.066994175s" + "count": "47", + "raw_value": 47331 }, { "percentile": 0.825, - "count": "40", - "duration": "0.067194879s" + "count": "47", + "raw_value": 47331 }, { "percentile": 0.85, - "count": "41", - "duration": "0.067563519s" + "count": "49", + "raw_value": 47333 }, { "percentile": 0.875, - "count": "42", - "duration": "0.067862527s" + "count": "49", + "raw_value": 47333 }, { "percentile": 0.8875, - "count": "43", - "duration": "0.068161535s" + "count": "50", + "raw_value": 47335 }, { "percentile": 0.9, - "count": "44", - "duration": "0.068657151s" + "count": "51", + "raw_value": 47339 }, { "percentile": 0.9125, - "count": "44", - "duration": "0.068657151s" + "count": "52", + "raw_value": 47341 }, { "percentile": 0.925, - "count": "45", - "duration": "0.069509119s" + "count": "52", + "raw_value": 47341 }, { "percentile": 0.9375, - "count": "45", - "duration": "0.069509119s" + "count": "53", + "raw_value": 47347 }, { "percentile": 0.94375, - "count": "46", - "duration": "0.073601023s" + "count": "53", + "raw_value": 47347 }, { "percentile": 0.95, - "count": "46", - "duration": "0.073601023s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.95625, - "count": "46", - "duration": "0.073601023s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.9625, - "count": "47", - "duration": "0.079327231s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.96875, - "count": "47", - "duration": "0.079327231s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.971875, - "count": "47", - "duration": "0.079327231s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.975, - "count": "47", - "duration": "0.079327231s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.978125, - "count": "47", - "duration": "0.079327231s" + "count": "55", + "raw_value": 47353 }, { "percentile": 0.98125, - "count": "48", - "duration": "0.084357119s" + "count": "55", + "raw_value": 47353 + }, + { + "percentile": 0.984375, + "count": "56", + "raw_value": 47357 }, { "percentile": 1, - "count": "48", - "duration": "0.084357119s" + "count": "56", + "raw_value": 47357 } ], - "mean": "0.062589845s", - "pstdev": "0.005785869s" + "raw_mean": 47314.5, + "raw_pstdev": 20.799210149838451, + "raw_min": "47257", + "raw_max": "47357" }, { "count": "0", @@ -3295,188 +2468,201 @@ } ], "mean": "0s", - "pstdev": "0s" + "pstdev": "0s", + "min": "0s", + "max": "0s" }, { - "count": "48", + "count": "57", "id": "sequencer.callback", "percentiles": [ { "percentile": 0, "count": "1", - "duration": "0.055662591s" + "duration": "0.000025572s" }, { "percentile": 0.1, - "count": "5", - "duration": "0.057012223s" + "count": "6", + "duration": "0.054673407s" }, { "percentile": 0.2, - "count": "10", - "duration": "0.057999359s" + "count": "12", + "duration": "0.056858623s" }, { "percentile": 0.3, - "count": "15", - "duration": "0.059162623s" + "count": "18", + "duration": "0.059303935s" }, { "percentile": 0.4, - "count": "20", - "duration": "0.060186623s" + "count": "23", + "duration": "0.061655039s" }, { "percentile": 0.5, - "count": "24", - "duration": "0.061003775s" + "count": "29", + "duration": "0.064466943s" }, { "percentile": 0.55, - "count": "27", - "duration": "0.061698047s" + "count": "32", + "duration": "0.065714175s" }, { "percentile": 0.6, - "count": "29", - "duration": "0.062064639s" + "count": "35", + "duration": "0.067452927s" }, { "percentile": 0.65, - "count": "32", - "duration": "0.063930367s" + "count": "38", + "duration": "0.068554751s" }, { "percentile": 0.7, - "count": "34", - "duration": "0.064784383s" + "count": "40", + "duration": "0.070062079s" }, { "percentile": 0.75, - "count": "36", - "duration": "0.065777663s" + "count": "43", + "duration": "0.073768959s" }, { "percentile": 0.775, - "count": "38", - "duration": "0.066721791s" + "count": "45", + "duration": "0.075526143s" }, { "percentile": 0.8, - "count": "39", - "duration": "0.067102719s" + "count": "46", + "duration": "0.075849727s" }, { "percentile": 0.825, - "count": "40", - "duration": "0.067289087s" + "count": "48", + "duration": "0.078221311s" }, { "percentile": 0.85, - "count": "41", - "duration": "0.067682303s" + "count": "49", + "duration": "0.080437247s" }, { "percentile": 0.875, - "count": "42", - "duration": "0.067960831s" + "count": "50", + "duration": "0.085082111s" }, { "percentile": 0.8875, - "count": "43", - "duration": "0.068259839s" + "count": "51", + "duration": "0.085680127s" }, { "percentile": 0.9, - "count": "44", - "duration": "0.068780031s" + "count": "52", + "duration": "0.238026751s" }, { "percentile": 0.9125, - "count": "44", - "duration": "0.068780031s" + "count": "53", + "duration": "0.247554047s" }, { "percentile": 0.925, - "count": "45", - "duration": "0.069631999s" + "count": "53", + "duration": "0.247554047s" }, { "percentile": 0.9375, - "count": "45", - "duration": "0.069631999s" + "count": "54", + "duration": "0.260120575s" }, { "percentile": 0.94375, - "count": "46", - "duration": "0.073703423s" + "count": "54", + "duration": "0.260120575s" }, { "percentile": 0.95, - "count": "46", - "duration": "0.073703423s" + "count": "55", + "duration": "0.281395199s" }, { "percentile": 0.95625, - "count": "46", - "duration": "0.073703423s" + "count": "55", + "duration": "0.281395199s" }, { "percentile": 0.9625, - "count": "47", - "duration": "0.079437823s" + "count": "55", + "duration": "0.281395199s" }, { "percentile": 0.96875, - "count": "47", - "duration": "0.079437823s" + "count": "56", + "duration": "0.293371903s" }, { "percentile": 0.971875, - "count": "47", - "duration": "0.079437823s" + "count": "56", + "duration": "0.293371903s" }, { "percentile": 0.975, - "count": "47", - "duration": "0.079437823s" + "count": "56", + "duration": "0.293371903s" }, { "percentile": 0.978125, - "count": "47", - "duration": "0.079437823s" + "count": "56", + "duration": "0.293371903s" }, { "percentile": 0.98125, - "count": "48", - "duration": "0.084479999s" + "count": "56", + "duration": "0.293371903s" + }, + { + "percentile": 0.984375, + "count": "57", + "duration": "0.310935551s" }, { "percentile": 1, - "count": "48", - "duration": "0.084479999s" + "count": "57", + "duration": "0.310935551s" } ], - "mean": "0.062699243s", - "pstdev": "0.005788063s" + "mean": "0.082438899s", + "pstdev": "0.067986441s", + "min": "0.000025572s", + "max": "0.310935551s" } ], "counters": [ { "name": "benchmark.http_2xx", - "value": "60" + "value": "56" + }, + { + "name": "benchmark.pool_overflow", + "value": "4" }, { "name": "cluster_manager.cluster_added", - "value": "12" + "value": "3" }, { "name": "default.total_match_count", - "value": "12" + "value": "3" }, { "name": "membership_change", - "value": "12" + "value": "3" }, { "name": "runtime.load_success", @@ -3487,46 +2673,60 @@ "value": "1" }, { - "name": "upstream_cx_destroy", - "value": "12" + "name": "ssl.ciphers.ECDHE-RSA-AES128-GCM-SHA256", + "value": "6" + }, + { + "name": "ssl.curves.X25519", + "value": "6" + }, + { + "name": "ssl.handshake", + "value": "6" + }, + { + "name": "ssl.session_reused", + "value": "3" + }, + { + "name": "ssl.sigalgs.rsa_pss_rsae_sha256", + "value": "6" }, { - "name": "upstream_cx_destroy_local", - "value": "12" + "name": "ssl.versions.TLSv1.2", + "value": "6" }, { "name": "upstream_cx_http1_total", - "value": "12" + "value": "6" }, { "name": "upstream_cx_rx_bytes_total", - "value": "3338276" + "value": "2702142" }, { "name": "upstream_cx_total", - "value": "12" + "value": "6" }, { "name": "upstream_cx_tx_bytes_total", - "value": "3600" + "value": "3528" + }, + { + "name": "upstream_rq_pending_overflow", + "value": "4" }, { "name": "upstream_rq_pending_total", - "value": "12" + "value": "6" }, { "name": "upstream_rq_total", - "value": "60" + "value": "56" } - ] + ], + "execution_duration": "2.000000429s" } ], - "version": { - "version": { - "major": 9, - "minor": 9, - "patch": 9 - } - }, - "timestamp": "2019-10-16T00:30:12.911078318Z" + "timestamp": "2020-01-11T12:47:57.259885200Z" } diff --git a/test/test_data/output_formatter.txt.gold b/test/test_data/output_formatter.txt.gold index 85c6af943..b9b99f8f9 100644 --- a/test/test_data/output_formatter.txt.gold +++ b/test/test_data/output_formatter.txt.gold @@ -1,11 +1,21 @@ Nighthawk - A layer 7 protocol benchmarking tool. -stat_id - samples: 3 - mean: 0s 002ms 000us - pstdev: 0s 000ms 816us +stat_id (3 samples) + min: 0s 001ms 000us | mean: 0s 002ms 000us | max: 0s 003ms 000us | pstdev: 0s 000ms 816us - Percentile Count Latency +foo_size (4 samples) + min: 14 | mean: 15.5 | max: 17 | pstdev: 1.11803 + + Percentile Count Value + 0.5 2 15 + 0.75 3 16 + +foo_latency (4 samples) + min: 0s 000ms 180us | mean: 0s 000ms 195us | max: 0s 000ms 210us | pstdev: 0s 000ms 011us + + Percentile Count Value + 0.5 2 0s 000ms 190us + 0.75 3 0s 000ms 200us Counter Value Per second bar 2 2.00 diff --git a/test/test_data/output_formatter.yaml.gold b/test/test_data/output_formatter.yaml.gold index 0bac8300d..f08da8b02 100644 --- a/test/test_data/output_formatter.yaml.gold +++ b/test/test_data/output_formatter.yaml.gold @@ -16,12 +16,108 @@ results: [] mean: 0.002s pstdev: 0.000816497s + min: 0.001s + max: 0.003s - count: 0 id: "" percentiles: [] mean: 0s pstdev: 0s + min: 0s + max: 0s + - count: 4 + id: foo_size + percentiles: + - percentile: 0 + count: 1 + raw_value: 14 + - percentile: 0.1 + count: 1 + raw_value: 14 + - percentile: 0.2 + count: 1 + raw_value: 14 + - percentile: 0.3 + count: 2 + raw_value: 15 + - percentile: 0.4 + count: 2 + raw_value: 15 + - percentile: 0.5 + count: 2 + raw_value: 15 + - percentile: 0.55 + count: 3 + raw_value: 16 + - percentile: 0.6 + count: 3 + raw_value: 16 + - percentile: 0.65 + count: 3 + raw_value: 16 + - percentile: 0.7 + count: 3 + raw_value: 16 + - percentile: 0.75 + count: 3 + raw_value: 16 + - percentile: 0.775 + count: 4 + raw_value: 17 + - percentile: 1 + count: 4 + raw_value: 17 + raw_mean: 15.5 + raw_pstdev: 1.1180339887498949 + raw_min: 14 + raw_max: 17 + - count: 4 + id: foo_latency + percentiles: + - percentile: 0 + count: 1 + duration: 0.000180007s + - percentile: 0.1 + count: 1 + duration: 0.000180007s + - percentile: 0.2 + count: 1 + duration: 0.000180007s + - percentile: 0.3 + count: 2 + duration: 0.000190007s + - percentile: 0.4 + count: 2 + duration: 0.000190007s + - percentile: 0.5 + count: 2 + duration: 0.000190007s + - percentile: 0.55 + count: 3 + duration: 0.000200007s + - percentile: 0.6 + count: 3 + duration: 0.000200007s + - percentile: 0.65 + count: 3 + duration: 0.000200007s + - percentile: 0.7 + count: 3 + duration: 0.000200007s + - percentile: 0.75 + count: 3 + duration: 0.000200007s + - percentile: 0.775 + count: 4 + duration: 0.000210007s + - percentile: 1 + count: 4 + duration: 0.000210007s + mean: 0.000195004s + pstdev: 0.000011180s + min: 0.000180007s + max: 0.000210007s counters: - name: bar value: 2 @@ -36,12 +132,108 @@ results: [] mean: 0.002s pstdev: 0.000816497s + min: 0.001s + max: 0.003s - count: 0 id: "" percentiles: [] mean: 0s pstdev: 0s + min: 0s + max: 0s + - count: 4 + id: foo_size + percentiles: + - percentile: 0 + count: 1 + raw_value: 14 + - percentile: 0.1 + count: 1 + raw_value: 14 + - percentile: 0.2 + count: 1 + raw_value: 14 + - percentile: 0.3 + count: 2 + raw_value: 15 + - percentile: 0.4 + count: 2 + raw_value: 15 + - percentile: 0.5 + count: 2 + raw_value: 15 + - percentile: 0.55 + count: 3 + raw_value: 16 + - percentile: 0.6 + count: 3 + raw_value: 16 + - percentile: 0.65 + count: 3 + raw_value: 16 + - percentile: 0.7 + count: 3 + raw_value: 16 + - percentile: 0.75 + count: 3 + raw_value: 16 + - percentile: 0.775 + count: 4 + raw_value: 17 + - percentile: 1 + count: 4 + raw_value: 17 + raw_mean: 15.5 + raw_pstdev: 1.1180339887498949 + raw_min: 14 + raw_max: 17 + - count: 4 + id: foo_latency + percentiles: + - percentile: 0 + count: 1 + duration: 0.000180007s + - percentile: 0.1 + count: 1 + duration: 0.000180007s + - percentile: 0.2 + count: 1 + duration: 0.000180007s + - percentile: 0.3 + count: 2 + duration: 0.000190007s + - percentile: 0.4 + count: 2 + duration: 0.000190007s + - percentile: 0.5 + count: 2 + duration: 0.000190007s + - percentile: 0.55 + count: 3 + duration: 0.000200007s + - percentile: 0.6 + count: 3 + duration: 0.000200007s + - percentile: 0.65 + count: 3 + duration: 0.000200007s + - percentile: 0.7 + count: 3 + duration: 0.000200007s + - percentile: 0.75 + count: 3 + duration: 0.000200007s + - percentile: 0.775 + count: 4 + duration: 0.000210007s + - percentile: 1 + count: 4 + duration: 0.000210007s + mean: 0.000195004s + pstdev: 0.000011180s + min: 0.000180007s + max: 0.000210007s counters: - name: bar value: 2 @@ -56,12 +248,108 @@ results: [] mean: 0.002s pstdev: 0.000816497s + min: 0.001s + max: 0.003s - count: 0 id: "" percentiles: [] mean: 0s pstdev: 0s + min: 0s + max: 0s + - count: 4 + id: foo_size + percentiles: + - percentile: 0 + count: 1 + raw_value: 14 + - percentile: 0.1 + count: 1 + raw_value: 14 + - percentile: 0.2 + count: 1 + raw_value: 14 + - percentile: 0.3 + count: 2 + raw_value: 15 + - percentile: 0.4 + count: 2 + raw_value: 15 + - percentile: 0.5 + count: 2 + raw_value: 15 + - percentile: 0.55 + count: 3 + raw_value: 16 + - percentile: 0.6 + count: 3 + raw_value: 16 + - percentile: 0.65 + count: 3 + raw_value: 16 + - percentile: 0.7 + count: 3 + raw_value: 16 + - percentile: 0.75 + count: 3 + raw_value: 16 + - percentile: 0.775 + count: 4 + raw_value: 17 + - percentile: 1 + count: 4 + raw_value: 17 + raw_mean: 15.5 + raw_pstdev: 1.1180339887498949 + raw_min: 14 + raw_max: 17 + - count: 4 + id: foo_latency + percentiles: + - percentile: 0 + count: 1 + duration: 0.000180007s + - percentile: 0.1 + count: 1 + duration: 0.000180007s + - percentile: 0.2 + count: 1 + duration: 0.000180007s + - percentile: 0.3 + count: 2 + duration: 0.000190007s + - percentile: 0.4 + count: 2 + duration: 0.000190007s + - percentile: 0.5 + count: 2 + duration: 0.000190007s + - percentile: 0.55 + count: 3 + duration: 0.000200007s + - percentile: 0.6 + count: 3 + duration: 0.000200007s + - percentile: 0.65 + count: 3 + duration: 0.000200007s + - percentile: 0.7 + count: 3 + duration: 0.000200007s + - percentile: 0.75 + count: 3 + duration: 0.000200007s + - percentile: 0.775 + count: 4 + duration: 0.000210007s + - percentile: 1 + count: 4 + duration: 0.000210007s + mean: 0.000195004s + pstdev: 0.000011180s + min: 0.000180007s + max: 0.000210007s counters: - name: bar value: 2