From 230b5707248423521b73b59db13528f82b095d36 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 17 Oct 2022 11:28:20 -0400 Subject: [PATCH 001/122] subgroup cluster config update stats so that later we can lazy init on non-config-update stats Signed-off-by: Xin Zhuang --- envoy/upstream/cluster_manager.h | 1 + envoy/upstream/upstream.h | 33 ++++++++++++++----- .../common/upstream/cluster_manager_impl.cc | 1 + source/common/upstream/cluster_manager_impl.h | 4 +++ source/common/upstream/eds.cc | 8 ++--- source/common/upstream/logical_dns_cluster.cc | 6 ++-- source/common/upstream/strict_dns_cluster.cc | 8 ++--- source/common/upstream/upstream_impl.cc | 2 ++ source/common/upstream/upstream_impl.h | 2 ++ .../clusters/redis/redis_cluster.cc | 16 ++++----- test/mocks/upstream/cluster_info.h | 1 + test/mocks/upstream/cluster_manager.cc | 3 +- test/mocks/upstream/cluster_manager.h | 5 +++ 13 files changed, 62 insertions(+), 28 deletions(-) diff --git a/envoy/upstream/cluster_manager.h b/envoy/upstream/cluster_manager.h index bbdcaf27116d3..012e66d1e8a34 100644 --- a/envoy/upstream/cluster_manager.h +++ b/envoy/upstream/cluster_manager.h @@ -379,6 +379,7 @@ class ClusterManager { * @return the stat names. */ virtual const ClusterStatNames& clusterStatNames() const PURE; + virtual const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const PURE; virtual const ClusterLoadReportStatNames& clusterLoadReportStatNames() const PURE; virtual const ClusterCircuitBreakersStatNames& clusterCircuitBreakersStatNames() const PURE; virtual const ClusterRequestResponseSizeStatNames& diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 69ff8cb0895cd..b497b833113d9 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -528,11 +528,22 @@ class PrioritySet { }; /** - * All cluster stats. @see stats_macros.h + * All cluster config update related stats. */ -#define ALL_CLUSTER_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ +#define ALL_CLUSTER_CONFIG_UPDATE_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ COUNTER(assignment_stale) \ COUNTER(assignment_timeout_received) \ + COUNTER(update_attempt) \ + COUNTER(update_empty) \ + COUNTER(update_failure) \ + COUNTER(update_no_rebuild) \ + COUNTER(update_success) \ + GAUGE(version, NeverImport) + +/** + * All cluster stats. @see stats_macros.h + */ +#define ALL_CLUSTER_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ COUNTER(bind_errors) \ COUNTER(lb_healthy_panic) \ COUNTER(lb_local_cluster_not_ok) \ @@ -551,11 +562,6 @@ class PrioritySet { COUNTER(membership_change) \ COUNTER(original_dst_host_invalid) \ COUNTER(retry_or_shadow_abandoned) \ - COUNTER(update_attempt) \ - COUNTER(update_empty) \ - COUNTER(update_failure) \ - COUNTER(update_no_rebuild) \ - COUNTER(update_success) \ COUNTER(upstream_cx_close_notify) \ COUNTER(upstream_cx_connect_attempts_exceeded) \ COUNTER(upstream_cx_connect_fail) \ @@ -618,7 +624,6 @@ class PrioritySet { GAUGE(upstream_cx_tx_bytes_buffered, Accumulate) \ GAUGE(upstream_rq_active, Accumulate) \ GAUGE(upstream_rq_pending_active, Accumulate) \ - GAUGE(version, NeverImport) \ HISTOGRAM(upstream_cx_connect_ms, Milliseconds) \ HISTOGRAM(upstream_cx_length_ms, Milliseconds) @@ -670,6 +675,13 @@ class PrioritySet { HISTOGRAM(upstream_rq_timeout_budget_percent_used, Unspecified) \ HISTOGRAM(upstream_rq_timeout_budget_per_try_percent_used, Unspecified) +/** + * Struct definition for cluster config update stats. @see stats_macros.h + */ +MAKE_STAT_NAMES_STRUCT(ClusterConfigUpdateStatNames, ALL_CLUSTER_CONFIG_UPDATE_STATS); +MAKE_STATS_STRUCT(ClusterConfigUpdateStats, ClusterConfigUpdateStatNames, + ALL_CLUSTER_CONFIG_UPDATE_STATS); + /** * Struct definition for all cluster stats. @see stats_macros.h */ @@ -955,6 +967,11 @@ class ClusterInfo : public Http::FilterChainFactory { */ virtual TransportSocketMatcher& transportSocketMatcher() const PURE; + /** + * @return ClusterConfigUpdateStats& strongly named config update stats for this cluster. + */ + virtual ClusterConfigUpdateStats& configUpdateStats() const PURE; + /** * @return ClusterStats& strongly named stats for this cluster. */ diff --git a/source/common/upstream/cluster_manager_impl.cc b/source/common/upstream/cluster_manager_impl.cc index a03026aa72839..4dc4532455006 100644 --- a/source/common/upstream/cluster_manager_impl.cc +++ b/source/common/upstream/cluster_manager_impl.cc @@ -300,6 +300,7 @@ ClusterManagerImpl::ClusterManagerImpl( time_source_(main_thread_dispatcher.timeSource()), dispatcher_(main_thread_dispatcher), http_context_(http_context), router_context_(router_context), cluster_stat_names_(stats.symbolTable()), + cluster_config_update_stat_names_(stats.symbolTable()), cluster_load_report_stat_names_(stats.symbolTable()), cluster_circuit_breakers_stat_names_(stats.symbolTable()), cluster_request_response_size_stat_names_(stats.symbolTable()), diff --git a/source/common/upstream/cluster_manager_impl.h b/source/common/upstream/cluster_manager_impl.h index a779bef35ad1a..cea5a35e4ab9e 100644 --- a/source/common/upstream/cluster_manager_impl.h +++ b/source/common/upstream/cluster_manager_impl.h @@ -326,6 +326,9 @@ class ClusterManagerImpl : public ClusterManager, initializeSecondaryClusters(const envoy::config::bootstrap::v3::Bootstrap& bootstrap) override; const ClusterStatNames& clusterStatNames() const override { return cluster_stat_names_; } + const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { + return cluster_config_update_stat_names_; + } const ClusterLoadReportStatNames& clusterLoadReportStatNames() const override { return cluster_load_report_stat_names_; } @@ -765,6 +768,7 @@ class ClusterManagerImpl : public ClusterManager, Http::Context& http_context_; Router::Context& router_context_; ClusterStatNames cluster_stat_names_; + ClusterConfigUpdateStatNames cluster_config_update_stat_names_; ClusterLoadReportStatNames cluster_load_report_stat_names_; ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; diff --git a/source/common/upstream/eds.cc b/source/common/upstream/eds.cc index dda70e1f37364..b8dd5ec5b2276 100644 --- a/source/common/upstream/eds.cc +++ b/source/common/upstream/eds.cc @@ -120,7 +120,7 @@ void EdsClusterImpl::BatchUpdateHelper::batchUpdate(PrioritySet::HostUpdateCb& h } if (!cluster_rebuilt) { - parent_.info_->stats().update_no_rebuild_.inc(); + parent_.info_->configUpdateStats().update_no_rebuild_.inc(); } // If we didn't setup to initialize when our first round of health checking is complete, just @@ -178,7 +178,7 @@ void EdsClusterImpl::onConfigUpdate(const std::vector 0) { // Stat to track how often we receive valid assignment_timeout in response. - info_->stats().assignment_timeout_received_.inc(); + info_->configUpdateStats().assignment_timeout_received_.inc(); assignment_timeout_->enableTimer(std::chrono::milliseconds(stale_after_ms)); } @@ -260,7 +260,7 @@ void EdsClusterImpl::onConfigUpdate(const std::vectorstats().update_empty_.inc(); + info_->configUpdateStats().update_empty_.inc(); onPreInitComplete(); return false; } @@ -286,7 +286,7 @@ void EdsClusterImpl::onAssignmentTimeout() { std::vector resource_refs = {*decoded_resource}; onConfigUpdate(resource_refs, ""); // Stat to track how often we end up with stale assignments. - info_->stats().assignment_stale_.inc(); + info_->configUpdateStats().assignment_stale_.inc(); } void EdsClusterImpl::reloadHealthyHostsHelper(const HostSharedPtr& host) { diff --git a/source/common/upstream/logical_dns_cluster.cc b/source/common/upstream/logical_dns_cluster.cc index 12067608a3b5f..c608078a1479b 100644 --- a/source/common/upstream/logical_dns_cluster.cc +++ b/source/common/upstream/logical_dns_cluster.cc @@ -106,7 +106,7 @@ LogicalDnsCluster::~LogicalDnsCluster() { void LogicalDnsCluster::startResolve() { ENVOY_LOG(debug, "starting async DNS resolution for {}", dns_address_); - info_->stats().update_attempt_.inc(); + info_->configUpdateStats().update_attempt_.inc(); active_dns_query_ = dns_resolver_->resolve( dns_address_, dns_lookup_family_, @@ -121,7 +121,7 @@ void LogicalDnsCluster::startResolve() { // cluster does not update. This ensures that a potentially previously resolved address does // not stabilize back to 0 hosts. if (status == Network::DnsResolver::ResolutionStatus::Success && !response.empty()) { - info_->stats().update_success_.inc(); + info_->configUpdateStats().update_success_.inc(); const auto addrinfo = response.front().addrInfo(); // TODO(mattklein123): Move port handling into the DNS interface. ASSERT(addrinfo.address_ != nullptr); @@ -166,7 +166,7 @@ void LogicalDnsCluster::startResolve() { ENVOY_LOG(debug, "DNS refresh rate reset for {}, refresh rate {} ms", dns_address_, final_refresh_rate.count()); } else { - info_->stats().update_failure_.inc(); + info_->configUpdateStats().update_failure_.inc(); final_refresh_rate = std::chrono::milliseconds(failure_backoff_strategy_->nextBackOffMs()); ENVOY_LOG(debug, "DNS refresh rate reset for {}, (failure) refresh rate {} ms", diff --git a/source/common/upstream/strict_dns_cluster.cc b/source/common/upstream/strict_dns_cluster.cc index eae8fcf49bdc0..c7d947d76534d 100644 --- a/source/common/upstream/strict_dns_cluster.cc +++ b/source/common/upstream/strict_dns_cluster.cc @@ -105,7 +105,7 @@ StrictDnsClusterImpl::ResolveTarget::~ResolveTarget() { void StrictDnsClusterImpl::ResolveTarget::startResolve() { ENVOY_LOG(trace, "starting async DNS resolution for {}", dns_address_); - parent_.info_->stats().update_attempt_.inc(); + parent_.info_->configUpdateStats().update_attempt_.inc(); active_query_ = parent_.dns_resolver_->resolve( dns_address_, parent_.dns_lookup_family_, @@ -117,7 +117,7 @@ void StrictDnsClusterImpl::ResolveTarget::startResolve() { std::chrono::milliseconds final_refresh_rate = parent_.dns_refresh_rate_ms_; if (status == Network::DnsResolver::ResolutionStatus::Success) { - parent_.info_->stats().update_success_.inc(); + parent_.info_->configUpdateStats().update_success_.inc(); HostVector new_hosts; std::chrono::seconds ttl_refresh_rate = std::chrono::seconds::max(); @@ -164,7 +164,7 @@ void StrictDnsClusterImpl::ResolveTarget::startResolve() { parent_.updateAllHosts(hosts_added, hosts_removed, locality_lb_endpoints_.priority()); } else { - parent_.info_->stats().update_no_rebuild_.inc(); + parent_.info_->configUpdateStats().update_no_rebuild_.inc(); } // reset failure backoff strategy because there was a success. @@ -179,7 +179,7 @@ void StrictDnsClusterImpl::ResolveTarget::startResolve() { ENVOY_LOG(debug, "DNS refresh rate reset for {}, refresh rate {} ms", dns_address_, final_refresh_rate.count()); } else { - parent_.info_->stats().update_failure_.inc(); + parent_.info_->configUpdateStats().update_failure_.inc(); final_refresh_rate = std::chrono::milliseconds(parent_.failure_backoff_strategy_->nextBackOffMs()); diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 84c7f1c6c1846..b16bdeab628f2 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -911,6 +911,8 @@ ClusterInfoImpl::ClusterInfoImpl( PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, per_connection_buffer_limit_bytes, 1024 * 1024)), socket_matcher_(std::move(socket_matcher)), stats_scope_(std::move(stats_scope)), stats_(generateStats(*stats_scope_, factory_context.clusterManager().clusterStatNames())), + config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), + *stats_scope_), load_report_stats_store_(stats_scope_->symbolTable()), load_report_stats_(generateLoadReportStats( load_report_stats_store_, factory_context.clusterManager().clusterLoadReportStatNames())), diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 2dec305e6339d..d9a1cfa3414df 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -734,6 +734,7 @@ class ClusterInfoImpl : public ClusterInfo, ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } ClusterStats& stats() const override { return stats_; } + ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } Stats::Scope& statsScope() const override { return *stats_scope_; } ClusterRequestResponseSizeStatsOptRef requestResponseSizeStats() const override { @@ -850,6 +851,7 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; mutable ClusterStats stats_; + mutable ClusterConfigUpdateStats config_update_stats_; Stats::IsolatedStoreImpl load_report_stats_store_; mutable ClusterLoadReportStats load_report_stats_; const std::unique_ptr optional_cluster_stats_; diff --git a/source/extensions/clusters/redis/redis_cluster.cc b/source/extensions/clusters/redis/redis_cluster.cc index 19e9d928c32c3..3c7f1ef3df430 100644 --- a/source/extensions/clusters/redis/redis_cluster.cc +++ b/source/extensions/clusters/redis/redis_cluster.cc @@ -142,7 +142,7 @@ void RedisCluster::onClusterSlotUpdate(ClusterSlotsSharedPtr&& slots) { })); updateAllHosts(hosts_added, hosts_removed, localityLbEndpoint().priority()); } else { - info_->stats().update_no_rebuild_.inc(); + info_->configUpdateStats().update_no_rebuild_.inc(); } // TODO(hyang): If there is an initialize callback, fire it now. Note that if the @@ -190,9 +190,9 @@ void RedisCluster::DnsDiscoveryResolveTarget::startResolveDns() { ENVOY_LOG(trace, "async DNS resolution complete for {}", dns_address_); if (status == Network::DnsResolver::ResolutionStatus::Failure || response.empty()) { if (status == Network::DnsResolver::ResolutionStatus::Failure) { - parent_.info_->stats().update_failure_.inc(); + parent_.info_->configUpdateStats().update_failure_.inc(); } else { - parent_.info_->stats().update_empty_.inc(); + parent_.info_->configUpdateStats().update_empty_.inc(); } if (!resolve_timer_) { @@ -273,7 +273,7 @@ void RedisCluster::RedisDiscoverySession::registerDiscoveryAddress( } void RedisCluster::RedisDiscoverySession::startResolveRedis() { - parent_.info_->stats().update_attempt_.inc(); + parent_.info_->configUpdateStats().update_attempt_.inc(); // If a resolution is currently in progress, skip it. if (current_request_) { ENVOY_LOG(debug, "redis cluster slot request is already in progress for '{}'", @@ -311,9 +311,9 @@ void RedisCluster::RedisDiscoverySession::startResolveRedis() { void RedisCluster::RedisDiscoverySession::updateDnsStats( Network::DnsResolver::ResolutionStatus status, bool empty_response) { if (status == Network::DnsResolver::ResolutionStatus::Failure) { - parent_.info_->stats().update_failure_.inc(); + parent_.info_->configUpdateStats().update_failure_.inc(); } else if (empty_response) { - parent_.info_->stats().update_empty_.inc(); + parent_.info_->configUpdateStats().update_empty_.inc(); } } @@ -558,7 +558,7 @@ bool RedisCluster::RedisDiscoverySession::validateCluster( void RedisCluster::RedisDiscoverySession::onUnexpectedResponse( const NetworkFilters::Common::Redis::RespValuePtr& value) { ENVOY_LOG(warn, "Unexpected response to cluster slot command: {}", value->toString()); - this->parent_.info_->stats().update_failure_.inc(); + this->parent_.info_->configUpdateStats().update_failure_.inc(); resolve_timer_->enableTimer(parent_.cluster_refresh_rate_); } @@ -569,7 +569,7 @@ void RedisCluster::RedisDiscoverySession::onFailure() { auto client_to_delete = client_map_.find(current_host_address_); client_to_delete->second->client_->close(); } - parent_.info()->stats().update_failure_.inc(); + parent_.info()->configUpdateStats().update_failure_.inc(); resolve_timer_->enableTimer(parent_.cluster_refresh_rate_); } diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 337836d77baeb..3b60e6a4c87c9 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -141,6 +141,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); MOCK_METHOD(ClusterStats&, stats, (), (const)); + MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); MOCK_METHOD(Stats::Scope&, statsScope, (), (const)); MOCK_METHOD(ClusterLoadReportStats&, loadReportStats, (), (const)); MOCK_METHOD(ClusterRequestResponseSizeStatsOptRef, requestResponseSizeStats, (), (const)); diff --git a/test/mocks/upstream/cluster_manager.cc b/test/mocks/upstream/cluster_manager.cc index 05c5afcd8aacc..285c4c051dc27 100644 --- a/test/mocks/upstream/cluster_manager.cc +++ b/test/mocks/upstream/cluster_manager.cc @@ -15,7 +15,8 @@ using ::testing::ReturnRef; MockClusterManager::MockClusterManager(TimeSource&) : MockClusterManager() {} MockClusterManager::MockClusterManager() - : cluster_stat_names_(*symbol_table_), cluster_load_report_stat_names_(*symbol_table_), + : cluster_stat_names_(*symbol_table_), cluster_config_update_stat_names_(*symbol_table_), + cluster_load_report_stat_names_(*symbol_table_), cluster_circuit_breakers_stat_names_(*symbol_table_), cluster_request_response_size_stat_names_(*symbol_table_), cluster_timeout_budget_stat_names_(*symbol_table_) { diff --git a/test/mocks/upstream/cluster_manager.h b/test/mocks/upstream/cluster_manager.h index 59dfce2e01c6b..118b3665da1e5 100644 --- a/test/mocks/upstream/cluster_manager.h +++ b/test/mocks/upstream/cluster_manager.h @@ -57,6 +57,10 @@ class MockClusterManager : public ClusterManager { (ClusterUpdateCallbacks & callbacks)); MOCK_METHOD(Config::SubscriptionFactory&, subscriptionFactory, ()); const ClusterStatNames& clusterStatNames() const override { return cluster_stat_names_; } + const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { + return cluster_config_update_stat_names_; + } + const ClusterLoadReportStatNames& clusterLoadReportStatNames() const override { return cluster_load_report_stat_names_; } @@ -89,6 +93,7 @@ class MockClusterManager : public ClusterManager { absl::flat_hash_map> warming_clusters_; Stats::TestUtil::TestSymbolTable symbol_table_; ClusterStatNames cluster_stat_names_; + ClusterConfigUpdateStatNames cluster_config_update_stat_names_; ClusterLoadReportStatNames cluster_load_report_stat_names_; ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; From 4c1a07663b324d8f40b649a3f07c79f9613c900c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 17 Oct 2022 11:46:38 -0400 Subject: [PATCH 002/122] add missing init Signed-off-by: Xin Zhuang --- .../clusters/redis/redis_cluster_test.cc | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/test/extensions/clusters/redis/redis_cluster_test.cc b/test/extensions/clusters/redis/redis_cluster_test.cc index b4042cec5771d..b0f033e0617a1 100644 --- a/test/extensions/clusters/redis/redis_cluster_test.cc +++ b/test/extensions/clusters/redis/redis_cluster_test.cc @@ -791,7 +791,7 @@ TEST_F(RedisClusterTest, AddressAsHostname) { EXPECT_CALL(*cluster_callback_, onClusterSlotUpdate(_, _)); expectClusterSlotResponse(singleSlotPrimaryReplica("primary.com", "replica.org", 22120)); expectHealthyHosts(std::list({"127.0.1.1:22120", "127.0.1.2:22120"})); - EXPECT_EQ(0U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(0U, cluster_->info()->configUpdateStats().update_failure_.value()); // 2. Single slot with just the primary hostname expectRedisResolve(true); @@ -802,7 +802,7 @@ TEST_F(RedisClusterTest, AddressAsHostname) { EXPECT_CALL(*cluster_callback_, onClusterSlotUpdate(_, _)); expectClusterSlotResponse(singleSlotPrimary("primary.com", 22120)); expectHealthyHosts(std::list({"127.0.1.1:22120"})); - EXPECT_EQ(0U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(0U, cluster_->info()->configUpdateStats().update_failure_.value()); // 2. Single slot with just the primary IP address and replica hostname expectRedisResolve(); @@ -813,7 +813,7 @@ TEST_F(RedisClusterTest, AddressAsHostname) { EXPECT_CALL(*cluster_callback_, onClusterSlotUpdate(_, _)); expectClusterSlotResponse(singleSlotPrimaryReplica("127.0.1.1", "replica.org", 22120)); expectHealthyHosts(std::list({"127.0.1.1:22120", "127.0.1.2:22120"})); - EXPECT_EQ(0U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(0U, cluster_->info()->configUpdateStats().update_failure_.value()); } TEST_F(RedisClusterTest, AddressAsHostnameParallelResolution) { @@ -845,7 +845,7 @@ TEST_F(RedisClusterTest, AddressAsHostnameParallelResolution) { "127.0.1.1:22120", "127.0.1.2:22120", })); - EXPECT_EQ(0U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(0U, cluster_->info()->configUpdateStats().update_failure_.value()); } TEST_F(RedisClusterTest, AddressAsHostnameFailure) { @@ -875,7 +875,7 @@ TEST_F(RedisClusterTest, AddressAsHostnameFailure) { EXPECT_EQ(1UL, cluster_->prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(1UL, cluster_->prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); expectHealthyHosts(std::list({"127.0.1.1:22120"})); - EXPECT_EQ(1UL, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(1UL, cluster_->info()->configUpdateStats().update_failure_.value()); // 2. Primary resolution fails, so replica resolution is not even called. // Expect cluster slot update to be successful, with just one healthy host, and failure counter to @@ -894,7 +894,7 @@ TEST_F(RedisClusterTest, AddressAsHostnameFailure) { // healthy hosts is same as before, but failure count increases by 1 EXPECT_EQ(1UL, cluster_->prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(1UL, cluster_->prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(2UL, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(2UL, cluster_->info()->configUpdateStats().update_failure_.value()); } TEST_F(RedisClusterTest, AddressAsHostnamePartialReplicaFailure) { @@ -940,7 +940,7 @@ TEST_F(RedisClusterTest, EmptyDnsResponse) { EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1U, cluster_->info()->stats().update_empty_.value()); + EXPECT_EQ(1U, cluster_->info()->configUpdateStats().update_empty_.value()); // Does not recreate the timer on subsequent DNS resolve calls. EXPECT_CALL(*dns_timer, enableTimer(_, _)); @@ -949,7 +949,7 @@ TEST_F(RedisClusterTest, EmptyDnsResponse) { EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(2U, cluster_->info()->stats().update_empty_.value()); + EXPECT_EQ(2U, cluster_->info()->configUpdateStats().update_empty_.value()); } TEST_F(RedisClusterTest, FailedDnsResponse) { @@ -965,7 +965,7 @@ TEST_F(RedisClusterTest, FailedDnsResponse) { EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(0U, cluster_->info()->stats().update_empty_.value()); + EXPECT_EQ(0U, cluster_->info()->configUpdateStats().update_empty_.value()); // Does not recreate the timer on subsequent DNS resolve calls. EXPECT_CALL(*dns_timer, enableTimer(_, _)); @@ -974,7 +974,7 @@ TEST_F(RedisClusterTest, FailedDnsResponse) { EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(0UL, cluster_->prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1U, cluster_->info()->stats().update_empty_.value()); + EXPECT_EQ(1U, cluster_->info()->configUpdateStats().update_empty_.value()); } TEST_F(RedisClusterTest, Basic) { @@ -1020,8 +1020,8 @@ TEST_F(RedisClusterTest, RedisResolveFailure) { // Initialization will wait til the redis cluster succeed. expectClusterSlotFailure(); - EXPECT_EQ(1U, cluster_->info()->stats().update_attempt_.value()); - EXPECT_EQ(1U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(1U, cluster_->info()->configUpdateStats().update_attempt_.value()); + EXPECT_EQ(1U, cluster_->info()->configUpdateStats().update_failure_.value()); expectRedisResolve(true); resolve_timer_->invokeCallback(); @@ -1036,8 +1036,8 @@ TEST_F(RedisClusterTest, RedisResolveFailure) { resolve_timer_->invokeCallback(); expectClusterSlotFailure(); expectHealthyHosts(std::list({"127.0.0.1:22120", "127.0.0.2:22120"})); - EXPECT_EQ(3U, cluster_->info()->stats().update_attempt_.value()); - EXPECT_EQ(2U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(3U, cluster_->info()->configUpdateStats().update_attempt_.value()); + EXPECT_EQ(2U, cluster_->info()->configUpdateStats().update_failure_.value()); } TEST_F(RedisClusterTest, FactoryInitNotRedisClusterTypeFailure) { @@ -1092,8 +1092,8 @@ TEST_F(RedisClusterTest, RedisErrorResponse) { EXPECT_CALL(*cluster_callback_, onClusterSlotUpdate(_, _)).Times(0); expectClusterSlotResponse(std::move(hello_world_response)); - EXPECT_EQ(1U, cluster_->info()->stats().update_attempt_.value()); - EXPECT_EQ(1U, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(1U, cluster_->info()->configUpdateStats().update_attempt_.value()); + EXPECT_EQ(1U, cluster_->info()->configUpdateStats().update_failure_.value()); expectRedisResolve(); resolve_timer_->invokeCallback(); @@ -1118,9 +1118,9 @@ TEST_F(RedisClusterTest, RedisErrorResponse) { } expectClusterSlotResponse(createResponse(flags, no_replica)); expectHealthyHosts(std::list({"127.0.0.1:22120"})); - EXPECT_EQ(++update_attempt, cluster_->info()->stats().update_attempt_.value()); + EXPECT_EQ(++update_attempt, cluster_->info()->configUpdateStats().update_attempt_.value()); if (!flags.all()) { - EXPECT_EQ(++update_failure, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(++update_failure, cluster_->info()->configUpdateStats().update_failure_.value()); } } } @@ -1155,9 +1155,9 @@ TEST_F(RedisClusterTest, RedisReplicaErrorResponse) { } expectHealthyHosts(std::list({"127.0.0.1:22120"})); expectClusterSlotResponse(createResponse(single_slot_primary, replica_flags)); - EXPECT_EQ(++update_attempt, cluster_->info()->stats().update_attempt_.value()); + EXPECT_EQ(++update_attempt, cluster_->info()->configUpdateStats().update_attempt_.value()); if (!(replica_flags.all() || replica_flags.none())) { - EXPECT_EQ(++update_failure, cluster_->info()->stats().update_failure_.value()); + EXPECT_EQ(++update_failure, cluster_->info()->configUpdateStats().update_failure_.value()); } } } From e370c84bffafbab65d38563701e3d58d897b2aea Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 8 Nov 2022 12:02:26 -0500 Subject: [PATCH 003/122] add more comments Signed-off-by: Xin Zhuang --- envoy/upstream/upstream.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index f69074841d10f..2eaf4ccfc459c 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -566,6 +566,12 @@ class PrioritySet { /** * All cluster config update related stats. + * See https://github.com/envoyproxy/envoy/issues/23575 for details. Stats from ClusterInfo::stats() + * will be split into subgroups "config-update", "lb", "endpoint" and "upstream", roughly based on + * their semantics. This list of stats are separated from Cluster::stats() since they are "config + * pipeline related". + * + * Each group of */ #define ALL_CLUSTER_CONFIG_UPDATE_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ COUNTER(assignment_stale) \ From 2a45ccfbaf4bade504c2291df252dd7c47ec2513 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 8 Nov 2022 16:50:19 -0500 Subject: [PATCH 004/122] Subgroup cluster stats() into lb-stats, endpoint-stats, config-update-stats and "the rest"(will be renamed to upstream-stats) Signed-off-by: Xin Zhuang --- envoy/upstream/cluster_manager.h | 2 + envoy/upstream/upstream.h | 52 +++- .../common/upstream/cluster_manager_impl.cc | 14 +- source/common/upstream/cluster_manager_impl.h | 6 + source/common/upstream/load_balancer_impl.cc | 32 +-- source/common/upstream/load_balancer_impl.h | 31 +- source/common/upstream/maglev_lb.cc | 4 +- source/common/upstream/maglev_lb.h | 2 +- source/common/upstream/ring_hash_lb.cc | 4 +- source/common/upstream/ring_hash_lb.h | 2 +- source/common/upstream/subset_lb.cc | 35 +-- source/common/upstream/subset_lb.h | 4 +- .../common/upstream/thread_aware_lb_impl.cc | 4 +- source/common/upstream/thread_aware_lb_impl.h | 18 +- source/common/upstream/upstream_impl.cc | 14 +- source/common/upstream/upstream_impl.h | 4 + .../extensions/clusters/aggregate/cluster.cc | 2 +- .../extensions/clusters/aggregate/cluster.h | 4 +- .../filters/http/health_check/health_check.cc | 7 +- .../least_request_load_balancer_fuzz_test.cc | 2 +- .../upstream/load_balancer_benchmark.cc | 16 +- .../common/upstream/load_balancer_fuzz_base.h | 7 +- .../upstream/load_balancer_impl_test.cc | 100 +++---- .../upstream/load_balancer_simulation_test.cc | 16 +- test/common/upstream/maglev_lb_test.cc | 9 +- .../random_load_balancer_fuzz_test.cc | 2 +- test/common/upstream/ring_hash_lb_test.cc | 23 +- .../round_robin_load_balancer_fuzz_test.cc | 2 +- test/common/upstream/subset_lb_test.cc | 271 +++++++++--------- test/common/upstream/upstream_impl_test.cc | 50 ++-- .../zone_aware_load_balancer_fuzz_base.cc | 1 - test/mocks/upstream/cluster_info.cc | 7 + test/mocks/upstream/cluster_info.h | 8 + test/mocks/upstream/cluster_manager.cc | 1 + test/mocks/upstream/cluster_manager.h | 7 +- 35 files changed, 414 insertions(+), 349 deletions(-) diff --git a/envoy/upstream/cluster_manager.h b/envoy/upstream/cluster_manager.h index 012e66d1e8a34..e8a5853a8fbad 100644 --- a/envoy/upstream/cluster_manager.h +++ b/envoy/upstream/cluster_manager.h @@ -380,6 +380,8 @@ class ClusterManager { */ virtual const ClusterStatNames& clusterStatNames() const PURE; virtual const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const PURE; + virtual const ClusterLbStatNames& clusterLbStatNames() const PURE; + virtual const ClusterEndpointStatNames& clusterEndpointStatNames() const PURE; virtual const ClusterLoadReportStatNames& clusterLoadReportStatNames() const PURE; virtual const ClusterCircuitBreakersStatNames& clusterCircuitBreakersStatNames() const PURE; virtual const ClusterRequestResponseSizeStatNames& diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 2eaf4ccfc459c..5ae11da6bd819 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -584,10 +584,20 @@ class PrioritySet { GAUGE(version, NeverImport) /** - * All cluster stats. @see stats_macros.h + * All cluster endpoints related stats. */ -#define ALL_CLUSTER_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ - COUNTER(bind_errors) \ +#define ALL_CLUSTER_ENDPOINT_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ + GAUGE(max_host_weight, NeverImport) \ + COUNTER(membership_change) \ + GAUGE(membership_degraded, NeverImport) \ + GAUGE(membership_excluded, NeverImport) \ + GAUGE(membership_healthy, NeverImport) \ + GAUGE(membership_total, NeverImport) + +/** + * All cluster loadbalancing related stats. + */ +#define ALL_CLUSTER_LB_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ COUNTER(lb_healthy_panic) \ COUNTER(lb_local_cluster_not_ok) \ COUNTER(lb_recalculate_zone_structures) \ @@ -602,7 +612,13 @@ class PrioritySet { COUNTER(lb_zone_routing_all_directly) \ COUNTER(lb_zone_routing_cross_zone) \ COUNTER(lb_zone_routing_sampled) \ - COUNTER(membership_change) \ + GAUGE(lb_subsets_active, Accumulate) + +/** + * All cluster stats. @see stats_macros.h + */ +#define ALL_CLUSTER_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ + COUNTER(bind_errors) \ COUNTER(original_dst_host_invalid) \ COUNTER(retry_or_shadow_abandoned) \ COUNTER(upstream_cx_close_notify) \ @@ -656,12 +672,6 @@ class PrioritySet { COUNTER(upstream_rq_total) \ COUNTER(upstream_rq_tx_reset) \ COUNTER(upstream_http3_broken) \ - GAUGE(lb_subsets_active, Accumulate) \ - GAUGE(max_host_weight, NeverImport) \ - GAUGE(membership_degraded, NeverImport) \ - GAUGE(membership_excluded, NeverImport) \ - GAUGE(membership_healthy, NeverImport) \ - GAUGE(membership_total, NeverImport) \ GAUGE(upstream_cx_active, Accumulate) \ GAUGE(upstream_cx_rx_bytes_buffered, Accumulate) \ GAUGE(upstream_cx_tx_bytes_buffered, Accumulate) \ @@ -725,6 +735,18 @@ MAKE_STAT_NAMES_STRUCT(ClusterConfigUpdateStatNames, ALL_CLUSTER_CONFIG_UPDATE_S MAKE_STATS_STRUCT(ClusterConfigUpdateStats, ClusterConfigUpdateStatNames, ALL_CLUSTER_CONFIG_UPDATE_STATS); +/** + * Struct definition for cluster endpoint related stats. @see stats_macros.h + */ +MAKE_STAT_NAMES_STRUCT(ClusterEndpointStatNames, ALL_CLUSTER_ENDPOINT_STATS); +MAKE_STATS_STRUCT(ClusterEndpointStats, ClusterEndpointStatNames, ALL_CLUSTER_ENDPOINT_STATS); + +/** + * Struct definition for cluster load balancing stats. @see stats_macros.h + */ +MAKE_STAT_NAMES_STRUCT(ClusterLbStatNames, ALL_CLUSTER_LB_STATS); +MAKE_STATS_STRUCT(ClusterLbStats, ClusterLbStatNames, ALL_CLUSTER_LB_STATS); + /** * Struct definition for all cluster stats. @see stats_macros.h */ @@ -1013,6 +1035,16 @@ class ClusterInfo : public Http::FilterChainFactory { * @return ClusterConfigUpdateStats& strongly named config update stats for this cluster. */ virtual ClusterConfigUpdateStats& configUpdateStats() const PURE; + + /** + * @return ClusterLbStats& strongly named stats for this cluster. + */ + virtual ClusterLbStats& lbStats() const PURE; + + /** + * @return ClusterEndpointStats& strongly named stats for this cluster. + */ + virtual ClusterEndpointStats& endpointStats() const PURE; /** * @return ClusterStats& strongly named stats for this cluster. diff --git a/source/common/upstream/cluster_manager_impl.cc b/source/common/upstream/cluster_manager_impl.cc index f79ef31c3d255..14c67c9733f4c 100644 --- a/source/common/upstream/cluster_manager_impl.cc +++ b/source/common/upstream/cluster_manager_impl.cc @@ -301,6 +301,8 @@ ClusterManagerImpl::ClusterManagerImpl( http_context_(http_context), router_context_(router_context), cluster_stat_names_(stats.symbolTable()), cluster_config_update_stat_names_(stats.symbolTable()), + cluster_lb_stat_names_(stats.symbolTable()), + cluster_endpoint_stat_names_(stats.symbolTable()), cluster_load_report_stat_names_(stats.symbolTable()), cluster_circuit_breakers_stat_names_(stats.symbolTable()), cluster_request_response_size_stat_names_(stats.symbolTable()), @@ -885,14 +887,14 @@ ClusterManagerImpl::loadCluster(const envoy::config::cluster::v3::Cluster& clust if (cluster_reference.info()->lbType() == LoadBalancerType::RingHash) { if (!cluster_reference.info()->lbSubsetInfo().isEnabled()) { cluster_entry_it->second->thread_aware_lb_ = std::make_unique( - cluster_reference.prioritySet(), cluster_reference.info()->stats(), + cluster_reference.prioritySet(), cluster_reference.info()->lbStats(), cluster_reference.info()->statsScope(), runtime_, random_, cluster_reference.info()->lbRingHashConfig(), cluster_reference.info()->lbConfig()); } } else if (cluster_reference.info()->lbType() == LoadBalancerType::Maglev) { if (!cluster_reference.info()->lbSubsetInfo().isEnabled()) { cluster_entry_it->second->thread_aware_lb_ = std::make_unique( - cluster_reference.prioritySet(), cluster_reference.info()->stats(), + cluster_reference.prioritySet(), cluster_reference.info()->lbStats(), cluster_reference.info()->statsScope(), runtime_, random_, cluster_reference.info()->lbMaglevConfig(), cluster_reference.info()->lbConfig()); } @@ -1515,7 +1517,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::ClusterEntry( // benefit given the healthy panic, locality, and priority calculations that take place. if (cluster->lbSubsetInfo().isEnabled()) { lb_ = std::make_unique( - cluster->lbType(), priority_set_, parent_.local_priority_set_, cluster->stats(), + cluster->lbType(), priority_set_, parent_.local_priority_set_, cluster->lbStats(), cluster->statsScope(), parent.parent_.runtime_, parent.parent_.random_, cluster->lbSubsetInfo(), cluster->lbRingHashConfig(), cluster->lbMaglevConfig(), cluster->lbRoundRobinConfig(), cluster->lbLeastRequestConfig(), cluster->lbConfig(), @@ -1525,7 +1527,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::ClusterEntry( case LoadBalancerType::LeastRequest: { ASSERT(lb_factory_ == nullptr); lb_ = std::make_unique( - priority_set_, parent_.local_priority_set_, cluster->stats(), parent.parent_.runtime_, + priority_set_, parent_.local_priority_set_, cluster->lbStats(), parent.parent_.runtime_, parent.parent_.random_, cluster->lbConfig(), cluster->lbLeastRequestConfig(), parent.thread_local_dispatcher_.timeSource()); break; @@ -1533,14 +1535,14 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::ClusterEntry( case LoadBalancerType::Random: { ASSERT(lb_factory_ == nullptr); lb_ = std::make_unique(priority_set_, parent_.local_priority_set_, - cluster->stats(), parent.parent_.runtime_, + cluster->lbStats(), parent.parent_.runtime_, parent.parent_.random_, cluster->lbConfig()); break; } case LoadBalancerType::RoundRobin: { ASSERT(lb_factory_ == nullptr); lb_ = std::make_unique( - priority_set_, parent_.local_priority_set_, cluster->stats(), parent.parent_.runtime_, + priority_set_, parent_.local_priority_set_, cluster->lbStats(), parent.parent_.runtime_, parent.parent_.random_, cluster->lbConfig(), cluster->lbRoundRobinConfig(), parent.thread_local_dispatcher_.timeSource()); break; diff --git a/source/common/upstream/cluster_manager_impl.h b/source/common/upstream/cluster_manager_impl.h index cea5a35e4ab9e..c2ef8daf92e93 100644 --- a/source/common/upstream/cluster_manager_impl.h +++ b/source/common/upstream/cluster_manager_impl.h @@ -329,6 +329,10 @@ class ClusterManagerImpl : public ClusterManager, const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { return cluster_config_update_stat_names_; } + const ClusterLbStatNames& clusterLbStatNames() const override { return cluster_lb_stat_names_; } + const ClusterEndpointStatNames& clusterEndpointStatNames() const override { + return cluster_endpoint_stat_names_; + } const ClusterLoadReportStatNames& clusterLoadReportStatNames() const override { return cluster_load_report_stat_names_; } @@ -769,6 +773,8 @@ class ClusterManagerImpl : public ClusterManager, Router::Context& router_context_; ClusterStatNames cluster_stat_names_; ClusterConfigUpdateStatNames cluster_config_update_stat_names_; + ClusterLbStatNames cluster_lb_stat_names_; + ClusterEndpointStatNames cluster_endpoint_stat_names_; ClusterLoadReportStatNames cluster_load_report_stat_names_; ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; diff --git a/source/common/upstream/load_balancer_impl.cc b/source/common/upstream/load_balancer_impl.cc index e89a0ad9f8df9..e408918eb7866 100644 --- a/source/common/upstream/load_balancer_impl.cc +++ b/source/common/upstream/load_balancer_impl.cc @@ -109,10 +109,10 @@ LoadBalancerBase::choosePriority(uint64_t hash, const HealthyLoad& healthy_per_p } LoadBalancerBase::LoadBalancerBase( - const PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : stats_(stats), runtime_(runtime), random_(random), + : lb_stats_(lb_stats), runtime_(runtime), random_(random), default_healthy_panic_percent_(PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT( common_config, healthy_panic_threshold, 100, 50)), priority_set_(priority_set), @@ -352,10 +352,10 @@ LoadBalancerBase::chooseHostSet(LoadBalancerContext* context, uint64_t hash) con } ZoneAwareLoadBalancerBase::ZoneAwareLoadBalancerBase( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterStats& stats, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : LoadBalancerBase(priority_set, stats, runtime, random, common_config), + : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), local_priority_set_(local_priority_set), routing_enabled_(PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT( common_config.zone_aware_lb_config(), routing_enabled, 100, 100)), @@ -395,7 +395,7 @@ ZoneAwareLoadBalancerBase::ZoneAwareLoadBalancerBase( void ZoneAwareLoadBalancerBase::regenerateLocalityRoutingStructures() { ASSERT(local_priority_set_); - stats_.lb_recalculate_zone_structures_.inc(); + lb_stats_.lb_recalculate_zone_structures_.inc(); // resizePerPriorityState should ensure these stay in sync. ASSERT(per_priority_state_.size() == priority_set_.hostSetsPerPriority().size()); @@ -493,14 +493,14 @@ bool ZoneAwareLoadBalancerBase::earlyExitNonLocalityRouting() { // panic mode for local cluster". if (!host_set.healthyHostsPerLocality().hasLocalLocality() || host_set.healthyHostsPerLocality().get()[0].empty()) { - stats_.lb_local_cluster_not_ok_.inc(); + lb_stats_.lb_local_cluster_not_ok_.inc(); return true; } // Same number of localities should be for local and upstream cluster. if (host_set.healthyHostsPerLocality().get().size() != localHostSet().healthyHostsPerLocality().get().size()) { - stats_.lb_zone_number_differs_.inc(); + lb_stats_.lb_zone_number_differs_.inc(); return true; } @@ -508,7 +508,7 @@ bool ZoneAwareLoadBalancerBase::earlyExitNonLocalityRouting() { const uint64_t min_cluster_size = runtime_.snapshot().getInteger(RuntimeMinClusterSize, min_cluster_size_); if (host_set.healthyHosts().size() < min_cluster_size) { - stats_.lb_zone_cluster_too_small_.inc(); + lb_stats_.lb_zone_cluster_too_small_.inc(); return true; } @@ -644,7 +644,7 @@ uint32_t ZoneAwareLoadBalancerBase::tryChooseLocalLocalityHosts(const HostSet& h // Try to push all of the requests to the same locality first. if (state.locality_routing_state_ == LocalityRoutingState::LocalityDirect) { - stats_.lb_zone_routing_all_directly_.inc(); + lb_stats_.lb_zone_routing_all_directly_.inc(); return 0; } @@ -653,17 +653,17 @@ uint32_t ZoneAwareLoadBalancerBase::tryChooseLocalLocalityHosts(const HostSet& h // If we cannot route all requests to the same locality, we already calculated how much we can // push to the local locality, check if we can push to local locality on current iteration. if (random_.random() % 10000 < state.local_percent_to_route_) { - stats_.lb_zone_routing_sampled_.inc(); + lb_stats_.lb_zone_routing_sampled_.inc(); return 0; } // At this point we must route cross locality as we cannot route to the local locality. - stats_.lb_zone_routing_cross_zone_.inc(); + lb_stats_.lb_zone_routing_cross_zone_.inc(); // This is *extremely* unlikely but possible due to rounding errors when calculating // locality percentages. In this case just select random locality. if (state.residual_capacity_[number_of_localities - 1] == 0) { - stats_.lb_zone_no_capacity_left_.inc(); + lb_stats_.lb_zone_no_capacity_left_.inc(); return random_.random() % number_of_localities; } @@ -696,7 +696,7 @@ ZoneAwareLoadBalancerBase::hostSourceToUse(LoadBalancerContext* context, uint64_ // If the selected host set has insufficient healthy hosts, return all hosts (unless we should // fail traffic on panic, in which case return no host). if (per_priority_panic_[hosts_source.priority_]) { - stats_.lb_healthy_panic_.inc(); + lb_stats_.lb_healthy_panic_.inc(); if (fail_traffic_on_panic_) { return absl::nullopt; } else { @@ -746,7 +746,7 @@ ZoneAwareLoadBalancerBase::hostSourceToUse(LoadBalancerContext* context, uint64_ } if (isHostSetInPanic(localHostSet())) { - stats_.lb_local_cluster_not_ok_.inc(); + lb_stats_.lb_local_cluster_not_ok_.inc(); // If the local Envoy instances are in global panic, and we should not fail traffic, do // not do locality based routing. if (fail_traffic_on_panic_) { @@ -788,12 +788,12 @@ const HostVector& ZoneAwareLoadBalancerBase::hostSourceToHosts(HostsSource hosts } EdfLoadBalancerBase::EdfLoadBalancerBase( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterStats& stats, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional slow_start_config, TimeSource& time_source) - : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, stats, runtime, random, + : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, lb_stats, runtime, random, common_config), seed_(random_.random()), slow_start_window_(slow_start_config.has_value() diff --git a/source/common/upstream/load_balancer_impl.h b/source/common/upstream/load_balancer_impl.h index 6e677afa2d1d8..5c480844d5c21 100644 --- a/source/common/upstream/load_balancer_impl.h +++ b/source/common/upstream/load_balancer_impl.h @@ -70,8 +70,8 @@ class LoadBalancerBase : public LoadBalancer { */ void recalculateLoadInTotalPanic(); - LoadBalancerBase(const PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime, - Random::RandomGenerator& random, + LoadBalancerBase(const PrioritySet& priority_set, ClusterLbStats& lb_stats, + Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); // Choose host set randomly, based on the healthy_per_priority_load_ and @@ -105,7 +105,7 @@ class LoadBalancerBase : public LoadBalancer { } } - ClusterStats& stats_; + ClusterLbStats& lb_stats_; Runtime::Loader& runtime_; std::deque stashed_random_; Random::RandomGenerator& random_; @@ -220,8 +220,8 @@ class ZoneAwareLoadBalancerBase : public LoadBalancerBase { protected: // Both priority_set and local_priority_set if non-null must have at least one host set. ZoneAwareLoadBalancerBase( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterStats& stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); // When deciding which hosts to use on an LB decision, we need to know how to index into the @@ -426,8 +426,8 @@ class EdfLoadBalancerBase : public ZoneAwareLoadBalancerBase, Logger::Loggable { public: EdfLoadBalancerBase( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterStats& stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional slow_start_cofig, TimeSource& time_source); @@ -494,14 +494,14 @@ class EdfLoadBalancerBase : public ZoneAwareLoadBalancerBase, class RoundRobinLoadBalancer : public EdfLoadBalancerBase { public: RoundRobinLoadBalancer( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterStats& stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional round_robin_config, TimeSource& time_source) : EdfLoadBalancerBase( - priority_set, local_priority_set, stats, runtime, random, common_config, + priority_set, local_priority_set, lb_stats, runtime, random, common_config, (round_robin_config.has_value() && round_robin_config.value().has_slow_start_config()) ? absl::optional( round_robin_config.value().slow_start_config()) @@ -572,14 +572,14 @@ class RoundRobinLoadBalancer : public EdfLoadBalancerBase { class LeastRequestLoadBalancer : public EdfLoadBalancerBase { public: LeastRequestLoadBalancer( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterStats& stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional least_request_config, TimeSource& time_source) : EdfLoadBalancerBase( - priority_set, local_priority_set, stats, runtime, random, common_config, + priority_set, local_priority_set, lb_stats, runtime, random, common_config, (least_request_config.has_value() && least_request_config.value().has_slow_start_config()) ? absl::optional( @@ -672,9 +672,10 @@ class RandomLoadBalancer : public ZoneAwareLoadBalancerBase, Logger::Loggable { public: RandomLoadBalancer(const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, + Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, stats, runtime, random, + : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, lb_stats, runtime, random, common_config) {} // Upstream::ZoneAwareLoadBalancerBase diff --git a/source/common/upstream/maglev_lb.cc b/source/common/upstream/maglev_lb.cc index 7617853725d06..ad9b1ce0c5b72 100644 --- a/source/common/upstream/maglev_lb.cc +++ b/source/common/upstream/maglev_lb.cc @@ -93,11 +93,11 @@ uint64_t MaglevTable::permutation(const TableBuildEntry& entry) { } MaglevLoadBalancer::MaglevLoadBalancer( - const PrioritySet& priority_set, ClusterStats& stats, Stats::Scope& scope, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ThreadAwareLoadBalancerBase(priority_set, stats, runtime, random, common_config), + : ThreadAwareLoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), scope_(scope.createScope("maglev_lb.")), stats_(generateStats(*scope_)), table_size_(config ? PROTOBUF_GET_WRAPPED_OR_DEFAULT(config.value(), table_size, MaglevTable::DefaultTableSize) diff --git a/source/common/upstream/maglev_lb.h b/source/common/upstream/maglev_lb.h index 0d1c6fc5f71e1..652290f30d125 100644 --- a/source/common/upstream/maglev_lb.h +++ b/source/common/upstream/maglev_lb.h @@ -72,7 +72,7 @@ class MaglevLoadBalancer : public ThreadAwareLoadBalancerBase, Logger::Loggable { public: MaglevLoadBalancer( - const PrioritySet& priority_set, ClusterStats& stats, Stats::Scope& scope, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); diff --git a/source/common/upstream/ring_hash_lb.cc b/source/common/upstream/ring_hash_lb.cc index f20ebd676bf9a..58c66b7d98fa5 100644 --- a/source/common/upstream/ring_hash_lb.cc +++ b/source/common/upstream/ring_hash_lb.cc @@ -17,11 +17,11 @@ namespace Envoy { namespace Upstream { RingHashLoadBalancer::RingHashLoadBalancer( - const PrioritySet& priority_set, ClusterStats& stats, Stats::Scope& scope, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ThreadAwareLoadBalancerBase(priority_set, stats, runtime, random, common_config), + : ThreadAwareLoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), scope_(scope.createScope("ring_hash_lb.")), stats_(generateStats(*scope_)), min_ring_size_(config ? PROTOBUF_GET_WRAPPED_OR_DEFAULT(config.value(), minimum_ring_size, DefaultMinRingSize) diff --git a/source/common/upstream/ring_hash_lb.h b/source/common/upstream/ring_hash_lb.h index aa861eb9fb92c..ed141f23a1149 100644 --- a/source/common/upstream/ring_hash_lb.h +++ b/source/common/upstream/ring_hash_lb.h @@ -41,7 +41,7 @@ class RingHashLoadBalancer : public ThreadAwareLoadBalancerBase, Logger::Loggable { public: RingHashLoadBalancer( - const PrioritySet& priority_set, ClusterStats& stats, Stats::Scope& scope, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); diff --git a/source/common/upstream/subset_lb.cc b/source/common/upstream/subset_lb.cc index 32f94943f3057..902883a44f558 100644 --- a/source/common/upstream/subset_lb.cc +++ b/source/common/upstream/subset_lb.cc @@ -23,7 +23,7 @@ using HostPredicate = std::function; SubsetLoadBalancer::SubsetLoadBalancer( LoadBalancerType lb_type, PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterStats& stats, Stats::Scope& scope, Runtime::Loader& runtime, + ClusterLbStats& lb_stats, Stats::Scope& scope, Runtime::Loader& runtime, Random::RandomGenerator& random, const LoadBalancerSubsetInfo& subsets, const absl::optional& lb_ring_hash_config, @@ -36,8 +36,9 @@ SubsetLoadBalancer::SubsetLoadBalancer( TimeSource& time_source) : lb_type_(lb_type), lb_ring_hash_config_(lb_ring_hash_config), lb_maglev_config_(lb_maglev_config), round_robin_config_(round_robin_config), - least_request_config_(least_request_config), common_config_(common_config), stats_(stats), - scope_(scope), runtime_(runtime), random_(random), fallback_policy_(subsets.fallbackPolicy()), + least_request_config_(least_request_config), common_config_(common_config), + lb_stats_(lb_stats), scope_(scope), runtime_(runtime), random_(random), + fallback_policy_(subsets.fallbackPolicy()), metadata_fallback_policy_(subsets.metadataFallbackPolicy()), default_subset_metadata_(subsets.defaultSubset().fields().begin(), subsets.defaultSubset().fields().end()), @@ -87,8 +88,8 @@ SubsetLoadBalancer::~SubsetLoadBalancer() { // Ensure gauges reflect correct values. forEachSubset(subsets_, [&](LbSubsetEntryPtr entry) { if (entry->active()) { - stats_.lb_subsets_removed_.inc(); - stats_.lb_subsets_active_.dec(); + lb_stats_.lb_subsets_removed_.inc(); + lb_stats_.lb_subsets_active_.dec(); } }); } @@ -266,14 +267,14 @@ HostConstSharedPtr SubsetLoadBalancer::chooseHostIteration(LoadBalancerContext* HostConstSharedPtr host = fallback_subset_->lb_subset_->chooseHost(context); if (host != nullptr) { - stats_.lb_subsets_fallback_.inc(); + lb_stats_.lb_subsets_fallback_.inc(); return host; } if (panic_mode_subset_ != nullptr) { HostConstSharedPtr host = panic_mode_subset_->lb_subset_->chooseHost(context); if (host != nullptr) { - stats_.lb_subsets_fallback_panic_.inc(); + lb_stats_.lb_subsets_fallback_panic_.inc(); return host; } } @@ -353,7 +354,7 @@ HostConstSharedPtr SubsetLoadBalancer::tryChooseHostFromContext(LoadBalancerCont } host_chosen = true; - stats_.lb_subsets_selected_.inc(); + lb_stats_.lb_subsets_selected_.inc(); return entry->lb_subset_->chooseHost(context); } @@ -440,8 +441,8 @@ void SubsetLoadBalancer::initLbSubsetEntryOnce(LbSubsetEntryPtr& entry, bool sin entry->single_host_subset_ = false; } - stats_.lb_subsets_active_.inc(); - stats_.lb_subsets_created_.inc(); + lb_stats_.lb_subsets_active_.inc(); + lb_stats_.lb_subsets_created_.inc(); } // Iterates all the hosts of specified priority, looking up an LbSubsetEntryPtr for each and add @@ -661,8 +662,8 @@ void SubsetLoadBalancer::purgeEmptySubsets(LbSubsetMap& subsets) { // If it wasn't initialized, it wasn't accounted for. if (entry->initialized()) { - stats_.lb_subsets_active_.dec(); - stats_.lb_subsets_removed_.inc(); + lb_stats_.lb_subsets_active_.dec(); + lb_stats_.lb_subsets_removed_.inc(); } auto next_it = std::next(it); @@ -693,20 +694,20 @@ SubsetLoadBalancer::PrioritySubsetImpl::PrioritySubsetImpl(const SubsetLoadBalan switch (subset_lb.lb_type_) { case LoadBalancerType::LeastRequest: lb_ = std::make_unique( - *this, subset_lb.original_local_priority_set_, subset_lb.stats_, subset_lb.runtime_, + *this, subset_lb.original_local_priority_set_, subset_lb.lb_stats_, subset_lb.runtime_, subset_lb.random_, subset_lb.common_config_, subset_lb.least_request_config_, subset_lb.time_source_); break; case LoadBalancerType::Random: lb_ = std::make_unique(*this, subset_lb.original_local_priority_set_, - subset_lb.stats_, subset_lb.runtime_, + subset_lb.lb_stats_, subset_lb.runtime_, subset_lb.random_, subset_lb.common_config_); break; case LoadBalancerType::RoundRobin: lb_ = std::make_unique( - *this, subset_lb.original_local_priority_set_, subset_lb.stats_, subset_lb.runtime_, + *this, subset_lb.original_local_priority_set_, subset_lb.lb_stats_, subset_lb.runtime_, subset_lb.random_, subset_lb.common_config_, subset_lb.round_robin_config_, subset_lb.time_source_); break; @@ -716,7 +717,7 @@ SubsetLoadBalancer::PrioritySubsetImpl::PrioritySubsetImpl(const SubsetLoadBalan // We should make the subset LB thread aware since the calculations are costly, and then we // can also use a thread aware sub-LB properly. The following works fine but is not optimal. thread_aware_lb_ = std::make_unique( - *this, subset_lb.stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, + *this, subset_lb.lb_stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, subset_lb.lb_ring_hash_config_, subset_lb.common_config_); thread_aware_lb_->initialize(); lb_ = thread_aware_lb_->factory()->create(); @@ -727,7 +728,7 @@ SubsetLoadBalancer::PrioritySubsetImpl::PrioritySubsetImpl(const SubsetLoadBalan // We should make the subset LB thread aware since the calculations are costly, and then we // can also use a thread aware sub-LB properly. The following works fine but is not optimal. thread_aware_lb_ = std::make_unique( - *this, subset_lb.stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, + *this, subset_lb.lb_stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, subset_lb.lb_maglev_config_, subset_lb.common_config_); thread_aware_lb_->initialize(); lb_ = thread_aware_lb_->factory()->create(); diff --git a/source/common/upstream/subset_lb.h b/source/common/upstream/subset_lb.h index 00c1e6494727e..62e87931d4c56 100644 --- a/source/common/upstream/subset_lb.h +++ b/source/common/upstream/subset_lb.h @@ -30,7 +30,7 @@ class SubsetLoadBalancer : public LoadBalancer, Logger::Loggable& lb_ring_hash_config, @@ -365,7 +365,7 @@ class SubsetLoadBalancer : public LoadBalancer, Logger::Loggable least_request_config_; const envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; - ClusterStats& stats_; + ClusterLbStats& lb_stats_; Stats::Scope& scope_; Runtime::Loader& runtime_; Random::RandomGenerator& random_; diff --git a/source/common/upstream/thread_aware_lb_impl.cc b/source/common/upstream/thread_aware_lb_impl.cc index 719317d17f1e7..e115d401231ab 100644 --- a/source/common/upstream/thread_aware_lb_impl.cc +++ b/source/common/upstream/thread_aware_lb_impl.cc @@ -162,7 +162,7 @@ ThreadAwareLoadBalancerBase::LoadBalancerImpl::chooseHost(LoadBalancerContext* c .first; const auto& per_priority_state = (*per_priority_state_)[priority]; if (per_priority_state->global_panic_) { - stats_.lb_healthy_panic_.inc(); + lb_stats_.lb_healthy_panic_.inc(); } const uint32_t max_attempts = context ? context->hostSelectionRetryCount() + 1 : 1; @@ -179,7 +179,7 @@ ThreadAwareLoadBalancerBase::LoadBalancerImpl::chooseHost(LoadBalancerContext* c } LoadBalancerPtr ThreadAwareLoadBalancerBase::LoadBalancerFactoryImpl::create() { - auto lb = std::make_unique(stats_, random_); + auto lb = std::make_unique(lb_stats_, random_); // We must protect current_lb_ via a RW lock since it is accessed and written to by multiple // threads. All complex processing has already been precalculated however. diff --git a/source/common/upstream/thread_aware_lb_impl.h b/source/common/upstream/thread_aware_lb_impl.h index 985e2921e3e83..125d25b6e10c6 100644 --- a/source/common/upstream/thread_aware_lb_impl.h +++ b/source/common/upstream/thread_aware_lb_impl.h @@ -107,11 +107,11 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL protected: ThreadAwareLoadBalancerBase( - const PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : LoadBalancerBase(priority_set, stats, runtime, random, common_config), - factory_(new LoadBalancerFactoryImpl(stats, random, override_host_status_)) {} + : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), + factory_(new LoadBalancerFactoryImpl(lb_stats, random, override_host_status_)) {} private: struct PerPriorityState { @@ -121,8 +121,8 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL using PerPriorityStatePtr = std::unique_ptr; struct LoadBalancerImpl : public LoadBalancer { - LoadBalancerImpl(ClusterStats& stats, Random::RandomGenerator& random) - : stats_(stats), random_(random) {} + LoadBalancerImpl(ClusterLbStats& lb_stats, Random::RandomGenerator& random) + : lb_stats_(lb_stats), random_(random) {} // Upstream::LoadBalancer HostConstSharedPtr chooseHost(LoadBalancerContext* context) override; @@ -138,7 +138,7 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL return {}; } - ClusterStats& stats_; + ClusterLbStats& lb_stats_; Random::RandomGenerator& random_; HostStatusSet override_host_status_{}; std::shared_ptr> per_priority_state_; @@ -150,16 +150,16 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL }; struct LoadBalancerFactoryImpl : public LoadBalancerFactory { - LoadBalancerFactoryImpl(ClusterStats& stats, Random::RandomGenerator& random, + LoadBalancerFactoryImpl(ClusterLbStats& lb_stats, Random::RandomGenerator& random, HostStatusSet status) - : stats_(stats), random_(random), override_host_status_(status) {} + : lb_stats_(lb_stats), random_(random), override_host_status_(status) {} // Upstream::LoadBalancerFactory LoadBalancerPtr create() override; // Ignore the params for the thread-aware LB. LoadBalancerPtr create(LoadBalancerParams) override { return create(); } - ClusterStats& stats_; + ClusterLbStats& lb_stats_; Random::RandomGenerator& random_; HostStatusSet override_host_status_{}; absl::Mutex mutex_; diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 26bbad3113993..dc0cf19b8a279 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -981,6 +981,8 @@ ClusterInfoImpl::ClusterInfoImpl( stats_(generateStats(*stats_scope_, factory_context.clusterManager().clusterStatNames())), config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), *stats_scope_), + lb_stats_(factory_context.clusterManager().clusterLbStatNames(), *stats_scope_), + endpoint_stats_(factory_context.clusterManager().clusterEndpointStatNames(), *stats_scope_), load_report_stats_store_(stats_scope_->symbolTable()), load_report_stats_(generateLoadReportStats( load_report_stats_store_, factory_context.clusterManager().clusterLoadReportStatNames())), @@ -1325,7 +1327,7 @@ ClusterImplBase::ClusterImplBase( priority_update_cb_ = priority_set_.addPriorityUpdateCb( [this](uint32_t, const HostVector& hosts_added, const HostVector& hosts_removed) { if (!hosts_added.empty() || !hosts_removed.empty()) { - info_->stats().membership_change_.inc(); + info_->endpointStats().membership_change_.inc(); } uint32_t healthy_hosts = 0; @@ -1338,10 +1340,10 @@ ClusterImplBase::ClusterImplBase( degraded_hosts += host_set->degradedHosts().size(); excluded_hosts += host_set->excludedHosts().size(); } - info_->stats().membership_total_.set(hosts); - info_->stats().membership_healthy_.set(healthy_hosts); - info_->stats().membership_degraded_.set(degraded_hosts); - info_->stats().membership_excluded_.set(excluded_hosts); + info_->endpointStats().membership_total_.set(hosts); + info_->endpointStats().membership_healthy_.set(healthy_hosts); + info_->endpointStats().membership_degraded_.set(degraded_hosts); + info_->endpointStats().membership_excluded_.set(excluded_hosts); }); } @@ -2032,7 +2034,7 @@ bool BaseDynamicClusterImpl::updateDynamicHostList( // At this point we've accounted for all the new hosts as well the hosts that previously // existed in this priority. - info_->stats().max_host_weight_.set(max_host_weight); + info_->endpointStats().max_host_weight_.set(max_host_weight); // Whatever remains in current_priority_hosts should be removed. if (!hosts_added_to_current_priority.empty() || !current_priority_hosts.empty()) { diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index e94c9e68f7f17..74b9ee3376508 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -793,6 +793,8 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } ClusterStats& stats() const override { return stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } + ClusterLbStats& lbStats() const override { return lb_stats_; } + ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } Stats::Scope& statsScope() const override { return *stats_scope_; } ClusterRequestResponseSizeStatsOptRef requestResponseSizeStats() const override { @@ -908,6 +910,8 @@ class ClusterInfoImpl : public ClusterInfo, Stats::ScopeSharedPtr stats_scope_; mutable ClusterStats stats_; mutable ClusterConfigUpdateStats config_update_stats_; + mutable ClusterLbStats lb_stats_; + mutable ClusterEndpointStats endpoint_stats_; Stats::IsolatedStoreImpl load_report_stats_store_; mutable ClusterLoadReportStats load_report_stats_; const std::unique_ptr optional_cluster_stats_; diff --git a/source/extensions/clusters/aggregate/cluster.cc b/source/extensions/clusters/aggregate/cluster.cc index 78caa5e8a164f..bebac8ac11d97 100644 --- a/source/extensions/clusters/aggregate/cluster.cc +++ b/source/extensions/clusters/aggregate/cluster.cc @@ -110,7 +110,7 @@ void AggregateClusterLoadBalancer::refresh(OptRef excluded_cl PriorityContextPtr priority_context = linearizePrioritySet(excluded_cluster); if (!priority_context->priority_set_.hostSetsPerPriority().empty()) { load_balancer_ = std::make_unique( - *priority_context, parent_info_->stats(), runtime_, random_, parent_info_->lbConfig()); + *priority_context, parent_info_->lbStats(), runtime_, random_, parent_info_->lbConfig()); } else { load_balancer_ = nullptr; } diff --git a/source/extensions/clusters/aggregate/cluster.h b/source/extensions/clusters/aggregate/cluster.h index 90a267a606ab3..7d0a215d6e9ec 100644 --- a/source/extensions/clusters/aggregate/cluster.h +++ b/source/extensions/clusters/aggregate/cluster.h @@ -91,10 +91,10 @@ class AggregateClusterLoadBalancer : public Upstream::LoadBalancer, // priority set could be empty, we cannot initialize LoadBalancerBase when priority set is empty. class LoadBalancerImpl : public Upstream::LoadBalancerBase { public: - LoadBalancerImpl(const PriorityContext& priority_context, Upstream::ClusterStats& stats, + LoadBalancerImpl(const PriorityContext& priority_context, Upstream::ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : Upstream::LoadBalancerBase(priority_context.priority_set_, stats, runtime, random, + : Upstream::LoadBalancerBase(priority_context.priority_set_, lb_stats, runtime, random, common_config), priority_context_(priority_context) {} diff --git a/source/extensions/filters/http/health_check/health_check.cc b/source/extensions/filters/http/health_check/health_check.cc index 08b3cb8b29c70..8a6bb39fdd43a 100644 --- a/source/extensions/filters/http/health_check/health_check.cc +++ b/source/extensions/filters/http/health_check/health_check.cc @@ -145,8 +145,8 @@ void HealthCheckFilter::onComplete() { break; } - const auto& stats = cluster->info()->stats(); - const uint64_t membership_total = stats.membership_total_.value(); + const auto& endpoint_stats = cluster->info()->endpointStats(); + const uint64_t membership_total = endpoint_stats.membership_total_.value(); if (membership_total == 0) { // If the cluster exists but is empty, consider the service unhealthy unless // the specified minimum percent healthy for the cluster happens to be zero. @@ -160,7 +160,8 @@ void HealthCheckFilter::onComplete() { } // In the general case, consider the service unhealthy if fewer than the // specified percentage of the servers in the cluster are available (healthy + degraded). - if ((100UL * (stats.membership_healthy_.value() + stats.membership_degraded_.value())) < + if ((100UL * (endpoint_stats.membership_healthy_.value() + + endpoint_stats.membership_degraded_.value())) < membership_total * min_healthy_percentage) { final_status = Http::Code::ServiceUnavailable; details = &RcDetails::get().HealthCheckClusterUnhealthy; diff --git a/test/common/upstream/least_request_load_balancer_fuzz_test.cc b/test/common/upstream/least_request_load_balancer_fuzz_test.cc index edd3419a538ab..82034d4b8883c 100644 --- a/test/common/upstream/least_request_load_balancer_fuzz_test.cc +++ b/test/common/upstream/least_request_load_balancer_fuzz_test.cc @@ -69,7 +69,7 @@ DEFINE_PROTO_FUZZER(const test::common::upstream::LeastRequestLoadBalancerTestCa zone_aware_load_balancer_fuzz.lb_ = std::make_unique( zone_aware_load_balancer_fuzz.priority_set_, zone_aware_load_balancer_fuzz.local_priority_set_.get(), - zone_aware_load_balancer_fuzz.stats_, zone_aware_load_balancer_fuzz.runtime_, + zone_aware_load_balancer_fuzz.lb_stats_, zone_aware_load_balancer_fuzz.runtime_, zone_aware_load_balancer_fuzz.random_, zone_aware_load_balancer_test_case.load_balancer_test_case().common_lb_config(), input.least_request_lb_config(), zone_aware_load_balancer_fuzz.simTime()); diff --git a/test/common/upstream/load_balancer_benchmark.cc b/test/common/upstream/load_balancer_benchmark.cc index 6a855bae9aacc..dd44f0a27253a 100644 --- a/test/common/upstream/load_balancer_benchmark.cc +++ b/test/common/upstream/load_balancer_benchmark.cc @@ -66,8 +66,8 @@ class BaseTester : public Event::TestUsingSimulatedTime { PrioritySetImpl priority_set_; PrioritySetImpl local_priority_set_; Stats::IsolatedStoreImpl stats_store_; - ClusterStatNames stat_names_{stats_store_.symbolTable()}; - ClusterStats stats_{ClusterInfoImpl::generateStats(stats_store_, stat_names_)}; + ClusterLbStatNames lb_stat_names_{stats_store_.symbolTable()}; + ClusterLbStats lb_stats_{lb_stat_names_, stats_store_}; NiceMock runtime_; Random::RandomGeneratorImpl random_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; @@ -81,7 +81,7 @@ class RoundRobinTester : public BaseTester { : BaseTester(num_hosts, weighted_subset_percent, weight) {} void initialize() { - lb_ = std::make_unique(priority_set_, &local_priority_set_, stats_, + lb_ = std::make_unique(priority_set_, &local_priority_set_, lb_stats_, runtime_, random_, common_config_, round_robin_lb_config_, simTime()); } @@ -94,7 +94,7 @@ class LeastRequestTester : public BaseTester { LeastRequestTester(uint64_t num_hosts, uint32_t choice_count) : BaseTester(num_hosts) { envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_choice_count()->set_value(choice_count); - lb_ = std::make_unique(priority_set_, &local_priority_set_, stats_, + lb_ = std::make_unique(priority_set_, &local_priority_set_, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()); } @@ -155,7 +155,7 @@ class RingHashTester : public BaseTester { config_ = envoy::config::cluster::v3::Cluster::RingHashLbConfig(); config_.value().mutable_minimum_ring_size()->set_value(min_ring_size); ring_hash_lb_ = std::make_unique( - priority_set_, stats_, stats_store_, runtime_, random_, config_, common_config_); + priority_set_, lb_stats_, stats_store_, runtime_, random_, config_, common_config_); } absl::optional config_; @@ -166,8 +166,8 @@ class MaglevTester : public BaseTester { public: MaglevTester(uint64_t num_hosts, uint32_t weighted_subset_percent = 0, uint32_t weight = 0) : BaseTester(num_hosts, weighted_subset_percent, weight) { - maglev_lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, - random_, config_, common_config_); + maglev_lb_ = std::make_unique(priority_set_, lb_stats_, stats_store_, + runtime_, random_, config_, common_config_); } absl::optional config_; @@ -544,7 +544,7 @@ class SubsetLbTester : public BaseTester { subset_info_ = std::make_unique(subset_config); lb_ = std::make_unique( - LoadBalancerType::Random, priority_set_, &local_priority_set_, stats_, stats_store_, + LoadBalancerType::Random, priority_set_, &local_priority_set_, lb_stats_, stats_store_, runtime_, random_, *subset_info_, absl::nullopt, absl::nullopt, absl::nullopt, absl::nullopt, common_config_, simTime()); diff --git a/test/common/upstream/load_balancer_fuzz_base.h b/test/common/upstream/load_balancer_fuzz_base.h index 727da689047b5..19adf8eae8013 100644 --- a/test/common/upstream/load_balancer_fuzz_base.h +++ b/test/common/upstream/load_balancer_fuzz_base.h @@ -21,8 +21,7 @@ namespace Upstream { class LoadBalancerFuzzBase { public: LoadBalancerFuzzBase() - : stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)){}; + : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_){}; // Initializes load balancer components shared amongst every load balancer, random_, and // priority_set_ @@ -42,8 +41,8 @@ class LoadBalancerFuzzBase { // These public objects shared amongst all types of load balancers will be used to construct load // balancers in specific load balancer fuzz classes Stats::IsolatedStoreImpl stats_store_; - ClusterStatNames stat_names_; - ClusterStats stats_; + ClusterLbStatNames lb_stat_names_; + ClusterLbStats lb_stats_; NiceMock runtime_; Random::PsuedoRandomGenerator64 random_; NiceMock priority_set_; diff --git a/test/common/upstream/load_balancer_impl_test.cc b/test/common/upstream/load_balancer_impl_test.cc index 59757ae8cde68..e72916e52dcd2 100644 --- a/test/common/upstream/load_balancer_impl_test.cc +++ b/test/common/upstream/load_balancer_impl_test.cc @@ -54,10 +54,11 @@ class EdfLoadBalancerBasePeer { class TestZoneAwareLoadBalancer : public ZoneAwareLoadBalancerBase { public: TestZoneAwareLoadBalancer( - const PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime, + const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ZoneAwareLoadBalancerBase(priority_set, nullptr, stats, runtime, random, common_config) {} + : ZoneAwareLoadBalancerBase(priority_set, nullptr, lb_stats, runtime, random, common_config) { + } void runInvalidLocalitySourceType() { localitySourceType(static_cast(123)); } @@ -80,14 +81,13 @@ class LoadBalancerTestBase : public Event::TestUsingSimulatedTime, MockHostSet& hostSet() { return GetParam() ? host_set_ : failover_host_set_; } LoadBalancerTestBase() - : stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)) { + : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) { least_request_lb_config_.mutable_choice_count()->set_value(2); } Stats::IsolatedStoreImpl stats_store_; - ClusterStatNames stat_names_; - ClusterStats stats_; + ClusterLbStatNames lb_stat_names_; + ClusterLbStats lb_stats_; NiceMock runtime_; NiceMock random_; NiceMock priority_set_; @@ -101,10 +101,10 @@ class LoadBalancerTestBase : public Event::TestUsingSimulatedTime, class TestLb : public LoadBalancerBase { public: - TestLb(const PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime, + TestLb(const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : LoadBalancerBase(priority_set, stats, runtime, random, common_config) {} + : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config) {} using LoadBalancerBase::chooseHostSet; using LoadBalancerBase::isInPanic; using LoadBalancerBase::percentageDegradedLoad; @@ -166,7 +166,7 @@ class LoadBalancerBaseTest : public LoadBalancerTestBase { } envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; - TestLb lb_{priority_set_, stats_, runtime_, random_, common_config_}; + TestLb lb_{priority_set_, lb_stats_, runtime_, random_, common_config_}; }; INSTANTIATE_TEST_SUITE_P(PrimaryOrFailover, LoadBalancerBaseTest, ::testing::Values(true)); @@ -585,10 +585,11 @@ TEST_P(LoadBalancerBaseTest, BoundaryConditions) { class TestZoneAwareLb : public ZoneAwareLoadBalancerBase { public: - TestZoneAwareLb(const PrioritySet& priority_set, ClusterStats& stats, Runtime::Loader& runtime, - Random::RandomGenerator& random, + TestZoneAwareLb(const PrioritySet& priority_set, ClusterLbStats& lb_stats, + Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ZoneAwareLoadBalancerBase(priority_set, nullptr, stats, runtime, random, common_config) {} + : ZoneAwareLoadBalancerBase(priority_set, nullptr, lb_stats, runtime, random, common_config) { + } // ZoneAwareLoadBalancerBase will keep a copy of cross priority host map shared pointer and update // it when the membership is updated. @@ -606,8 +607,8 @@ class TestZoneAwareLb : public ZoneAwareLoadBalancerBase { class ZoneAwareLoadBalancerBaseTest : public LoadBalancerTestBase { public: envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; - TestZoneAwareLb lb_{priority_set_, stats_, runtime_, random_, common_config_}; - TestZoneAwareLoadBalancer lbx_{priority_set_, stats_, runtime_, random_, common_config_}; + TestZoneAwareLb lb_{priority_set_, lb_stats_, runtime_, random_, common_config_}; + TestZoneAwareLoadBalancer lbx_{priority_set_, lb_stats_, runtime_, random_, common_config_}; }; // Tests the source type static methods in zone aware load balancer. @@ -697,8 +698,8 @@ class RoundRobinLoadBalancerTest : public LoadBalancerTestBase { local_priority_set_ = std::make_shared(); local_priority_set_->getOrCreateHostSet(0); } - lb_ = std::make_shared(priority_set_, local_priority_set_.get(), stats_, - runtime_, random_, common_config_, + lb_ = std::make_shared(priority_set_, local_priority_set_.get(), + lb_stats_, runtime_, random_, common_config_, round_robin_lb_config_, simTime()); } @@ -1146,7 +1147,7 @@ TEST_P(RoundRobinLoadBalancerTest, MaxUnhealthyPanic) { EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); EXPECT_EQ(hostSet().healthy_hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(3UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(3UL, lb_stats_.lb_healthy_panic_.value()); } // Test that no hosts are selected when fail_traffic_on_panic is enabled. @@ -1175,7 +1176,7 @@ TEST_P(RoundRobinLoadBalancerTest, MaxUnhealthyPanicDisableOnPanic) { EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); EXPECT_EQ(hostSet().healthy_hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); } // Ensure if the panic threshold is 0%, panic mode is disabled. @@ -1189,7 +1190,7 @@ TEST_P(RoundRobinLoadBalancerTest, DisablePanicMode) { EXPECT_CALL(runtime_.snapshot_, getInteger("upstream.healthy_panic_threshold", 50)) .WillRepeatedly(Return(0)); EXPECT_EQ(nullptr, lb_->chooseHost(nullptr)); - EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); } // Test of host set selection with host filter @@ -1269,9 +1270,9 @@ TEST_P(RoundRobinLoadBalancerTest, ZoneAwareSmallCluster) { if (&hostSet() == &host_set_) { // Cluster size is computed once at zone aware struct regeneration point. - EXPECT_EQ(1U, stats_.lb_zone_cluster_too_small_.value()); + EXPECT_EQ(1U, lb_stats_.lb_zone_cluster_too_small_.value()); } else { - EXPECT_EQ(0U, stats_.lb_zone_cluster_too_small_.value()); + EXPECT_EQ(0U, lb_stats_.lb_zone_cluster_too_small_.value()); return; } EXPECT_CALL(runtime_.snapshot_, getInteger("upstream.zone_routing.min_cluster_size", 7)) @@ -1313,7 +1314,7 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareDifferentZoneSize) { .WillRepeatedly(Return(7)); EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, stats_.lb_zone_number_differs_.value()); + EXPECT_EQ(1U, lb_stats_.lb_zone_number_differs_.value()); } TEST_P(RoundRobinLoadBalancerTest, ZoneAwareRoutingLargeZoneSwitchOnOff) { @@ -1343,9 +1344,9 @@ TEST_P(RoundRobinLoadBalancerTest, ZoneAwareRoutingLargeZoneSwitchOnOff) { // There is only one host in the given zone for zone aware routing. EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[0][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, stats_.lb_zone_routing_all_directly_.value()); + EXPECT_EQ(1U, lb_stats_.lb_zone_routing_all_directly_.value()); EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[0][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(2U, stats_.lb_zone_routing_all_directly_.value()); + EXPECT_EQ(2U, lb_stats_.lb_zone_routing_all_directly_.value()); // Disable runtime global zone routing. EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.zone_routing.enabled", 100)) @@ -1396,12 +1397,12 @@ TEST_P(RoundRobinLoadBalancerTest, ZoneAwareRoutingSmallZone) { // There is only one host in the given zone for zone aware routing. EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(100)); EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[0][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, stats_.lb_zone_routing_sampled_.value()); + EXPECT_EQ(1U, lb_stats_.lb_zone_routing_sampled_.value()); // Force request out of small zone. EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(9999)).WillOnce(Return(2)); EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[1][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, stats_.lb_zone_routing_cross_zone_.value()); + EXPECT_EQ(1U, lb_stats_.lb_zone_routing_cross_zone_.value()); } TEST_P(RoundRobinLoadBalancerTest, LowPrecisionForDistribution) { @@ -1467,7 +1468,7 @@ TEST_P(RoundRobinLoadBalancerTest, LowPrecisionForDistribution) { // Force request out of small zone and to randomly select zone. EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(9999)).WillOnce(Return(2)); lb_->chooseHost(nullptr); - EXPECT_EQ(1U, stats_.lb_zone_no_capacity_left_.value()); + EXPECT_EQ(1U, lb_stats_.lb_zone_no_capacity_left_.value()); } TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingOneZone) { @@ -1535,8 +1536,8 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingLocalEmpty) { // Local cluster is not OK, we'll do regular routing. EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, stats_.lb_healthy_panic_.value()); - EXPECT_EQ(1U, stats_.lb_local_cluster_not_ok_.value()); + EXPECT_EQ(0U, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1U, lb_stats_.lb_local_cluster_not_ok_.value()); } TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingLocalEmptyFailTrafficOnPanic) { @@ -1572,8 +1573,8 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingLocalEmptyFailTrafficOnPani // Local cluster is not OK, we'll do regular routing (and select no host, since we're in global // panic). EXPECT_EQ(nullptr, lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, stats_.lb_healthy_panic_.value()); - EXPECT_EQ(1U, stats_.lb_local_cluster_not_ok_.value()); + EXPECT_EQ(0U, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1U, lb_stats_.lb_local_cluster_not_ok_.value()); } // Validate that if we have healthy host lists >= 2, but there is no local @@ -1601,8 +1602,8 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingNoLocalLocality) { // Local cluster is not OK, we'll do regular routing. EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, stats_.lb_healthy_panic_.value()); - EXPECT_EQ(1U, stats_.lb_local_cluster_not_ok_.value()); + EXPECT_EQ(0U, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1U, lb_stats_.lb_local_cluster_not_ok_.value()); } INSTANTIATE_TEST_SUITE_P(PrimaryOrFailover, RoundRobinLoadBalancerTest, @@ -2018,9 +2019,14 @@ TEST_P(RoundRobinLoadBalancerTest, SlowStartNoWaitMinWeightPercent35) { class LeastRequestLoadBalancerTest : public LoadBalancerTestBase { public: - LeastRequestLoadBalancer lb_{ - priority_set_, nullptr, stats_, runtime_, random_, common_config_, least_request_lb_config_, - simTime()}; + LeastRequestLoadBalancer lb_{priority_set_, + nullptr, + lb_stats_, + runtime_, + random_, + common_config_, + least_request_lb_config_, + simTime()}; }; TEST_P(LeastRequestLoadBalancerTest, NoHosts) { EXPECT_EQ(nullptr, lb_.chooseHost(nullptr)); } @@ -2033,14 +2039,12 @@ TEST_P(LeastRequestLoadBalancerTest, SingleHost) { // Host weight is 1. { EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(2)).WillOnce(Return(3)); - stats_.max_host_weight_.set(1UL); EXPECT_EQ(hostSet().healthy_hosts_[0], lb_.chooseHost(nullptr)); } // Host weight is 100. { EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(2)).WillOnce(Return(3)); - stats_.max_host_weight_.set(100UL); EXPECT_EQ(hostSet().healthy_hosts_[0], lb_.chooseHost(nullptr)); } @@ -2065,7 +2069,6 @@ TEST_P(LeastRequestLoadBalancerTest, SingleHost) { TEST_P(LeastRequestLoadBalancerTest, Normal) { hostSet().healthy_hosts_ = {makeTestHost(info_, "tcp://127.0.0.1:80", simTime()), makeTestHost(info_, "tcp://127.0.0.1:81", simTime())}; - stats_.max_host_weight_.set(1UL); hostSet().hosts_ = hostSet().healthy_hosts_; hostSet().runCallbacks({}, {}); // Trigger callbacks. The added/removed lists are not relevant. @@ -2085,7 +2088,6 @@ TEST_P(LeastRequestLoadBalancerTest, PNC) { makeTestHost(info_, "tcp://127.0.0.1:81", simTime()), makeTestHost(info_, "tcp://127.0.0.1:82", simTime()), makeTestHost(info_, "tcp://127.0.0.1:83", simTime())}; - stats_.max_host_weight_.set(1UL); hostSet().hosts_ = hostSet().healthy_hosts_; hostSet().runCallbacks({}, {}); // Trigger callbacks. The added/removed lists are not relevant. @@ -2097,10 +2099,10 @@ TEST_P(LeastRequestLoadBalancerTest, PNC) { // Creating various load balancer objects with different choice configs. envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_choice_count()->set_value(2); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; lr_lb_config.mutable_choice_count()->set_value(5); - LeastRequestLoadBalancer lb_5{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_5{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; // Verify correct number of choices. @@ -2132,7 +2134,6 @@ TEST_P(LeastRequestLoadBalancerTest, PNC) { TEST_P(LeastRequestLoadBalancerTest, WeightImbalance) { hostSet().healthy_hosts_ = {makeTestHost(info_, "tcp://127.0.0.1:80", simTime(), 1), makeTestHost(info_, "tcp://127.0.0.1:81", simTime(), 2)}; - stats_.max_host_weight_.set(2UL); hostSet().hosts_ = hostSet().healthy_hosts_; hostSet().runCallbacks({}, {}); // Trigger callbacks. The added/removed lists are not relevant. @@ -2177,7 +2178,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithInvalidActiveRequestBias envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; EXPECT_CALL(runtime_.snapshot_, getDouble("ar_bias", 1.0)).WillRepeatedly(Return(-1.0)); @@ -2231,7 +2232,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithCustomActiveRequestBias) envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; EXPECT_CALL(runtime_.snapshot_, getDouble("ar_bias", 1.0)).WillRepeatedly(Return(0.0)); @@ -2257,7 +2258,6 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithCustomActiveRequestBias) TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceCallbacks) { hostSet().healthy_hosts_ = {makeTestHost(info_, "tcp://127.0.0.1:80", simTime(), 1), makeTestHost(info_, "tcp://127.0.0.1:81", simTime(), 2)}; - stats_.max_host_weight_.set(2UL); hostSet().hosts_ = hostSet().healthy_hosts_; hostSet().runCallbacks({}, {}); // Trigger callbacks. The added/removed lists are not relevant. @@ -2279,7 +2279,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceCallbacks) { TEST_P(LeastRequestLoadBalancerTest, SlowStartWithDefaultParams) { envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; const auto slow_start_window = EdfLoadBalancerBasePeer::slowStartWindow(static_cast(lb_2)); @@ -2300,7 +2300,7 @@ TEST_P(LeastRequestLoadBalancerTest, SlowStartNoWait) { lr_lb_config.mutable_slow_start_config()->mutable_slow_start_window()->set_seconds(60); lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; simTime().advanceTimeWait(std::chrono::seconds(1)); @@ -2371,7 +2371,7 @@ TEST_P(LeastRequestLoadBalancerTest, SlowStartWaitForPassingHC) { lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(0.9); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; simTime().advanceTimeWait(std::chrono::seconds(1)); @@ -2490,7 +2490,7 @@ INSTANTIATE_TEST_SUITE_P(PrimaryOrFailover, LeastRequestLoadBalancerTest, class RandomLoadBalancerTest : public LoadBalancerTestBase { public: void init() { - lb_ = std::make_shared(priority_set_, nullptr, stats_, runtime_, random_, + lb_ = std::make_shared(priority_set_, nullptr, lb_stats_, runtime_, random_, common_config_); } std::shared_ptr lb_; diff --git a/test/common/upstream/load_balancer_simulation_test.cc b/test/common/upstream/load_balancer_simulation_test.cc index 22d081562f1ad..43a575a75fe64 100644 --- a/test/common/upstream/load_balancer_simulation_test.cc +++ b/test/common/upstream/load_balancer_simulation_test.cc @@ -70,16 +70,15 @@ TEST(DISABLED_LeastRequestLoadBalancerWeightTest, Weight) { {}, hosts, {}, absl::nullopt); Stats::IsolatedStoreImpl stats_store; - ClusterStatNames stat_names(stats_store.symbolTable()); - ClusterStats stats{ClusterInfoImpl::generateStats(stats_store, stat_names)}; - stats.max_host_weight_.set(weight); + ClusterLbStatNames stat_names(stats_store.symbolTable()); + ClusterLbStats lb_stats{stat_names, stats_store}; NiceMock runtime; auto time_source = std::make_unique>(); Random::RandomGeneratorImpl random; envoy::config::cluster::v3::Cluster::LeastRequestLbConfig least_request_lb_config; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config; LeastRequestLoadBalancer lb_{ - priority_set, nullptr, stats, runtime, random, common_config, least_request_lb_config, + priority_set, nullptr, lb_stats, runtime, random, common_config, least_request_lb_config, *time_source}; absl::node_hash_map host_hits; @@ -108,8 +107,7 @@ TEST(DISABLED_LeastRequestLoadBalancerWeightTest, Weight) { class DISABLED_SimulationTest : public testing::Test { public: DISABLED_SimulationTest() - : stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)) { + : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) { ON_CALL(runtime_.snapshot_, getInteger("upstream.healthy_panic_threshold", 50U)) .WillByDefault(Return(50U)); ON_CALL(runtime_.snapshot_, featureEnabled("upstream.zone_routing.enabled", 100)) @@ -130,7 +128,7 @@ class DISABLED_SimulationTest : public testing::Test { std::vector healthy_destination_cluster) { local_priority_set_ = new PrioritySetImpl; // TODO(mattklein123): make load balancer per originating cluster host. - RandomLoadBalancer lb(priority_set_, local_priority_set_, stats_, runtime_, random_, + RandomLoadBalancer lb(priority_set_, local_priority_set_, lb_stats_, runtime_, random_, common_config_); HostsPerLocalitySharedPtr upstream_per_zone_hosts = @@ -247,8 +245,8 @@ class DISABLED_SimulationTest : public testing::Test { NiceMock time_source_; Random::RandomGeneratorImpl random_; Stats::IsolatedStoreImpl stats_store_; - ClusterStatNames stat_names_; - ClusterStats stats_; + ClusterLbStatNames lb_stat_names_; + ClusterLbStats lb_stats_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; }; diff --git a/test/common/upstream/maglev_lb_test.cc b/test/common/upstream/maglev_lb_test.cc index db951e9115ccf..09c925cf49078 100644 --- a/test/common/upstream/maglev_lb_test.cc +++ b/test/common/upstream/maglev_lb_test.cc @@ -45,11 +45,10 @@ class TestLoadBalancerContext : public LoadBalancerContextBase { class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::Test { public: MaglevLoadBalancerTest() - : stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)) {} + : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) {} void createLb() { - lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, + lb_ = std::make_unique(priority_set_, lb_stats_, stats_store_, runtime_, random_, config_, common_config_); } @@ -65,8 +64,8 @@ class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public test MockHostSet& host_set_ = *priority_set_.getMockHostSet(0); std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; - ClusterStatNames stat_names_; - ClusterStats stats_; + ClusterLbStatNames lb_stat_names_; + ClusterLbStats lb_stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; NiceMock runtime_; diff --git a/test/common/upstream/random_load_balancer_fuzz_test.cc b/test/common/upstream/random_load_balancer_fuzz_test.cc index 6d5700654989e..85a223f1e9606 100644 --- a/test/common/upstream/random_load_balancer_fuzz_test.cc +++ b/test/common/upstream/random_load_balancer_fuzz_test.cc @@ -21,7 +21,7 @@ DEFINE_PROTO_FUZZER(const test::common::upstream::RandomLoadBalancerTestCase& in try { load_balancer_fuzz.lb_ = std::make_unique( - load_balancer_fuzz.priority_set_, nullptr, load_balancer_fuzz.stats_, + load_balancer_fuzz.priority_set_, nullptr, load_balancer_fuzz.lb_stats_, load_balancer_fuzz.runtime_, load_balancer_fuzz.random_, input.load_balancer_test_case().common_lb_config()); } catch (EnvoyException& e) { diff --git a/test/common/upstream/ring_hash_lb_test.cc b/test/common/upstream/ring_hash_lb_test.cc index d4c01aa3e329f..9d40875bede73 100644 --- a/test/common/upstream/ring_hash_lb_test.cc +++ b/test/common/upstream/ring_hash_lb_test.cc @@ -58,11 +58,10 @@ class RingHashLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::TestWithParam { public: RingHashLoadBalancerTest() - : stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)) {} + : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) {} void init() { - lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, + lb_ = std::make_unique(priority_set_, lb_stats_, stats_store_, runtime_, random_, config_, common_config_); lb_->initialize(); } @@ -76,8 +75,8 @@ class RingHashLoadBalancerTest : public Event::TestUsingSimulatedTime, MockHostSet& failover_host_set_ = *priority_set_.getMockHostSet(1); std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; - ClusterStatNames stat_names_; - ClusterStats stats_; + ClusterLbStatNames lb_stat_names_; + ClusterLbStats lb_stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; NiceMock runtime_; @@ -216,7 +215,7 @@ TEST_P(RingHashLoadBalancerTest, Basic) { EXPECT_CALL(random_, random()).WillOnce(Return(16117243373044804880UL)); EXPECT_EQ(hostSet().hosts_[0], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); hostSet().healthy_hosts_.clear(); hostSet().runCallbacks({}, {}); @@ -225,7 +224,7 @@ TEST_P(RingHashLoadBalancerTest, Basic) { TestLoadBalancerContext context(0); EXPECT_EQ(hostSet().hosts_[4], lb->chooseHost(&context)); } - EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); } // Ensure if all the hosts with priority 0 unhealthy, the next priority hosts are used. @@ -322,7 +321,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithMurmur2) { EXPECT_CALL(random_, random()).WillOnce(Return(10150910876324007730UL)); EXPECT_EQ(hostSet().hosts_[2], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); } // Expect reasonable results with hostname. @@ -385,7 +384,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithHostname) { EXPECT_EQ(hostSet().hosts_[3], lb->chooseHost(&context)); } { EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); hostSet().healthy_hosts_.clear(); hostSet().runCallbacks({}, {}); @@ -394,7 +393,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithHostname) { TestLoadBalancerContext context(0); EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(&context)); } - EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); } // Expect reasonable results with metadata hash_key. @@ -457,7 +456,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithMetadataHashKey) { EXPECT_EQ(hostSet().hosts_[3], lb->chooseHost(&context)); } { EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); hostSet().healthy_hosts_.clear(); hostSet().runCallbacks({}, {}); @@ -466,7 +465,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithMetadataHashKey) { TestLoadBalancerContext context(0); EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(&context)); } - EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); } // Test the same ring as Basic but exercise retry host predicate behavior. diff --git a/test/common/upstream/round_robin_load_balancer_fuzz_test.cc b/test/common/upstream/round_robin_load_balancer_fuzz_test.cc index 75a456f44c87f..2ecad7819299e 100644 --- a/test/common/upstream/round_robin_load_balancer_fuzz_test.cc +++ b/test/common/upstream/round_robin_load_balancer_fuzz_test.cc @@ -29,7 +29,7 @@ DEFINE_PROTO_FUZZER(const test::common::upstream::RoundRobinLoadBalancerTestCase zone_aware_load_balancer_fuzz.lb_ = std::make_unique( zone_aware_load_balancer_fuzz.priority_set_, zone_aware_load_balancer_fuzz.local_priority_set_.get(), - zone_aware_load_balancer_fuzz.stats_, zone_aware_load_balancer_fuzz.runtime_, + zone_aware_load_balancer_fuzz.lb_stats_, zone_aware_load_balancer_fuzz.runtime_, zone_aware_load_balancer_fuzz.random_, zone_aware_load_balancer_test_case.load_balancer_test_case().common_lb_config(), input.round_robin_lb_config(), zone_aware_load_balancer_fuzz.simTime()); diff --git a/test/common/upstream/subset_lb_test.cc b/test/common/upstream/subset_lb_test.cc index c65e4ba24ce32..8749389992032 100644 --- a/test/common/upstream/subset_lb_test.cc +++ b/test/common/upstream/subset_lb_test.cc @@ -169,9 +169,8 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::TestWithParam { public: SubsetLoadBalancerTest() - : scope_(stats_store_.createScope("testprefix")), stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)) { - stats_.max_host_weight_.set(1UL); + : scope_(stats_store_.createScope("testprefix")), lb_stat_names_(stats_store_.symbolTable()), + lb_stats_(lb_stat_names_, stats_store_) { least_request_lb_config_.mutable_choice_count()->set_value(2); } @@ -240,7 +239,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, } lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, *scope_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, lb_stats_, *scope_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); } @@ -290,7 +289,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, {}, {}, {}, absl::nullopt); lb_ = std::make_shared( - lb_type_, priority_set_, &local_priority_set_, stats_, *scope_, runtime_, random_, + lb_type_, priority_set_, &local_priority_set_, lb_stats_, *scope_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); } @@ -528,8 +527,8 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, NiceMock random_; Stats::IsolatedStoreImpl stats_store_; Stats::ScopeSharedPtr scope_; - ClusterStatNames stat_names_; - ClusterStats stats_; + ClusterLbStatNames lb_stat_names_; + ClusterLbStats lb_stats_; PrioritySetImpl local_priority_set_; HostVectorSharedPtr local_hosts_; HostsPerLocalitySharedPtr local_hosts_per_locality_; @@ -543,8 +542,8 @@ TEST_F(SubsetLoadBalancerTest, NoFallback) { init(); EXPECT_EQ(nullptr, lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); EXPECT_EQ(nullptr, lb_->peekAnotherHost(nullptr)); EXPECT_FALSE(lb_->lifetimeCallbacks().has_value()); @@ -601,8 +600,8 @@ TEST_F(SubsetLoadBalancerTest, FallbackAnyEndpoint) { init(); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, FallbackAnyEndpointAfterUpdate) { @@ -633,8 +632,8 @@ TEST_F(SubsetLoadBalancerTest, FallbackDefaultSubset) { }); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); } TEST_F(SubsetLoadBalancerTest, FallbackPanicMode) { @@ -652,9 +651,9 @@ TEST_F(SubsetLoadBalancerTest, FallbackPanicMode) { }); EXPECT_TRUE(lb_->chooseHost(nullptr) != nullptr); - EXPECT_EQ(1U, stats_.lb_subsets_fallback_panic_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_panic_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, FallbackPanicModeWithUpdates) { @@ -710,8 +709,8 @@ TEST_F(SubsetLoadBalancerTest, FallbackEmptyDefaultSubsetConvertsToAnyEndpoint) EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(nullptr)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(2U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); } TEST_F(SubsetLoadBalancerTest, FallbackOnUnknownMetadata) { @@ -751,8 +750,8 @@ TEST_F(SubsetLoadBalancerTest, BalancesSubset) { EXPECT_EQ(host_set_.hosts_[2], lb_->chooseHost(&context_11)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_11)); - EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, BalancesSubsetAfterUpdate) { @@ -779,7 +778,7 @@ TEST_P(SubsetLoadBalancerTest, BalancesSubsetAfterUpdate) { EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[2], lb_->chooseHost(&context_11)); EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_11)); - EXPECT_EQ(2U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_created_.value()); modifyHosts({makeHost("tcp://127.0.0.1:8000", {{"version", "1.2"}}), makeHost("tcp://127.0.0.1:8001", {{"version", "1.0"}})}, @@ -791,8 +790,8 @@ TEST_P(SubsetLoadBalancerTest, BalancesSubsetAfterUpdate) { EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_11)); EXPECT_EQ(host_set_.hosts_[2], lb_->chooseHost(&context_12)); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); } TEST_P(SubsetLoadBalancerTest, ListAsAnyEnabled) { @@ -982,9 +981,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { // Add hosts initial hosts. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"default", "true"}}}}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -996,9 +995,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1010,9 +1009,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { // No hosts added nor removed, so we bypass modifyHosts(). host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_13)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1023,9 +1022,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1037,9 +1036,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1054,43 +1053,43 @@ TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurged) { // Simple add and remove. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"stage", "prod"}}}}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); host_set_.hosts_[0]->metadata(buildMetadataWithStage("1.3")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); // Move host that was in the version + stage subset into a new version only subset. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.4")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_removed_.value()); // Create a new version + stage subset. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.5", "devel")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(7U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(7U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_removed_.value()); // Now move it back to its original version + stage subset. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.0", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(9U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(6U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(9U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(6U, lb_stats_.lb_subsets_removed_.value()); // Finally, remove the original version + stage subset again. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.6")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(10U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(8U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(10U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(8U, lb_stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedCollapsed) { @@ -1101,30 +1100,30 @@ TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedCollapsed) { // Init subsets. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"stage", "prod"}}}}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); // Get rid of 1.0. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); // Get rid of stage prod. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_removed_.value()); // Add stage prod back. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedVersionChanged) { @@ -1135,24 +1134,24 @@ TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedVersionChanged) { // Init subsets. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"stage", "prod"}}}}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); // Get rid of 1.0. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); // Change versions. host_set_.hosts_[0]->metadata(buildMetadataWithStage("1.3")); host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.4", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(7U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(7U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { @@ -1179,9 +1178,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { // Add hosts initial hosts. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"default", "true"}}}}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1194,9 +1193,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { // Add a new host. modifyHosts({makeHost("tcp://127.0.0.1:8002", {{"version", "1.3"}})}, {}); - EXPECT_EQ(4U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1208,9 +1207,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { modifyHosts({}, {host_set_.hosts_[2]}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1223,9 +1222,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { modifyHosts({makeHost("tcp://127.0.0.1:8003", {{"version", "1.4"}})}, {host_set_.hosts_[1]}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1238,9 +1237,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1267,20 +1266,20 @@ TEST_P(SubsetLoadBalancerTest, UpdateRemovingLastSubsetHost) { TestLoadBalancerContext context({{"version", "1.0"}}); EXPECT_EQ(host_v10, lb_->chooseHost(&context)); - EXPECT_EQ(1U, stats_.lb_subsets_selected_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_created_.value()); modifyHosts({}, {host_v10}); // fallback to any endpoint EXPECT_EQ(host_v11, lb_->chooseHost(&context)); - EXPECT_EQ(1U, stats_.lb_subsets_selected_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(2U, stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(2U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, UpdateRemovingUnknownHost) { @@ -1510,10 +1509,10 @@ TEST_F(SubsetLoadBalancerTest, IgnoresHostsWithoutMetadata) { host_set_.healthy_hosts_ = host_set_.hosts_; host_set_.healthy_hosts_per_locality_ = host_set_.hosts_per_locality_; - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); TestLoadBalancerContext context_version({{"version", "1.0"}}); @@ -1930,10 +1929,10 @@ TEST_F(SubsetLoadBalancerTest, DisabledLocalityWeightAwareness) { }, host_set_, {1, 100}); - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); @@ -1954,10 +1953,10 @@ TEST_F(SubsetLoadBalancerTest, DoesNotCheckHostHealth) { EXPECT_CALL(*mock_host, weight()).WillRepeatedly(Return(1)); - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); } TEST_F(SubsetLoadBalancerTest, EnabledLocalityWeightAwareness) { @@ -1978,10 +1977,10 @@ TEST_F(SubsetLoadBalancerTest, EnabledLocalityWeightAwareness) { }, host_set_, {1, 100}); - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); @@ -2014,10 +2013,10 @@ TEST_F(SubsetLoadBalancerTest, EnabledScaleLocalityWeights) { }, host_set_, {50, 50}); - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); // Since we scale the locality weights by number of hosts removed, we expect to see the second @@ -2060,10 +2059,10 @@ TEST_F(SubsetLoadBalancerTest, EnabledScaleLocalityWeightsRounding) { }, host_set_, {2, 2}); - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.0"}}); // We expect to see a 33/66 split because 2 * 1 / 2 = 1 and 2 * 3 / 4 = 1.5 -> 2 @@ -2093,10 +2092,10 @@ TEST_F(SubsetLoadBalancerTest, ScaleLocalityWeightsWithNoLocalityWeights) { }, host_set_); - lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, - runtime_, random_, subset_info_, ring_hash_lb_config_, - maglev_lb_config_, round_robin_lb_config_, - least_request_lb_config_, common_config_, simTime()); + lb_ = std::make_shared( + lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, + common_config_, simTime()); } TEST_P(SubsetLoadBalancerTest, GaugesUpdatedOnDestroy) { @@ -2112,13 +2111,13 @@ TEST_P(SubsetLoadBalancerTest, GaugesUpdatedOnDestroy) { {"tcp://127.0.0.1:80", {{"version", "1.0"}}}, }); - EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); lb_ = nullptr; - EXPECT_EQ(0U, stats_.lb_subsets_active_.value()); - EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_active_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, SubsetSelectorNoFallbackPerSelector) { @@ -2147,8 +2146,8 @@ TEST_P(SubsetLoadBalancerTest, SubsetSelectorNoFallbackPerSelector) { EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_11)); EXPECT_EQ(nullptr, lb_->chooseHost(&context_12)); - EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(4U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(4U, lb_stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, FallbackNotDefinedForIntermediateSelector) { @@ -2419,7 +2418,7 @@ TEST_P(SubsetLoadBalancerTest, KeysSubsetFallbackToNotExistingSelector) { TestLoadBalancerContext context_nx({{"version", "1.0"}, {"stage", "test"}}); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_nx)); - EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); } TEST_P(SubsetLoadBalancerTest, MetadataFallbackList) { diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index 543b890c65e94..1cb5903a8e1a4 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -2018,7 +2018,7 @@ TEST_F(StaticClusterImplTest, OutlierDetector) { cluster.initialize([] {}); EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(2UL, cluster.info()->stats().membership_healthy_.value()); + EXPECT_EQ(2UL, cluster.info()->endpointStats().membership_healthy_.value()); // Set a single host as having failed and fire outlier detector callbacks. This should result // in only a single healthy host. @@ -2028,7 +2028,7 @@ TEST_F(StaticClusterImplTest, OutlierDetector) { Host::HealthFlag::FAILED_OUTLIER_CHECK); detector->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); EXPECT_NE(cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts()[0], cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]); @@ -2037,7 +2037,7 @@ TEST_F(StaticClusterImplTest, OutlierDetector) { Host::HealthFlag::FAILED_OUTLIER_CHECK); detector->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]); EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(2UL, cluster.info()->stats().membership_healthy_.value()); + EXPECT_EQ(2UL, cluster.info()->endpointStats().membership_healthy_.value()); } TEST_F(StaticClusterImplTest, HealthyStat) { @@ -2082,8 +2082,8 @@ TEST_F(StaticClusterImplTest, HealthyStat) { EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]->healthFlagClear( Host::HealthFlag::FAILED_ACTIVE_HC); @@ -2099,46 +2099,46 @@ TEST_F(StaticClusterImplTest, HealthyStat) { Host::HealthFlag::FAILED_OUTLIER_CHECK); outlier_detector->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]->healthFlagSet( Host::HealthFlag::FAILED_ACTIVE_HC); health_checker->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0], HealthTransition::Changed); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]->healthFlagClear( Host::HealthFlag::FAILED_OUTLIER_CHECK); outlier_detector->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]->healthFlagClear( Host::HealthFlag::FAILED_ACTIVE_HC); health_checker->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0], HealthTransition::Changed); EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(2UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(2UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]->healthFlagSet( Host::HealthFlag::FAILED_OUTLIER_CHECK); outlier_detector->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0]); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[1]->healthFlagSet( Host::HealthFlag::FAILED_ACTIVE_HC); health_checker->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[1], HealthTransition::Changed); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[1]->healthFlagSet( Host::HealthFlag::DEGRADED_ACTIVE_HC); @@ -2148,8 +2148,8 @@ TEST_F(StaticClusterImplTest, HealthyStat) { HealthTransition::Changed); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->degradedHosts().size()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_degraded_.value()); // Mark the endpoint as unhealthy. This should decrement the degraded stat. cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[1]->healthFlagSet( @@ -2158,8 +2158,8 @@ TEST_F(StaticClusterImplTest, HealthyStat) { HealthTransition::Changed); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->degradedHosts().size()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); // Go back to degraded. cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[1]->healthFlagClear( @@ -2168,8 +2168,8 @@ TEST_F(StaticClusterImplTest, HealthyStat) { HealthTransition::Changed); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->degradedHosts().size()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_degraded_.value()); // Then go healthy. cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[1]->healthFlagClear( @@ -2178,8 +2178,8 @@ TEST_F(StaticClusterImplTest, HealthyStat) { HealthTransition::Changed); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->degradedHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); } TEST_F(StaticClusterImplTest, UrlConfig) { diff --git a/test/common/upstream/zone_aware_load_balancer_fuzz_base.cc b/test/common/upstream/zone_aware_load_balancer_fuzz_base.cc index 73b3890089f81..e9ed21b67094c 100644 --- a/test/common/upstream/zone_aware_load_balancer_fuzz_base.cc +++ b/test/common/upstream/zone_aware_load_balancer_fuzz_base.cc @@ -48,7 +48,6 @@ void ZoneAwareLoadBalancerFuzzBase::setupZoneAwareLoadBalancingSpecificLogic() { // Having 3 possible weights, 1, 2, and 3 to provide the state space at least some variation // in regards to weights, which do affect the load balancing algorithm. Cap the amount of // weights at 3 for simplicity's sake - stats_.max_host_weight_.set(3UL); addWeightsToHosts(); } diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index ba3a767c931c1..b33d48a5c1e1b 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -54,11 +54,15 @@ MockClusterInfo::MockClusterInfo() : http2_options_(::Envoy::Http2::Utility::initializeAndValidateOptions( envoy::config::core::v3::Http2ProtocolOptions())), stat_names_(stats_store_.symbolTable()), + config_update_stats_names_(stats_store_.symbolTable()), + lb_stat_names_(stats_store_.symbolTable()), endpoint_stat_names_(stats_store_.symbolTable()), cluster_load_report_stat_names_(stats_store_.symbolTable()), cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)), + config_update_stats_(config_update_stats_names_, stats_store_), + lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), load_report_stats_(ClusterInfoImpl::generateLoadReportStats(load_report_stats_store_, cluster_load_report_stat_names_)), @@ -95,6 +99,9 @@ MockClusterInfo::MockClusterInfo() ON_CALL(*this, maxRequestsPerConnection()) .WillByDefault(ReturnPointee(&max_requests_per_connection_)); ON_CALL(*this, stats()).WillByDefault(ReturnRef(stats_)); + ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); + ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); + ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); ON_CALL(*this, statsScope()).WillByDefault(ReturnRef(stats_store_)); // TODO(incfly): The following is a hack because it's not possible to directly embed // a mock transport socket factory matcher due to circular dependencies. Fix this up in a follow diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 1c6c27ca20b94..0bd4b5e22ab70 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -152,6 +152,8 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); MOCK_METHOD(ClusterStats&, stats, (), (const)); + MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); + MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); MOCK_METHOD(Stats::Scope&, statsScope, (), (const)); MOCK_METHOD(ClusterLoadReportStats&, loadReportStats, (), (const)); @@ -198,11 +200,17 @@ class MockClusterInfo : public ClusterInfo { uint32_t max_response_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT}; NiceMock stats_store_; ClusterStatNames stat_names_; + ClusterConfigUpdateStatNames config_update_stats_names_; + ClusterLbStatNames lb_stat_names_; + ClusterEndpointStatNames endpoint_stat_names_; ClusterLoadReportStatNames cluster_load_report_stat_names_; ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; ClusterStats stats_; + ClusterConfigUpdateStats config_update_stats_; + ClusterLbStats lb_stats_; + ClusterEndpointStats endpoint_stats_; Upstream::TransportSocketMatcherPtr transport_socket_matcher_; NiceMock load_report_stats_store_; ClusterLoadReportStats load_report_stats_; diff --git a/test/mocks/upstream/cluster_manager.cc b/test/mocks/upstream/cluster_manager.cc index 285c4c051dc27..3b588bf67da86 100644 --- a/test/mocks/upstream/cluster_manager.cc +++ b/test/mocks/upstream/cluster_manager.cc @@ -16,6 +16,7 @@ MockClusterManager::MockClusterManager(TimeSource&) : MockClusterManager() {} MockClusterManager::MockClusterManager() : cluster_stat_names_(*symbol_table_), cluster_config_update_stat_names_(*symbol_table_), + cluster_lb_stat_names_(*symbol_table_), cluster_endpoint_stat_names_(*symbol_table_), cluster_load_report_stat_names_(*symbol_table_), cluster_circuit_breakers_stat_names_(*symbol_table_), cluster_request_response_size_stat_names_(*symbol_table_), diff --git a/test/mocks/upstream/cluster_manager.h b/test/mocks/upstream/cluster_manager.h index 118b3665da1e5..a28b17f0822ca 100644 --- a/test/mocks/upstream/cluster_manager.h +++ b/test/mocks/upstream/cluster_manager.h @@ -60,7 +60,10 @@ class MockClusterManager : public ClusterManager { const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { return cluster_config_update_stat_names_; } - + const ClusterEndpointStatNames& clusterEndpointStatNames() const override { + return cluster_endpoint_stat_names_; + } + const ClusterLbStatNames& clusterLbStatNames() const override { return cluster_lb_stat_names_; } const ClusterLoadReportStatNames& clusterLoadReportStatNames() const override { return cluster_load_report_stat_names_; } @@ -94,6 +97,8 @@ class MockClusterManager : public ClusterManager { Stats::TestUtil::TestSymbolTable symbol_table_; ClusterStatNames cluster_stat_names_; ClusterConfigUpdateStatNames cluster_config_update_stat_names_; + ClusterLbStatNames cluster_lb_stat_names_; + ClusterEndpointStatNames cluster_endpoint_stat_names_; ClusterLoadReportStatNames cluster_load_report_stat_names_; ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; From eebc32266f2a300afed6fef5a32fd4010802e849 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 9 Nov 2022 15:25:35 -0500 Subject: [PATCH 005/122] fix failing tests Signed-off-by: Xin Zhuang --- envoy/stats/stats_macros.h | 26 +++- envoy/upstream/cluster_manager.h | 2 +- envoy/upstream/upstream.h | 10 +- source/common/conn_pool/conn_pool_base.cc | 44 +++---- source/common/http/codec_client.cc | 2 +- source/common/http/codec_client.h | 2 +- source/common/http/conn_pool_base.cc | 8 +- source/common/http/conn_pool_base.h | 10 +- source/common/http/conn_pool_grid.cc | 2 +- source/common/http/http1/conn_pool.cc | 4 +- source/common/http/http2/conn_pool.cc | 2 +- source/common/http/http3/conn_pool.cc | 2 +- source/common/router/retry_state_impl.cc | 12 +- source/common/router/router.cc | 14 +-- source/common/router/upstream_codec_filter.cc | 4 +- source/common/router/upstream_request.cc | 12 +- source/common/tcp/conn_pool.cc | 10 +- source/common/tcp_proxy/tcp_proxy.cc | 14 +-- .../common/upstream/cluster_manager_impl.cc | 6 +- source/common/upstream/cluster_manager_impl.h | 4 +- source/common/upstream/conn_pool_map_impl.h | 2 +- .../upstream/health_checker_base_impl.cc | 2 +- .../common/upstream/thread_aware_lb_impl.cc | 2 +- source/common/upstream/upstream_impl.cc | 21 ++-- source/common/upstream/upstream_impl.h | 8 +- .../original_dst/original_dst_cluster.cc | 2 +- .../network/common/redis/client_impl.cc | 24 ++-- .../network/redis_proxy/conn_pool_impl.cc | 12 +- .../filters/udp/udp_proxy/udp_proxy_filter.cc | 10 +- .../stat_sinks/common/statsd/statsd.cc | 12 +- .../extensions/stat_sinks/hystrix/hystrix.cc | 2 +- test/common/conn_pool/conn_pool_base_test.cc | 20 +-- test/common/http/codec_client_test.cc | 6 +- test/common/http/http1/conn_pool_test.cc | 49 ++++---- test/common/http/http2/conn_pool_test.cc | 82 ++++++------ test/common/router/retry_state_impl_test.cc | 58 ++++----- test/common/tcp/conn_pool_test.cc | 20 +-- .../upstream/conn_pool_map_impl_test.cc | 6 +- test/common/upstream/health_check_fuzz.cc | 6 +- .../upstream/health_checker_impl_test.cc | 106 ++++++++-------- test/common/upstream/upstream_impl_test.cc | 6 +- .../clusters/aggregate/cluster_test.cc | 4 +- .../original_dst/original_dst_cluster_test.cc | 4 +- .../proxy_filter_test.cc | 4 +- .../gcp_authn_filter_integration_test.cc | 4 +- .../http/health_check/health_check_test.cc | 6 +- .../network/common/redis/client_impl_test.cc | 118 ++++++++++-------- .../udp/udp_proxy/udp_proxy_filter_test.cc | 40 +++--- .../stats_sinks/common/statsd/statsd_test.cc | 12 +- .../stats_sinks/hystrix/hystrix_test.cc | 6 +- test/integration/integration_test.cc | 8 +- test/integration/xfcc_integration_test.cc | 17 +++ test/mocks/upstream/cluster_info.cc | 6 +- test/mocks/upstream/cluster_info.h | 6 +- test/mocks/upstream/cluster_manager.h | 4 +- 55 files changed, 473 insertions(+), 412 deletions(-) diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index 6ffca3ea0d118..4f9b7b2f465a2 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -152,6 +152,7 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ */ #define MAKE_STATS_STRUCT(StatsStruct, StatNamesStruct, ALL_STATS) \ struct StatsStruct { \ + using StatNameType = StatNamesStruct; \ StatsStruct(const StatNamesStruct& stat_names, Envoy::Stats::Scope& scope, \ Envoy::Stats::StatName prefix = Envoy::Stats::StatName()) \ : stat_names_(stat_names) \ @@ -159,9 +160,32 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ MAKE_STATS_STRUCT_HISTOGRAM_HELPER_, \ MAKE_STATS_STRUCT_TEXT_READOUT_HELPER_, \ MAKE_STATS_STRUCT_STATNAME_HELPER_) {} \ - const StatNamesStruct& stat_names_; \ + const StatNameType& stat_names_; \ ALL_STATS(GENERATE_COUNTER_STRUCT, GENERATE_GAUGE_STRUCT, GENERATE_HISTOGRAM_STRUCT, \ GENERATE_TEXT_READOUT_STRUCT, GENERATE_STATNAME_STRUCT) \ } +/** + * LazyInit$StatsStruct is a wrapper with creator of the actual "$StatsStruct" + * structure. + * It instantiate a $StatsStruct struct when any data member is referenced. + * See https://github.com/envoyproxy/envoy/issues/23575 for more details. + */ +template struct LazyInitStats { + LazyInitStats(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) + : scope_(scope), ctor_([&scope, &stat_names]() -> StatsStructType* { + return new StatsStructType(stat_names, scope); + }) {} + + StatsStructType* operator->() { return internal_stats_.get(ctor_); } + StatsStructType& operator*() { return *internal_stats_.get(ctor_); } + + inline Stats::Scope& statsScope() { return scope_; } + + Stats::Scope& scope_; + std::function ctor_; + Thread::AtomicPtr + internal_stats_{}; +}; + } // namespace Envoy diff --git a/envoy/upstream/cluster_manager.h b/envoy/upstream/cluster_manager.h index e8a5853a8fbad..677601df56eeb 100644 --- a/envoy/upstream/cluster_manager.h +++ b/envoy/upstream/cluster_manager.h @@ -378,7 +378,7 @@ class ClusterManager { * * @return the stat names. */ - virtual const ClusterStatNames& clusterStatNames() const PURE; + virtual const ClusterUpstreamStatNames& clusterStatNames() const PURE; virtual const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const PURE; virtual const ClusterLbStatNames& clusterLbStatNames() const PURE; virtual const ClusterEndpointStatNames& clusterEndpointStatNames() const PURE; diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 5ae11da6bd819..ba63da5eed6ed 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -617,7 +617,7 @@ class PrioritySet { /** * All cluster stats. @see stats_macros.h */ -#define ALL_CLUSTER_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ +#define ALL_CLUSTER_UPSTREAM_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ COUNTER(bind_errors) \ COUNTER(original_dst_host_invalid) \ COUNTER(retry_or_shadow_abandoned) \ @@ -750,8 +750,8 @@ MAKE_STATS_STRUCT(ClusterLbStats, ClusterLbStatNames, ALL_CLUSTER_LB_STATS); /** * Struct definition for all cluster stats. @see stats_macros.h */ -MAKE_STAT_NAMES_STRUCT(ClusterStatNames, ALL_CLUSTER_STATS); -MAKE_STATS_STRUCT(ClusterStats, ClusterStatNames, ALL_CLUSTER_STATS); +MAKE_STAT_NAMES_STRUCT(ClusterUpstreamStatNames, ALL_CLUSTER_UPSTREAM_STATS); +MAKE_STATS_STRUCT(ClusterUpstreamStats, ClusterUpstreamStatNames, ALL_CLUSTER_UPSTREAM_STATS); MAKE_STAT_NAMES_STRUCT(ClusterLoadReportStatNames, ALL_CLUSTER_LOAD_REPORT_STATS); MAKE_STATS_STRUCT(ClusterLoadReportStats, ClusterLoadReportStatNames, @@ -1047,9 +1047,9 @@ class ClusterInfo : public Http::FilterChainFactory { virtual ClusterEndpointStats& endpointStats() const PURE; /** - * @return ClusterStats& strongly named stats for this cluster. + * @return ClusterUpstreamStats& strongly named stats for this cluster. */ - virtual ClusterStats& stats() const PURE; + virtual LazyInitStats& upstreamStats() const PURE; /** * @return the stats scope that contains all cluster stats. This can be used to produce dynamic diff --git a/source/common/conn_pool/conn_pool_base.cc b/source/common/conn_pool/conn_pool_base.cc index 78d26a13f91f9..8fd87be0d0a86 100644 --- a/source/common/conn_pool/conn_pool_base.cc +++ b/source/common/conn_pool/conn_pool_base.cc @@ -135,7 +135,7 @@ ConnPoolImplBase::tryCreateNewConnection(float global_preconnect_ratio) { const bool can_create_connection = host_->canCreateConnection(priority_); if (!can_create_connection) { - host_->cluster().stats().upstream_cx_overflow_.inc(); + host_->cluster().upstreamStats()->upstream_cx_overflow_.inc(); } // If we are at the connection circuit-breaker limit due to other upstreams having // too many open connections, and this upstream has no connections, always create one, to @@ -168,14 +168,14 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& ASSERT(client.readyForStream()); if (client.state() == Envoy::ConnectionPool::ActiveClient::State::ReadyForEarlyData) { - host_->cluster().stats().upstream_rq_0rtt_.inc(); + host_->cluster().upstreamStats()->upstream_rq_0rtt_.inc(); } if (enforceMaxRequests() && !host_->cluster().resourceManager(priority_).requests().canCreate()) { ENVOY_LOG(debug, "max streams overflow"); onPoolFailure(client.real_host_description_, absl::string_view(), ConnectionPool::PoolFailureReason::Overflow, context); - host_->cluster().stats().upstream_rq_pending_overflow_.inc(); + host_->cluster().upstreamStats()->upstream_rq_pending_overflow_.inc(); return; } ENVOY_CONN_LOG(debug, "creating stream", client); @@ -185,7 +185,7 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& client.remaining_streams_--; if (client.remaining_streams_ == 0) { ENVOY_CONN_LOG(debug, "maximum streams per connection, start draining", client); - host_->cluster().stats().upstream_cx_max_requests_.inc(); + host_->cluster().upstreamStats()->upstream_cx_max_requests_.inc(); transitionActiveClientState(client, Envoy::ConnectionPool::ActiveClient::State::Draining); } else if (capacity == 1) { // As soon as the new stream is created, the client will be maxed out. @@ -202,8 +202,8 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& num_active_streams_++; host_->stats().rq_total_.inc(); host_->stats().rq_active_.inc(); - host_->cluster().stats().upstream_rq_total_.inc(); - host_->cluster().stats().upstream_rq_active_.inc(); + host_->cluster().upstreamStats()->upstream_rq_total_.inc(); + host_->cluster().upstreamStats()->upstream_rq_active_.inc(); host_->cluster().resourceManager(priority_).requests().inc(); onPoolReady(client, context); @@ -216,7 +216,7 @@ void ConnPoolImplBase::onStreamClosed(Envoy::ConnectionPool::ActiveClient& clien state_.decrActiveStreams(1); num_active_streams_--; host_->stats().rq_active_.dec(); - host_->cluster().stats().upstream_rq_active_.dec(); + host_->cluster().upstreamStats()->upstream_rq_active_.dec(); host_->cluster().resourceManager(priority_).requests().dec(); // We don't update the capacity for HTTP/3 as the stream count should only // increase when a MAX_STREAMS frame is received. @@ -282,7 +282,7 @@ ConnectionPool::Cancellable* ConnPoolImplBase::newStreamImpl(AttachContext& cont ENVOY_LOG(debug, "max pending streams overflow"); onPoolFailure(nullptr, absl::string_view(), ConnectionPool::PoolFailureReason::Overflow, context); - host_->cluster().stats().upstream_rq_pending_overflow_.inc(); + host_->cluster().upstreamStats()->upstream_rq_pending_overflow_.inc(); return nullptr; } @@ -490,7 +490,7 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view if (!client.hasHandshakeCompleted()) { client.has_handshake_completed_ = true; - host_->cluster().stats().upstream_cx_connect_fail_.inc(); + host_->cluster().upstreamStats()->upstream_cx_connect_fail_.inc(); host_->stats().cx_connect_fail_.inc(); onConnectFailed(client); @@ -595,7 +595,7 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view client.currentUnusedCapacity()); // No need to update connecting capacity and connect_timer_ as the client is still connecting. ASSERT(client.state() == ActiveClient::State::Connecting); - host()->cluster().stats().upstream_cx_connect_with_0_rtt_.inc(); + host()->cluster().upstreamStats()->upstream_cx_connect_with_0_rtt_.inc(); transitionActiveClientState(client, (client.currentUnusedCapacity() > 0 ? ActiveClient::State::ReadyForEarlyData : ActiveClient::State::Busy)); @@ -606,13 +606,13 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view PendingStream::PendingStream(ConnPoolImplBase& parent, bool can_send_early_data) : parent_(parent), can_send_early_data_(can_send_early_data) { - parent_.host()->cluster().stats().upstream_rq_pending_total_.inc(); - parent_.host()->cluster().stats().upstream_rq_pending_active_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_rq_pending_total_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_rq_pending_active_.inc(); parent_.host()->cluster().resourceManager(parent_.priority()).pendingRequests().inc(); } PendingStream::~PendingStream() { - parent_.host()->cluster().stats().upstream_rq_pending_active_.dec(); + parent_.host()->cluster().upstreamStats()->upstream_rq_pending_active_.dec(); parent_.host()->cluster().resourceManager(parent_.priority()).pendingRequests().dec(); } @@ -630,7 +630,7 @@ void ConnPoolImplBase::purgePendingStreams( while (!pending_streams_to_purge_.empty()) { PendingStreamPtr stream = pending_streams_to_purge_.front()->removeFromList(pending_streams_to_purge_); - host_->cluster().stats().upstream_rq_pending_failure_eject_.inc(); + host_->cluster().upstreamStats()->upstream_rq_pending_failure_eject_.inc(); onPoolFailure(host_description, failure_reason, reason, stream->context()); } } @@ -683,7 +683,7 @@ void ConnPoolImplBase::onPendingStreamCancel(PendingStream& stream, } } - host_->cluster().stats().upstream_rq_cancelled_.inc(); + host_->cluster().upstreamStats()->upstream_rq_cancelled_.inc(); checkForIdleAndCloseIdleConnsIfDraining(); } @@ -757,14 +757,14 @@ ActiveClient::ActiveClient(ConnPoolImplBase& parent, uint32_t lifetime_stream_li concurrent_stream_limit_(translateZeroToUnlimited(concurrent_stream_limit)), connect_timer_(parent_.dispatcher().createTimer([this]() { onConnectTimeout(); })) { conn_connect_ms_ = std::make_unique( - parent_.host()->cluster().stats().upstream_cx_connect_ms_, parent_.dispatcher().timeSource()); + parent_.host()->cluster().upstreamStats()->upstream_cx_connect_ms_, parent_.dispatcher().timeSource()); conn_length_ = std::make_unique( - parent_.host()->cluster().stats().upstream_cx_length_ms_, parent_.dispatcher().timeSource()); + parent_.host()->cluster().upstreamStats()->upstream_cx_length_ms_, parent_.dispatcher().timeSource()); connect_timer_->enableTimer(parent_.host()->cluster().connectTimeout()); parent_.host()->stats().cx_total_.inc(); parent_.host()->stats().cx_active_.inc(); - parent_.host()->cluster().stats().upstream_cx_total_.inc(); - parent_.host()->cluster().stats().upstream_cx_active_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_cx_total_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_cx_active_.inc(); parent_.host()->cluster().resourceManager(parent_.priority()).connections().inc(); } @@ -776,7 +776,7 @@ void ActiveClient::releaseResourcesBase() { conn_length_->complete(); - parent_.host()->cluster().stats().upstream_cx_active_.dec(); + parent_.host()->cluster().upstreamStats()->upstream_cx_active_.dec(); parent_.host()->stats().cx_active_.dec(); parent_.host()->cluster().resourceManager(parent_.priority()).connections().dec(); } @@ -784,7 +784,7 @@ void ActiveClient::releaseResourcesBase() { void ActiveClient::onConnectTimeout() { ENVOY_CONN_LOG(debug, "connect timeout", *this); - parent_.host()->cluster().stats().upstream_cx_connect_timeout_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_cx_connect_timeout_.inc(); timed_out_ = true; close(); } @@ -809,7 +809,7 @@ void ActiveClient::onConnectionDurationTimeout() { } ENVOY_CONN_LOG(debug, "max connection duration reached, start draining", *this); - parent_.host()->cluster().stats().upstream_cx_max_duration_reached_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.inc(); parent_.transitionActiveClientState(*this, Envoy::ConnectionPool::ActiveClient::State::Draining); // Close out the draining client if we no longer have active streams. diff --git a/source/common/http/codec_client.cc b/source/common/http/codec_client.cc index e7e8008ef1d71..a51222f852f05 100644 --- a/source/common/http/codec_client.cc +++ b/source/common/http/codec_client.cc @@ -171,7 +171,7 @@ void CodecClient::onData(Buffer::Instance& data) { if (!isPrematureResponseError(status) || (!active_requests_.empty() || getPrematureResponseHttpCode(status) != Code::RequestTimeout)) { - host_->cluster().stats().upstream_cx_protocol_error_.inc(); + host_->cluster().upstreamStats()->upstream_cx_protocol_error_.inc(); protocol_error_ = true; } close(); diff --git a/source/common/http/codec_client.h b/source/common/http/codec_client.h index c53fbf5c347b0..8aafbf25c65ca 100644 --- a/source/common/http/codec_client.h +++ b/source/common/http/codec_client.h @@ -164,7 +164,7 @@ class CodecClient : protected Logger::Loggable, } void onIdleTimeout() { - host_->cluster().stats().upstream_cx_idle_timeout_.inc(); + host_->cluster().upstreamStats()->upstream_cx_idle_timeout_.inc(); close(); } diff --git a/source/common/http/conn_pool_base.cc b/source/common/http/conn_pool_base.cc index 284e479a8632f..f91401bd12237 100644 --- a/source/common/http/conn_pool_base.cc +++ b/source/common/http/conn_pool_base.cc @@ -99,7 +99,7 @@ static const uint64_t DEFAULT_MAX_STREAMS = (1 << 29); void MultiplexedActiveClientBase::onGoAway(Http::GoAwayErrorCode) { ENVOY_CONN_LOG(debug, "remote goaway", *codec_client_); - parent_.host()->cluster().stats().upstream_cx_close_notify_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_cx_close_notify_.inc(); if (state() != ActiveClient::State::Draining) { if (codec_client_->numActiveRequests() == 0) { codec_client_->close(); @@ -160,16 +160,16 @@ void MultiplexedActiveClientBase::onStreamReset(Http::StreamResetReason reason) switch (reason) { case StreamResetReason::ConnectionTermination: case StreamResetReason::ConnectionFailure: - parent_.host()->cluster().stats().upstream_rq_pending_failure_eject_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_rq_pending_failure_eject_.inc(); closed_with_active_rq_ = true; break; case StreamResetReason::LocalReset: case StreamResetReason::ProtocolError: case StreamResetReason::OverloadManager: - parent_.host()->cluster().stats().upstream_rq_tx_reset_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_rq_tx_reset_.inc(); break; case StreamResetReason::RemoteReset: - parent_.host()->cluster().stats().upstream_rq_rx_reset_.inc(); + parent_.host()->cluster().upstreamStats()->upstream_rq_rx_reset_.inc(); break; case StreamResetReason::LocalRefusedStreamReset: case StreamResetReason::RemoteRefusedStreamReset: diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index 44451ab60643a..1c740f9706b57 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -129,11 +129,11 @@ class ActiveClient : public Envoy::ConnectionPool::ActiveClient { codec_client_ = parent.createCodecClient(data); codec_client_->addConnectionCallbacks(*this); codec_client_->setConnectionStats( - {parent_.host()->cluster().stats().upstream_cx_rx_bytes_total_, - parent_.host()->cluster().stats().upstream_cx_rx_bytes_buffered_, - parent_.host()->cluster().stats().upstream_cx_tx_bytes_total_, - parent_.host()->cluster().stats().upstream_cx_tx_bytes_buffered_, - &parent_.host()->cluster().stats().bind_errors_, nullptr}); + {parent_.host()->cluster().upstreamStats()->upstream_cx_rx_bytes_total_, + parent_.host()->cluster().upstreamStats()->upstream_cx_rx_bytes_buffered_, + parent_.host()->cluster().upstreamStats()->upstream_cx_tx_bytes_total_, + parent_.host()->cluster().upstreamStats()->upstream_cx_tx_bytes_buffered_, + &parent_.host()->cluster().upstreamStats()->bind_errors_, nullptr}); } absl::optional protocol() const override { return codec_client_->protocol(); } diff --git a/source/common/http/conn_pool_grid.cc b/source/common/http/conn_pool_grid.cc index 6c45e48eca39d..40919fd245fb1 100644 --- a/source/common/http/conn_pool_grid.cc +++ b/source/common/http/conn_pool_grid.cc @@ -382,7 +382,7 @@ HttpServerPropertiesCache::Http3StatusTracker& ConnectivityGrid::getHttp3StatusT bool ConnectivityGrid::isHttp3Broken() const { return getHttp3StatusTracker().isHttp3Broken(); } void ConnectivityGrid::markHttp3Broken() { - host_->cluster().stats().upstream_http3_broken_.inc(); + host_->cluster().upstreamStats()->upstream_http3_broken_.inc(); getHttp3StatusTracker().markHttp3Broken(); } diff --git a/source/common/http/http1/conn_pool.cc b/source/common/http/http1/conn_pool.cc index ab7165f5d3412..485a265fc0465 100644 --- a/source/common/http/http1/conn_pool.cc +++ b/source/common/http/http1/conn_pool.cc @@ -42,7 +42,7 @@ void ActiveClient::StreamWrapper::decodeHeaders(ResponseHeaderMapPtr&& headers, close_connection_ = HeaderUtility::shouldCloseConnection(parent_.codec_client_->protocol(), *headers); if (close_connection_) { - parent_.parent().host()->cluster().stats().upstream_cx_close_notify_.inc(); + parent_.parent().host()->cluster().upstreamStats()->upstream_cx_close_notify_.inc(); } ResponseDecoderWrapper::decodeHeaders(std::move(headers), end_stream); } @@ -76,7 +76,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, : Envoy::Http::ActiveClient(parent, parent.host()->cluster().maxRequestsPerConnection(), /* effective_concurrent_stream_limit */ 1, /* configured_concurrent_stream_limit */ 1, data) { - parent.host()->cluster().stats().upstream_cx_http1_total_.inc(); + parent.host()->cluster().upstreamStats()->upstream_cx_http1_total_.inc(); } ActiveClient::~ActiveClient() { ASSERT(!stream_wrapper_.get()); } diff --git a/source/common/http/http2/conn_pool.cc b/source/common/http/http2/conn_pool.cc index 8879d75282b6b..6f483f37e32ed 100644 --- a/source/common/http/http2/conn_pool.cc +++ b/source/common/http/http2/conn_pool.cc @@ -45,7 +45,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, : MultiplexedActiveClientBase( parent, calculateInitialStreamsLimit(parent.cache(), parent.origin(), parent.host()), parent.host()->cluster().http2Options().max_concurrent_streams().value(), - parent.host()->cluster().stats().upstream_cx_http2_total_, data) {} + parent.host()->cluster().upstreamStats()->upstream_cx_http2_total_, data) {} ConnectionPool::InstancePtr allocateConnPool(Event::Dispatcher& dispatcher, Random::RandomGenerator& random_generator, diff --git a/source/common/http/http3/conn_pool.cc b/source/common/http/http3/conn_pool.cc index 25d3cc5bc56b3..96ad6c5d36748 100644 --- a/source/common/http/http3/conn_pool.cc +++ b/source/common/http/http3/conn_pool.cc @@ -41,7 +41,7 @@ ActiveClient::ActiveClient(Envoy::Http::HttpConnPoolImplBase& parent, Upstream::Host::CreateConnectionData& data) : MultiplexedActiveClientBase(parent, getMaxStreams(parent.host()->cluster()), getMaxStreams(parent.host()->cluster()), - parent.host()->cluster().stats().upstream_cx_http3_total_, data), + parent.host()->cluster().upstreamStats()->upstream_cx_http3_total_, data), async_connect_callback_(parent_.dispatcher().createSchedulableCallback([this]() { if (state() != Envoy::ConnectionPool::ActiveClient::State::Connecting) { return; diff --git a/source/common/router/retry_state_impl.cc b/source/common/router/retry_state_impl.cc index 419e398909cf2..3f9a0d9a8c639 100644 --- a/source/common/router/retry_state_impl.cc +++ b/source/common/router/retry_state_impl.cc @@ -185,13 +185,13 @@ void RetryStateImpl::enableBackoffTimer() { // be reused. ratelimited_backoff_strategy_.reset(); - cluster_.stats().upstream_rq_retry_backoff_ratelimited_.inc(); + cluster_.upstreamStats()->upstream_rq_retry_backoff_ratelimited_.inc(); } else { // Otherwise we use a fully jittered exponential backoff algorithm. retry_timer_->enableTimer(std::chrono::milliseconds(backoff_strategy_->nextBackOffMs())); - cluster_.stats().upstream_rq_retry_backoff_exponential_.inc(); + cluster_.upstreamStats()->upstream_rq_retry_backoff_exponential_.inc(); } } @@ -277,7 +277,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba // retry this particular request, we can infer that we did a retry earlier // and it was successful. if ((backoff_callback_ || next_loop_callback_) && would_retry == RetryDecision::NoRetry) { - cluster_.stats().upstream_rq_retry_success_.inc(); + cluster_.upstreamStats()->upstream_rq_retry_success_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_success_.inc(); } @@ -295,7 +295,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba // The request has exhausted the number of retries allotted to it by the retry policy configured // (or the x-envoy-max-retries header). if (retries_remaining_ == 0) { - cluster_.stats().upstream_rq_retry_limit_exceeded_.inc(); + cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_limit_exceeded_.inc(); } @@ -308,7 +308,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba retries_remaining_--; if (!cluster_.resourceManager(priority_).retries().canCreate()) { - cluster_.stats().upstream_rq_retry_overflow_.inc(); + cluster_.upstreamStats()->upstream_rq_retry_overflow_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_overflow_.inc(); } @@ -324,7 +324,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba ASSERT(!backoff_callback_ && !next_loop_callback_); cluster_.resourceManager(priority_).retries().inc(); - cluster_.stats().upstream_rq_retry_.inc(); + cluster_.upstreamStats()->upstream_rq_retry_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_.inc(); } diff --git a/source/common/router/router.cc b/source/common/router/router.cc index acd45f3147e1a..0fdba8d55f7d0 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -509,7 +509,7 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::RequestHeaderMap& headers, modify_headers(headers); }, absl::nullopt, StreamInfo::ResponseCodeDetails::get().MaintenanceMode); - cluster_->stats().upstream_rq_maintenance_mode_.inc(); + cluster_->upstreamStats()->upstream_rq_maintenance_mode_.inc(); return Http::FilterHeadersStatus::StopIteration; } @@ -754,7 +754,7 @@ Http::FilterDataStatus Filter::decodeData(Buffer::Instance& data, bool end_strea "The request payload has at least {} bytes data which exceeds buffer limit {}. Give " "up on the retry/shadow.", getLength(callbacks_->decodingBuffer()) + data.length(), retry_shadow_buffer_limit_); - cluster_->stats().retry_or_shadow_abandoned_.inc(); + cluster_->upstreamStats()->retry_or_shadow_abandoned_.inc(); retry_state_.reset(); buffering = false; active_shadow_policies_.clear(); @@ -956,7 +956,7 @@ void Filter::onResponseTimeout() { if (Runtime::runtimeFeatureEnabled( "envoy.reloadable_features.do_not_await_headers_on_upstream_timeout_to_emit_stats") || upstream_request->awaitingHeaders()) { - cluster_->stats().upstream_rq_timeout_.inc(); + cluster_->upstreamStats()->upstream_rq_timeout_.inc(); if (request_vcluster_) { request_vcluster_->stats().upstream_rq_timeout_.inc(); } @@ -1030,12 +1030,12 @@ void Filter::onSoftPerTryTimeout(UpstreamRequest& upstream_request) { } void Filter::onPerTryIdleTimeout(UpstreamRequest& upstream_request) { - onPerTryTimeoutCommon(upstream_request, cluster_->stats().upstream_rq_per_try_idle_timeout_, + onPerTryTimeoutCommon(upstream_request, cluster_->upstreamStats()->upstream_rq_per_try_idle_timeout_, StreamInfo::ResponseCodeDetails::get().UpstreamPerTryIdleTimeout); } void Filter::onPerTryTimeout(UpstreamRequest& upstream_request) { - onPerTryTimeoutCommon(upstream_request, cluster_->stats().upstream_rq_per_try_timeout_, + onPerTryTimeoutCommon(upstream_request, cluster_->upstreamStats()->upstream_rq_per_try_timeout_, StreamInfo::ResponseCodeDetails::get().UpstreamPerTryTimeout); } @@ -1624,7 +1624,7 @@ bool Filter::setupRedirect(const Http::ResponseHeaderMap& headers) { convertRequestHeadersForInternalRedirect(*downstream_headers_, *location, status_code) && callbacks_->recreateStream(&headers)) { ENVOY_STREAM_LOG(debug, "Internal redirect succeeded", *callbacks_); - cluster_->stats().upstream_internal_redirect_succeeded_total_.inc(); + cluster_->upstreamStats()->upstream_internal_redirect_succeeded_total_.inc(); return true; } // convertRequestHeadersForInternalRedirect logs failure reasons but log @@ -1637,7 +1637,7 @@ bool Filter::setupRedirect(const Http::ResponseHeaderMap& headers) { ENVOY_STREAM_LOG(trace, "Internal redirect failed: missing location header", *callbacks_); } - cluster_->stats().upstream_internal_redirect_failed_total_.inc(); + cluster_->upstreamStats()->upstream_internal_redirect_failed_total_.inc(); return false; } diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index 07e43f4998512..4a464196c0cac 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -28,12 +28,12 @@ namespace Envoy { namespace Router { void UpstreamCodecFilter::onBelowWriteBufferLowWatermark() { - callbacks_->clusterInfo()->stats().upstream_flow_control_resumed_reading_total_.inc(); + callbacks_->clusterInfo()->upstreamStats()->upstream_flow_control_resumed_reading_total_.inc(); callbacks_->upstreamCallbacks()->upstream()->readDisable(false); } void UpstreamCodecFilter::onAboveWriteBufferHighWatermark() { - callbacks_->clusterInfo()->stats().upstream_flow_control_paused_reading_total_.inc(); + callbacks_->clusterInfo()->upstreamStats()->upstream_flow_control_paused_reading_total_.inc(); callbacks_->upstreamCallbacks()->upstream()->readDisable(true); } diff --git a/source/common/router/upstream_request.cc b/source/common/router/upstream_request.cc index 5407c2ce1d281..7f1a8d2a2fef1 100644 --- a/source/common/router/upstream_request.cc +++ b/source/common/router/upstream_request.cc @@ -197,7 +197,7 @@ void UpstreamRequest::cleanUp() { while (downstream_data_disabled_ != 0) { parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); - parent_.cluster()->stats().upstream_flow_control_drained_total_.inc(); + parent_.cluster()->upstreamStats()->upstream_flow_control_drained_total_.inc(); --downstream_data_disabled_; } if (allow_upstream_filters_) { @@ -753,7 +753,7 @@ UpstreamToDownstream& UpstreamRequest::upstreamToDownstream() { } void UpstreamRequest::onStreamMaxDurationReached() { - upstream_host_->cluster().stats().upstream_rq_max_duration_reached_.inc(); + upstream_host_->cluster().upstreamStats()->upstream_rq_max_duration_reached_.inc(); // The upstream had closed then try to retry along with retry policy. parent_.onStreamMaxDurationReached(*this); @@ -780,7 +780,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onAboveWriteBufferHighWatermar // The downstream connection is overrun. Pause reads from upstream. // If there are multiple calls to readDisable either the codec (H2) or the underlying // Network::Connection (H1) will handle reference counting. - parent_.parent_.cluster()->stats().upstream_flow_control_paused_reading_total_.inc(); + parent_.parent_.cluster()->upstreamStats()->upstream_flow_control_paused_reading_total_.inc(); parent_.upstream_->readDisable(true); } @@ -789,7 +789,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onBelowWriteBufferLowWatermark // One source of connection blockage has buffer available. Pass this on to the stream, which // will resume reads if this was the last remaining high watermark. - parent_.parent_.cluster()->stats().upstream_flow_control_resumed_reading_total_.inc(); + parent_.parent_.cluster()->upstreamStats()->upstream_flow_control_resumed_reading_total_.inc(); parent_.upstream_->readDisable(false); } @@ -804,7 +804,7 @@ void UpstreamRequest::disableDataFromDownstreamForFlowControl() { // the per try timeout timer is started only after downstream_end_stream_ // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); - parent_.cluster()->stats().upstream_flow_control_backed_up_total_.inc(); + parent_.cluster()->upstreamStats()->upstream_flow_control_backed_up_total_.inc(); parent_.callbacks()->onDecoderFilterAboveWriteBufferHighWatermark(); ++downstream_data_disabled_; } @@ -820,7 +820,7 @@ void UpstreamRequest::enableDataFromDownstreamForFlowControl() { // the per try timeout timer is started only after downstream_end_stream_ // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); - parent_.cluster()->stats().upstream_flow_control_drained_total_.inc(); + parent_.cluster()->upstreamStats()->upstream_flow_control_drained_total_.inc(); parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); ASSERT(downstream_data_disabled_ != 0); if (downstream_data_disabled_ > 0) { diff --git a/source/common/tcp/conn_pool.cc b/source/common/tcp/conn_pool.cc index 0ece4a46b155f..82c1dab79344a 100644 --- a/source/common/tcp/conn_pool.cc +++ b/source/common/tcp/conn_pool.cc @@ -25,11 +25,11 @@ ActiveTcpClient::ActiveTcpClient(Envoy::ConnectionPool::ConnPoolImplBase& parent connection_->addConnectionCallbacks(*this); read_filter_handle_ = std::make_shared(*this); connection_->addReadFilter(read_filter_handle_); - connection_->setConnectionStats({host->cluster().stats().upstream_cx_rx_bytes_total_, - host->cluster().stats().upstream_cx_rx_bytes_buffered_, - host->cluster().stats().upstream_cx_tx_bytes_total_, - host->cluster().stats().upstream_cx_tx_bytes_buffered_, - &host->cluster().stats().bind_errors_, nullptr}); + connection_->setConnectionStats({host->cluster().upstreamStats()->upstream_cx_rx_bytes_total_, + host->cluster().upstreamStats()->upstream_cx_rx_bytes_buffered_, + host->cluster().upstreamStats()->upstream_cx_tx_bytes_total_, + host->cluster().upstreamStats()->upstream_cx_tx_bytes_buffered_, + &host->cluster().upstreamStats()->bind_errors_, nullptr}); connection_->noDelay(true); connection_->connect(); } diff --git a/source/common/tcp_proxy/tcp_proxy.cc b/source/common/tcp_proxy/tcp_proxy.cc index aed1680c88f11..78331418f5292 100644 --- a/source/common/tcp_proxy/tcp_proxy.cc +++ b/source/common/tcp_proxy/tcp_proxy.cc @@ -234,13 +234,13 @@ void Filter::readDisableUpstream(bool disable) { if (disable) { read_callbacks_->upstreamHost() ->cluster() - .stats() - .upstream_flow_control_paused_reading_total_.inc(); + .upstreamStats() + ->upstream_flow_control_paused_reading_total_.inc(); } else { read_callbacks_->upstreamHost() ->cluster() - .stats() - .upstream_flow_control_resumed_reading_total_.inc(); + .upstreamStats() + ->upstream_flow_control_resumed_reading_total_.inc(); } } @@ -377,7 +377,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { // will never be released. if (!cluster->resourceManager(Upstream::ResourcePriority::Default).connections().canCreate()) { getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::UpstreamOverflow); - cluster->stats().upstream_cx_overflow_.inc(); + cluster->upstreamStats()->upstream_cx_overflow_.inc(); onInitFailure(UpstreamFailureReason::ResourceLimitExceeded); return Network::FilterStatus::StopIteration; } @@ -385,7 +385,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { const uint32_t max_connect_attempts = config_->maxConnectAttempts(); if (connect_attempts_ >= max_connect_attempts) { getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::UpstreamRetryLimitExceeded); - cluster->stats().upstream_cx_connect_attempts_exceeded_.inc(); + cluster->upstreamStats()->upstream_cx_connect_attempts_exceeded_.inc(); onInitFailure(UpstreamFailureReason::ConnectFailed); return Network::FilterStatus::StopIteration; } @@ -417,7 +417,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { if (!maybeTunnel(*thread_local_cluster)) { // Either cluster is unknown or there are no healthy hosts. tcpConnPool() increments - // cluster->stats().upstream_cx_none_healthy in the latter case. + // cluster->upstreamStats()->upstream_cx_none_healthy in the latter case. getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::NoHealthyUpstream); onInitFailure(UpstreamFailureReason::NoHealthyUpstream); } diff --git a/source/common/upstream/cluster_manager_impl.cc b/source/common/upstream/cluster_manager_impl.cc index 14c67c9733f4c..8da252fcdc90a 100644 --- a/source/common/upstream/cluster_manager_impl.cc +++ b/source/common/upstream/cluster_manager_impl.cc @@ -1153,7 +1153,7 @@ Host::CreateConnectionData ClusterManagerImpl::ThreadLocalClusterManagerImpl::Cl } return conn_info; } else { - cluster_info_->stats().upstream_cx_none_healthy_.inc(); + cluster_info_->upstreamStats()->upstream_cx_none_healthy_.inc(); return {nullptr, nullptr}; } } @@ -1624,7 +1624,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::httpConnPoolImp if (!host) { if (!peek) { ENVOY_LOG(debug, "no healthy host for HTTP connection pool"); - cluster_info_->stats().upstream_cx_none_healthy_.inc(); + cluster_info_->upstreamStats()->upstream_cx_none_healthy_.inc(); } return nullptr; } @@ -1731,7 +1731,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::tcpConnPoolImpl if (!host) { if (!peek) { ENVOY_LOG(debug, "no healthy host for TCP connection pool"); - cluster_info_->stats().upstream_cx_none_healthy_.inc(); + cluster_info_->upstreamStats()->upstream_cx_none_healthy_.inc(); } return nullptr; } diff --git a/source/common/upstream/cluster_manager_impl.h b/source/common/upstream/cluster_manager_impl.h index c2ef8daf92e93..1f8cbe576d253 100644 --- a/source/common/upstream/cluster_manager_impl.h +++ b/source/common/upstream/cluster_manager_impl.h @@ -325,7 +325,7 @@ class ClusterManagerImpl : public ClusterManager, void initializeSecondaryClusters(const envoy::config::bootstrap::v3::Bootstrap& bootstrap) override; - const ClusterStatNames& clusterStatNames() const override { return cluster_stat_names_; } + const ClusterUpstreamStatNames& clusterStatNames() const override { return cluster_stat_names_; } const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { return cluster_config_update_stat_names_; } @@ -771,7 +771,7 @@ class ClusterManagerImpl : public ClusterManager, Event::Dispatcher& dispatcher_; Http::Context& http_context_; Router::Context& router_context_; - ClusterStatNames cluster_stat_names_; + ClusterUpstreamStatNames cluster_stat_names_; ClusterConfigUpdateStatNames cluster_config_update_stat_names_; ClusterLbStatNames cluster_lb_stat_names_; ClusterEndpointStatNames cluster_endpoint_stat_names_; diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index 1eebd6ec82f4f..83012f811660d 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -35,7 +35,7 @@ ConnPoolMap::getPool(const KEY_TYPE& key, const PoolFactory if (!connPoolResource.canCreate()) { // We're full. Try to free up a pool. If we can't, bail out. if (!freeOnePool()) { - host_->cluster().stats().upstream_cx_pool_overflow_.inc(); + host_->cluster().upstreamStats()->upstream_cx_pool_overflow_.inc(); return absl::nullopt; } diff --git a/source/common/upstream/health_checker_base_impl.cc b/source/common/upstream/health_checker_base_impl.cc index da5963e1945d1..ea8eaf5796364 100644 --- a/source/common/upstream/health_checker_base_impl.cc +++ b/source/common/upstream/health_checker_base_impl.cc @@ -105,7 +105,7 @@ std::chrono::milliseconds HealthCheckerImplBase::interval(HealthState state, // If a connection has been established, we choose an interval based on the host's health. Please // refer to the HealthCheck API documentation for more details. uint64_t base_time_ms; - if (cluster_.info()->stats().upstream_cx_total_.used()) { + if (cluster_.info()->upstreamStats()->upstream_cx_total_.used()) { // When healthy/unhealthy threshold is configured the health transition of a host will be // delayed. In this situation Envoy should use the edge interval settings between health checks. // diff --git a/source/common/upstream/thread_aware_lb_impl.cc b/source/common/upstream/thread_aware_lb_impl.cc index e115d401231ab..99d5191feacf2 100644 --- a/source/common/upstream/thread_aware_lb_impl.cc +++ b/source/common/upstream/thread_aware_lb_impl.cc @@ -197,7 +197,7 @@ double ThreadAwareLoadBalancerBase::BoundedLoadHashingLoadBalancer::hostOverload // TODO(scheler): This will not work if rq_active cluster stat is disabled, need to detect // and alert the user if that's the case. - const uint32_t overall_active = host.cluster().stats().upstream_rq_active_.value(); + const uint32_t overall_active = host.cluster().upstreamStats()->upstream_rq_active_.value(); const uint32_t host_active = host.stats().rq_active_.value(); const uint32_t total_slots = ((overall_active + 1) * hash_balance_factor_ + 99) / 100; diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index dc0cf19b8a279..d9efc1f2001b3 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -833,9 +833,9 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add } } -ClusterStats ClusterInfoImpl::generateStats(Stats::Scope& scope, - const ClusterStatNames& stat_names) { - return ClusterStats(stat_names, scope); +LazyInitStats +ClusterInfoImpl::generateStats(Stats::Scope& scope, const ClusterUpstreamStatNames& stat_names) { + return {scope, stat_names}; } ClusterRequestResponseSizeStats ClusterInfoImpl::generateRequestResponseSizeStats( @@ -978,7 +978,8 @@ ClusterInfoImpl::ClusterInfoImpl( per_connection_buffer_limit_bytes_( PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, per_connection_buffer_limit_bytes, 1024 * 1024)), socket_matcher_(std::move(socket_matcher)), stats_scope_(std::move(stats_scope)), - stats_(generateStats(*stats_scope_, factory_context.clusterManager().clusterStatNames())), + upstream_stats_( + generateStats(*stats_scope_, factory_context.clusterManager().clusterStatNames())), config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), *stats_scope_), lb_stats_(factory_context.clusterManager().clusterLbStatNames(), *stats_scope_), @@ -2059,21 +2060,21 @@ getDnsLookupFamilyFromCluster(const envoy::config::cluster::v3::Cluster& cluster void reportUpstreamCxDestroy(const Upstream::HostDescriptionConstSharedPtr& host, Network::ConnectionEvent event) { - host->cluster().stats().upstream_cx_destroy_.inc(); + host->cluster().upstreamStats()->upstream_cx_destroy_.inc(); if (event == Network::ConnectionEvent::RemoteClose) { - host->cluster().stats().upstream_cx_destroy_remote_.inc(); + host->cluster().upstreamStats()->upstream_cx_destroy_remote_.inc(); } else { - host->cluster().stats().upstream_cx_destroy_local_.inc(); + host->cluster().upstreamStats()->upstream_cx_destroy_local_.inc(); } } void reportUpstreamCxDestroyActiveRequest(const Upstream::HostDescriptionConstSharedPtr& host, Network::ConnectionEvent event) { - host->cluster().stats().upstream_cx_destroy_with_active_rq_.inc(); + host->cluster().upstreamStats()->upstream_cx_destroy_with_active_rq_.inc(); if (event == Network::ConnectionEvent::RemoteClose) { - host->cluster().stats().upstream_cx_destroy_remote_with_active_rq_.inc(); + host->cluster().upstreamStats()->upstream_cx_destroy_remote_with_active_rq_.inc(); } else { - host->cluster().stats().upstream_cx_destroy_local_with_active_rq_.inc(); + host->cluster().upstreamStats()->upstream_cx_destroy_local_with_active_rq_.inc(); } } diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 74b9ee3376508..d7c9971761070 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -703,8 +703,8 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcherPtr&& socket_matcher, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static ClusterStats generateStats(Stats::Scope& scope, - const ClusterStatNames& cluster_stat_names); + static LazyInitStats generateStats(Stats::Scope& scope, + const ClusterUpstreamStatNames& cluster_stat_names); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); static ClusterCircuitBreakersStats @@ -791,7 +791,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - ClusterStats& stats() const override { return stats_; } + LazyInitStats& upstreamStats() const override { return upstream_stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } @@ -908,7 +908,7 @@ class ClusterInfoImpl : public ClusterInfo, const uint32_t per_connection_buffer_limit_bytes_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; - mutable ClusterStats stats_; + mutable LazyInitStats upstream_stats_; mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/source/extensions/clusters/original_dst/original_dst_cluster.cc b/source/extensions/clusters/original_dst/original_dst_cluster.cc index 32dc5997747c7..7b3467f984128 100644 --- a/source/extensions/clusters/original_dst/original_dst_cluster.cc +++ b/source/extensions/clusters/original_dst/original_dst_cluster.cc @@ -124,7 +124,7 @@ OriginalDstCluster::LoadBalancer::requestOverrideHost(LoadBalancerContext* conte if (request_host == nullptr) { ENVOY_LOG(debug, "original_dst_load_balancer: invalid override header value. {}", request_override_host); - parent_->info()->stats().original_dst_host_invalid_.inc(); + parent_->info()->upstreamStats()->original_dst_host_invalid_.inc(); return nullptr; } ENVOY_LOG(debug, "Using request override host {}.", request_override_host); diff --git a/source/extensions/filters/network/common/redis/client_impl.cc b/source/extensions/filters/network/common/redis/client_impl.cc index bb3add9ab8a9f..630ebd298c2e4 100644 --- a/source/extensions/filters/network/common/redis/client_impl.cc +++ b/source/extensions/filters/network/common/redis/client_impl.cc @@ -77,9 +77,9 @@ ClientImpl::ClientImpl(Upstream::HostConstSharedPtr host, Event::Dispatcher& dis flush_timer_(dispatcher.createTimer([this]() { flushBufferAndResetTimer(); })), time_source_(dispatcher.timeSource()), redis_command_stats_(redis_command_stats), scope_(scope), is_transaction_client_(is_transaction_client) { - host->cluster().stats().upstream_cx_total_.inc(); + host->cluster().upstreamStats()->upstream_cx_total_.inc(); host->stats().cx_total_.inc(); - host->cluster().stats().upstream_cx_active_.inc(); + host->cluster().upstreamStats()->upstream_cx_active_.inc(); host->stats().cx_active_.inc(); connect_or_op_timer_->enableTimer(host->cluster().connectTimeout()); } @@ -87,7 +87,7 @@ ClientImpl::ClientImpl(Upstream::HostConstSharedPtr host, Event::Dispatcher& dis ClientImpl::~ClientImpl() { ASSERT(pending_requests_.empty()); ASSERT(connection_->state() == Network::Connection::State::Closed); - host_->cluster().stats().upstream_cx_active_.dec(); + host_->cluster().upstreamStats()->upstream_cx_active_.dec(); host_->stats().cx_active_.dec(); } @@ -141,10 +141,10 @@ PoolRequest* ClientImpl::makeRequest(const RespValue& request, ClientCallbacks& void ClientImpl::onConnectOrOpTimeout() { putOutlierEvent(Upstream::Outlier::Result::LocalOriginTimeout); if (connected_) { - host_->cluster().stats().upstream_rq_timeout_.inc(); + host_->cluster().upstreamStats()->upstream_rq_timeout_.inc(); host_->stats().rq_timeout_.inc(); } else { - host_->cluster().stats().upstream_cx_connect_timeout_.inc(); + host_->cluster().upstreamStats()->upstream_cx_connect_timeout_.inc(); host_->stats().cx_connect_fail_.inc(); } @@ -156,7 +156,7 @@ void ClientImpl::onData(Buffer::Instance& data) { decoder_->decode(data); } catch (ProtocolError&) { putOutlierEvent(Upstream::Outlier::Result::ExtOriginRequestFailed); - host_->cluster().stats().upstream_cx_protocol_error_.inc(); + host_->cluster().upstreamStats()->upstream_cx_protocol_error_.inc(); host_->stats().rq_error_.inc(); connection_->close(Network::ConnectionCloseType::NoFlush); } @@ -185,7 +185,7 @@ void ClientImpl::onEvent(Network::ConnectionEvent event) { if (!request.canceled_) { request.callbacks_.onFailure(); } else { - host_->cluster().stats().upstream_rq_cancelled_.inc(); + host_->cluster().upstreamStats()->upstream_rq_cancelled_.inc(); } pending_requests_.pop_front(); } @@ -198,7 +198,7 @@ void ClientImpl::onEvent(Network::ConnectionEvent event) { } if (event == Network::ConnectionEvent::RemoteClose && !connected_) { - host_->cluster().stats().upstream_cx_connect_fail_.inc(); + host_->cluster().upstreamStats()->upstream_cx_connect_fail_.inc(); host_->stats().cx_connect_fail_.inc(); } } @@ -221,7 +221,7 @@ void ClientImpl::onRespValue(RespValuePtr&& value) { // result in closing the connection. pending_requests_.pop_front(); if (canceled) { - host_->cluster().stats().upstream_rq_cancelled_.inc(); + host_->cluster().upstreamStats()->upstream_rq_cancelled_.inc(); } else if (config_.enableRedirection() && !is_transaction_client_ && (value->type() == Common::Redis::RespType::Error)) { std::vector err = StringUtil::splitToken(value->asString(), " ", false); @@ -263,14 +263,14 @@ ClientImpl::PendingRequest::PendingRequest(ClientImpl& parent, ClientCallbacks& command_request_timer_ = parent_.redis_command_stats_->createCommandTimer( parent_.scope_, command_, parent_.time_source_); } - parent.host_->cluster().stats().upstream_rq_total_.inc(); + parent.host_->cluster().upstreamStats()->upstream_rq_total_.inc(); parent.host_->stats().rq_total_.inc(); - parent.host_->cluster().stats().upstream_rq_active_.inc(); + parent.host_->cluster().upstreamStats()->upstream_rq_active_.inc(); parent.host_->stats().rq_active_.inc(); } ClientImpl::PendingRequest::~PendingRequest() { - parent_.host_->cluster().stats().upstream_rq_active_.dec(); + parent_.host_->cluster().upstreamStats()->upstream_rq_active_.dec(); parent_.host_->stats().rq_active_.dec(); } diff --git a/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc b/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc index 4619fc2d512f5..05b2cb0ce7d4a 100644 --- a/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc +++ b/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc @@ -454,7 +454,7 @@ void InstanceImpl::PendingRequest::onRedirection(Common::Redis::RespValuePtr&& v host_address); auto host = host_; onResponse(std::move(resp_value_)); - host->cluster().stats().upstream_internal_redirect_failed_total_.inc(); + host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); } else { doRedirection(std::move(resp_value_), formatAddress(*result.host_info_.value()->address()->ip()), ask_redirection_); @@ -470,7 +470,7 @@ void InstanceImpl::PendingRequest::onRedirection(Common::Redis::RespValuePtr&& v host_address); auto host = host_; onResponse(std::move(resp_value_)); - host->cluster().stats().upstream_internal_redirect_failed_total_.inc(); + host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); return; } PANIC_DUE_TO_CORRUPT_ENUM; @@ -487,7 +487,7 @@ void InstanceImpl::PendingRequest::onLoadDnsCacheComplete( ENVOY_LOG(debug, "DNS lookup failed"); auto host = host_; onResponse(std::move(resp_value_)); - host->cluster().stats().upstream_internal_redirect_failed_total_.inc(); + host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); } else { doRedirection(std::move(resp_value_), formatAddress(*host_info->address()->ip()), ask_redirection_); @@ -509,16 +509,16 @@ void InstanceImpl::PendingRequest::doRedirection(Common::Redis::RespValuePtr&& v !parent_.makeRequestToHost(host_address, Common::Redis::Utility::AskingRequest::instance(), null_client_callbacks)) { onResponse(std::move(value)); - host->cluster().stats().upstream_internal_redirect_failed_total_.inc(); + host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); } else { request_handler_ = parent_.makeRequestToHost(host_address, getRequest(incoming_request_), *this); if (!request_handler_) { onResponse(std::move(value)); - host->cluster().stats().upstream_internal_redirect_failed_total_.inc(); + host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); } else { parent_.refresh_manager_->onRedirection(parent_.cluster_name_); - host->cluster().stats().upstream_internal_redirect_succeeded_total_.inc(); + host->cluster().upstreamStats()->upstream_internal_redirect_succeeded_total_.inc(); } } } diff --git a/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc b/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc index 118d206bc786a..82d6c9e12fcad 100644 --- a/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc +++ b/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc @@ -128,7 +128,7 @@ UdpProxyFilter::ClusterInfo::createSession(Network::UdpRecvData::LocalPeerAddres .connections() .canCreate()) { ENVOY_LOG(debug, "cannot create new connection."); - cluster_.info()->stats().upstream_cx_overflow_.inc(); + cluster_.info()->upstreamStats()->upstream_cx_overflow_.inc(); return nullptr; } @@ -139,7 +139,7 @@ UdpProxyFilter::ClusterInfo::createSession(Network::UdpRecvData::LocalPeerAddres auto host = chooseHost(addresses.peer_); if (host == nullptr) { ENVOY_LOG(debug, "cannot find any valid host."); - cluster_.info()->stats().upstream_cx_none_healthy_.inc(); + cluster_.info()->upstreamStats()->upstream_cx_none_healthy_.inc(); return nullptr; } return createSessionWithHost(std::move(addresses), host); @@ -212,7 +212,7 @@ UdpProxyFilter::PerPacketLoadBalancingClusterInfo::onData(Network::UdpRecvData& auto host = chooseHost(data.addresses_.peer_); if (host == nullptr) { ENVOY_LOG(debug, "cannot find any valid host."); - cluster_.info()->stats().upstream_cx_none_healthy_.inc(); + cluster_.info()->upstreamStats()->upstream_cx_none_healthy_.inc(); return Network::FilterStatus::StopIteration; } @@ -407,7 +407,7 @@ void UdpProxyFilter::ActiveSession::write(const Buffer::Instance& buffer) { cluster_.cluster_stats_.sess_tx_errors_.inc(); } else { cluster_.cluster_stats_.sess_tx_datagrams_.inc(); - cluster_.cluster_.info()->stats().upstream_cx_tx_bytes_total_.add(buffer_length); + cluster_.cluster_.info()->upstreamStats()->upstream_cx_tx_bytes_total_.add(buffer_length); } } @@ -420,7 +420,7 @@ void UdpProxyFilter::ActiveSession::processPacket(Network::Address::InstanceCons const uint64_t buffer_length = buffer->length(); cluster_.cluster_stats_.sess_rx_datagrams_.inc(); - cluster_.cluster_.info()->stats().upstream_cx_rx_bytes_total_.add(buffer_length); + cluster_.cluster_.info()->upstreamStats()->upstream_cx_rx_bytes_total_.add(buffer_length); Network::UdpSendData data{addresses_.local_->ip(), *addresses_.peer_, *buffer}; const Api::IoCallUint64Result rc = cluster_.filter_.read_callbacks_->udpListener().send(data); diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index e18c54cd2f856..f2dbe1555ac67 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -330,7 +330,7 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { // since if we stay over, the other threads will eventually kill their connections too. // TODO(mattklein123): The use of the stat is somewhat of a hack, and should be replaced with // real flow control callbacks once they are available. - if (parent_.cluster_info_->stats().upstream_cx_tx_bytes_buffered_.value() > + if (parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_buffered_.value() > MAX_BUFFERED_STATS_BYTES) { if (connection_) { connection_->close(Network::ConnectionCloseType::NoFlush); @@ -354,11 +354,11 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { connection_ = std::move(info.connection_); connection_->addConnectionCallbacks(*this); - connection_->setConnectionStats({parent_.cluster_info_->stats().upstream_cx_rx_bytes_total_, - parent_.cluster_info_->stats().upstream_cx_rx_bytes_buffered_, - parent_.cluster_info_->stats().upstream_cx_tx_bytes_total_, - parent_.cluster_info_->stats().upstream_cx_tx_bytes_buffered_, - &parent_.cluster_info_->stats().bind_errors_, nullptr}); + connection_->setConnectionStats({parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_total_, + parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_buffered_, + parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_total_, + parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_buffered_, + &parent_.cluster_info_->upstreamStats()->bind_errors_, nullptr}); connection_->connect(); } diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index 2ae45959cdf37..5c4392205d1a8 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -90,7 +90,7 @@ uint64_t HystrixSink::getRollingValue(RollingWindow rolling_window) { void HystrixSink::updateRollingWindowMap(const Upstream::ClusterInfo& cluster_info, ClusterStatsCache& cluster_stats_cache) { - Upstream::ClusterStats& cluster_stats = cluster_info.stats(); + Upstream::ClusterUpstreamStats& cluster_stats = *cluster_info.upstreamStats(); Stats::Scope& cluster_stats_scope = cluster_info.statsScope(); // Combining timeouts+retries - retries are counted as separate requests diff --git a/test/common/conn_pool/conn_pool_base_test.cc b/test/common/conn_pool/conn_pool_base_test.cc index 35545830270c5..5911aa642201f 100644 --- a/test/common/conn_pool/conn_pool_base_test.cc +++ b/test/common/conn_pool/conn_pool_base_test.cc @@ -374,13 +374,13 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationBusy) { // Verify that advancing to just before the connection duration timeout doesn't drain the // connection. advanceTimeAndRun(max_connection_duration_ - 1); - EXPECT_EQ(0, pool_.host()->cluster().stats().upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Busy, clients_.back()->state()); // Verify that advancing past the connection duration timeout drains the connection, // because there's a busy client. advanceTimeAndRun(2); - EXPECT_EQ(1, pool_.host()->cluster().stats().upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Draining, clients_.back()->state()); closeStream(); } @@ -395,13 +395,13 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationReady) { // Verify that advancing to just before the connection duration timeout doesn't close the // connection. advanceTimeAndRun(max_connection_duration_ - 1); - EXPECT_EQ(0, pool_.host()->cluster().stats().upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Ready, clients_.back()->state()); // Verify that advancing past the connection duration timeout closes the connection, // because there's nothing to drain. advanceTimeAndRun(2); - EXPECT_EQ(1, pool_.host()->cluster().stats().upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); } TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { @@ -411,7 +411,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { // Verify that advancing past the connection duration timeout does nothing to an active client // that is already draining. advanceTimeAndRun(max_connection_duration_ + 1); - EXPECT_EQ(0, pool_.host()->cluster().stats().upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Draining, clients_.back()->state()); closeStream(); } @@ -423,7 +423,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyClosed) { // Verify that advancing past the connection duration timeout does nothing to the active // client that is already closed. advanceTimeAndRun(max_connection_duration_ + 1); - EXPECT_EQ(0, pool_.host()->cluster().stats().upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); } TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationCallbackWhileClosedBug) { @@ -565,7 +565,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { pool_.onUpstreamReadyForEarlyData(client_ref); CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); - EXPECT_EQ(1, pool_.host()->cluster().stats().upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); EXPECT_NE(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/false)); CHECK_STATE(1 /*active*/, 1 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); @@ -574,7 +574,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { clients_.back()->onEvent(Network::ConnectionEvent::Connected); CHECK_STATE(2 /*active*/, 0 /*pending*/, 0 /*connecting capacity*/); - EXPECT_EQ(1, pool_.host()->cluster().stats().upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); // Clean up. closeStreamAndDrainClient(); @@ -596,12 +596,12 @@ TEST_F(ConnPoolImplDispatcherBaseTest, EarlyDataStreamsReachConcurrentStreamLimi pool_.onUpstreamReadyForEarlyData(client_ref); CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); - EXPECT_EQ(1, pool_.host()->cluster().stats().upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); EXPECT_CALL(pool_, onPoolReady); EXPECT_EQ(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/true)); CHECK_STATE(2 /*active*/, 0 /*pending*/, concurrent_streams_ - 2 /*connecting capacity*/); - EXPECT_EQ(2, pool_.host()->cluster().stats().upstream_rq_0rtt_.value()); + EXPECT_EQ(2, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); EXPECT_EQ(ActiveClient::State::Busy, clients_.back()->state()); // After 1 stream gets closed, the client should transit to ReadyForEarlyData. diff --git a/test/common/http/codec_client_test.cc b/test/common/http/codec_client_test.cc index 910f1995cf5b9..399b69e2577bd 100644 --- a/test/common/http/codec_client_test.cc +++ b/test/common/http/codec_client_test.cc @@ -258,7 +258,7 @@ TEST_F(CodecClientTest, ProtocolError) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, 408Response) { @@ -270,7 +270,7 @@ TEST_F(CodecClientTest, 408Response) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_protocol_error_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, PrematureResponse) { @@ -281,7 +281,7 @@ TEST_F(CodecClientTest, PrematureResponse) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, WatermarkPassthrough) { diff --git a/test/common/http/http1/conn_pool_test.cc b/test/common/http/http1/conn_pool_test.cc index 52ae8c044597c..6db9d1f5d2d97 100644 --- a/test/common/http/http1/conn_pool_test.cc +++ b/test/common/http/http1/conn_pool_test.cc @@ -175,7 +175,7 @@ struct ActiveTestRequest { : parent_(parent), client_index_(client_index) { uint64_t active_rq_observed = parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default).requests().count(); - uint64_t current_rq_total = parent_.cluster_->stats_.upstream_rq_total_.value(); + uint64_t current_rq_total = parent_.cluster_->upstream_stats_->upstream_rq_total_.value(); if (type == Type::CreateConnection) { parent.conn_pool_->expectClientCreate(); } @@ -199,7 +199,8 @@ struct ActiveTestRequest { Network::ConnectionEvent::Connected); } if (type != Type::Pending) { - EXPECT_EQ(current_rq_total + 1, parent_.cluster_->stats_.upstream_rq_total_.value()); + EXPECT_EQ(current_rq_total + 1, + parent_.cluster_->upstream_stats_->upstream_rq_total_.value()); EXPECT_EQ(active_rq_observed + 1, parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default) .requests() @@ -440,7 +441,7 @@ TEST_F(Http1ConnPoolImplTest, MaxPendingRequests) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_overflow_.value()); } /** @@ -464,8 +465,8 @@ TEST_F(Http1ConnPoolImplTest, ConnectFailure) { EXPECT_CALL(*conn_pool_, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -553,9 +554,9 @@ TEST_F(Http1ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*conn_pool_, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->stats_.upstream_rq_total_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_connect_timeout_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_timeout_.value()); } /** @@ -655,7 +656,7 @@ TEST_F(Http1ConnPoolImplTest, MaxConnections) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_overflow_.value()); EXPECT_EQ(1U, cluster_->circuit_breakers_stats_.cx_open_.value()); EXPECT_NE(nullptr, handle); @@ -719,7 +720,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseWithoutHeader) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -803,7 +804,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -841,7 +842,7 @@ TEST_F(Http1ConnPoolImplTest, ProxyConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -878,7 +879,7 @@ TEST_F(Http1ConnPoolImplTest, Http10NoConnectionKeepAlive) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -920,8 +921,8 @@ TEST_F(Http1ConnPoolImplTest, MaxRequestsPerConnection) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_max_requests_.value()); } TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { @@ -943,7 +944,7 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { r1.completeResponse(false); conn_pool_->expectAndRunUpstreamReady(); r3.startRequest(); - EXPECT_EQ(3U, cluster_->stats_.upstream_rq_total_.value()); + EXPECT_EQ(3U, cluster_->upstream_stats_->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); r2.completeResponse(false); @@ -956,8 +957,8 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, DrainCallback) { @@ -971,7 +972,7 @@ TEST_F(Http1ConnPoolImplTest, DrainCallback) { conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainAndDelete); r2.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); EXPECT_CALL(drained, ready()).Times(AtLeast(1)); @@ -1048,8 +1049,8 @@ TEST_F(Http1ConnPoolImplTest, RemoteCloseToCompleteResponse) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, NoActiveConnectionsByDefault) { @@ -1093,13 +1094,13 @@ TEST_F(Http1ConnPoolImplTest, PendingRequestIsConsideredActive) { EXPECT_CALL(*conn_pool_, onClientDestroy()); r1.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(0U, cluster_->stats_.upstream_rq_total_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_rq_total_.value()); conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainExistingConnections); conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_local_.value()); } // Schedulable callback that can track it's destruction. diff --git a/test/common/http/http2/conn_pool_test.cc b/test/common/http/http2/conn_pool_test.cc index 2050ea59b7710..1c6e7b2007599 100644 --- a/test/common/http/http2/conn_pool_test.cc +++ b/test/common/http/http2/conn_pool_test.cc @@ -634,8 +634,8 @@ TEST_F(Http2ConnPoolImplTest, DrainConnections) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } // Test that cluster.http2_protocol_options.max_concurrent_streams limits @@ -688,7 +688,7 @@ TEST_F(Http2ConnPoolImplTest, MaxConcurrentRequestsPerStream) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_total_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_total_.value()); } // Verifies that requests are queued up in the conn pool until the connection becomes ready. @@ -732,8 +732,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreams) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } // Verifies that the correct number of CONNECTING connections are created for @@ -853,8 +853,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsFailure) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } // Verifies resets due to local connection closes are tracked correctly. @@ -909,8 +909,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsRequestOverflow) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } // Verifies that we honor the max pending requests circuit breaker. @@ -947,8 +947,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsMaxPendingCircuitBreaker) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { @@ -973,8 +973,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } /** @@ -1004,8 +1004,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyBufferLimits) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { @@ -1019,7 +1019,7 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { r1.callbacks_.outer_encoder_ ->encodeHeaders(TestRequestHeaderMapImpl{{":path", "/"}, {":method", "GET"}}, true) .ok()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_active_.value()); EXPECT_CALL(r1.decoder_, decodeHeaders_(_, true)); r1.inner_decoder_->decodeHeaders( ResponseHeaderMapPtr{new TestResponseHeaderMapImpl{{":status", "200"}}}, true); @@ -1038,9 +1038,9 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_active_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, LocalReset) { @@ -1059,11 +1059,11 @@ TEST_F(Http2ConnPoolImplTest, LocalReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_tx_reset_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_tx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, RemoteReset) { @@ -1082,11 +1082,11 @@ TEST_F(Http2ConnPoolImplTest, RemoteReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_rx_reset_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_rx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { @@ -1111,8 +1111,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { @@ -1155,8 +1155,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainPrimary) { @@ -1278,13 +1278,13 @@ TEST_F(Http2ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_total_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_connect_timeout_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_pending_failure_eject_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_local_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { @@ -1310,8 +1310,8 @@ TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, GoAway) { @@ -1348,7 +1348,7 @@ TEST_F(Http2ConnPoolImplTest, GoAway) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_close_notify_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_close_notify_.value()); } TEST_F(Http2ConnPoolImplTest, NoActiveConnectionsByDefault) { diff --git a/test/common/router/retry_state_impl_test.cc b/test/common/router/retry_state_impl_test.cc index 65d47c72451b2..742efa32e7672 100644 --- a/test/common/router/retry_state_impl_test.cc +++ b/test/common/router/retry_state_impl_test.cc @@ -157,9 +157,9 @@ class RouterRetryStateImplTest : public testing::Test { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); } @@ -217,10 +217,10 @@ TEST_F(RouterRetryStateImplTest, PolicyRefusedStream) { state_->shouldRetryReset(remote_refused_stream_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -253,10 +253,10 @@ TEST_F(RouterRetryStateImplTest, PolicyAltProtocolPostHandshakeFailure) { state_->shouldRetryReset(remote_refused_stream_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -300,10 +300,10 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -390,10 +390,10 @@ TEST_F(RouterRetryStateImplTest, PolicyGatewayErrorRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -437,10 +437,10 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemote200RemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -532,7 +532,7 @@ TEST_F(RouterRetryStateImplTest, NoRetryUponTooEarlyStatusCodeWithDownstreamEarl EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); - EXPECT_EQ(0UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -828,10 +828,10 @@ TEST_F(RouterRetryStateImplTest, PolicyResetRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -915,10 +915,10 @@ TEST_F(RouterRetryStateImplTest, RouteConfigNoRetriesAllowed) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -948,7 +948,7 @@ TEST_F(RouterRetryStateImplTest, NoAvailableRetries) { EXPECT_EQ( RetryStatus::NoOverflow, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_overflow_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_overflow_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_overflow_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_overflow_.value()); } @@ -988,9 +988,9 @@ TEST_F(RouterRetryStateImplTest, MaxRetriesHeader) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(3UL, cluster_.stats().upstream_rq_retry_.value()); - EXPECT_EQ(0UL, cluster_.stats().upstream_rq_retry_success_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(3UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_success_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(3UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_success_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); @@ -1062,8 +1062,8 @@ TEST_F(RouterRetryStateImplTest, Backoff) { EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); - EXPECT_EQ(5UL, cluster_.stats().upstream_rq_retry_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_success_.value()); + EXPECT_EQ(5UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_success_.value()); EXPECT_EQ(5UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_success_.value()); EXPECT_EQ(5UL, route_stats_context_.stats().upstream_rq_retry_.value()); @@ -1306,8 +1306,8 @@ TEST_F(RouterRetryStateImplTest, RateLimitedRetryBackoffStrategy) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryHeaders(response_headers_reset_2, request_headers, header_callback_)); - EXPECT_EQ(2UL, cluster_.stats().upstream_rq_retry_backoff_ratelimited_.value()); - EXPECT_EQ(2UL, cluster_.stats().upstream_rq_retry_backoff_exponential_.value()); + EXPECT_EQ(2UL, cluster_.upstreamStats()->upstream_rq_retry_backoff_ratelimited_.value()); + EXPECT_EQ(2UL, cluster_.upstreamStats()->upstream_rq_retry_backoff_exponential_.value()); } TEST_F(RouterRetryStateImplTest, HostSelectionAttempts) { @@ -1343,10 +1343,10 @@ TEST_F(RouterRetryStateImplTest, ZeroMaxRetriesHeader) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -1367,10 +1367,10 @@ TEST_F(RouterRetryStateImplTest, NoPreferredOverLimitExceeded) { EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(good_response_headers, request_headers, header_callback_)); - EXPECT_EQ(0UL, cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.stats().upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index f6870ecabc369..f4c36e0b9a026 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -569,7 +569,7 @@ TEST_F(TcpConnPoolImplTest, MaxPendingRequests) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Overflow, callbacks2.reason_); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_overflow_.value()); } /** @@ -597,8 +597,8 @@ TEST_F(TcpConnPoolImplTest, RemoteConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::RemoteConnectionFailure, callbacks.reason_); EXPECT_EQ("foo", callbacks.failure_reason_string_); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -623,8 +623,8 @@ TEST_F(TcpConnPoolImplTest, LocalConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::LocalConnectionFailure, callbacks.reason_); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -655,8 +655,8 @@ TEST_F(TcpConnPoolImplTest, ConnectTimeout) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks1.reason_); EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks2.reason_); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->stats_.upstream_cx_connect_timeout_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_timeout_.value()); } /** @@ -781,7 +781,7 @@ TEST_F(TcpConnPoolImplTest, MaxConnections) { // Request 2 should not kick off a new connection. ConnPoolCallbacks callbacks2; handle = conn_pool_->newConnection(callbacks2); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -828,8 +828,8 @@ TEST_F(TcpConnPoolImplTest, MaxRequestsPerConnection) { callbacks.conn_data_.reset(); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->stats_.upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->stats_.upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_max_requests_.value()); } /* diff --git a/test/common/upstream/conn_pool_map_impl_test.cc b/test/common/upstream/conn_pool_map_impl_test.cc index cca21cb716185..be292b2e051af 100644 --- a/test/common/upstream/conn_pool_map_impl_test.cc +++ b/test/common/upstream/conn_pool_map_impl_test.cc @@ -235,7 +235,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureCounter) { ON_CALL(*mock_pools_[0], hasActiveConnections()).WillByDefault(Return(true)); test_map->getPool(2, getNeverCalledFactory()); - EXPECT_EQ(host_->cluster_.stats_.upstream_cx_pool_overflow_.value(), 1); + EXPECT_EQ(host_->cluster_.upstream_stats_->upstream_cx_pool_overflow_.value(), 1); } TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureMultiple) { @@ -247,7 +247,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureMultiple) { test_map->getPool(2, getNeverCalledFactory()); test_map->getPool(2, getNeverCalledFactory()); - EXPECT_EQ(host_->cluster_.stats_.upstream_cx_pool_overflow_.value(), 3); + EXPECT_EQ(host_->cluster_.upstream_stats_->upstream_cx_pool_overflow_.value(), 3); } TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitGreaterThan1Fails) { @@ -284,7 +284,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolLimitHitFollowedBySuccessDoesNotClearFailure) ON_CALL(*mock_pools_[0], hasActiveConnections()).WillByDefault(Return(false)); test_map->getPool(2, getBasicFactory()); - EXPECT_EQ(host_->cluster_.stats_.upstream_cx_pool_overflow_.value(), 1); + EXPECT_EQ(host_->cluster_.upstream_stats_->upstream_cx_pool_overflow_.value(), 1); } // Test that only the pool which are idle are actually cleared diff --git a/test/common/upstream/health_check_fuzz.cc b/test/common/upstream/health_check_fuzz.cc index 06aecdb303566..9c04ab88f20af 100644 --- a/test/common/upstream/health_check_fuzz.cc +++ b/test/common/upstream/health_check_fuzz.cc @@ -106,7 +106,7 @@ void HttpHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); } expectSessionCreate(); expectStreamCreate(0); @@ -217,7 +217,7 @@ void TcpHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); } expectSessionCreate(); expectClientCreate(); @@ -326,7 +326,7 @@ void GrpcHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); } expectSessionCreate(); ON_CALL(dispatcher_, createClientConnection_(_, _, _, _)) diff --git a/test/common/upstream/health_checker_impl_test.cc b/test/common/upstream/health_checker_impl_test.cc index cccc700549ef8..0c82aad698a0e 100644 --- a/test/common/upstream/health_checker_impl_test.cc +++ b/test/common/upstream/health_checker_impl_test.cc @@ -858,7 +858,7 @@ TEST_F(HttpHealthCheckerImplTest, Success) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -881,7 +881,7 @@ TEST_F(HttpHealthCheckerImplTest, Degraded) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1010,7 +1010,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessIntervalJitterPercent) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1041,7 +1041,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithSpurious1xx) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1069,7 +1069,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithSpuriousMetadata) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1099,8 +1099,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHosts) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime()), makeTestHost(cluster_->info_, "tcp://127.0.0.1:81", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1136,8 +1136,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostSets) { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; cluster_->prioritySet().getMockHostSet(1)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:81", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1170,7 +1170,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1193,7 +1193,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseStringContainsCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1217,7 +1217,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseHexStringContainsCheck) cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1240,7 +1240,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckBuffer) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1265,7 +1265,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckMaxBuffer) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1305,7 +1305,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckHttp2) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1330,7 +1330,7 @@ TEST_F(HttpHealthCheckerImplTest, FailExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1356,7 +1356,7 @@ TEST_F(HttpHealthCheckerImplTest, FailStatusCheckWithExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1381,7 +1381,7 @@ TEST_F(HttpHealthCheckerImplTest, ImmediateFailExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1428,7 +1428,7 @@ TEST_F(HttpHealthCheckerImplTest, ZeroRetryInterval) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1487,7 +1487,7 @@ TEST_F(HttpHealthCheckerImplTest, TlsOptions) { allocHealthChecker(yaml); cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1505,7 +1505,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1541,7 +1541,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServicePrefixPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1577,7 +1577,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceExactPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1613,7 +1613,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceRegexPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1657,7 +1657,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithCustomHostValueOnTheHos EXPECT_CALL(*this, onHostStatus(_, HealthTransition::Unchanged)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = {test_host}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1703,7 +1703,7 @@ TEST_F(HttpHealthCheckerImplTest, EXPECT_CALL(*this, onHostStatus(_, HealthTransition::Unchanged)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = {test_host}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1739,7 +1739,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithCustomHostValue) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1804,7 +1804,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAdditionalHeaders) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1869,7 +1869,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithoutUserAgent) { std::string current_start_time; cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1907,7 +1907,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceDoesNotMatchFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1938,7 +1938,7 @@ TEST_F(HttpHealthCheckerImplTest, ServicePatternDoesNotMatchFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1969,7 +1969,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNotPresentInResponseFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1997,7 +1997,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceCheckRuntimeOff) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2024,7 +2024,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceCheckRuntimeOffWithStringPattern) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2538,7 +2538,7 @@ TEST_F(HttpHealthCheckerImplTest, HealthCheckIntervals) { EXPECT_CALL(*test_sessions_[0]->interval_timer_, enableTimer(std::chrono::milliseconds(5000), _)); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, disableTimer()); respond(0, "200", false); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); // Needed after a response is sent. @@ -2877,7 +2877,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAltPort) { // Prepares a host with its designated health check port. const HostWithHealthCheckMap hosts{{"127.0.0.1:80", makeHealthCheckConfig(8000)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2910,8 +2910,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostsAndAltPort) { const HostWithHealthCheckMap hosts = {{"127.0.0.1:80", makeHealthCheckConfig(8000)}, {"127.0.0.1:81", makeHealthCheckConfig(8001)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->stats().upstream_cx_total_.inc(); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2951,7 +2951,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAltAddress) { const HostWithHealthCheckMap hosts{ {"127.0.0.1:80", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2985,8 +2985,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostsAndAltAddress) { {"127.0.0.1:80", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}, {"127.0.0.2:81", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->stats().upstream_cx_total_.inc(); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3082,7 +3082,7 @@ TEST_F(HttpHealthCheckerImplTest, TransportSocketMatchCriteria) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3123,7 +3123,7 @@ TEST_F(HttpHealthCheckerImplTest, NoTransportSocketMatchCriteria) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3140,7 +3140,7 @@ TEST_F(HttpHealthCheckerImplTest, GoAwayErrorProbeInProgress) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3188,7 +3188,7 @@ TEST_F(HttpHealthCheckerImplTest, GoAwayProbeInProgress) { .WillRepeatedly(Return(false)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); @@ -3487,7 +3487,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNameMatch) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3523,7 +3523,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNameMismatch) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3549,7 +3549,7 @@ TEST_F(HttpHealthCheckerImplTest, DefaultMethodGet) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3578,7 +3578,7 @@ TEST_F(HttpHealthCheckerImplTest, MethodHead) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -4818,7 +4818,7 @@ class GrpcHealthCheckerImplTestBase : public Event::TestUsingSimulatedTime, // performed during test case (but possibly on many hosts). void expectHealthchecks(HealthTransition host_changed_state, size_t num_healthchecks) { for (size_t i = 0; i < num_healthchecks; i++) { - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectHealthcheckStart(i); } @@ -4921,7 +4921,7 @@ class GrpcHealthCheckerImplTestBase : public Event::TestUsingSimulatedTime, void runHealthCheck(std::string expected_host) { - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectHealthcheckStart(0); @@ -5071,7 +5071,7 @@ TEST_F(GrpcHealthCheckerImplTest, SuccessWithAdditionalHeaders) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectHealthcheckStart(0); @@ -5543,7 +5543,7 @@ TEST_F(GrpcHealthCheckerImplTest, HealthCheckIntervals) { EXPECT_CALL(*test_sessions_[0]->interval_timer_, enableTimer(std::chrono::milliseconds(5000), _)); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, disableTimer()); respondServiceStatus(0, grpc::health::v1::HealthCheckResponse::SERVING); - cluster_->info_->stats().upstream_cx_total_.inc(); + cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); // Needed after a response is sent. diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index 1cb5903a8e1a4..3d0a6a0f068e3 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -420,7 +420,7 @@ TEST_F(StrictDnsClusterImplTest, Basic) { EXPECT_EQ(1U, cluster.info()->resourceManager(ResourcePriority::Default).maxConnectionsPerHost()); EXPECT_EQ(990U, cluster.info()->resourceManager(ResourcePriority::High).maxConnectionsPerHost()); - cluster.info()->stats().upstream_rq_total_.inc(); + cluster.info()->upstreamStats()->upstream_rq_total_.inc(); EXPECT_EQ(1UL, stats_.counter("cluster.name.upstream_rq_total").value()); EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.maintenance_mode.name", 0)); @@ -770,7 +770,7 @@ TEST_F(StrictDnsClusterImplTest, LoadAssignmentBasic) { EXPECT_EQ(3U, cluster.info()->maxRequestsPerConnection()); EXPECT_EQ(0U, cluster.info()->http2Options().hpack_table_size().value()); - cluster.info()->stats().upstream_rq_total_.inc(); + cluster.info()->upstreamStats()->upstream_rq_total_.inc(); EXPECT_EQ(1UL, stats_.counter("cluster.name.upstream_rq_total").value()); EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.maintenance_mode.name", 0)); @@ -1859,7 +1859,7 @@ TEST_F(StaticClusterImplTest, AltStatName) { std::move(scope), false); cluster.initialize([] {}); // Increment a stat and verify it is emitted with alt_stat_name - cluster.info()->stats().upstream_rq_total_.inc(); + cluster.info()->upstreamStats()->upstream_rq_total_.inc(); EXPECT_EQ(1UL, stats_.counter("cluster.staticcluster_stats.upstream_rq_total").value()); } diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 0a9845b7a8f4e..4a2de7990075e 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -138,8 +138,8 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::ThreadAwareLoadBalancerPtr thread_aware_lb_; Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; - Upstream::ClusterStatNames stat_names_; - Upstream::ClusterStats stats_; + Upstream::ClusterUpstreamStatNames stat_names_; + LazyInitStats stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/extensions/clusters/original_dst/original_dst_cluster_test.cc b/test/extensions/clusters/original_dst/original_dst_cluster_test.cc index 6e465ab77d656..2af963fdbacf5 100644 --- a/test/extensions/clusters/original_dst/original_dst_cluster_test.cc +++ b/test/extensions/clusters/original_dst/original_dst_cluster_test.cc @@ -72,12 +72,11 @@ class OriginalDstClusterTest : public Event::TestUsingSimulatedTime, public test void setupFromYaml(const std::string& yaml) { setup(parseClusterFromV3Yaml(yaml)); } void setup(const envoy::config::cluster::v3::Cluster& cluster_config) { - NiceMock cm; Envoy::Stats::ScopeSharedPtr scope = stats_store_.createScope(fmt::format( "cluster.{}.", cluster_config.alt_stat_name().empty() ? cluster_config.name() : cluster_config.alt_stat_name())); Envoy::Server::Configuration::TransportSocketFactoryContextImpl factory_context( - server_context_, ssl_context_manager_, *scope, cm, stats_store_, validation_visitor_); + server_context_, ssl_context_manager_, *scope, cm_, stats_store_, validation_visitor_); cluster_ = std::make_shared(server_context_, cluster_config, runtime_, factory_context, std::move(scope), false); priority_update_cb_ = cluster_->prioritySet().addPriorityUpdateCb( @@ -87,6 +86,7 @@ class OriginalDstClusterTest : public Event::TestUsingSimulatedTime, public test cluster_->initialize([&]() -> void { initialized_.ready(); }); } + NiceMock cm_; NiceMock server_context_; Stats::TestUtil::TestStore stats_store_; Ssl::MockContextManager ssl_context_manager_; diff --git a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc index f6ab28f56fbe2..90e2371850bdd 100644 --- a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc +++ b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc @@ -258,8 +258,8 @@ TEST_F(ProxyFilterTest, CircuitBreakerOverflowWithDnsCacheResourceManager) { filter2->decodeHeaders(request_headers_, false)); // Cluster circuit breaker overflow counter won't be incremented. - EXPECT_EQ(0, - cm_.thread_local_cluster_.cluster_.info_->stats_.upstream_rq_pending_overflow_.value()); + EXPECT_EQ(0, cm_.thread_local_cluster_.cluster_.info_->upstream_stats_ + ->upstream_rq_pending_overflow_.value()); filter2->onDestroy(); EXPECT_CALL(*handle, onDestroy()); filter_->onDestroy(); diff --git a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc index 551e6ed82fbe2..efec0acda5393 100644 --- a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc +++ b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc @@ -236,7 +236,9 @@ TEST_P(GcpAuthnFilterIntegrationTest, BasicflowWithoutAudience) { sendRequestToDestinationAndValidateResponse(/*with_audience=*/false); // Verify request has been routed to `cluster_0` but not `gcp_authn` cluster. - EXPECT_GE(test_server_->counter("cluster.gcp_authn.upstream_cx_total")->value(), 0); + // Note that upstream_cx_total is from the lazy-inited ClusterInfo::upstreamStats(), so there is + // no such stat yet. + EXPECT_EQ(test_server_->counter("cluster.gcp_authn.upstream_cx_total"), nullptr); EXPECT_GE(test_server_->counter("cluster.cluster_0.upstream_cx_total")->value(), 1); // Clean up the codec and connections. diff --git a/test/extensions/filters/http/health_check/health_check_test.cc b/test/extensions/filters/http/health_check/health_check_test.cc index 7dcf99d5129c4..5e9051c7bb571 100644 --- a/test/extensions/filters/http/health_check/health_check_test.cc +++ b/test/extensions/filters/http/health_check/health_check_test.cc @@ -71,9 +71,9 @@ class HealthCheckFilterTest : public testing::Test { public: MockHealthCheckCluster(uint64_t membership_total, uint64_t membership_healthy, uint64_t membership_degraded = 0) { - info()->stats().membership_total_.set(membership_total); - info()->stats().membership_healthy_.set(membership_healthy); - info()->stats().membership_degraded_.set(membership_degraded); + info()->endpointStats().membership_total_.set(membership_total); + info()->endpointStats().membership_healthy_.set(membership_healthy); + info()->endpointStats().membership_degraded_.set(membership_degraded); } }; }; diff --git a/test/extensions/filters/network/common/redis/client_impl_test.cc b/test/extensions/filters/network/common/redis/client_impl_test.cc index bcd4d4e3810c1..95eb03ea8f51f 100644 --- a/test/extensions/filters/network/common/redis/client_impl_test.cc +++ b/test/extensions/filters/network/common/redis/client_impl_test.cc @@ -81,7 +81,7 @@ class RedisClientImplTest : public testing::Test, client_ = ClientImpl::create(host_, dispatcher_, Common::Redis::EncoderPtr{encoder_}, *this, *config_, redis_command_stats_, stats_, false); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_total_.value()); EXPECT_EQ(1UL, host_->stats_.cx_total_.value()); EXPECT_EQ(false, client_->active()); @@ -117,8 +117,8 @@ class RedisClientImplTest : public testing::Test, EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -308,8 +308,8 @@ TEST_F(RedisClientImplTest, Basic) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -385,8 +385,8 @@ TEST_F(RedisClientImplTest, CommandStatsDisabledSingleRequest) { onConnected(); // Regular Envoy stats function as normal - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -449,8 +449,8 @@ TEST_F(RedisClientImplTest, CommandStatsEnabledTwoRequests) { EXPECT_NE(nullptr, handle2); // Regular Envoy stats function as normal - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -513,8 +513,8 @@ TEST_F(RedisClientImplTest, InitializedWithAuthPassword) { EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -535,8 +535,8 @@ TEST_F(RedisClientImplTest, InitializedWithAuthAcl) { EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -612,7 +612,7 @@ TEST_F(RedisClientImplTest, Cancel) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); client_->close(); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_cancelled_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_cancelled_.value()); } TEST_F(RedisClientImplTest, FailAll) { @@ -639,8 +639,9 @@ TEST_F(RedisClientImplTest, FailAll) { EXPECT_CALL(connection_callbacks, onEvent(Network::ConnectionEvent::RemoteClose)); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_destroy_remote_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1UL, + host_->cluster_.upstream_stats_->upstream_cx_destroy_remote_with_active_rq_.value()); } TEST_F(RedisClientImplTest, FailAllWithCancel) { @@ -666,9 +667,10 @@ TEST_F(RedisClientImplTest, FailAllWithCancel) { EXPECT_CALL(connection_callbacks, onEvent(Network::ConnectionEvent::LocalClose)); upstream_connection_->raiseEvent(Network::ConnectionEvent::LocalClose); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_destroy_local_with_active_rq_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_cancelled_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1UL, + host_->cluster_.upstream_stats_->upstream_cx_destroy_local_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_cancelled_.value()); } TEST_F(RedisClientImplTest, ProtocolError) { @@ -696,7 +698,7 @@ TEST_F(RedisClientImplTest, ProtocolError) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_read_filter_->onData(fake_data, false); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_protocol_error_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_protocol_error_.value()); EXPECT_EQ(1UL, host_->stats_.rq_error_.value()); } @@ -718,7 +720,7 @@ TEST_F(RedisClientImplTest, ConnectFail) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_connect_fail_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -753,7 +755,7 @@ TEST_F(RedisClientImplTest, OutlierDisabled) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_connect_fail_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -776,7 +778,7 @@ TEST_F(RedisClientImplTest, ConnectTimeout) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); connect_or_op_timer_->invokeCallback(); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_connect_timeout_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -794,8 +796,8 @@ TEST_F(RedisClientImplTest, OpTimeout) { onConnected(); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_CALL(callbacks1, onResponse_(_)); EXPECT_CALL(*connect_or_op_timer_, disableTimer()); @@ -803,8 +805,8 @@ TEST_F(RedisClientImplTest, OpTimeout) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); respond(); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_CALL(*encoder_, encode(Ref(request1), _)); EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); @@ -819,10 +821,10 @@ TEST_F(RedisClientImplTest, OpTimeout) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); connect_or_op_timer_->invokeCallback(); - EXPECT_EQ(1UL, host_->cluster_.stats_.upstream_rq_timeout_.value()); + EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_timeout_.value()); EXPECT_EQ(1UL, host_->stats_.rq_timeout_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); } TEST_F(RedisClientImplTest, AskRedirection) { @@ -846,8 +848,8 @@ TEST_F(RedisClientImplTest, AskRedirection) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -903,8 +905,8 @@ TEST_F(RedisClientImplTest, MovedRedirection) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -960,8 +962,8 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -981,8 +983,10 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); callbacks_->onRespValue(std::move(response1)); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_succeeded_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_failed_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); // Test a truncated MOVED error response that cannot be parsed properly. Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); @@ -994,8 +998,10 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); callbacks_->onRespValue(std::move(response2)); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_succeeded_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_failed_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); })); upstream_read_filter_->onData(fake_data, false); @@ -1025,8 +1031,8 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -1044,8 +1050,10 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); callbacks_->onRespValue(std::move(response1)); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_failed_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_succeeded_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); response2->type(Common::Redis::RespType::Error); @@ -1057,8 +1065,10 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); callbacks_->onRespValue(std::move(response2)); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_failed_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_succeeded_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); })); upstream_read_filter_->onData(fake_data, false); @@ -1088,8 +1098,8 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.stats_.upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -1106,8 +1116,10 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); callbacks_->onRespValue(std::move(response1)); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_succeeded_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_failed_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); response2->type(Common::Redis::RespType::Error); @@ -1119,8 +1131,10 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); callbacks_->onRespValue(std::move(response2)); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_succeeded_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.stats_.upstream_internal_redirect_failed_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + EXPECT_EQ(0UL, + host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); })); upstream_read_filter_->onData(fake_data, false); diff --git a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc index 6fae57176a9b8..49dc9cd255d83 100644 --- a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc +++ b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc @@ -578,19 +578,19 @@ stat_prefix: foo test_sessions_[0].expectWriteToUpstream("hello", 0, nullptr, true); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_tx_bytes_total_.value()); + EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_tx_bytes_total_.value()); test_sessions_[0].recvDataFromUpstream("world2", 0, SOCKET_ERROR_MSG_SIZE); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_rx_bytes_total_.value()); + EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_tx_errors_.value()); test_sessions_[0].recvDataFromUpstream("world2", SOCKET_ERROR_MSG_SIZE, 0); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_rx_bytes_total_.value()); + EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -600,8 +600,8 @@ stat_prefix: foo test_sessions_[0].expectWriteToUpstream("hello", SOCKET_ERROR_MSG_SIZE); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(10 /*rx_bytes*/, 2 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_tx_bytes_total_.value()); + EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_tx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -676,8 +676,8 @@ stat_prefix: foo EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_none_healthy_.value()); } // No cluster at filter creation. @@ -784,8 +784,8 @@ stat_prefix: foo // This should hit the session circuit breaker. recvDataFromDownstream("10.0.0.2:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_overflow_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_overflow_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); @@ -980,8 +980,8 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(0, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(0, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_none_healthy_.value()); } // Verify that when on second packet no host is available, message is dropped. @@ -1005,16 +1005,16 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(0, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_none_healthy_.value()); + EXPECT_EQ(0, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_none_healthy_.value()); EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello2"); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_none_healthy_.value()); } // Verify that all sessions for a host are removed when a host is removed. @@ -1117,8 +1117,8 @@ use_per_packet_load_balancing: true 0, 0, 0, 0, 0); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_ - .upstream_cx_overflow_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->upstream_stats_->upstream_cx_overflow_.value()); } // Make sure socket option is set correctly if use_original_src_ip is set in case of ipv6. diff --git a/test/extensions/stats_sinks/common/statsd/statsd_test.cc b/test/extensions/stats_sinks/common/statsd/statsd_test.cc index 3d20059442c12..b5e7f193407ba 100644 --- a/test/extensions/stats_sinks/common/statsd/statsd_test.cc +++ b/test/extensions/stats_sinks/common/statsd/statsd_test.cc @@ -225,22 +225,22 @@ TEST_F(TcpStatsdSinkTest, Overflow) { // Synthetically set buffer above high watermark. Make sure we don't write anything. cluster_manager_.active_clusters_["fake_cluster"] - ->info_->stats() - .upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); + ->info_->upstreamStats() + ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); sink_->flush(snapshot_); // Lower and make sure we write. cluster_manager_.active_clusters_["fake_cluster"] - ->info_->stats() - .upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 15); + ->info_->upstreamStats() + ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 15); expectCreateConnection(); EXPECT_CALL(*connection_, write(BufferStringEqual("envoy.test_counter:1|c\n"), _)); sink_->flush(snapshot_); // Raise and make sure we don't write and kill connection. cluster_manager_.active_clusters_["fake_cluster"] - ->info_->stats() - .upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); + ->info_->upstreamStats() + ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); EXPECT_CALL(*connection_, close(Network::ConnectionCloseType::NoFlush)); sink_->flush(snapshot_); diff --git a/test/extensions/stats_sinks/hystrix/hystrix_test.cc b/test/extensions/stats_sinks/hystrix/hystrix_test.cc index 866cbc7df0de4..2307f22a252a8 100644 --- a/test/extensions/stats_sinks/hystrix/hystrix_test.cc +++ b/test/extensions/stats_sinks/hystrix/hystrix_test.cc @@ -82,9 +82,9 @@ class ClusterTestInfo { ON_CALL(error_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_step)); ON_CALL(retry_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_retry_step)); ON_CALL(success_counter_, value()).WillByDefault(Return((i + 1) * success_step)); - cluster_info_->stats().upstream_rq_timeout_.add(timeout_step); - cluster_info_->stats().upstream_rq_per_try_timeout_.add(timeout_retry_step); - cluster_info_->stats().upstream_rq_pending_overflow_.add(rejected_step); + cluster_info_->upstreamStats()->upstream_rq_timeout_.add(timeout_step); + cluster_info_->upstreamStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); + cluster_info_->upstreamStats()->upstream_rq_pending_overflow_.add(rejected_step); } NiceMock cluster_; diff --git a/test/integration/integration_test.cc b/test/integration/integration_test.cc index c18c30ec7cf14..2d5e53a5c8d4f 100644 --- a/test/integration/integration_test.cc +++ b/test/integration/integration_test.cc @@ -2457,9 +2457,11 @@ TEST_P(IntegrationTest, SetRouteToDelegatingRouteWithClusterOverride) { EXPECT_EQ("200", response->headers().getStatusValue()); // Even though headers specify cluster_0, set_route_filter modifies cached route cluster of - // current request to cluster_override - EXPECT_EQ(0, test_server_->counter("cluster.cluster_0.upstream_cx_total")->value()); - EXPECT_EQ(0, test_server_->counter("cluster.cluster_0.upstream_rq_total")->value()); + // current request to cluster_override. + // cluster_0 upstreamStats() not created yet. + EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_cx_total"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_rq_total"), nullptr); + EXPECT_EQ(1, test_server_->counter("cluster.cluster_override.upstream_cx_total")->value()); EXPECT_EQ(1, test_server_->counter("cluster.cluster_override.upstream_rq_200")->value()); EXPECT_THAT(waitForAccessLog(access_log_name_), HasSubstr("cluster_override")); diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index 50f8a630af1de..5cf5599d140ed 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -928,6 +928,23 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { } }; + // Since ClusterInfo::upstreamStats() are lazy-init, we need to update any stat for a cluster's + // upstreamStats() to trigger creation of the cluster upstreamStats. + absl::Notification n; + test_server_->server().dispatcher().post([&]() { + test_server_->server() + .clusterManager() + .clusters() + .getCluster("cluster_0") + ->get() + .info() + ->upstreamStats() + ->upstream_cx_active_.inc(); + n.Notify(); + }); + + n.WaitForNotification(); + for (const Stats::CounterSharedPtr& counter : test_server_->counters()) { test_name_against_mapping(tag_extracted_counter_map, *counter); } diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index b33d48a5c1e1b..bae54981ebd72 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -53,14 +53,14 @@ MockUpstreamLocalAddressSelector::MockUpstreamLocalAddressSelector( MockClusterInfo::MockClusterInfo() : http2_options_(::Envoy::Http2::Utility::initializeAndValidateOptions( envoy::config::core::v3::Http2ProtocolOptions())), - stat_names_(stats_store_.symbolTable()), + upstream_stat_names_(stats_store_.symbolTable()), config_update_stats_names_(stats_store_.symbolTable()), lb_stat_names_(stats_store_.symbolTable()), endpoint_stat_names_(stats_store_.symbolTable()), cluster_load_report_stat_names_(stats_store_.symbolTable()), cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)), + upstream_stats_(stats_store_, upstream_stat_names_), config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), @@ -98,7 +98,7 @@ MockClusterInfo::MockClusterInfo() .WillByDefault(ReturnPointee(&max_response_headers_count_)); ON_CALL(*this, maxRequestsPerConnection()) .WillByDefault(ReturnPointee(&max_requests_per_connection_)); - ON_CALL(*this, stats()).WillByDefault(ReturnRef(stats_)); + ON_CALL(*this, upstreamStats()).WillByDefault(ReturnRef(upstream_stats_)); ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 0bd4b5e22ab70..4cef9e43a1553 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -151,7 +151,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); - MOCK_METHOD(ClusterStats&, stats, (), (const)); + MOCK_METHOD(LazyInitStats&, upstreamStats, (), (const)); MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); @@ -199,7 +199,7 @@ class MockClusterInfo : public ClusterInfo { uint64_t max_requests_per_connection_{}; uint32_t max_response_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT}; NiceMock stats_store_; - ClusterStatNames stat_names_; + ClusterUpstreamStatNames upstream_stat_names_; ClusterConfigUpdateStatNames config_update_stats_names_; ClusterLbStatNames lb_stat_names_; ClusterEndpointStatNames endpoint_stat_names_; @@ -207,7 +207,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; - ClusterStats stats_; + LazyInitStats upstream_stats_; ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; diff --git a/test/mocks/upstream/cluster_manager.h b/test/mocks/upstream/cluster_manager.h index a28b17f0822ca..61387da239ff8 100644 --- a/test/mocks/upstream/cluster_manager.h +++ b/test/mocks/upstream/cluster_manager.h @@ -56,7 +56,7 @@ class MockClusterManager : public ClusterManager { MOCK_METHOD(ClusterUpdateCallbacksHandle*, addThreadLocalClusterUpdateCallbacks_, (ClusterUpdateCallbacks & callbacks)); MOCK_METHOD(Config::SubscriptionFactory&, subscriptionFactory, ()); - const ClusterStatNames& clusterStatNames() const override { return cluster_stat_names_; } + const ClusterUpstreamStatNames& clusterStatNames() const override { return cluster_stat_names_; } const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { return cluster_config_update_stat_names_; } @@ -95,7 +95,7 @@ class MockClusterManager : public ClusterManager { absl::flat_hash_map> active_clusters_; absl::flat_hash_map> warming_clusters_; Stats::TestUtil::TestSymbolTable symbol_table_; - ClusterStatNames cluster_stat_names_; + ClusterUpstreamStatNames cluster_stat_names_; ClusterConfigUpdateStatNames cluster_config_update_stat_names_; ClusterLbStatNames cluster_lb_stat_names_; ClusterEndpointStatNames cluster_endpoint_stat_names_; From 8d3f6bd06f3390c3b2b70f09c497af333f0f86c9 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 9 Nov 2022 16:33:57 -0500 Subject: [PATCH 006/122] format Signed-off-by: Xin Zhuang --- envoy/stats/stats_macros.h | 1 + envoy/upstream/upstream.h | 2 +- source/common/conn_pool/conn_pool_base.cc | 6 ++++-- source/common/http/http3/conn_pool.cc | 6 +++--- source/common/router/router.cc | 3 ++- source/common/upstream/load_balancer_impl.cc | 8 ++++---- source/common/upstream/upstream_impl.h | 4 ++-- .../stat_sinks/common/statsd/statsd.cc | 11 ++++++----- test/integration/cds_integration_test.cc | 17 +++++++++++++++++ test/integration/integration_admin_test.cc | 18 ++++++++++++++++++ 10 files changed, 58 insertions(+), 18 deletions(-) diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index 4f9b7b2f465a2..1eb64fd078139 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -174,6 +174,7 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ template struct LazyInitStats { LazyInitStats(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) : scope_(scope), ctor_([&scope, &stat_names]() -> StatsStructType* { + ENVOY_LOG_MISC(error, "DDDD begin to create stats now..."); return new StatsStructType(stat_names, scope); }) {} diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index ba63da5eed6ed..9fd2e3e7e25d4 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -1035,7 +1035,7 @@ class ClusterInfo : public Http::FilterChainFactory { * @return ClusterConfigUpdateStats& strongly named config update stats for this cluster. */ virtual ClusterConfigUpdateStats& configUpdateStats() const PURE; - + /** * @return ClusterLbStats& strongly named stats for this cluster. */ diff --git a/source/common/conn_pool/conn_pool_base.cc b/source/common/conn_pool/conn_pool_base.cc index 8fd87be0d0a86..ffe058060b041 100644 --- a/source/common/conn_pool/conn_pool_base.cc +++ b/source/common/conn_pool/conn_pool_base.cc @@ -757,9 +757,11 @@ ActiveClient::ActiveClient(ConnPoolImplBase& parent, uint32_t lifetime_stream_li concurrent_stream_limit_(translateZeroToUnlimited(concurrent_stream_limit)), connect_timer_(parent_.dispatcher().createTimer([this]() { onConnectTimeout(); })) { conn_connect_ms_ = std::make_unique( - parent_.host()->cluster().upstreamStats()->upstream_cx_connect_ms_, parent_.dispatcher().timeSource()); + parent_.host()->cluster().upstreamStats()->upstream_cx_connect_ms_, + parent_.dispatcher().timeSource()); conn_length_ = std::make_unique( - parent_.host()->cluster().upstreamStats()->upstream_cx_length_ms_, parent_.dispatcher().timeSource()); + parent_.host()->cluster().upstreamStats()->upstream_cx_length_ms_, + parent_.dispatcher().timeSource()); connect_timer_->enableTimer(parent_.host()->cluster().connectTimeout()); parent_.host()->stats().cx_total_.inc(); parent_.host()->stats().cx_active_.inc(); diff --git a/source/common/http/http3/conn_pool.cc b/source/common/http/http3/conn_pool.cc index 96ad6c5d36748..764d388aff2a7 100644 --- a/source/common/http/http3/conn_pool.cc +++ b/source/common/http/http3/conn_pool.cc @@ -39,9 +39,9 @@ std::string sni(const Network::TransportSocketOptionsConstSharedPtr& options, ActiveClient::ActiveClient(Envoy::Http::HttpConnPoolImplBase& parent, Upstream::Host::CreateConnectionData& data) - : MultiplexedActiveClientBase(parent, getMaxStreams(parent.host()->cluster()), - getMaxStreams(parent.host()->cluster()), - parent.host()->cluster().upstreamStats()->upstream_cx_http3_total_, data), + : MultiplexedActiveClientBase( + parent, getMaxStreams(parent.host()->cluster()), getMaxStreams(parent.host()->cluster()), + parent.host()->cluster().upstreamStats()->upstream_cx_http3_total_, data), async_connect_callback_(parent_.dispatcher().createSchedulableCallback([this]() { if (state() != Envoy::ConnectionPool::ActiveClient::State::Connecting) { return; diff --git a/source/common/router/router.cc b/source/common/router/router.cc index 0fdba8d55f7d0..6ce468452d685 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -1030,7 +1030,8 @@ void Filter::onSoftPerTryTimeout(UpstreamRequest& upstream_request) { } void Filter::onPerTryIdleTimeout(UpstreamRequest& upstream_request) { - onPerTryTimeoutCommon(upstream_request, cluster_->upstreamStats()->upstream_rq_per_try_idle_timeout_, + onPerTryTimeoutCommon(upstream_request, + cluster_->upstreamStats()->upstream_rq_per_try_idle_timeout_, StreamInfo::ResponseCodeDetails::get().UpstreamPerTryIdleTimeout); } diff --git a/source/common/upstream/load_balancer_impl.cc b/source/common/upstream/load_balancer_impl.cc index e408918eb7866..8260f450cab00 100644 --- a/source/common/upstream/load_balancer_impl.cc +++ b/source/common/upstream/load_balancer_impl.cc @@ -352,8 +352,8 @@ LoadBalancerBase::chooseHostSet(LoadBalancerContext* context, uint64_t hash) con } ZoneAwareLoadBalancerBase::ZoneAwareLoadBalancerBase( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& lb_stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), local_priority_set_(local_priority_set), @@ -788,8 +788,8 @@ const HostVector& ZoneAwareLoadBalancerBase::hostSourceToHosts(HostsSource hosts } EdfLoadBalancerBase::EdfLoadBalancerBase( - const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& lb_stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, + const PrioritySet& priority_set, const PrioritySet* local_priority_set, + ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional slow_start_config, TimeSource& time_source) diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index d7c9971761070..8587ccb3033dc 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -703,8 +703,8 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcherPtr&& socket_matcher, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static LazyInitStats generateStats(Stats::Scope& scope, - const ClusterUpstreamStatNames& cluster_stat_names); + static LazyInitStats + generateStats(Stats::Scope& scope, const ClusterUpstreamStatNames& cluster_stat_names); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); static ClusterCircuitBreakersStats diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index f2dbe1555ac67..ce4d04cfd10aa 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -354,11 +354,12 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { connection_ = std::move(info.connection_); connection_->addConnectionCallbacks(*this); - connection_->setConnectionStats({parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_total_, - parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_buffered_, - parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_total_, - parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_buffered_, - &parent_.cluster_info_->upstreamStats()->bind_errors_, nullptr}); + connection_->setConnectionStats( + {parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_total_, + parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_buffered_, + parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_total_, + parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_buffered_, + &parent_.cluster_info_->upstreamStats()->bind_errors_, nullptr}); connection_->connect(); } diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 8e03b0421201e..9b830f862227e 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -195,6 +195,23 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); + // With https://github.com/envoyproxy/envoy/pull/23921 all the + // upstream_xxxx are lazy-inited. + // We need to trigger an inc on the ClusterInfo::upstreamStats() to create the upstream stats. + absl::Notification n; + test_server_->server().dispatcher().post([&]() { + auto _ = *test_server_->server() + .clusterManager() + .clusters() + .getCluster("cluster_1") + ->get() + .info() + ->upstreamStats(); + (void)_; + n.Notify(); + }); + n.WaitForNotification(); + test_server_->waitForCounterExists("cluster.cluster_1.upstream_cx_total"); Stats::CounterSharedPtr cx_counter = test_server_->counter("cluster.cluster_1.upstream_cx_total"); // Confirm no upstream connection is attempted so far. diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index fda542ebbb137..56e6a0855ce20 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -129,6 +129,23 @@ TEST_P(IntegrationAdminTest, Admin) { initialize(); BufferingStreamDecoderPtr response; + // With https://github.com/envoyproxy/envoy/pull/23921 all the + // upstream_xxxx are lazy-inited. + // We need to trigger an inc on the ClusterInfo::upstreamStats() to create the upstream stats. + absl::Notification n; + test_server_->server().dispatcher().post([&]() { + test_server_->server() + .clusterManager() + .clusters() + .getCluster("cluster_0") + ->get() + .info() + ->upstreamStats() + ->bind_errors_.inc(); + n.Notify(); + }); + n.WaitForNotification(); + EXPECT_EQ("404", request("admin", "GET", "/notfound", response)); EXPECT_EQ("text/plain; charset=UTF-8", contentType(response)); EXPECT_THAT(response->body(), HasSubstr("invalid path. admin commands are:")); @@ -232,6 +249,7 @@ TEST_P(IntegrationAdminTest, Admin) { response->body(), HasSubstr("envoy_listener_admin_http_downstream_rq_xx{envoy_response_code_class=\"4\"," "envoy_http_conn_manager_prefix=\"admin\"} 2\n")); + EXPECT_THAT(response->body(), HasSubstr("# TYPE envoy_cluster_upstream_cx_active gauge\n")); EXPECT_THAT(response->body(), HasSubstr("envoy_cluster_upstream_cx_active{envoy_cluster_name=\"cluster_0\"} 0\n")); From 2aed8eb73cacbe9b241d5f158df710f702c492b6 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 10 Nov 2022 14:21:32 -0500 Subject: [PATCH 007/122] renamings Signed-off-by: Xin Zhuang --- envoy/upstream/upstream.h | 6 +- source/common/upstream/upstream_impl.cc | 4 +- source/common/upstream/upstream_impl.h | 6 +- .../http/grpc_stats/grpc_stats_filter.cc | 8 +- .../extensions/stat_sinks/hystrix/hystrix.cc | 2 +- .../grpc_client_integration_test_harness.h | 4 +- test/common/http/codec_client_test.cc | 6 +- test/common/http/http1/conn_pool_test.cc | 48 ++++---- test/common/http/http2/conn_pool_test.cc | 82 +++++++------- test/common/tcp/conn_pool_test.cc | 20 ++-- .../upstream/conn_pool_map_impl_test.cc | 6 +- .../clusters/aggregate/cluster_test.cc | 2 +- .../proxy_filter_test.cc | 2 +- .../http/router/auto_sni_integration_test.cc | 4 +- .../network/common/redis/client_impl_test.cc | 104 +++++++++--------- .../udp/udp_proxy/udp_proxy_filter_test.cc | 20 ++-- .../alpn_selection_integration_test.cc | 4 +- test/integration/base_integration_test.cc | 8 +- test/integration/base_integration_test.h | 2 +- .../sds_dynamic_integration_test.cc | 4 +- test/integration/ssl_utility.cc | 8 +- test/integration/xfcc_integration_test.cc | 4 +- test/mocks/upstream/cluster_info.cc | 4 +- test/mocks/upstream/cluster_info.h | 4 +- 24 files changed, 181 insertions(+), 181 deletions(-) diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 9fd2e3e7e25d4..49d8025627655 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -751,7 +751,7 @@ MAKE_STATS_STRUCT(ClusterLbStats, ClusterLbStatNames, ALL_CLUSTER_LB_STATS); * Struct definition for all cluster stats. @see stats_macros.h */ MAKE_STAT_NAMES_STRUCT(ClusterUpstreamStatNames, ALL_CLUSTER_UPSTREAM_STATS); -MAKE_STATS_STRUCT(ClusterUpstreamStats, ClusterUpstreamStatNames, ALL_CLUSTER_UPSTREAM_STATS); +MAKE_STATS_STRUCT(ClusterTrafficStats, ClusterUpstreamStatNames, ALL_CLUSTER_UPSTREAM_STATS); MAKE_STAT_NAMES_STRUCT(ClusterLoadReportStatNames, ALL_CLUSTER_LOAD_REPORT_STATS); MAKE_STATS_STRUCT(ClusterLoadReportStats, ClusterLoadReportStatNames, @@ -1047,9 +1047,9 @@ class ClusterInfo : public Http::FilterChainFactory { virtual ClusterEndpointStats& endpointStats() const PURE; /** - * @return ClusterUpstreamStats& strongly named stats for this cluster. + * @return ClusterTrafficStats& strongly named stats for this cluster. */ - virtual LazyInitStats& upstreamStats() const PURE; + virtual LazyInitStats& upstreamStats() const PURE; /** * @return the stats scope that contains all cluster stats. This can be used to produce dynamic diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index d9efc1f2001b3..b65ec9b0fd370 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -833,7 +833,7 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add } } -LazyInitStats +LazyInitStats ClusterInfoImpl::generateStats(Stats::Scope& scope, const ClusterUpstreamStatNames& stat_names) { return {scope, stat_names}; } @@ -978,7 +978,7 @@ ClusterInfoImpl::ClusterInfoImpl( per_connection_buffer_limit_bytes_( PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, per_connection_buffer_limit_bytes, 1024 * 1024)), socket_matcher_(std::move(socket_matcher)), stats_scope_(std::move(stats_scope)), - upstream_stats_( + traffic_stats_( generateStats(*stats_scope_, factory_context.clusterManager().clusterStatNames())), config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), *stats_scope_), diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 8587ccb3033dc..ab512231a7472 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -703,7 +703,7 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcherPtr&& socket_matcher, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static LazyInitStats + static LazyInitStats generateStats(Stats::Scope& scope, const ClusterUpstreamStatNames& cluster_stat_names); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); @@ -791,7 +791,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - LazyInitStats& upstreamStats() const override { return upstream_stats_; } + LazyInitStats& upstreamStats() const override { return traffic_stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } @@ -908,7 +908,7 @@ class ClusterInfoImpl : public ClusterInfo, const uint32_t per_connection_buffer_limit_bytes_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; - mutable LazyInitStats upstream_stats_; + mutable LazyInitStats traffic_stats_; mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc b/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc index 5f0d2200fa2dc..b35f382d0b0af 100644 --- a/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc +++ b/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc @@ -93,7 +93,7 @@ struct Config { Config(const envoy::extensions::filters::http::grpc_stats::v3::FilterConfig& proto_config, Server::Configuration::FactoryContext& context) : context_(context.grpcContext()), emit_filter_state_(proto_config.emit_filter_state()), - enable_upstream_stats_(proto_config.enable_upstream_stats()), + enable_traffic_stats_(proto_config.enable_upstream_stats()), replace_dots_in_grpc_service_name_(proto_config.replace_dots_in_grpc_service_name()) { switch (proto_config.per_method_stat_specifier_case()) { @@ -137,7 +137,7 @@ struct Config { } Grpc::Context& context_; const bool emit_filter_state_; - const bool enable_upstream_stats_; + const bool enable_traffic_stats_; const bool replace_dots_in_grpc_service_name_; bool stats_for_all_methods_{false}; absl::optional allowlist_; @@ -262,11 +262,11 @@ class GrpcStatsFilter : public Http::PassThroughFilter { } void maybeChargeUpstreamStat() { - if (!config_->enable_upstream_stats_) { + if (!config_->enable_traffic_stats_) { return; } StreamInfo::TimingUtility timing(decoder_callbacks_->streamInfo()); - if (config_->enable_upstream_stats_ && timing.lastUpstreamTxByteSent().has_value() && + if (config_->enable_traffic_stats_ && timing.lastUpstreamTxByteSent().has_value() && timing.lastUpstreamRxByteReceived().has_value()) { std::chrono::milliseconds chrono_duration = std::chrono::duration_cast( diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index 5c4392205d1a8..1b021b9ef802d 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -90,7 +90,7 @@ uint64_t HystrixSink::getRollingValue(RollingWindow rolling_window) { void HystrixSink::updateRollingWindowMap(const Upstream::ClusterInfo& cluster_info, ClusterStatsCache& cluster_stats_cache) { - Upstream::ClusterUpstreamStats& cluster_stats = *cluster_info.upstreamStats(); + Upstream::ClusterTrafficStats& cluster_stats = *cluster_info.upstreamStats(); Stats::Scope& cluster_stats_scope = cluster_info.statsScope(); // Combining timeouts+retries - retries are counted as separate requests diff --git a/test/common/grpc/grpc_client_integration_test_harness.h b/test/common/grpc/grpc_client_integration_test_harness.h index 49947606770fc..b524e840bc65b 100644 --- a/test/common/grpc/grpc_client_integration_test_harness.h +++ b/test/common/grpc/grpc_client_integration_test_harness.h @@ -567,9 +567,9 @@ class GrpcSslClientIntegrationTest : public GrpcClientIntegrationTest { auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); } bool use_client_cert_{}; diff --git a/test/common/http/codec_client_test.cc b/test/common/http/codec_client_test.cc index 399b69e2577bd..4c46a755c8d00 100644 --- a/test/common/http/codec_client_test.cc +++ b/test/common/http/codec_client_test.cc @@ -258,7 +258,7 @@ TEST_F(CodecClientTest, ProtocolError) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, 408Response) { @@ -270,7 +270,7 @@ TEST_F(CodecClientTest, 408Response) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, PrematureResponse) { @@ -281,7 +281,7 @@ TEST_F(CodecClientTest, PrematureResponse) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, WatermarkPassthrough) { diff --git a/test/common/http/http1/conn_pool_test.cc b/test/common/http/http1/conn_pool_test.cc index 6db9d1f5d2d97..bf0ed74a311c8 100644 --- a/test/common/http/http1/conn_pool_test.cc +++ b/test/common/http/http1/conn_pool_test.cc @@ -175,7 +175,7 @@ struct ActiveTestRequest { : parent_(parent), client_index_(client_index) { uint64_t active_rq_observed = parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default).requests().count(); - uint64_t current_rq_total = parent_.cluster_->upstream_stats_->upstream_rq_total_.value(); + uint64_t current_rq_total = parent_.cluster_->traffic_stats_->upstream_rq_total_.value(); if (type == Type::CreateConnection) { parent.conn_pool_->expectClientCreate(); } @@ -200,7 +200,7 @@ struct ActiveTestRequest { } if (type != Type::Pending) { EXPECT_EQ(current_rq_total + 1, - parent_.cluster_->upstream_stats_->upstream_rq_total_.value()); + parent_.cluster_->traffic_stats_->upstream_rq_total_.value()); EXPECT_EQ(active_rq_observed + 1, parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default) .requests() @@ -441,7 +441,7 @@ TEST_F(Http1ConnPoolImplTest, MaxPendingRequests) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_overflow_.value()); } /** @@ -465,8 +465,8 @@ TEST_F(Http1ConnPoolImplTest, ConnectFailure) { EXPECT_CALL(*conn_pool_, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -554,9 +554,9 @@ TEST_F(Http1ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*conn_pool_, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); } /** @@ -656,7 +656,7 @@ TEST_F(Http1ConnPoolImplTest, MaxConnections) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_EQ(1U, cluster_->circuit_breakers_stats_.cx_open_.value()); EXPECT_NE(nullptr, handle); @@ -720,7 +720,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseWithoutHeader) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -804,7 +804,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -842,7 +842,7 @@ TEST_F(Http1ConnPoolImplTest, ProxyConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -879,7 +879,7 @@ TEST_F(Http1ConnPoolImplTest, Http10NoConnectionKeepAlive) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -921,8 +921,8 @@ TEST_F(Http1ConnPoolImplTest, MaxRequestsPerConnection) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_max_requests_.value()); } TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { @@ -944,7 +944,7 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { r1.completeResponse(false); conn_pool_->expectAndRunUpstreamReady(); r3.startRequest(); - EXPECT_EQ(3U, cluster_->upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(3U, cluster_->traffic_stats_->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); r2.completeResponse(false); @@ -957,8 +957,8 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, DrainCallback) { @@ -972,7 +972,7 @@ TEST_F(Http1ConnPoolImplTest, DrainCallback) { conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainAndDelete); r2.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); EXPECT_CALL(drained, ready()).Times(AtLeast(1)); @@ -1049,8 +1049,8 @@ TEST_F(Http1ConnPoolImplTest, RemoteCloseToCompleteResponse) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, NoActiveConnectionsByDefault) { @@ -1094,13 +1094,13 @@ TEST_F(Http1ConnPoolImplTest, PendingRequestIsConsideredActive) { EXPECT_CALL(*conn_pool_, onClientDestroy()); r1.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_rq_total_.value()); conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainExistingConnections); conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_local_.value()); } // Schedulable callback that can track it's destruction. diff --git a/test/common/http/http2/conn_pool_test.cc b/test/common/http/http2/conn_pool_test.cc index 1c6e7b2007599..17823ad3ef516 100644 --- a/test/common/http/http2/conn_pool_test.cc +++ b/test/common/http/http2/conn_pool_test.cc @@ -634,8 +634,8 @@ TEST_F(Http2ConnPoolImplTest, DrainConnections) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Test that cluster.http2_protocol_options.max_concurrent_streams limits @@ -688,7 +688,7 @@ TEST_F(Http2ConnPoolImplTest, MaxConcurrentRequestsPerStream) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_total_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_total_.value()); } // Verifies that requests are queued up in the conn pool until the connection becomes ready. @@ -732,8 +732,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreams) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Verifies that the correct number of CONNECTING connections are created for @@ -853,8 +853,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsFailure) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Verifies resets due to local connection closes are tracked correctly. @@ -909,8 +909,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsRequestOverflow) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Verifies that we honor the max pending requests circuit breaker. @@ -947,8 +947,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsMaxPendingCircuitBreaker) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { @@ -973,8 +973,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } /** @@ -1004,8 +1004,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyBufferLimits) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { @@ -1019,7 +1019,7 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { r1.callbacks_.outer_encoder_ ->encodeHeaders(TestRequestHeaderMapImpl{{":path", "/"}, {":method", "GET"}}, true) .ok()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_active_.value()); EXPECT_CALL(r1.decoder_, decodeHeaders_(_, true)); r1.inner_decoder_->decodeHeaders( ResponseHeaderMapPtr{new TestResponseHeaderMapImpl{{":status", "200"}}}, true); @@ -1038,9 +1038,9 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_active_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, LocalReset) { @@ -1059,11 +1059,11 @@ TEST_F(Http2ConnPoolImplTest, LocalReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_tx_reset_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_tx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, RemoteReset) { @@ -1082,11 +1082,11 @@ TEST_F(Http2ConnPoolImplTest, RemoteReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_rx_reset_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_rx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { @@ -1111,8 +1111,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { @@ -1155,8 +1155,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainPrimary) { @@ -1278,13 +1278,13 @@ TEST_F(Http2ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_timeout_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_local_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { @@ -1310,8 +1310,8 @@ TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, GoAway) { @@ -1348,7 +1348,7 @@ TEST_F(Http2ConnPoolImplTest, GoAway) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_close_notify_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_close_notify_.value()); } TEST_F(Http2ConnPoolImplTest, NoActiveConnectionsByDefault) { diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index f4c36e0b9a026..78de9cb0c8bd8 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -569,7 +569,7 @@ TEST_F(TcpConnPoolImplTest, MaxPendingRequests) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Overflow, callbacks2.reason_); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_overflow_.value()); } /** @@ -597,8 +597,8 @@ TEST_F(TcpConnPoolImplTest, RemoteConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::RemoteConnectionFailure, callbacks.reason_); EXPECT_EQ("foo", callbacks.failure_reason_string_); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -623,8 +623,8 @@ TEST_F(TcpConnPoolImplTest, LocalConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::LocalConnectionFailure, callbacks.reason_); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -655,8 +655,8 @@ TEST_F(TcpConnPoolImplTest, ConnectTimeout) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks1.reason_); EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks2.reason_); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->upstream_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); } /** @@ -781,7 +781,7 @@ TEST_F(TcpConnPoolImplTest, MaxConnections) { // Request 2 should not kick off a new connection. ConnPoolCallbacks callbacks2; handle = conn_pool_->newConnection(callbacks2); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -828,8 +828,8 @@ TEST_F(TcpConnPoolImplTest, MaxRequestsPerConnection) { callbacks.conn_data_.reset(); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->upstream_stats_->upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_max_requests_.value()); } /* diff --git a/test/common/upstream/conn_pool_map_impl_test.cc b/test/common/upstream/conn_pool_map_impl_test.cc index be292b2e051af..e51a0de702f10 100644 --- a/test/common/upstream/conn_pool_map_impl_test.cc +++ b/test/common/upstream/conn_pool_map_impl_test.cc @@ -235,7 +235,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureCounter) { ON_CALL(*mock_pools_[0], hasActiveConnections()).WillByDefault(Return(true)); test_map->getPool(2, getNeverCalledFactory()); - EXPECT_EQ(host_->cluster_.upstream_stats_->upstream_cx_pool_overflow_.value(), 1); + EXPECT_EQ(host_->cluster_.traffic_stats_->upstream_cx_pool_overflow_.value(), 1); } TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureMultiple) { @@ -247,7 +247,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureMultiple) { test_map->getPool(2, getNeverCalledFactory()); test_map->getPool(2, getNeverCalledFactory()); - EXPECT_EQ(host_->cluster_.upstream_stats_->upstream_cx_pool_overflow_.value(), 3); + EXPECT_EQ(host_->cluster_.traffic_stats_->upstream_cx_pool_overflow_.value(), 3); } TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitGreaterThan1Fails) { @@ -284,7 +284,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolLimitHitFollowedBySuccessDoesNotClearFailure) ON_CALL(*mock_pools_[0], hasActiveConnections()).WillByDefault(Return(false)); test_map->getPool(2, getBasicFactory()); - EXPECT_EQ(host_->cluster_.upstream_stats_->upstream_cx_pool_overflow_.value(), 1); + EXPECT_EQ(host_->cluster_.traffic_stats_->upstream_cx_pool_overflow_.value(), 1); } // Test that only the pool which are idle are actually cleared diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 4a2de7990075e..470dcf4d03f49 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -139,7 +139,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterUpstreamStatNames stat_names_; - LazyInitStats stats_; + LazyInitStats stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc index 90e2371850bdd..0745401a05aeb 100644 --- a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc +++ b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc @@ -258,7 +258,7 @@ TEST_F(ProxyFilterTest, CircuitBreakerOverflowWithDnsCacheResourceManager) { filter2->decodeHeaders(request_headers_, false)); // Cluster circuit breaker overflow counter won't be incremented. - EXPECT_EQ(0, cm_.thread_local_cluster_.cluster_.info_->upstream_stats_ + EXPECT_EQ(0, cm_.thread_local_cluster_.cluster_.info_->traffic_stats_ ->upstream_rq_pending_overflow_.value()); filter2->onDestroy(); EXPECT_CALL(*handle, onDestroy()); diff --git a/test/extensions/filters/http/router/auto_sni_integration_test.cc b/test/extensions/filters/http/router/auto_sni_integration_test.cc index 71e4d4aed849c..f1999437bd2b1 100644 --- a/test/extensions/filters/http/router/auto_sni_integration_test.cc +++ b/test/extensions/filters/http/router/auto_sni_integration_test.cc @@ -62,9 +62,9 @@ class AutoSniIntegrationTest : public testing::TestWithParam( tls_context, factory_context_); - static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); } }; diff --git a/test/extensions/filters/network/common/redis/client_impl_test.cc b/test/extensions/filters/network/common/redis/client_impl_test.cc index 95eb03ea8f51f..f9709a6188377 100644 --- a/test/extensions/filters/network/common/redis/client_impl_test.cc +++ b/test/extensions/filters/network/common/redis/client_impl_test.cc @@ -81,7 +81,7 @@ class RedisClientImplTest : public testing::Test, client_ = ClientImpl::create(host_, dispatcher_, Common::Redis::EncoderPtr{encoder_}, *this, *config_, redis_command_stats_, stats_, false); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_total_.value()); EXPECT_EQ(1UL, host_->stats_.cx_total_.value()); EXPECT_EQ(false, client_->active()); @@ -117,8 +117,8 @@ class RedisClientImplTest : public testing::Test, EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -308,8 +308,8 @@ TEST_F(RedisClientImplTest, Basic) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -385,8 +385,8 @@ TEST_F(RedisClientImplTest, CommandStatsDisabledSingleRequest) { onConnected(); // Regular Envoy stats function as normal - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -449,8 +449,8 @@ TEST_F(RedisClientImplTest, CommandStatsEnabledTwoRequests) { EXPECT_NE(nullptr, handle2); // Regular Envoy stats function as normal - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -513,8 +513,8 @@ TEST_F(RedisClientImplTest, InitializedWithAuthPassword) { EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -535,8 +535,8 @@ TEST_F(RedisClientImplTest, InitializedWithAuthAcl) { EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -612,7 +612,7 @@ TEST_F(RedisClientImplTest, Cancel) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); client_->close(); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_cancelled_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_cancelled_.value()); } TEST_F(RedisClientImplTest, FailAll) { @@ -639,9 +639,9 @@ TEST_F(RedisClientImplTest, FailAll) { EXPECT_CALL(connection_callbacks, onEvent(Network::ConnectionEvent::RemoteClose)); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); EXPECT_EQ(1UL, - host_->cluster_.upstream_stats_->upstream_cx_destroy_remote_with_active_rq_.value()); + host_->cluster_.traffic_stats_->upstream_cx_destroy_remote_with_active_rq_.value()); } TEST_F(RedisClientImplTest, FailAllWithCancel) { @@ -667,10 +667,10 @@ TEST_F(RedisClientImplTest, FailAllWithCancel) { EXPECT_CALL(connection_callbacks, onEvent(Network::ConnectionEvent::LocalClose)); upstream_connection_->raiseEvent(Network::ConnectionEvent::LocalClose); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); EXPECT_EQ(1UL, - host_->cluster_.upstream_stats_->upstream_cx_destroy_local_with_active_rq_.value()); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_cancelled_.value()); + host_->cluster_.traffic_stats_->upstream_cx_destroy_local_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_cancelled_.value()); } TEST_F(RedisClientImplTest, ProtocolError) { @@ -698,7 +698,7 @@ TEST_F(RedisClientImplTest, ProtocolError) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_read_filter_->onData(fake_data, false); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_protocol_error_.value()); EXPECT_EQ(1UL, host_->stats_.rq_error_.value()); } @@ -720,7 +720,7 @@ TEST_F(RedisClientImplTest, ConnectFail) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -755,7 +755,7 @@ TEST_F(RedisClientImplTest, OutlierDisabled) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -778,7 +778,7 @@ TEST_F(RedisClientImplTest, ConnectTimeout) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); connect_or_op_timer_->invokeCallback(); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_connect_timeout_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -796,8 +796,8 @@ TEST_F(RedisClientImplTest, OpTimeout) { onConnected(); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_CALL(callbacks1, onResponse_(_)); EXPECT_CALL(*connect_or_op_timer_, disableTimer()); @@ -805,8 +805,8 @@ TEST_F(RedisClientImplTest, OpTimeout) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); respond(); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_CALL(*encoder_, encode(Ref(request1), _)); EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); @@ -821,10 +821,10 @@ TEST_F(RedisClientImplTest, OpTimeout) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); connect_or_op_timer_->invokeCallback(); - EXPECT_EQ(1UL, host_->cluster_.upstream_stats_->upstream_rq_timeout_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_timeout_.value()); EXPECT_EQ(1UL, host_->stats_.rq_timeout_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); } TEST_F(RedisClientImplTest, AskRedirection) { @@ -848,8 +848,8 @@ TEST_F(RedisClientImplTest, AskRedirection) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -905,8 +905,8 @@ TEST_F(RedisClientImplTest, MovedRedirection) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -962,8 +962,8 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -984,9 +984,9 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { callbacks_->onRespValue(std::move(response1)); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); // Test a truncated MOVED error response that cannot be parsed properly. Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); @@ -999,9 +999,9 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { callbacks_->onRespValue(std::move(response2)); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); })); upstream_read_filter_->onData(fake_data, false); @@ -1031,8 +1031,8 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -1051,9 +1051,9 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response1)); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); response2->type(Common::Redis::RespType::Error); @@ -1066,9 +1066,9 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response2)); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); })); upstream_read_filter_->onData(fake_data, false); @@ -1098,8 +1098,8 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.upstream_stats_->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -1117,9 +1117,9 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response1)); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); response2->type(Common::Redis::RespType::Error); @@ -1132,9 +1132,9 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response2)); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.upstream_stats_->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); })); upstream_read_filter_->onData(fake_data, false); diff --git a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc index 49dc9cd255d83..9ef89d3269a80 100644 --- a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc +++ b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc @@ -579,18 +579,18 @@ stat_prefix: foo recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_tx_bytes_total_.value()); + ->traffic_stats_->upstream_cx_tx_bytes_total_.value()); test_sessions_[0].recvDataFromUpstream("world2", 0, SOCKET_ERROR_MSG_SIZE); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_rx_bytes_total_.value()); + ->traffic_stats_->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_tx_errors_.value()); test_sessions_[0].recvDataFromUpstream("world2", SOCKET_ERROR_MSG_SIZE, 0); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_rx_bytes_total_.value()); + ->traffic_stats_->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -601,7 +601,7 @@ stat_prefix: foo recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(10 /*rx_bytes*/, 2 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_tx_bytes_total_.value()); + ->traffic_stats_->upstream_cx_tx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -677,7 +677,7 @@ stat_prefix: foo .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_none_healthy_.value()); + ->traffic_stats_->upstream_cx_none_healthy_.value()); } // No cluster at filter creation. @@ -785,7 +785,7 @@ stat_prefix: foo // This should hit the session circuit breaker. recvDataFromDownstream("10.0.0.2:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_overflow_.value()); + ->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); @@ -981,7 +981,7 @@ use_per_packet_load_balancing: true EXPECT_EQ(0, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(0, config_->stats().downstream_sess_active_.value()); EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_none_healthy_.value()); + ->traffic_stats_->upstream_cx_none_healthy_.value()); } // Verify that when on second packet no host is available, message is dropped. @@ -1006,7 +1006,7 @@ use_per_packet_load_balancing: true EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); EXPECT_EQ(0, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_none_healthy_.value()); + ->traffic_stats_->upstream_cx_none_healthy_.value()); EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); @@ -1014,7 +1014,7 @@ use_per_packet_load_balancing: true EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_none_healthy_.value()); + ->traffic_stats_->upstream_cx_none_healthy_.value()); } // Verify that all sessions for a host are removed when a host is removed. @@ -1118,7 +1118,7 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->upstream_stats_->upstream_cx_overflow_.value()); + ->traffic_stats_->upstream_cx_overflow_.value()); } // Make sure socket option is set correctly if use_original_src_ip is set in case of ipv6. diff --git a/test/integration/alpn_selection_integration_test.cc b/test/integration/alpn_selection_integration_test.cc index 5cb436295cb10..549742bc651e7 100644 --- a/test/integration/alpn_selection_integration_test.cc +++ b/test/integration/alpn_selection_integration_test.cc @@ -70,9 +70,9 @@ require_client_certificate: true TestUtility::loadFromYaml(yaml, tls_context); auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); } void createUpstreams() override { diff --git a/test/integration/base_integration_test.cc b/test/integration/base_integration_test.cc index 7ed1469f38a08..3a18bb1dc5c1c 100644 --- a/test/integration/base_integration_test.cc +++ b/test/integration/base_integration_test.cc @@ -129,9 +129,9 @@ BaseIntegrationTest::createUpstreamTlsContext(const FakeUpstreamConfig& upstream if (upstream_config.upstream_protocol_ != Http::CodecType::HTTP3) { auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); } else { envoy::extensions::transport_sockets::quic::v3::QuicDownstreamTransport quic_config; quic_config.mutable_downstream_tls_context()->MergeFrom(tls_context); @@ -510,9 +510,9 @@ void BaseIntegrationTest::createXdsUpstream() { auto cfg = std::make_unique( tls_context, factory_context_); - upstream_stats_store_ = std::make_unique(); + traffic_stats_store_ = std::make_unique(); auto context = std::make_unique( - std::move(cfg), context_manager_, *upstream_stats_store_, std::vector{}); + std::move(cfg), context_manager_, *traffic_stats_store_, std::vector{}); addFakeUpstream(std::move(context), Http::CodecType::HTTP2, /*autonomous_upstream=*/false); } xds_upstream_ = fake_upstreams_.back().get(); diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index 42f178017b84a..6e665b45c59a2 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -423,7 +423,7 @@ class BaseIntegrationTest : protected Logger::Loggable { void checkForMissingTagExtractionRules(); - std::unique_ptr upstream_stats_store_; + std::unique_ptr traffic_stats_store_; // Make sure the test server will be torn down after any fake client. // The test server owns the runtime, which is often accessed by client and diff --git a/test/integration/sds_dynamic_integration_test.cc b/test/integration/sds_dynamic_integration_test.cc index 64e4320b9d8b3..b625d12500273 100644 --- a/test/integration/sds_dynamic_integration_test.cc +++ b/test/integration/sds_dynamic_integration_test.cc @@ -602,9 +602,9 @@ class SdsDynamicDownstreamCertValidationContextTest : public SdsDynamicDownstrea auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); } void TearDown() override { diff --git a/test/integration/ssl_utility.cc b/test/integration/ssl_utility.cc index ffc7080e9744f..366912b05891d 100644 --- a/test/integration/ssl_utility.cc +++ b/test/integration/ssl_utility.cc @@ -133,10 +133,10 @@ createUpstreamSslContext(ContextManager& context_manager, Api::Api& api, bool us auto cfg = std::make_unique( tls_context, mock_factory_ctx); - static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); if (!use_http3) { return std::make_unique( - std::move(cfg), context_manager, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager, *traffic_stats_store, std::vector{}); } envoy::extensions::transport_sockets::quic::v3::QuicDownstreamTransport quic_config; quic_config.mutable_downstream_tls_context()->MergeFrom(tls_context); @@ -162,9 +162,9 @@ Network::DownstreamTransportSocketFactoryPtr createFakeUpstreamSslContext( auto cfg = std::make_unique( tls_context, factory_context); - static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager, *upstream_stats_store, std::vector{}); + std::move(cfg), context_manager, *traffic_stats_store, std::vector{}); } Network::Address::InstanceConstSharedPtr getSslAddress(const Network::Address::IpVersion& version, int port) { diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index 5cf5599d140ed..218493293d98f 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -113,9 +113,9 @@ Network::DownstreamTransportSocketFactoryPtr XfccIntegrationTest::createUpstream auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); return std::make_unique( - std::move(cfg), *context_manager_, *upstream_stats_store, std::vector{}); + std::move(cfg), *context_manager_, *traffic_stats_store, std::vector{}); } Network::ClientConnectionPtr XfccIntegrationTest::makeTcpClientConnection() { diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index bae54981ebd72..363033849b876 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -60,7 +60,7 @@ MockClusterInfo::MockClusterInfo() cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - upstream_stats_(stats_store_, upstream_stat_names_), + traffic_stats_(stats_store_, upstream_stat_names_), config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), @@ -98,7 +98,7 @@ MockClusterInfo::MockClusterInfo() .WillByDefault(ReturnPointee(&max_response_headers_count_)); ON_CALL(*this, maxRequestsPerConnection()) .WillByDefault(ReturnPointee(&max_requests_per_connection_)); - ON_CALL(*this, upstreamStats()).WillByDefault(ReturnRef(upstream_stats_)); + ON_CALL(*this, upstreamStats()).WillByDefault(ReturnRef(traffic_stats_)); ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 4cef9e43a1553..9b8a2c945281b 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -151,7 +151,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); - MOCK_METHOD(LazyInitStats&, upstreamStats, (), (const)); + MOCK_METHOD(LazyInitStats&, upstreamStats, (), (const)); MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); @@ -207,7 +207,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; - LazyInitStats upstream_stats_; + LazyInitStats traffic_stats_; ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; From 1c039f66091f7743cf5c91eee8dd119bab6714ef Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 10 Nov 2022 14:23:22 -0500 Subject: [PATCH 008/122] more renamings Signed-off-by: Xin Zhuang --- envoy/upstream/upstream.h | 2 +- source/common/conn_pool/conn_pool_base.cc | 44 ++++---- source/common/http/codec_client.cc | 2 +- source/common/http/codec_client.h | 2 +- source/common/http/conn_pool_base.cc | 8 +- source/common/http/conn_pool_base.h | 10 +- source/common/http/conn_pool_grid.cc | 2 +- source/common/http/http1/conn_pool.cc | 4 +- source/common/http/http2/conn_pool.cc | 2 +- source/common/http/http3/conn_pool.cc | 2 +- source/common/router/retry_state_impl.cc | 12 +- source/common/router/router.cc | 14 +-- source/common/router/upstream_codec_filter.cc | 4 +- source/common/router/upstream_request.cc | 12 +- source/common/tcp/conn_pool.cc | 10 +- source/common/tcp_proxy/tcp_proxy.cc | 10 +- .../common/upstream/cluster_manager_impl.cc | 6 +- source/common/upstream/conn_pool_map_impl.h | 2 +- .../upstream/health_checker_base_impl.cc | 2 +- .../common/upstream/thread_aware_lb_impl.cc | 2 +- source/common/upstream/upstream_impl.cc | 12 +- source/common/upstream/upstream_impl.h | 2 +- .../original_dst/original_dst_cluster.cc | 2 +- .../network/common/redis/client_impl.cc | 24 ++-- .../network/redis_proxy/conn_pool_impl.cc | 12 +- .../filters/udp/udp_proxy/udp_proxy_filter.cc | 10 +- .../stat_sinks/common/statsd/statsd.cc | 12 +- .../extensions/stat_sinks/hystrix/hystrix.cc | 2 +- test/common/conn_pool/conn_pool_base_test.cc | 20 ++-- test/common/router/retry_state_impl_test.cc | 58 +++++----- test/common/upstream/health_check_fuzz.cc | 6 +- .../upstream/health_checker_impl_test.cc | 106 +++++++++--------- test/common/upstream/upstream_impl_test.cc | 6 +- .../gcp_authn_filter_integration_test.cc | 2 +- .../stats_sinks/common/statsd/statsd_test.cc | 6 +- .../stats_sinks/hystrix/hystrix_test.cc | 6 +- test/integration/cds_integration_test.cc | 4 +- test/integration/integration_admin_test.cc | 4 +- test/integration/integration_test.cc | 2 +- test/integration/xfcc_integration_test.cc | 6 +- test/mocks/upstream/cluster_info.cc | 2 +- test/mocks/upstream/cluster_info.h | 2 +- 42 files changed, 229 insertions(+), 229 deletions(-) diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 49d8025627655..3c96f2dc12a65 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -1049,7 +1049,7 @@ class ClusterInfo : public Http::FilterChainFactory { /** * @return ClusterTrafficStats& strongly named stats for this cluster. */ - virtual LazyInitStats& upstreamStats() const PURE; + virtual LazyInitStats& trafficStats() const PURE; /** * @return the stats scope that contains all cluster stats. This can be used to produce dynamic diff --git a/source/common/conn_pool/conn_pool_base.cc b/source/common/conn_pool/conn_pool_base.cc index ffe058060b041..e2d308ca4ad89 100644 --- a/source/common/conn_pool/conn_pool_base.cc +++ b/source/common/conn_pool/conn_pool_base.cc @@ -135,7 +135,7 @@ ConnPoolImplBase::tryCreateNewConnection(float global_preconnect_ratio) { const bool can_create_connection = host_->canCreateConnection(priority_); if (!can_create_connection) { - host_->cluster().upstreamStats()->upstream_cx_overflow_.inc(); + host_->cluster().trafficStats()->upstream_cx_overflow_.inc(); } // If we are at the connection circuit-breaker limit due to other upstreams having // too many open connections, and this upstream has no connections, always create one, to @@ -168,14 +168,14 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& ASSERT(client.readyForStream()); if (client.state() == Envoy::ConnectionPool::ActiveClient::State::ReadyForEarlyData) { - host_->cluster().upstreamStats()->upstream_rq_0rtt_.inc(); + host_->cluster().trafficStats()->upstream_rq_0rtt_.inc(); } if (enforceMaxRequests() && !host_->cluster().resourceManager(priority_).requests().canCreate()) { ENVOY_LOG(debug, "max streams overflow"); onPoolFailure(client.real_host_description_, absl::string_view(), ConnectionPool::PoolFailureReason::Overflow, context); - host_->cluster().upstreamStats()->upstream_rq_pending_overflow_.inc(); + host_->cluster().trafficStats()->upstream_rq_pending_overflow_.inc(); return; } ENVOY_CONN_LOG(debug, "creating stream", client); @@ -185,7 +185,7 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& client.remaining_streams_--; if (client.remaining_streams_ == 0) { ENVOY_CONN_LOG(debug, "maximum streams per connection, start draining", client); - host_->cluster().upstreamStats()->upstream_cx_max_requests_.inc(); + host_->cluster().trafficStats()->upstream_cx_max_requests_.inc(); transitionActiveClientState(client, Envoy::ConnectionPool::ActiveClient::State::Draining); } else if (capacity == 1) { // As soon as the new stream is created, the client will be maxed out. @@ -202,8 +202,8 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& num_active_streams_++; host_->stats().rq_total_.inc(); host_->stats().rq_active_.inc(); - host_->cluster().upstreamStats()->upstream_rq_total_.inc(); - host_->cluster().upstreamStats()->upstream_rq_active_.inc(); + host_->cluster().trafficStats()->upstream_rq_total_.inc(); + host_->cluster().trafficStats()->upstream_rq_active_.inc(); host_->cluster().resourceManager(priority_).requests().inc(); onPoolReady(client, context); @@ -216,7 +216,7 @@ void ConnPoolImplBase::onStreamClosed(Envoy::ConnectionPool::ActiveClient& clien state_.decrActiveStreams(1); num_active_streams_--; host_->stats().rq_active_.dec(); - host_->cluster().upstreamStats()->upstream_rq_active_.dec(); + host_->cluster().trafficStats()->upstream_rq_active_.dec(); host_->cluster().resourceManager(priority_).requests().dec(); // We don't update the capacity for HTTP/3 as the stream count should only // increase when a MAX_STREAMS frame is received. @@ -282,7 +282,7 @@ ConnectionPool::Cancellable* ConnPoolImplBase::newStreamImpl(AttachContext& cont ENVOY_LOG(debug, "max pending streams overflow"); onPoolFailure(nullptr, absl::string_view(), ConnectionPool::PoolFailureReason::Overflow, context); - host_->cluster().upstreamStats()->upstream_rq_pending_overflow_.inc(); + host_->cluster().trafficStats()->upstream_rq_pending_overflow_.inc(); return nullptr; } @@ -490,7 +490,7 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view if (!client.hasHandshakeCompleted()) { client.has_handshake_completed_ = true; - host_->cluster().upstreamStats()->upstream_cx_connect_fail_.inc(); + host_->cluster().trafficStats()->upstream_cx_connect_fail_.inc(); host_->stats().cx_connect_fail_.inc(); onConnectFailed(client); @@ -595,7 +595,7 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view client.currentUnusedCapacity()); // No need to update connecting capacity and connect_timer_ as the client is still connecting. ASSERT(client.state() == ActiveClient::State::Connecting); - host()->cluster().upstreamStats()->upstream_cx_connect_with_0_rtt_.inc(); + host()->cluster().trafficStats()->upstream_cx_connect_with_0_rtt_.inc(); transitionActiveClientState(client, (client.currentUnusedCapacity() > 0 ? ActiveClient::State::ReadyForEarlyData : ActiveClient::State::Busy)); @@ -606,13 +606,13 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view PendingStream::PendingStream(ConnPoolImplBase& parent, bool can_send_early_data) : parent_(parent), can_send_early_data_(can_send_early_data) { - parent_.host()->cluster().upstreamStats()->upstream_rq_pending_total_.inc(); - parent_.host()->cluster().upstreamStats()->upstream_rq_pending_active_.inc(); + parent_.host()->cluster().trafficStats()->upstream_rq_pending_total_.inc(); + parent_.host()->cluster().trafficStats()->upstream_rq_pending_active_.inc(); parent_.host()->cluster().resourceManager(parent_.priority()).pendingRequests().inc(); } PendingStream::~PendingStream() { - parent_.host()->cluster().upstreamStats()->upstream_rq_pending_active_.dec(); + parent_.host()->cluster().trafficStats()->upstream_rq_pending_active_.dec(); parent_.host()->cluster().resourceManager(parent_.priority()).pendingRequests().dec(); } @@ -630,7 +630,7 @@ void ConnPoolImplBase::purgePendingStreams( while (!pending_streams_to_purge_.empty()) { PendingStreamPtr stream = pending_streams_to_purge_.front()->removeFromList(pending_streams_to_purge_); - host_->cluster().upstreamStats()->upstream_rq_pending_failure_eject_.inc(); + host_->cluster().trafficStats()->upstream_rq_pending_failure_eject_.inc(); onPoolFailure(host_description, failure_reason, reason, stream->context()); } } @@ -683,7 +683,7 @@ void ConnPoolImplBase::onPendingStreamCancel(PendingStream& stream, } } - host_->cluster().upstreamStats()->upstream_rq_cancelled_.inc(); + host_->cluster().trafficStats()->upstream_rq_cancelled_.inc(); checkForIdleAndCloseIdleConnsIfDraining(); } @@ -757,16 +757,16 @@ ActiveClient::ActiveClient(ConnPoolImplBase& parent, uint32_t lifetime_stream_li concurrent_stream_limit_(translateZeroToUnlimited(concurrent_stream_limit)), connect_timer_(parent_.dispatcher().createTimer([this]() { onConnectTimeout(); })) { conn_connect_ms_ = std::make_unique( - parent_.host()->cluster().upstreamStats()->upstream_cx_connect_ms_, + parent_.host()->cluster().trafficStats()->upstream_cx_connect_ms_, parent_.dispatcher().timeSource()); conn_length_ = std::make_unique( - parent_.host()->cluster().upstreamStats()->upstream_cx_length_ms_, + parent_.host()->cluster().trafficStats()->upstream_cx_length_ms_, parent_.dispatcher().timeSource()); connect_timer_->enableTimer(parent_.host()->cluster().connectTimeout()); parent_.host()->stats().cx_total_.inc(); parent_.host()->stats().cx_active_.inc(); - parent_.host()->cluster().upstreamStats()->upstream_cx_total_.inc(); - parent_.host()->cluster().upstreamStats()->upstream_cx_active_.inc(); + parent_.host()->cluster().trafficStats()->upstream_cx_total_.inc(); + parent_.host()->cluster().trafficStats()->upstream_cx_active_.inc(); parent_.host()->cluster().resourceManager(parent_.priority()).connections().inc(); } @@ -778,7 +778,7 @@ void ActiveClient::releaseResourcesBase() { conn_length_->complete(); - parent_.host()->cluster().upstreamStats()->upstream_cx_active_.dec(); + parent_.host()->cluster().trafficStats()->upstream_cx_active_.dec(); parent_.host()->stats().cx_active_.dec(); parent_.host()->cluster().resourceManager(parent_.priority()).connections().dec(); } @@ -786,7 +786,7 @@ void ActiveClient::releaseResourcesBase() { void ActiveClient::onConnectTimeout() { ENVOY_CONN_LOG(debug, "connect timeout", *this); - parent_.host()->cluster().upstreamStats()->upstream_cx_connect_timeout_.inc(); + parent_.host()->cluster().trafficStats()->upstream_cx_connect_timeout_.inc(); timed_out_ = true; close(); } @@ -811,7 +811,7 @@ void ActiveClient::onConnectionDurationTimeout() { } ENVOY_CONN_LOG(debug, "max connection duration reached, start draining", *this); - parent_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.inc(); + parent_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.inc(); parent_.transitionActiveClientState(*this, Envoy::ConnectionPool::ActiveClient::State::Draining); // Close out the draining client if we no longer have active streams. diff --git a/source/common/http/codec_client.cc b/source/common/http/codec_client.cc index a51222f852f05..4369f94909094 100644 --- a/source/common/http/codec_client.cc +++ b/source/common/http/codec_client.cc @@ -171,7 +171,7 @@ void CodecClient::onData(Buffer::Instance& data) { if (!isPrematureResponseError(status) || (!active_requests_.empty() || getPrematureResponseHttpCode(status) != Code::RequestTimeout)) { - host_->cluster().upstreamStats()->upstream_cx_protocol_error_.inc(); + host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); protocol_error_ = true; } close(); diff --git a/source/common/http/codec_client.h b/source/common/http/codec_client.h index 8aafbf25c65ca..65c3d9715f849 100644 --- a/source/common/http/codec_client.h +++ b/source/common/http/codec_client.h @@ -164,7 +164,7 @@ class CodecClient : protected Logger::Loggable, } void onIdleTimeout() { - host_->cluster().upstreamStats()->upstream_cx_idle_timeout_.inc(); + host_->cluster().trafficStats()->upstream_cx_idle_timeout_.inc(); close(); } diff --git a/source/common/http/conn_pool_base.cc b/source/common/http/conn_pool_base.cc index f91401bd12237..afec14e51bf9b 100644 --- a/source/common/http/conn_pool_base.cc +++ b/source/common/http/conn_pool_base.cc @@ -99,7 +99,7 @@ static const uint64_t DEFAULT_MAX_STREAMS = (1 << 29); void MultiplexedActiveClientBase::onGoAway(Http::GoAwayErrorCode) { ENVOY_CONN_LOG(debug, "remote goaway", *codec_client_); - parent_.host()->cluster().upstreamStats()->upstream_cx_close_notify_.inc(); + parent_.host()->cluster().trafficStats()->upstream_cx_close_notify_.inc(); if (state() != ActiveClient::State::Draining) { if (codec_client_->numActiveRequests() == 0) { codec_client_->close(); @@ -160,16 +160,16 @@ void MultiplexedActiveClientBase::onStreamReset(Http::StreamResetReason reason) switch (reason) { case StreamResetReason::ConnectionTermination: case StreamResetReason::ConnectionFailure: - parent_.host()->cluster().upstreamStats()->upstream_rq_pending_failure_eject_.inc(); + parent_.host()->cluster().trafficStats()->upstream_rq_pending_failure_eject_.inc(); closed_with_active_rq_ = true; break; case StreamResetReason::LocalReset: case StreamResetReason::ProtocolError: case StreamResetReason::OverloadManager: - parent_.host()->cluster().upstreamStats()->upstream_rq_tx_reset_.inc(); + parent_.host()->cluster().trafficStats()->upstream_rq_tx_reset_.inc(); break; case StreamResetReason::RemoteReset: - parent_.host()->cluster().upstreamStats()->upstream_rq_rx_reset_.inc(); + parent_.host()->cluster().trafficStats()->upstream_rq_rx_reset_.inc(); break; case StreamResetReason::LocalRefusedStreamReset: case StreamResetReason::RemoteRefusedStreamReset: diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index 1c740f9706b57..efbd58216fcb1 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -129,11 +129,11 @@ class ActiveClient : public Envoy::ConnectionPool::ActiveClient { codec_client_ = parent.createCodecClient(data); codec_client_->addConnectionCallbacks(*this); codec_client_->setConnectionStats( - {parent_.host()->cluster().upstreamStats()->upstream_cx_rx_bytes_total_, - parent_.host()->cluster().upstreamStats()->upstream_cx_rx_bytes_buffered_, - parent_.host()->cluster().upstreamStats()->upstream_cx_tx_bytes_total_, - parent_.host()->cluster().upstreamStats()->upstream_cx_tx_bytes_buffered_, - &parent_.host()->cluster().upstreamStats()->bind_errors_, nullptr}); + {parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_total_, + parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, + parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_total_, + parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, + &parent_.host()->cluster().trafficStats()->bind_errors_, nullptr}); } absl::optional protocol() const override { return codec_client_->protocol(); } diff --git a/source/common/http/conn_pool_grid.cc b/source/common/http/conn_pool_grid.cc index 40919fd245fb1..1e6e6cf3419d0 100644 --- a/source/common/http/conn_pool_grid.cc +++ b/source/common/http/conn_pool_grid.cc @@ -382,7 +382,7 @@ HttpServerPropertiesCache::Http3StatusTracker& ConnectivityGrid::getHttp3StatusT bool ConnectivityGrid::isHttp3Broken() const { return getHttp3StatusTracker().isHttp3Broken(); } void ConnectivityGrid::markHttp3Broken() { - host_->cluster().upstreamStats()->upstream_http3_broken_.inc(); + host_->cluster().trafficStats()->upstream_http3_broken_.inc(); getHttp3StatusTracker().markHttp3Broken(); } diff --git a/source/common/http/http1/conn_pool.cc b/source/common/http/http1/conn_pool.cc index 485a265fc0465..0439641c472f2 100644 --- a/source/common/http/http1/conn_pool.cc +++ b/source/common/http/http1/conn_pool.cc @@ -42,7 +42,7 @@ void ActiveClient::StreamWrapper::decodeHeaders(ResponseHeaderMapPtr&& headers, close_connection_ = HeaderUtility::shouldCloseConnection(parent_.codec_client_->protocol(), *headers); if (close_connection_) { - parent_.parent().host()->cluster().upstreamStats()->upstream_cx_close_notify_.inc(); + parent_.parent().host()->cluster().trafficStats()->upstream_cx_close_notify_.inc(); } ResponseDecoderWrapper::decodeHeaders(std::move(headers), end_stream); } @@ -76,7 +76,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, : Envoy::Http::ActiveClient(parent, parent.host()->cluster().maxRequestsPerConnection(), /* effective_concurrent_stream_limit */ 1, /* configured_concurrent_stream_limit */ 1, data) { - parent.host()->cluster().upstreamStats()->upstream_cx_http1_total_.inc(); + parent.host()->cluster().trafficStats()->upstream_cx_http1_total_.inc(); } ActiveClient::~ActiveClient() { ASSERT(!stream_wrapper_.get()); } diff --git a/source/common/http/http2/conn_pool.cc b/source/common/http/http2/conn_pool.cc index 6f483f37e32ed..865f0f0d6dcc2 100644 --- a/source/common/http/http2/conn_pool.cc +++ b/source/common/http/http2/conn_pool.cc @@ -45,7 +45,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, : MultiplexedActiveClientBase( parent, calculateInitialStreamsLimit(parent.cache(), parent.origin(), parent.host()), parent.host()->cluster().http2Options().max_concurrent_streams().value(), - parent.host()->cluster().upstreamStats()->upstream_cx_http2_total_, data) {} + parent.host()->cluster().trafficStats()->upstream_cx_http2_total_, data) {} ConnectionPool::InstancePtr allocateConnPool(Event::Dispatcher& dispatcher, Random::RandomGenerator& random_generator, diff --git a/source/common/http/http3/conn_pool.cc b/source/common/http/http3/conn_pool.cc index 764d388aff2a7..ea7d365601386 100644 --- a/source/common/http/http3/conn_pool.cc +++ b/source/common/http/http3/conn_pool.cc @@ -41,7 +41,7 @@ ActiveClient::ActiveClient(Envoy::Http::HttpConnPoolImplBase& parent, Upstream::Host::CreateConnectionData& data) : MultiplexedActiveClientBase( parent, getMaxStreams(parent.host()->cluster()), getMaxStreams(parent.host()->cluster()), - parent.host()->cluster().upstreamStats()->upstream_cx_http3_total_, data), + parent.host()->cluster().trafficStats()->upstream_cx_http3_total_, data), async_connect_callback_(parent_.dispatcher().createSchedulableCallback([this]() { if (state() != Envoy::ConnectionPool::ActiveClient::State::Connecting) { return; diff --git a/source/common/router/retry_state_impl.cc b/source/common/router/retry_state_impl.cc index 3f9a0d9a8c639..f45144832f629 100644 --- a/source/common/router/retry_state_impl.cc +++ b/source/common/router/retry_state_impl.cc @@ -185,13 +185,13 @@ void RetryStateImpl::enableBackoffTimer() { // be reused. ratelimited_backoff_strategy_.reset(); - cluster_.upstreamStats()->upstream_rq_retry_backoff_ratelimited_.inc(); + cluster_.trafficStats()->upstream_rq_retry_backoff_ratelimited_.inc(); } else { // Otherwise we use a fully jittered exponential backoff algorithm. retry_timer_->enableTimer(std::chrono::milliseconds(backoff_strategy_->nextBackOffMs())); - cluster_.upstreamStats()->upstream_rq_retry_backoff_exponential_.inc(); + cluster_.trafficStats()->upstream_rq_retry_backoff_exponential_.inc(); } } @@ -277,7 +277,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba // retry this particular request, we can infer that we did a retry earlier // and it was successful. if ((backoff_callback_ || next_loop_callback_) && would_retry == RetryDecision::NoRetry) { - cluster_.upstreamStats()->upstream_rq_retry_success_.inc(); + cluster_.trafficStats()->upstream_rq_retry_success_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_success_.inc(); } @@ -295,7 +295,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba // The request has exhausted the number of retries allotted to it by the retry policy configured // (or the x-envoy-max-retries header). if (retries_remaining_ == 0) { - cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.inc(); + cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_limit_exceeded_.inc(); } @@ -308,7 +308,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba retries_remaining_--; if (!cluster_.resourceManager(priority_).retries().canCreate()) { - cluster_.upstreamStats()->upstream_rq_retry_overflow_.inc(); + cluster_.trafficStats()->upstream_rq_retry_overflow_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_overflow_.inc(); } @@ -324,7 +324,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba ASSERT(!backoff_callback_ && !next_loop_callback_); cluster_.resourceManager(priority_).retries().inc(); - cluster_.upstreamStats()->upstream_rq_retry_.inc(); + cluster_.trafficStats()->upstream_rq_retry_.inc(); if (vcluster_) { vcluster_->stats().upstream_rq_retry_.inc(); } diff --git a/source/common/router/router.cc b/source/common/router/router.cc index 6ce468452d685..ad95d17026133 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -509,7 +509,7 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::RequestHeaderMap& headers, modify_headers(headers); }, absl::nullopt, StreamInfo::ResponseCodeDetails::get().MaintenanceMode); - cluster_->upstreamStats()->upstream_rq_maintenance_mode_.inc(); + cluster_->trafficStats()->upstream_rq_maintenance_mode_.inc(); return Http::FilterHeadersStatus::StopIteration; } @@ -754,7 +754,7 @@ Http::FilterDataStatus Filter::decodeData(Buffer::Instance& data, bool end_strea "The request payload has at least {} bytes data which exceeds buffer limit {}. Give " "up on the retry/shadow.", getLength(callbacks_->decodingBuffer()) + data.length(), retry_shadow_buffer_limit_); - cluster_->upstreamStats()->retry_or_shadow_abandoned_.inc(); + cluster_->trafficStats()->retry_or_shadow_abandoned_.inc(); retry_state_.reset(); buffering = false; active_shadow_policies_.clear(); @@ -956,7 +956,7 @@ void Filter::onResponseTimeout() { if (Runtime::runtimeFeatureEnabled( "envoy.reloadable_features.do_not_await_headers_on_upstream_timeout_to_emit_stats") || upstream_request->awaitingHeaders()) { - cluster_->upstreamStats()->upstream_rq_timeout_.inc(); + cluster_->trafficStats()->upstream_rq_timeout_.inc(); if (request_vcluster_) { request_vcluster_->stats().upstream_rq_timeout_.inc(); } @@ -1031,12 +1031,12 @@ void Filter::onSoftPerTryTimeout(UpstreamRequest& upstream_request) { void Filter::onPerTryIdleTimeout(UpstreamRequest& upstream_request) { onPerTryTimeoutCommon(upstream_request, - cluster_->upstreamStats()->upstream_rq_per_try_idle_timeout_, + cluster_->trafficStats()->upstream_rq_per_try_idle_timeout_, StreamInfo::ResponseCodeDetails::get().UpstreamPerTryIdleTimeout); } void Filter::onPerTryTimeout(UpstreamRequest& upstream_request) { - onPerTryTimeoutCommon(upstream_request, cluster_->upstreamStats()->upstream_rq_per_try_timeout_, + onPerTryTimeoutCommon(upstream_request, cluster_->trafficStats()->upstream_rq_per_try_timeout_, StreamInfo::ResponseCodeDetails::get().UpstreamPerTryTimeout); } @@ -1625,7 +1625,7 @@ bool Filter::setupRedirect(const Http::ResponseHeaderMap& headers) { convertRequestHeadersForInternalRedirect(*downstream_headers_, *location, status_code) && callbacks_->recreateStream(&headers)) { ENVOY_STREAM_LOG(debug, "Internal redirect succeeded", *callbacks_); - cluster_->upstreamStats()->upstream_internal_redirect_succeeded_total_.inc(); + cluster_->trafficStats()->upstream_internal_redirect_succeeded_total_.inc(); return true; } // convertRequestHeadersForInternalRedirect logs failure reasons but log @@ -1638,7 +1638,7 @@ bool Filter::setupRedirect(const Http::ResponseHeaderMap& headers) { ENVOY_STREAM_LOG(trace, "Internal redirect failed: missing location header", *callbacks_); } - cluster_->upstreamStats()->upstream_internal_redirect_failed_total_.inc(); + cluster_->trafficStats()->upstream_internal_redirect_failed_total_.inc(); return false; } diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index 4a464196c0cac..df00ef8813da6 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -28,12 +28,12 @@ namespace Envoy { namespace Router { void UpstreamCodecFilter::onBelowWriteBufferLowWatermark() { - callbacks_->clusterInfo()->upstreamStats()->upstream_flow_control_resumed_reading_total_.inc(); + callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); callbacks_->upstreamCallbacks()->upstream()->readDisable(false); } void UpstreamCodecFilter::onAboveWriteBufferHighWatermark() { - callbacks_->clusterInfo()->upstreamStats()->upstream_flow_control_paused_reading_total_.inc(); + callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); callbacks_->upstreamCallbacks()->upstream()->readDisable(true); } diff --git a/source/common/router/upstream_request.cc b/source/common/router/upstream_request.cc index 7f1a8d2a2fef1..6079d350d61e5 100644 --- a/source/common/router/upstream_request.cc +++ b/source/common/router/upstream_request.cc @@ -197,7 +197,7 @@ void UpstreamRequest::cleanUp() { while (downstream_data_disabled_ != 0) { parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); - parent_.cluster()->upstreamStats()->upstream_flow_control_drained_total_.inc(); + parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); --downstream_data_disabled_; } if (allow_upstream_filters_) { @@ -753,7 +753,7 @@ UpstreamToDownstream& UpstreamRequest::upstreamToDownstream() { } void UpstreamRequest::onStreamMaxDurationReached() { - upstream_host_->cluster().upstreamStats()->upstream_rq_max_duration_reached_.inc(); + upstream_host_->cluster().trafficStats()->upstream_rq_max_duration_reached_.inc(); // The upstream had closed then try to retry along with retry policy. parent_.onStreamMaxDurationReached(*this); @@ -780,7 +780,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onAboveWriteBufferHighWatermar // The downstream connection is overrun. Pause reads from upstream. // If there are multiple calls to readDisable either the codec (H2) or the underlying // Network::Connection (H1) will handle reference counting. - parent_.parent_.cluster()->upstreamStats()->upstream_flow_control_paused_reading_total_.inc(); + parent_.parent_.cluster()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); parent_.upstream_->readDisable(true); } @@ -789,7 +789,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onBelowWriteBufferLowWatermark // One source of connection blockage has buffer available. Pass this on to the stream, which // will resume reads if this was the last remaining high watermark. - parent_.parent_.cluster()->upstreamStats()->upstream_flow_control_resumed_reading_total_.inc(); + parent_.parent_.cluster()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); parent_.upstream_->readDisable(false); } @@ -804,7 +804,7 @@ void UpstreamRequest::disableDataFromDownstreamForFlowControl() { // the per try timeout timer is started only after downstream_end_stream_ // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); - parent_.cluster()->upstreamStats()->upstream_flow_control_backed_up_total_.inc(); + parent_.cluster()->trafficStats()->upstream_flow_control_backed_up_total_.inc(); parent_.callbacks()->onDecoderFilterAboveWriteBufferHighWatermark(); ++downstream_data_disabled_; } @@ -820,7 +820,7 @@ void UpstreamRequest::enableDataFromDownstreamForFlowControl() { // the per try timeout timer is started only after downstream_end_stream_ // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); - parent_.cluster()->upstreamStats()->upstream_flow_control_drained_total_.inc(); + parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); ASSERT(downstream_data_disabled_ != 0); if (downstream_data_disabled_ > 0) { diff --git a/source/common/tcp/conn_pool.cc b/source/common/tcp/conn_pool.cc index 82c1dab79344a..b39da30b61a90 100644 --- a/source/common/tcp/conn_pool.cc +++ b/source/common/tcp/conn_pool.cc @@ -25,11 +25,11 @@ ActiveTcpClient::ActiveTcpClient(Envoy::ConnectionPool::ConnPoolImplBase& parent connection_->addConnectionCallbacks(*this); read_filter_handle_ = std::make_shared(*this); connection_->addReadFilter(read_filter_handle_); - connection_->setConnectionStats({host->cluster().upstreamStats()->upstream_cx_rx_bytes_total_, - host->cluster().upstreamStats()->upstream_cx_rx_bytes_buffered_, - host->cluster().upstreamStats()->upstream_cx_tx_bytes_total_, - host->cluster().upstreamStats()->upstream_cx_tx_bytes_buffered_, - &host->cluster().upstreamStats()->bind_errors_, nullptr}); + connection_->setConnectionStats({host->cluster().trafficStats()->upstream_cx_rx_bytes_total_, + host->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, + host->cluster().trafficStats()->upstream_cx_tx_bytes_total_, + host->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, + &host->cluster().trafficStats()->bind_errors_, nullptr}); connection_->noDelay(true); connection_->connect(); } diff --git a/source/common/tcp_proxy/tcp_proxy.cc b/source/common/tcp_proxy/tcp_proxy.cc index 78331418f5292..385a45a6c86d1 100644 --- a/source/common/tcp_proxy/tcp_proxy.cc +++ b/source/common/tcp_proxy/tcp_proxy.cc @@ -234,12 +234,12 @@ void Filter::readDisableUpstream(bool disable) { if (disable) { read_callbacks_->upstreamHost() ->cluster() - .upstreamStats() + .trafficStats() ->upstream_flow_control_paused_reading_total_.inc(); } else { read_callbacks_->upstreamHost() ->cluster() - .upstreamStats() + .trafficStats() ->upstream_flow_control_resumed_reading_total_.inc(); } } @@ -377,7 +377,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { // will never be released. if (!cluster->resourceManager(Upstream::ResourcePriority::Default).connections().canCreate()) { getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::UpstreamOverflow); - cluster->upstreamStats()->upstream_cx_overflow_.inc(); + cluster->trafficStats()->upstream_cx_overflow_.inc(); onInitFailure(UpstreamFailureReason::ResourceLimitExceeded); return Network::FilterStatus::StopIteration; } @@ -385,7 +385,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { const uint32_t max_connect_attempts = config_->maxConnectAttempts(); if (connect_attempts_ >= max_connect_attempts) { getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::UpstreamRetryLimitExceeded); - cluster->upstreamStats()->upstream_cx_connect_attempts_exceeded_.inc(); + cluster->trafficStats()->upstream_cx_connect_attempts_exceeded_.inc(); onInitFailure(UpstreamFailureReason::ConnectFailed); return Network::FilterStatus::StopIteration; } @@ -417,7 +417,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { if (!maybeTunnel(*thread_local_cluster)) { // Either cluster is unknown or there are no healthy hosts. tcpConnPool() increments - // cluster->upstreamStats()->upstream_cx_none_healthy in the latter case. + // cluster->trafficStats()->upstream_cx_none_healthy in the latter case. getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::NoHealthyUpstream); onInitFailure(UpstreamFailureReason::NoHealthyUpstream); } diff --git a/source/common/upstream/cluster_manager_impl.cc b/source/common/upstream/cluster_manager_impl.cc index 8da252fcdc90a..a3e649f27ac3b 100644 --- a/source/common/upstream/cluster_manager_impl.cc +++ b/source/common/upstream/cluster_manager_impl.cc @@ -1153,7 +1153,7 @@ Host::CreateConnectionData ClusterManagerImpl::ThreadLocalClusterManagerImpl::Cl } return conn_info; } else { - cluster_info_->upstreamStats()->upstream_cx_none_healthy_.inc(); + cluster_info_->trafficStats()->upstream_cx_none_healthy_.inc(); return {nullptr, nullptr}; } } @@ -1624,7 +1624,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::httpConnPoolImp if (!host) { if (!peek) { ENVOY_LOG(debug, "no healthy host for HTTP connection pool"); - cluster_info_->upstreamStats()->upstream_cx_none_healthy_.inc(); + cluster_info_->trafficStats()->upstream_cx_none_healthy_.inc(); } return nullptr; } @@ -1731,7 +1731,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::tcpConnPoolImpl if (!host) { if (!peek) { ENVOY_LOG(debug, "no healthy host for TCP connection pool"); - cluster_info_->upstreamStats()->upstream_cx_none_healthy_.inc(); + cluster_info_->trafficStats()->upstream_cx_none_healthy_.inc(); } return nullptr; } diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index 83012f811660d..d4360858b58d1 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -35,7 +35,7 @@ ConnPoolMap::getPool(const KEY_TYPE& key, const PoolFactory if (!connPoolResource.canCreate()) { // We're full. Try to free up a pool. If we can't, bail out. if (!freeOnePool()) { - host_->cluster().upstreamStats()->upstream_cx_pool_overflow_.inc(); + host_->cluster().trafficStats()->upstream_cx_pool_overflow_.inc(); return absl::nullopt; } diff --git a/source/common/upstream/health_checker_base_impl.cc b/source/common/upstream/health_checker_base_impl.cc index ea8eaf5796364..4eff06ebd3487 100644 --- a/source/common/upstream/health_checker_base_impl.cc +++ b/source/common/upstream/health_checker_base_impl.cc @@ -105,7 +105,7 @@ std::chrono::milliseconds HealthCheckerImplBase::interval(HealthState state, // If a connection has been established, we choose an interval based on the host's health. Please // refer to the HealthCheck API documentation for more details. uint64_t base_time_ms; - if (cluster_.info()->upstreamStats()->upstream_cx_total_.used()) { + if (cluster_.info()->trafficStats()->upstream_cx_total_.used()) { // When healthy/unhealthy threshold is configured the health transition of a host will be // delayed. In this situation Envoy should use the edge interval settings between health checks. // diff --git a/source/common/upstream/thread_aware_lb_impl.cc b/source/common/upstream/thread_aware_lb_impl.cc index 99d5191feacf2..b5d802e7ec5a5 100644 --- a/source/common/upstream/thread_aware_lb_impl.cc +++ b/source/common/upstream/thread_aware_lb_impl.cc @@ -197,7 +197,7 @@ double ThreadAwareLoadBalancerBase::BoundedLoadHashingLoadBalancer::hostOverload // TODO(scheler): This will not work if rq_active cluster stat is disabled, need to detect // and alert the user if that's the case. - const uint32_t overall_active = host.cluster().upstreamStats()->upstream_rq_active_.value(); + const uint32_t overall_active = host.cluster().trafficStats()->upstream_rq_active_.value(); const uint32_t host_active = host.stats().rq_active_.value(); const uint32_t total_slots = ((overall_active + 1) * hash_balance_factor_ + 99) / 100; diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index b65ec9b0fd370..c2aa9b9d3df33 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -2060,21 +2060,21 @@ getDnsLookupFamilyFromCluster(const envoy::config::cluster::v3::Cluster& cluster void reportUpstreamCxDestroy(const Upstream::HostDescriptionConstSharedPtr& host, Network::ConnectionEvent event) { - host->cluster().upstreamStats()->upstream_cx_destroy_.inc(); + host->cluster().trafficStats()->upstream_cx_destroy_.inc(); if (event == Network::ConnectionEvent::RemoteClose) { - host->cluster().upstreamStats()->upstream_cx_destroy_remote_.inc(); + host->cluster().trafficStats()->upstream_cx_destroy_remote_.inc(); } else { - host->cluster().upstreamStats()->upstream_cx_destroy_local_.inc(); + host->cluster().trafficStats()->upstream_cx_destroy_local_.inc(); } } void reportUpstreamCxDestroyActiveRequest(const Upstream::HostDescriptionConstSharedPtr& host, Network::ConnectionEvent event) { - host->cluster().upstreamStats()->upstream_cx_destroy_with_active_rq_.inc(); + host->cluster().trafficStats()->upstream_cx_destroy_with_active_rq_.inc(); if (event == Network::ConnectionEvent::RemoteClose) { - host->cluster().upstreamStats()->upstream_cx_destroy_remote_with_active_rq_.inc(); + host->cluster().trafficStats()->upstream_cx_destroy_remote_with_active_rq_.inc(); } else { - host->cluster().upstreamStats()->upstream_cx_destroy_local_with_active_rq_.inc(); + host->cluster().trafficStats()->upstream_cx_destroy_local_with_active_rq_.inc(); } } diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index ab512231a7472..90faa47946182 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -791,7 +791,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - LazyInitStats& upstreamStats() const override { return traffic_stats_; } + LazyInitStats& trafficStats() const override { return traffic_stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } diff --git a/source/extensions/clusters/original_dst/original_dst_cluster.cc b/source/extensions/clusters/original_dst/original_dst_cluster.cc index 7b3467f984128..fe10a85649a5f 100644 --- a/source/extensions/clusters/original_dst/original_dst_cluster.cc +++ b/source/extensions/clusters/original_dst/original_dst_cluster.cc @@ -124,7 +124,7 @@ OriginalDstCluster::LoadBalancer::requestOverrideHost(LoadBalancerContext* conte if (request_host == nullptr) { ENVOY_LOG(debug, "original_dst_load_balancer: invalid override header value. {}", request_override_host); - parent_->info()->upstreamStats()->original_dst_host_invalid_.inc(); + parent_->info()->trafficStats()->original_dst_host_invalid_.inc(); return nullptr; } ENVOY_LOG(debug, "Using request override host {}.", request_override_host); diff --git a/source/extensions/filters/network/common/redis/client_impl.cc b/source/extensions/filters/network/common/redis/client_impl.cc index 630ebd298c2e4..5bf5b690d082f 100644 --- a/source/extensions/filters/network/common/redis/client_impl.cc +++ b/source/extensions/filters/network/common/redis/client_impl.cc @@ -77,9 +77,9 @@ ClientImpl::ClientImpl(Upstream::HostConstSharedPtr host, Event::Dispatcher& dis flush_timer_(dispatcher.createTimer([this]() { flushBufferAndResetTimer(); })), time_source_(dispatcher.timeSource()), redis_command_stats_(redis_command_stats), scope_(scope), is_transaction_client_(is_transaction_client) { - host->cluster().upstreamStats()->upstream_cx_total_.inc(); + host->cluster().trafficStats()->upstream_cx_total_.inc(); host->stats().cx_total_.inc(); - host->cluster().upstreamStats()->upstream_cx_active_.inc(); + host->cluster().trafficStats()->upstream_cx_active_.inc(); host->stats().cx_active_.inc(); connect_or_op_timer_->enableTimer(host->cluster().connectTimeout()); } @@ -87,7 +87,7 @@ ClientImpl::ClientImpl(Upstream::HostConstSharedPtr host, Event::Dispatcher& dis ClientImpl::~ClientImpl() { ASSERT(pending_requests_.empty()); ASSERT(connection_->state() == Network::Connection::State::Closed); - host_->cluster().upstreamStats()->upstream_cx_active_.dec(); + host_->cluster().trafficStats()->upstream_cx_active_.dec(); host_->stats().cx_active_.dec(); } @@ -141,10 +141,10 @@ PoolRequest* ClientImpl::makeRequest(const RespValue& request, ClientCallbacks& void ClientImpl::onConnectOrOpTimeout() { putOutlierEvent(Upstream::Outlier::Result::LocalOriginTimeout); if (connected_) { - host_->cluster().upstreamStats()->upstream_rq_timeout_.inc(); + host_->cluster().trafficStats()->upstream_rq_timeout_.inc(); host_->stats().rq_timeout_.inc(); } else { - host_->cluster().upstreamStats()->upstream_cx_connect_timeout_.inc(); + host_->cluster().trafficStats()->upstream_cx_connect_timeout_.inc(); host_->stats().cx_connect_fail_.inc(); } @@ -156,7 +156,7 @@ void ClientImpl::onData(Buffer::Instance& data) { decoder_->decode(data); } catch (ProtocolError&) { putOutlierEvent(Upstream::Outlier::Result::ExtOriginRequestFailed); - host_->cluster().upstreamStats()->upstream_cx_protocol_error_.inc(); + host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); host_->stats().rq_error_.inc(); connection_->close(Network::ConnectionCloseType::NoFlush); } @@ -185,7 +185,7 @@ void ClientImpl::onEvent(Network::ConnectionEvent event) { if (!request.canceled_) { request.callbacks_.onFailure(); } else { - host_->cluster().upstreamStats()->upstream_rq_cancelled_.inc(); + host_->cluster().trafficStats()->upstream_rq_cancelled_.inc(); } pending_requests_.pop_front(); } @@ -198,7 +198,7 @@ void ClientImpl::onEvent(Network::ConnectionEvent event) { } if (event == Network::ConnectionEvent::RemoteClose && !connected_) { - host_->cluster().upstreamStats()->upstream_cx_connect_fail_.inc(); + host_->cluster().trafficStats()->upstream_cx_connect_fail_.inc(); host_->stats().cx_connect_fail_.inc(); } } @@ -221,7 +221,7 @@ void ClientImpl::onRespValue(RespValuePtr&& value) { // result in closing the connection. pending_requests_.pop_front(); if (canceled) { - host_->cluster().upstreamStats()->upstream_rq_cancelled_.inc(); + host_->cluster().trafficStats()->upstream_rq_cancelled_.inc(); } else if (config_.enableRedirection() && !is_transaction_client_ && (value->type() == Common::Redis::RespType::Error)) { std::vector err = StringUtil::splitToken(value->asString(), " ", false); @@ -263,14 +263,14 @@ ClientImpl::PendingRequest::PendingRequest(ClientImpl& parent, ClientCallbacks& command_request_timer_ = parent_.redis_command_stats_->createCommandTimer( parent_.scope_, command_, parent_.time_source_); } - parent.host_->cluster().upstreamStats()->upstream_rq_total_.inc(); + parent.host_->cluster().trafficStats()->upstream_rq_total_.inc(); parent.host_->stats().rq_total_.inc(); - parent.host_->cluster().upstreamStats()->upstream_rq_active_.inc(); + parent.host_->cluster().trafficStats()->upstream_rq_active_.inc(); parent.host_->stats().rq_active_.inc(); } ClientImpl::PendingRequest::~PendingRequest() { - parent_.host_->cluster().upstreamStats()->upstream_rq_active_.dec(); + parent_.host_->cluster().trafficStats()->upstream_rq_active_.dec(); parent_.host_->stats().rq_active_.dec(); } diff --git a/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc b/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc index 05b2cb0ce7d4a..fb04dfbc585e3 100644 --- a/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc +++ b/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc @@ -454,7 +454,7 @@ void InstanceImpl::PendingRequest::onRedirection(Common::Redis::RespValuePtr&& v host_address); auto host = host_; onResponse(std::move(resp_value_)); - host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); + host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); } else { doRedirection(std::move(resp_value_), formatAddress(*result.host_info_.value()->address()->ip()), ask_redirection_); @@ -470,7 +470,7 @@ void InstanceImpl::PendingRequest::onRedirection(Common::Redis::RespValuePtr&& v host_address); auto host = host_; onResponse(std::move(resp_value_)); - host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); + host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); return; } PANIC_DUE_TO_CORRUPT_ENUM; @@ -487,7 +487,7 @@ void InstanceImpl::PendingRequest::onLoadDnsCacheComplete( ENVOY_LOG(debug, "DNS lookup failed"); auto host = host_; onResponse(std::move(resp_value_)); - host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); + host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); } else { doRedirection(std::move(resp_value_), formatAddress(*host_info->address()->ip()), ask_redirection_); @@ -509,16 +509,16 @@ void InstanceImpl::PendingRequest::doRedirection(Common::Redis::RespValuePtr&& v !parent_.makeRequestToHost(host_address, Common::Redis::Utility::AskingRequest::instance(), null_client_callbacks)) { onResponse(std::move(value)); - host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); + host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); } else { request_handler_ = parent_.makeRequestToHost(host_address, getRequest(incoming_request_), *this); if (!request_handler_) { onResponse(std::move(value)); - host->cluster().upstreamStats()->upstream_internal_redirect_failed_total_.inc(); + host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); } else { parent_.refresh_manager_->onRedirection(parent_.cluster_name_); - host->cluster().upstreamStats()->upstream_internal_redirect_succeeded_total_.inc(); + host->cluster().trafficStats()->upstream_internal_redirect_succeeded_total_.inc(); } } } diff --git a/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc b/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc index 82d6c9e12fcad..cb0480018b109 100644 --- a/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc +++ b/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc @@ -128,7 +128,7 @@ UdpProxyFilter::ClusterInfo::createSession(Network::UdpRecvData::LocalPeerAddres .connections() .canCreate()) { ENVOY_LOG(debug, "cannot create new connection."); - cluster_.info()->upstreamStats()->upstream_cx_overflow_.inc(); + cluster_.info()->trafficStats()->upstream_cx_overflow_.inc(); return nullptr; } @@ -139,7 +139,7 @@ UdpProxyFilter::ClusterInfo::createSession(Network::UdpRecvData::LocalPeerAddres auto host = chooseHost(addresses.peer_); if (host == nullptr) { ENVOY_LOG(debug, "cannot find any valid host."); - cluster_.info()->upstreamStats()->upstream_cx_none_healthy_.inc(); + cluster_.info()->trafficStats()->upstream_cx_none_healthy_.inc(); return nullptr; } return createSessionWithHost(std::move(addresses), host); @@ -212,7 +212,7 @@ UdpProxyFilter::PerPacketLoadBalancingClusterInfo::onData(Network::UdpRecvData& auto host = chooseHost(data.addresses_.peer_); if (host == nullptr) { ENVOY_LOG(debug, "cannot find any valid host."); - cluster_.info()->upstreamStats()->upstream_cx_none_healthy_.inc(); + cluster_.info()->trafficStats()->upstream_cx_none_healthy_.inc(); return Network::FilterStatus::StopIteration; } @@ -407,7 +407,7 @@ void UdpProxyFilter::ActiveSession::write(const Buffer::Instance& buffer) { cluster_.cluster_stats_.sess_tx_errors_.inc(); } else { cluster_.cluster_stats_.sess_tx_datagrams_.inc(); - cluster_.cluster_.info()->upstreamStats()->upstream_cx_tx_bytes_total_.add(buffer_length); + cluster_.cluster_.info()->trafficStats()->upstream_cx_tx_bytes_total_.add(buffer_length); } } @@ -420,7 +420,7 @@ void UdpProxyFilter::ActiveSession::processPacket(Network::Address::InstanceCons const uint64_t buffer_length = buffer->length(); cluster_.cluster_stats_.sess_rx_datagrams_.inc(); - cluster_.cluster_.info()->upstreamStats()->upstream_cx_rx_bytes_total_.add(buffer_length); + cluster_.cluster_.info()->trafficStats()->upstream_cx_rx_bytes_total_.add(buffer_length); Network::UdpSendData data{addresses_.local_->ip(), *addresses_.peer_, *buffer}; const Api::IoCallUint64Result rc = cluster_.filter_.read_callbacks_->udpListener().send(data); diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index ce4d04cfd10aa..e5f62a9d1a778 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -330,7 +330,7 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { // since if we stay over, the other threads will eventually kill their connections too. // TODO(mattklein123): The use of the stat is somewhat of a hack, and should be replaced with // real flow control callbacks once they are available. - if (parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_buffered_.value() > + if (parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_buffered_.value() > MAX_BUFFERED_STATS_BYTES) { if (connection_) { connection_->close(Network::ConnectionCloseType::NoFlush); @@ -355,11 +355,11 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { connection_ = std::move(info.connection_); connection_->addConnectionCallbacks(*this); connection_->setConnectionStats( - {parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_total_, - parent_.cluster_info_->upstreamStats()->upstream_cx_rx_bytes_buffered_, - parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_total_, - parent_.cluster_info_->upstreamStats()->upstream_cx_tx_bytes_buffered_, - &parent_.cluster_info_->upstreamStats()->bind_errors_, nullptr}); + {parent_.cluster_info_->trafficStats()->upstream_cx_rx_bytes_total_, + parent_.cluster_info_->trafficStats()->upstream_cx_rx_bytes_buffered_, + parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_total_, + parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_buffered_, + &parent_.cluster_info_->trafficStats()->bind_errors_, nullptr}); connection_->connect(); } diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index 1b021b9ef802d..99017874299c4 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -90,7 +90,7 @@ uint64_t HystrixSink::getRollingValue(RollingWindow rolling_window) { void HystrixSink::updateRollingWindowMap(const Upstream::ClusterInfo& cluster_info, ClusterStatsCache& cluster_stats_cache) { - Upstream::ClusterTrafficStats& cluster_stats = *cluster_info.upstreamStats(); + Upstream::ClusterTrafficStats& cluster_stats = *cluster_info.trafficStats(); Stats::Scope& cluster_stats_scope = cluster_info.statsScope(); // Combining timeouts+retries - retries are counted as separate requests diff --git a/test/common/conn_pool/conn_pool_base_test.cc b/test/common/conn_pool/conn_pool_base_test.cc index 5911aa642201f..1313c5d38d69e 100644 --- a/test/common/conn_pool/conn_pool_base_test.cc +++ b/test/common/conn_pool/conn_pool_base_test.cc @@ -374,13 +374,13 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationBusy) { // Verify that advancing to just before the connection duration timeout doesn't drain the // connection. advanceTimeAndRun(max_connection_duration_ - 1); - EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Busy, clients_.back()->state()); // Verify that advancing past the connection duration timeout drains the connection, // because there's a busy client. advanceTimeAndRun(2); - EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Draining, clients_.back()->state()); closeStream(); } @@ -395,13 +395,13 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationReady) { // Verify that advancing to just before the connection duration timeout doesn't close the // connection. advanceTimeAndRun(max_connection_duration_ - 1); - EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Ready, clients_.back()->state()); // Verify that advancing past the connection duration timeout closes the connection, // because there's nothing to drain. advanceTimeAndRun(2); - EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); } TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { @@ -411,7 +411,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { // Verify that advancing past the connection duration timeout does nothing to an active client // that is already draining. advanceTimeAndRun(max_connection_duration_ + 1); - EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); EXPECT_EQ(ActiveClient::State::Draining, clients_.back()->state()); closeStream(); } @@ -423,7 +423,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyClosed) { // Verify that advancing past the connection duration timeout does nothing to the active // client that is already closed. advanceTimeAndRun(max_connection_duration_ + 1); - EXPECT_EQ(0, pool_.host()->cluster().upstreamStats()->upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); } TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationCallbackWhileClosedBug) { @@ -565,7 +565,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { pool_.onUpstreamReadyForEarlyData(client_ref); CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); - EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); EXPECT_NE(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/false)); CHECK_STATE(1 /*active*/, 1 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); @@ -574,7 +574,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { clients_.back()->onEvent(Network::ConnectionEvent::Connected); CHECK_STATE(2 /*active*/, 0 /*pending*/, 0 /*connecting capacity*/); - EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); // Clean up. closeStreamAndDrainClient(); @@ -596,12 +596,12 @@ TEST_F(ConnPoolImplDispatcherBaseTest, EarlyDataStreamsReachConcurrentStreamLimi pool_.onUpstreamReadyForEarlyData(client_ref); CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); - EXPECT_EQ(1, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); EXPECT_CALL(pool_, onPoolReady); EXPECT_EQ(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/true)); CHECK_STATE(2 /*active*/, 0 /*pending*/, concurrent_streams_ - 2 /*connecting capacity*/); - EXPECT_EQ(2, pool_.host()->cluster().upstreamStats()->upstream_rq_0rtt_.value()); + EXPECT_EQ(2, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); EXPECT_EQ(ActiveClient::State::Busy, clients_.back()->state()); // After 1 stream gets closed, the client should transit to ReadyForEarlyData. diff --git a/test/common/router/retry_state_impl_test.cc b/test/common/router/retry_state_impl_test.cc index 742efa32e7672..f772846071634 100644 --- a/test/common/router/retry_state_impl_test.cc +++ b/test/common/router/retry_state_impl_test.cc @@ -157,9 +157,9 @@ class RouterRetryStateImplTest : public testing::Test { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); } @@ -217,10 +217,10 @@ TEST_F(RouterRetryStateImplTest, PolicyRefusedStream) { state_->shouldRetryReset(remote_refused_stream_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -253,10 +253,10 @@ TEST_F(RouterRetryStateImplTest, PolicyAltProtocolPostHandshakeFailure) { state_->shouldRetryReset(remote_refused_stream_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -300,10 +300,10 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -390,10 +390,10 @@ TEST_F(RouterRetryStateImplTest, PolicyGatewayErrorRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -437,10 +437,10 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemote200RemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -532,7 +532,7 @@ TEST_F(RouterRetryStateImplTest, NoRetryUponTooEarlyStatusCodeWithDownstreamEarl EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); - EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -828,10 +828,10 @@ TEST_F(RouterRetryStateImplTest, PolicyResetRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -915,10 +915,10 @@ TEST_F(RouterRetryStateImplTest, RouteConfigNoRetriesAllowed) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -948,7 +948,7 @@ TEST_F(RouterRetryStateImplTest, NoAvailableRetries) { EXPECT_EQ( RetryStatus::NoOverflow, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_overflow_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_overflow_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_overflow_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_overflow_.value()); } @@ -988,9 +988,9 @@ TEST_F(RouterRetryStateImplTest, MaxRetriesHeader) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(3UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); - EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_success_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(3UL, cluster_.trafficStats()->upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_success_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(3UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_success_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); @@ -1062,8 +1062,8 @@ TEST_F(RouterRetryStateImplTest, Backoff) { EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); - EXPECT_EQ(5UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_success_.value()); + EXPECT_EQ(5UL, cluster_.trafficStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_success_.value()); EXPECT_EQ(5UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_success_.value()); EXPECT_EQ(5UL, route_stats_context_.stats().upstream_rq_retry_.value()); @@ -1306,8 +1306,8 @@ TEST_F(RouterRetryStateImplTest, RateLimitedRetryBackoffStrategy) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryHeaders(response_headers_reset_2, request_headers, header_callback_)); - EXPECT_EQ(2UL, cluster_.upstreamStats()->upstream_rq_retry_backoff_ratelimited_.value()); - EXPECT_EQ(2UL, cluster_.upstreamStats()->upstream_rq_retry_backoff_exponential_.value()); + EXPECT_EQ(2UL, cluster_.trafficStats()->upstream_rq_retry_backoff_ratelimited_.value()); + EXPECT_EQ(2UL, cluster_.trafficStats()->upstream_rq_retry_backoff_exponential_.value()); } TEST_F(RouterRetryStateImplTest, HostSelectionAttempts) { @@ -1343,10 +1343,10 @@ TEST_F(RouterRetryStateImplTest, ZeroMaxRetriesHeader) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -1367,10 +1367,10 @@ TEST_F(RouterRetryStateImplTest, NoPreferredOverLimitExceeded) { EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(good_response_headers, request_headers, header_callback_)); - EXPECT_EQ(0UL, cluster_.upstreamStats()->upstream_rq_retry_limit_exceeded_.value()); + EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.upstreamStats()->upstream_rq_retry_.value()); + EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } diff --git a/test/common/upstream/health_check_fuzz.cc b/test/common/upstream/health_check_fuzz.cc index 9c04ab88f20af..dcc5ab5579f9d 100644 --- a/test/common/upstream/health_check_fuzz.cc +++ b/test/common/upstream/health_check_fuzz.cc @@ -106,7 +106,7 @@ void HttpHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); } expectSessionCreate(); expectStreamCreate(0); @@ -217,7 +217,7 @@ void TcpHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); } expectSessionCreate(); expectClientCreate(); @@ -326,7 +326,7 @@ void GrpcHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); } expectSessionCreate(); ON_CALL(dispatcher_, createClientConnection_(_, _, _, _)) diff --git a/test/common/upstream/health_checker_impl_test.cc b/test/common/upstream/health_checker_impl_test.cc index 0c82aad698a0e..b320b5d279df4 100644 --- a/test/common/upstream/health_checker_impl_test.cc +++ b/test/common/upstream/health_checker_impl_test.cc @@ -858,7 +858,7 @@ TEST_F(HttpHealthCheckerImplTest, Success) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -881,7 +881,7 @@ TEST_F(HttpHealthCheckerImplTest, Degraded) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1010,7 +1010,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessIntervalJitterPercent) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1041,7 +1041,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithSpurious1xx) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1069,7 +1069,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithSpuriousMetadata) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1099,8 +1099,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHosts) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime()), makeTestHost(cluster_->info_, "tcp://127.0.0.1:81", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1136,8 +1136,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostSets) { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; cluster_->prioritySet().getMockHostSet(1)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:81", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1170,7 +1170,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1193,7 +1193,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseStringContainsCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1217,7 +1217,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseHexStringContainsCheck) cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1240,7 +1240,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckBuffer) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1265,7 +1265,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckMaxBuffer) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1305,7 +1305,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckHttp2) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1330,7 +1330,7 @@ TEST_F(HttpHealthCheckerImplTest, FailExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1356,7 +1356,7 @@ TEST_F(HttpHealthCheckerImplTest, FailStatusCheckWithExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1381,7 +1381,7 @@ TEST_F(HttpHealthCheckerImplTest, ImmediateFailExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1428,7 +1428,7 @@ TEST_F(HttpHealthCheckerImplTest, ZeroRetryInterval) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1487,7 +1487,7 @@ TEST_F(HttpHealthCheckerImplTest, TlsOptions) { allocHealthChecker(yaml); cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1505,7 +1505,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1541,7 +1541,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServicePrefixPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1577,7 +1577,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceExactPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1613,7 +1613,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceRegexPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1657,7 +1657,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithCustomHostValueOnTheHos EXPECT_CALL(*this, onHostStatus(_, HealthTransition::Unchanged)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = {test_host}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1703,7 +1703,7 @@ TEST_F(HttpHealthCheckerImplTest, EXPECT_CALL(*this, onHostStatus(_, HealthTransition::Unchanged)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = {test_host}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1739,7 +1739,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithCustomHostValue) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1804,7 +1804,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAdditionalHeaders) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1869,7 +1869,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithoutUserAgent) { std::string current_start_time; cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1907,7 +1907,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceDoesNotMatchFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1938,7 +1938,7 @@ TEST_F(HttpHealthCheckerImplTest, ServicePatternDoesNotMatchFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1969,7 +1969,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNotPresentInResponseFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1997,7 +1997,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceCheckRuntimeOff) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2024,7 +2024,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceCheckRuntimeOffWithStringPattern) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2538,7 +2538,7 @@ TEST_F(HttpHealthCheckerImplTest, HealthCheckIntervals) { EXPECT_CALL(*test_sessions_[0]->interval_timer_, enableTimer(std::chrono::milliseconds(5000), _)); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, disableTimer()); respond(0, "200", false); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); // Needed after a response is sent. @@ -2877,7 +2877,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAltPort) { // Prepares a host with its designated health check port. const HostWithHealthCheckMap hosts{{"127.0.0.1:80", makeHealthCheckConfig(8000)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2910,8 +2910,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostsAndAltPort) { const HostWithHealthCheckMap hosts = {{"127.0.0.1:80", makeHealthCheckConfig(8000)}, {"127.0.0.1:81", makeHealthCheckConfig(8001)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2951,7 +2951,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAltAddress) { const HostWithHealthCheckMap hosts{ {"127.0.0.1:80", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2985,8 +2985,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostsAndAltAddress) { {"127.0.0.1:80", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}, {"127.0.0.2:81", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}}; appendTestHosts(cluster_, hosts); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3082,7 +3082,7 @@ TEST_F(HttpHealthCheckerImplTest, TransportSocketMatchCriteria) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3123,7 +3123,7 @@ TEST_F(HttpHealthCheckerImplTest, NoTransportSocketMatchCriteria) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3140,7 +3140,7 @@ TEST_F(HttpHealthCheckerImplTest, GoAwayErrorProbeInProgress) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3188,7 +3188,7 @@ TEST_F(HttpHealthCheckerImplTest, GoAwayProbeInProgress) { .WillRepeatedly(Return(false)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); @@ -3487,7 +3487,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNameMatch) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3523,7 +3523,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNameMismatch) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3549,7 +3549,7 @@ TEST_F(HttpHealthCheckerImplTest, DefaultMethodGet) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3578,7 +3578,7 @@ TEST_F(HttpHealthCheckerImplTest, MethodHead) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -4818,7 +4818,7 @@ class GrpcHealthCheckerImplTestBase : public Event::TestUsingSimulatedTime, // performed during test case (but possibly on many hosts). void expectHealthchecks(HealthTransition host_changed_state, size_t num_healthchecks) { for (size_t i = 0; i < num_healthchecks; i++) { - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectHealthcheckStart(i); } @@ -4921,7 +4921,7 @@ class GrpcHealthCheckerImplTestBase : public Event::TestUsingSimulatedTime, void runHealthCheck(std::string expected_host) { - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectHealthcheckStart(0); @@ -5071,7 +5071,7 @@ TEST_F(GrpcHealthCheckerImplTest, SuccessWithAdditionalHeaders) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); expectSessionCreate(); expectHealthcheckStart(0); @@ -5543,7 +5543,7 @@ TEST_F(GrpcHealthCheckerImplTest, HealthCheckIntervals) { EXPECT_CALL(*test_sessions_[0]->interval_timer_, enableTimer(std::chrono::milliseconds(5000), _)); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, disableTimer()); respondServiceStatus(0, grpc::health::v1::HealthCheckResponse::SERVING); - cluster_->info_->upstreamStats()->upstream_cx_total_.inc(); + cluster_->info_->trafficStats()->upstream_cx_total_.inc(); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); // Needed after a response is sent. diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index 3d0a6a0f068e3..ff8c045df3d26 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -420,7 +420,7 @@ TEST_F(StrictDnsClusterImplTest, Basic) { EXPECT_EQ(1U, cluster.info()->resourceManager(ResourcePriority::Default).maxConnectionsPerHost()); EXPECT_EQ(990U, cluster.info()->resourceManager(ResourcePriority::High).maxConnectionsPerHost()); - cluster.info()->upstreamStats()->upstream_rq_total_.inc(); + cluster.info()->trafficStats()->upstream_rq_total_.inc(); EXPECT_EQ(1UL, stats_.counter("cluster.name.upstream_rq_total").value()); EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.maintenance_mode.name", 0)); @@ -770,7 +770,7 @@ TEST_F(StrictDnsClusterImplTest, LoadAssignmentBasic) { EXPECT_EQ(3U, cluster.info()->maxRequestsPerConnection()); EXPECT_EQ(0U, cluster.info()->http2Options().hpack_table_size().value()); - cluster.info()->upstreamStats()->upstream_rq_total_.inc(); + cluster.info()->trafficStats()->upstream_rq_total_.inc(); EXPECT_EQ(1UL, stats_.counter("cluster.name.upstream_rq_total").value()); EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.maintenance_mode.name", 0)); @@ -1859,7 +1859,7 @@ TEST_F(StaticClusterImplTest, AltStatName) { std::move(scope), false); cluster.initialize([] {}); // Increment a stat and verify it is emitted with alt_stat_name - cluster.info()->upstreamStats()->upstream_rq_total_.inc(); + cluster.info()->trafficStats()->upstream_rq_total_.inc(); EXPECT_EQ(1UL, stats_.counter("cluster.staticcluster_stats.upstream_rq_total").value()); } diff --git a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc index efec0acda5393..d514be6c80382 100644 --- a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc +++ b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc @@ -236,7 +236,7 @@ TEST_P(GcpAuthnFilterIntegrationTest, BasicflowWithoutAudience) { sendRequestToDestinationAndValidateResponse(/*with_audience=*/false); // Verify request has been routed to `cluster_0` but not `gcp_authn` cluster. - // Note that upstream_cx_total is from the lazy-inited ClusterInfo::upstreamStats(), so there is + // Note that upstream_cx_total is from the lazy-inited ClusterInfo::trafficStats(), so there is // no such stat yet. EXPECT_EQ(test_server_->counter("cluster.gcp_authn.upstream_cx_total"), nullptr); EXPECT_GE(test_server_->counter("cluster.cluster_0.upstream_cx_total")->value(), 1); diff --git a/test/extensions/stats_sinks/common/statsd/statsd_test.cc b/test/extensions/stats_sinks/common/statsd/statsd_test.cc index b5e7f193407ba..fcadb4d6a7102 100644 --- a/test/extensions/stats_sinks/common/statsd/statsd_test.cc +++ b/test/extensions/stats_sinks/common/statsd/statsd_test.cc @@ -225,13 +225,13 @@ TEST_F(TcpStatsdSinkTest, Overflow) { // Synthetically set buffer above high watermark. Make sure we don't write anything. cluster_manager_.active_clusters_["fake_cluster"] - ->info_->upstreamStats() + ->info_->trafficStats() ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); sink_->flush(snapshot_); // Lower and make sure we write. cluster_manager_.active_clusters_["fake_cluster"] - ->info_->upstreamStats() + ->info_->trafficStats() ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 15); expectCreateConnection(); EXPECT_CALL(*connection_, write(BufferStringEqual("envoy.test_counter:1|c\n"), _)); @@ -239,7 +239,7 @@ TEST_F(TcpStatsdSinkTest, Overflow) { // Raise and make sure we don't write and kill connection. cluster_manager_.active_clusters_["fake_cluster"] - ->info_->upstreamStats() + ->info_->trafficStats() ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); EXPECT_CALL(*connection_, close(Network::ConnectionCloseType::NoFlush)); sink_->flush(snapshot_); diff --git a/test/extensions/stats_sinks/hystrix/hystrix_test.cc b/test/extensions/stats_sinks/hystrix/hystrix_test.cc index 2307f22a252a8..0a71f9df68360 100644 --- a/test/extensions/stats_sinks/hystrix/hystrix_test.cc +++ b/test/extensions/stats_sinks/hystrix/hystrix_test.cc @@ -82,9 +82,9 @@ class ClusterTestInfo { ON_CALL(error_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_step)); ON_CALL(retry_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_retry_step)); ON_CALL(success_counter_, value()).WillByDefault(Return((i + 1) * success_step)); - cluster_info_->upstreamStats()->upstream_rq_timeout_.add(timeout_step); - cluster_info_->upstreamStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); - cluster_info_->upstreamStats()->upstream_rq_pending_overflow_.add(rejected_step); + cluster_info_->trafficStats()->upstream_rq_timeout_.add(timeout_step); + cluster_info_->trafficStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); + cluster_info_->trafficStats()->upstream_rq_pending_overflow_.add(rejected_step); } NiceMock cluster_; diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 9b830f862227e..6109ab4e7f77b 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -197,7 +197,7 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); // With https://github.com/envoyproxy/envoy/pull/23921 all the // upstream_xxxx are lazy-inited. - // We need to trigger an inc on the ClusterInfo::upstreamStats() to create the upstream stats. + // We need to trigger an inc on the ClusterInfo::trafficStats() to create the upstream stats. absl::Notification n; test_server_->server().dispatcher().post([&]() { auto _ = *test_server_->server() @@ -206,7 +206,7 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { .getCluster("cluster_1") ->get() .info() - ->upstreamStats(); + ->trafficStats(); (void)_; n.Notify(); }); diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index 56e6a0855ce20..8da8f58a9b179 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -131,7 +131,7 @@ TEST_P(IntegrationAdminTest, Admin) { BufferingStreamDecoderPtr response; // With https://github.com/envoyproxy/envoy/pull/23921 all the // upstream_xxxx are lazy-inited. - // We need to trigger an inc on the ClusterInfo::upstreamStats() to create the upstream stats. + // We need to trigger an inc on the ClusterInfo::trafficStats() to create the upstream stats. absl::Notification n; test_server_->server().dispatcher().post([&]() { test_server_->server() @@ -140,7 +140,7 @@ TEST_P(IntegrationAdminTest, Admin) { .getCluster("cluster_0") ->get() .info() - ->upstreamStats() + ->trafficStats() ->bind_errors_.inc(); n.Notify(); }); diff --git a/test/integration/integration_test.cc b/test/integration/integration_test.cc index 2d5e53a5c8d4f..511cd91b717ee 100644 --- a/test/integration/integration_test.cc +++ b/test/integration/integration_test.cc @@ -2458,7 +2458,7 @@ TEST_P(IntegrationTest, SetRouteToDelegatingRouteWithClusterOverride) { // Even though headers specify cluster_0, set_route_filter modifies cached route cluster of // current request to cluster_override. - // cluster_0 upstreamStats() not created yet. + // cluster_0 trafficStats() not created yet. EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_cx_total"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_rq_total"), nullptr); diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index 218493293d98f..b97f195c71281 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -928,8 +928,8 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { } }; - // Since ClusterInfo::upstreamStats() are lazy-init, we need to update any stat for a cluster's - // upstreamStats() to trigger creation of the cluster upstreamStats. + // Since ClusterInfo::trafficStats() are lazy-init, we need to update any stat for a cluster's + // trafficStats() to trigger creation of the cluster upstreamStats. absl::Notification n; test_server_->server().dispatcher().post([&]() { test_server_->server() @@ -938,7 +938,7 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { .getCluster("cluster_0") ->get() .info() - ->upstreamStats() + ->trafficStats() ->upstream_cx_active_.inc(); n.Notify(); }); diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 363033849b876..6d9697878ab22 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -98,7 +98,7 @@ MockClusterInfo::MockClusterInfo() .WillByDefault(ReturnPointee(&max_response_headers_count_)); ON_CALL(*this, maxRequestsPerConnection()) .WillByDefault(ReturnPointee(&max_requests_per_connection_)); - ON_CALL(*this, upstreamStats()).WillByDefault(ReturnRef(traffic_stats_)); + ON_CALL(*this, trafficStats()).WillByDefault(ReturnRef(traffic_stats_)); ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 9b8a2c945281b..a9ab5c80af5d4 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -151,7 +151,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); - MOCK_METHOD(LazyInitStats&, upstreamStats, (), (const)); + MOCK_METHOD(LazyInitStats&, trafficStats, (), (const)); MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); From 96662a91065b4de25f507c6d6bb819e40c57f12f Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 10 Nov 2022 14:32:06 -0500 Subject: [PATCH 009/122] revert the renaming stats_ --> lb_stats_ in lb tests Signed-off-by: Xin Zhuang --- source/common/upstream/load_balancer_impl.cc | 22 +- source/common/upstream/load_balancer_impl.h | 2 +- source/common/upstream/subset_lb.cc | 30 +-- source/common/upstream/subset_lb.h | 2 +- .../common/upstream/thread_aware_lb_impl.cc | 4 +- source/common/upstream/thread_aware_lb_impl.h | 8 +- .../least_request_load_balancer_fuzz_test.cc | 2 +- .../upstream/load_balancer_benchmark.cc | 12 +- .../common/upstream/load_balancer_fuzz_base.h | 4 +- .../upstream/load_balancer_impl_test.cc | 64 ++--- .../upstream/load_balancer_simulation_test.cc | 6 +- test/common/upstream/maglev_lb_test.cc | 6 +- .../random_load_balancer_fuzz_test.cc | 2 +- test/common/upstream/ring_hash_lb_test.cc | 20 +- .../round_robin_load_balancer_fuzz_test.cc | 2 +- test/common/upstream/subset_lb_test.cc | 224 +++++++++--------- 16 files changed, 205 insertions(+), 205 deletions(-) diff --git a/source/common/upstream/load_balancer_impl.cc b/source/common/upstream/load_balancer_impl.cc index 8260f450cab00..92a16987549f6 100644 --- a/source/common/upstream/load_balancer_impl.cc +++ b/source/common/upstream/load_balancer_impl.cc @@ -112,7 +112,7 @@ LoadBalancerBase::LoadBalancerBase( const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : lb_stats_(lb_stats), runtime_(runtime), random_(random), + : stats_(lb_stats), runtime_(runtime), random_(random), default_healthy_panic_percent_(PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT( common_config, healthy_panic_threshold, 100, 50)), priority_set_(priority_set), @@ -395,7 +395,7 @@ ZoneAwareLoadBalancerBase::ZoneAwareLoadBalancerBase( void ZoneAwareLoadBalancerBase::regenerateLocalityRoutingStructures() { ASSERT(local_priority_set_); - lb_stats_.lb_recalculate_zone_structures_.inc(); + stats_.lb_recalculate_zone_structures_.inc(); // resizePerPriorityState should ensure these stay in sync. ASSERT(per_priority_state_.size() == priority_set_.hostSetsPerPriority().size()); @@ -493,14 +493,14 @@ bool ZoneAwareLoadBalancerBase::earlyExitNonLocalityRouting() { // panic mode for local cluster". if (!host_set.healthyHostsPerLocality().hasLocalLocality() || host_set.healthyHostsPerLocality().get()[0].empty()) { - lb_stats_.lb_local_cluster_not_ok_.inc(); + stats_.lb_local_cluster_not_ok_.inc(); return true; } // Same number of localities should be for local and upstream cluster. if (host_set.healthyHostsPerLocality().get().size() != localHostSet().healthyHostsPerLocality().get().size()) { - lb_stats_.lb_zone_number_differs_.inc(); + stats_.lb_zone_number_differs_.inc(); return true; } @@ -508,7 +508,7 @@ bool ZoneAwareLoadBalancerBase::earlyExitNonLocalityRouting() { const uint64_t min_cluster_size = runtime_.snapshot().getInteger(RuntimeMinClusterSize, min_cluster_size_); if (host_set.healthyHosts().size() < min_cluster_size) { - lb_stats_.lb_zone_cluster_too_small_.inc(); + stats_.lb_zone_cluster_too_small_.inc(); return true; } @@ -644,7 +644,7 @@ uint32_t ZoneAwareLoadBalancerBase::tryChooseLocalLocalityHosts(const HostSet& h // Try to push all of the requests to the same locality first. if (state.locality_routing_state_ == LocalityRoutingState::LocalityDirect) { - lb_stats_.lb_zone_routing_all_directly_.inc(); + stats_.lb_zone_routing_all_directly_.inc(); return 0; } @@ -653,17 +653,17 @@ uint32_t ZoneAwareLoadBalancerBase::tryChooseLocalLocalityHosts(const HostSet& h // If we cannot route all requests to the same locality, we already calculated how much we can // push to the local locality, check if we can push to local locality on current iteration. if (random_.random() % 10000 < state.local_percent_to_route_) { - lb_stats_.lb_zone_routing_sampled_.inc(); + stats_.lb_zone_routing_sampled_.inc(); return 0; } // At this point we must route cross locality as we cannot route to the local locality. - lb_stats_.lb_zone_routing_cross_zone_.inc(); + stats_.lb_zone_routing_cross_zone_.inc(); // This is *extremely* unlikely but possible due to rounding errors when calculating // locality percentages. In this case just select random locality. if (state.residual_capacity_[number_of_localities - 1] == 0) { - lb_stats_.lb_zone_no_capacity_left_.inc(); + stats_.lb_zone_no_capacity_left_.inc(); return random_.random() % number_of_localities; } @@ -696,7 +696,7 @@ ZoneAwareLoadBalancerBase::hostSourceToUse(LoadBalancerContext* context, uint64_ // If the selected host set has insufficient healthy hosts, return all hosts (unless we should // fail traffic on panic, in which case return no host). if (per_priority_panic_[hosts_source.priority_]) { - lb_stats_.lb_healthy_panic_.inc(); + stats_.lb_healthy_panic_.inc(); if (fail_traffic_on_panic_) { return absl::nullopt; } else { @@ -746,7 +746,7 @@ ZoneAwareLoadBalancerBase::hostSourceToUse(LoadBalancerContext* context, uint64_ } if (isHostSetInPanic(localHostSet())) { - lb_stats_.lb_local_cluster_not_ok_.inc(); + stats_.lb_local_cluster_not_ok_.inc(); // If the local Envoy instances are in global panic, and we should not fail traffic, do // not do locality based routing. if (fail_traffic_on_panic_) { diff --git a/source/common/upstream/load_balancer_impl.h b/source/common/upstream/load_balancer_impl.h index 5c480844d5c21..3f906886e91e6 100644 --- a/source/common/upstream/load_balancer_impl.h +++ b/source/common/upstream/load_balancer_impl.h @@ -105,7 +105,7 @@ class LoadBalancerBase : public LoadBalancer { } } - ClusterLbStats& lb_stats_; + ClusterLbStats& stats_; Runtime::Loader& runtime_; std::deque stashed_random_; Random::RandomGenerator& random_; diff --git a/source/common/upstream/subset_lb.cc b/source/common/upstream/subset_lb.cc index 902883a44f558..e53725c9d9706 100644 --- a/source/common/upstream/subset_lb.cc +++ b/source/common/upstream/subset_lb.cc @@ -37,7 +37,7 @@ SubsetLoadBalancer::SubsetLoadBalancer( : lb_type_(lb_type), lb_ring_hash_config_(lb_ring_hash_config), lb_maglev_config_(lb_maglev_config), round_robin_config_(round_robin_config), least_request_config_(least_request_config), common_config_(common_config), - lb_stats_(lb_stats), scope_(scope), runtime_(runtime), random_(random), + stats_(lb_stats), scope_(scope), runtime_(runtime), random_(random), fallback_policy_(subsets.fallbackPolicy()), metadata_fallback_policy_(subsets.metadataFallbackPolicy()), default_subset_metadata_(subsets.defaultSubset().fields().begin(), @@ -88,8 +88,8 @@ SubsetLoadBalancer::~SubsetLoadBalancer() { // Ensure gauges reflect correct values. forEachSubset(subsets_, [&](LbSubsetEntryPtr entry) { if (entry->active()) { - lb_stats_.lb_subsets_removed_.inc(); - lb_stats_.lb_subsets_active_.dec(); + stats_.lb_subsets_removed_.inc(); + stats_.lb_subsets_active_.dec(); } }); } @@ -267,14 +267,14 @@ HostConstSharedPtr SubsetLoadBalancer::chooseHostIteration(LoadBalancerContext* HostConstSharedPtr host = fallback_subset_->lb_subset_->chooseHost(context); if (host != nullptr) { - lb_stats_.lb_subsets_fallback_.inc(); + stats_.lb_subsets_fallback_.inc(); return host; } if (panic_mode_subset_ != nullptr) { HostConstSharedPtr host = panic_mode_subset_->lb_subset_->chooseHost(context); if (host != nullptr) { - lb_stats_.lb_subsets_fallback_panic_.inc(); + stats_.lb_subsets_fallback_panic_.inc(); return host; } } @@ -354,7 +354,7 @@ HostConstSharedPtr SubsetLoadBalancer::tryChooseHostFromContext(LoadBalancerCont } host_chosen = true; - lb_stats_.lb_subsets_selected_.inc(); + stats_.lb_subsets_selected_.inc(); return entry->lb_subset_->chooseHost(context); } @@ -441,8 +441,8 @@ void SubsetLoadBalancer::initLbSubsetEntryOnce(LbSubsetEntryPtr& entry, bool sin entry->single_host_subset_ = false; } - lb_stats_.lb_subsets_active_.inc(); - lb_stats_.lb_subsets_created_.inc(); + stats_.lb_subsets_active_.inc(); + stats_.lb_subsets_created_.inc(); } // Iterates all the hosts of specified priority, looking up an LbSubsetEntryPtr for each and add @@ -662,8 +662,8 @@ void SubsetLoadBalancer::purgeEmptySubsets(LbSubsetMap& subsets) { // If it wasn't initialized, it wasn't accounted for. if (entry->initialized()) { - lb_stats_.lb_subsets_active_.dec(); - lb_stats_.lb_subsets_removed_.inc(); + stats_.lb_subsets_active_.dec(); + stats_.lb_subsets_removed_.inc(); } auto next_it = std::next(it); @@ -694,20 +694,20 @@ SubsetLoadBalancer::PrioritySubsetImpl::PrioritySubsetImpl(const SubsetLoadBalan switch (subset_lb.lb_type_) { case LoadBalancerType::LeastRequest: lb_ = std::make_unique( - *this, subset_lb.original_local_priority_set_, subset_lb.lb_stats_, subset_lb.runtime_, + *this, subset_lb.original_local_priority_set_, subset_lb.stats_, subset_lb.runtime_, subset_lb.random_, subset_lb.common_config_, subset_lb.least_request_config_, subset_lb.time_source_); break; case LoadBalancerType::Random: lb_ = std::make_unique(*this, subset_lb.original_local_priority_set_, - subset_lb.lb_stats_, subset_lb.runtime_, + subset_lb.stats_, subset_lb.runtime_, subset_lb.random_, subset_lb.common_config_); break; case LoadBalancerType::RoundRobin: lb_ = std::make_unique( - *this, subset_lb.original_local_priority_set_, subset_lb.lb_stats_, subset_lb.runtime_, + *this, subset_lb.original_local_priority_set_, subset_lb.stats_, subset_lb.runtime_, subset_lb.random_, subset_lb.common_config_, subset_lb.round_robin_config_, subset_lb.time_source_); break; @@ -717,7 +717,7 @@ SubsetLoadBalancer::PrioritySubsetImpl::PrioritySubsetImpl(const SubsetLoadBalan // We should make the subset LB thread aware since the calculations are costly, and then we // can also use a thread aware sub-LB properly. The following works fine but is not optimal. thread_aware_lb_ = std::make_unique( - *this, subset_lb.lb_stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, + *this, subset_lb.stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, subset_lb.lb_ring_hash_config_, subset_lb.common_config_); thread_aware_lb_->initialize(); lb_ = thread_aware_lb_->factory()->create(); @@ -728,7 +728,7 @@ SubsetLoadBalancer::PrioritySubsetImpl::PrioritySubsetImpl(const SubsetLoadBalan // We should make the subset LB thread aware since the calculations are costly, and then we // can also use a thread aware sub-LB properly. The following works fine but is not optimal. thread_aware_lb_ = std::make_unique( - *this, subset_lb.lb_stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, + *this, subset_lb.stats_, subset_lb.scope_, subset_lb.runtime_, subset_lb.random_, subset_lb.lb_maglev_config_, subset_lb.common_config_); thread_aware_lb_->initialize(); lb_ = thread_aware_lb_->factory()->create(); diff --git a/source/common/upstream/subset_lb.h b/source/common/upstream/subset_lb.h index 62e87931d4c56..c9b36e5e05950 100644 --- a/source/common/upstream/subset_lb.h +++ b/source/common/upstream/subset_lb.h @@ -365,7 +365,7 @@ class SubsetLoadBalancer : public LoadBalancer, Logger::Loggable least_request_config_; const envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; - ClusterLbStats& lb_stats_; + ClusterLbStats& stats_; Stats::Scope& scope_; Runtime::Loader& runtime_; Random::RandomGenerator& random_; diff --git a/source/common/upstream/thread_aware_lb_impl.cc b/source/common/upstream/thread_aware_lb_impl.cc index b5d802e7ec5a5..861c821c8cb4e 100644 --- a/source/common/upstream/thread_aware_lb_impl.cc +++ b/source/common/upstream/thread_aware_lb_impl.cc @@ -162,7 +162,7 @@ ThreadAwareLoadBalancerBase::LoadBalancerImpl::chooseHost(LoadBalancerContext* c .first; const auto& per_priority_state = (*per_priority_state_)[priority]; if (per_priority_state->global_panic_) { - lb_stats_.lb_healthy_panic_.inc(); + stats_.lb_healthy_panic_.inc(); } const uint32_t max_attempts = context ? context->hostSelectionRetryCount() + 1 : 1; @@ -179,7 +179,7 @@ ThreadAwareLoadBalancerBase::LoadBalancerImpl::chooseHost(LoadBalancerContext* c } LoadBalancerPtr ThreadAwareLoadBalancerBase::LoadBalancerFactoryImpl::create() { - auto lb = std::make_unique(lb_stats_, random_); + auto lb = std::make_unique(stats_, random_); // We must protect current_lb_ via a RW lock since it is accessed and written to by multiple // threads. All complex processing has already been precalculated however. diff --git a/source/common/upstream/thread_aware_lb_impl.h b/source/common/upstream/thread_aware_lb_impl.h index 125d25b6e10c6..cf59b2ce3815c 100644 --- a/source/common/upstream/thread_aware_lb_impl.h +++ b/source/common/upstream/thread_aware_lb_impl.h @@ -122,7 +122,7 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL struct LoadBalancerImpl : public LoadBalancer { LoadBalancerImpl(ClusterLbStats& lb_stats, Random::RandomGenerator& random) - : lb_stats_(lb_stats), random_(random) {} + : stats_(lb_stats), random_(random) {} // Upstream::LoadBalancer HostConstSharedPtr chooseHost(LoadBalancerContext* context) override; @@ -138,7 +138,7 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL return {}; } - ClusterLbStats& lb_stats_; + ClusterLbStats& stats_; Random::RandomGenerator& random_; HostStatusSet override_host_status_{}; std::shared_ptr> per_priority_state_; @@ -152,14 +152,14 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL struct LoadBalancerFactoryImpl : public LoadBalancerFactory { LoadBalancerFactoryImpl(ClusterLbStats& lb_stats, Random::RandomGenerator& random, HostStatusSet status) - : lb_stats_(lb_stats), random_(random), override_host_status_(status) {} + : stats_(lb_stats), random_(random), override_host_status_(status) {} // Upstream::LoadBalancerFactory LoadBalancerPtr create() override; // Ignore the params for the thread-aware LB. LoadBalancerPtr create(LoadBalancerParams) override { return create(); } - ClusterLbStats& lb_stats_; + ClusterLbStats& stats_; Random::RandomGenerator& random_; HostStatusSet override_host_status_{}; absl::Mutex mutex_; diff --git a/test/common/upstream/least_request_load_balancer_fuzz_test.cc b/test/common/upstream/least_request_load_balancer_fuzz_test.cc index 82034d4b8883c..edd3419a538ab 100644 --- a/test/common/upstream/least_request_load_balancer_fuzz_test.cc +++ b/test/common/upstream/least_request_load_balancer_fuzz_test.cc @@ -69,7 +69,7 @@ DEFINE_PROTO_FUZZER(const test::common::upstream::LeastRequestLoadBalancerTestCa zone_aware_load_balancer_fuzz.lb_ = std::make_unique( zone_aware_load_balancer_fuzz.priority_set_, zone_aware_load_balancer_fuzz.local_priority_set_.get(), - zone_aware_load_balancer_fuzz.lb_stats_, zone_aware_load_balancer_fuzz.runtime_, + zone_aware_load_balancer_fuzz.stats_, zone_aware_load_balancer_fuzz.runtime_, zone_aware_load_balancer_fuzz.random_, zone_aware_load_balancer_test_case.load_balancer_test_case().common_lb_config(), input.least_request_lb_config(), zone_aware_load_balancer_fuzz.simTime()); diff --git a/test/common/upstream/load_balancer_benchmark.cc b/test/common/upstream/load_balancer_benchmark.cc index dd44f0a27253a..cccd30b46f9bb 100644 --- a/test/common/upstream/load_balancer_benchmark.cc +++ b/test/common/upstream/load_balancer_benchmark.cc @@ -67,7 +67,7 @@ class BaseTester : public Event::TestUsingSimulatedTime { PrioritySetImpl local_priority_set_; Stats::IsolatedStoreImpl stats_store_; ClusterLbStatNames lb_stat_names_{stats_store_.symbolTable()}; - ClusterLbStats lb_stats_{lb_stat_names_, stats_store_}; + ClusterLbStats stats_{lb_stat_names_, stats_store_}; NiceMock runtime_; Random::RandomGeneratorImpl random_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; @@ -81,7 +81,7 @@ class RoundRobinTester : public BaseTester { : BaseTester(num_hosts, weighted_subset_percent, weight) {} void initialize() { - lb_ = std::make_unique(priority_set_, &local_priority_set_, lb_stats_, + lb_ = std::make_unique(priority_set_, &local_priority_set_, stats_, runtime_, random_, common_config_, round_robin_lb_config_, simTime()); } @@ -94,7 +94,7 @@ class LeastRequestTester : public BaseTester { LeastRequestTester(uint64_t num_hosts, uint32_t choice_count) : BaseTester(num_hosts) { envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_choice_count()->set_value(choice_count); - lb_ = std::make_unique(priority_set_, &local_priority_set_, lb_stats_, + lb_ = std::make_unique(priority_set_, &local_priority_set_, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()); } @@ -155,7 +155,7 @@ class RingHashTester : public BaseTester { config_ = envoy::config::cluster::v3::Cluster::RingHashLbConfig(); config_.value().mutable_minimum_ring_size()->set_value(min_ring_size); ring_hash_lb_ = std::make_unique( - priority_set_, lb_stats_, stats_store_, runtime_, random_, config_, common_config_); + priority_set_, stats_, stats_store_, runtime_, random_, config_, common_config_); } absl::optional config_; @@ -166,7 +166,7 @@ class MaglevTester : public BaseTester { public: MaglevTester(uint64_t num_hosts, uint32_t weighted_subset_percent = 0, uint32_t weight = 0) : BaseTester(num_hosts, weighted_subset_percent, weight) { - maglev_lb_ = std::make_unique(priority_set_, lb_stats_, stats_store_, + maglev_lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, random_, config_, common_config_); } @@ -544,7 +544,7 @@ class SubsetLbTester : public BaseTester { subset_info_ = std::make_unique(subset_config); lb_ = std::make_unique( - LoadBalancerType::Random, priority_set_, &local_priority_set_, lb_stats_, stats_store_, + LoadBalancerType::Random, priority_set_, &local_priority_set_, stats_, stats_store_, runtime_, random_, *subset_info_, absl::nullopt, absl::nullopt, absl::nullopt, absl::nullopt, common_config_, simTime()); diff --git a/test/common/upstream/load_balancer_fuzz_base.h b/test/common/upstream/load_balancer_fuzz_base.h index 19adf8eae8013..a9bee573c04f0 100644 --- a/test/common/upstream/load_balancer_fuzz_base.h +++ b/test/common/upstream/load_balancer_fuzz_base.h @@ -21,7 +21,7 @@ namespace Upstream { class LoadBalancerFuzzBase { public: LoadBalancerFuzzBase() - : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_){}; + : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_){}; // Initializes load balancer components shared amongst every load balancer, random_, and // priority_set_ @@ -42,7 +42,7 @@ class LoadBalancerFuzzBase { // balancers in specific load balancer fuzz classes Stats::IsolatedStoreImpl stats_store_; ClusterLbStatNames lb_stat_names_; - ClusterLbStats lb_stats_; + ClusterLbStats stats_; NiceMock runtime_; Random::PsuedoRandomGenerator64 random_; NiceMock priority_set_; diff --git a/test/common/upstream/load_balancer_impl_test.cc b/test/common/upstream/load_balancer_impl_test.cc index e72916e52dcd2..38eff5cbd299e 100644 --- a/test/common/upstream/load_balancer_impl_test.cc +++ b/test/common/upstream/load_balancer_impl_test.cc @@ -81,13 +81,13 @@ class LoadBalancerTestBase : public Event::TestUsingSimulatedTime, MockHostSet& hostSet() { return GetParam() ? host_set_ : failover_host_set_; } LoadBalancerTestBase() - : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) { + : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) { least_request_lb_config_.mutable_choice_count()->set_value(2); } Stats::IsolatedStoreImpl stats_store_; ClusterLbStatNames lb_stat_names_; - ClusterLbStats lb_stats_; + ClusterLbStats stats_; NiceMock runtime_; NiceMock random_; NiceMock priority_set_; @@ -166,7 +166,7 @@ class LoadBalancerBaseTest : public LoadBalancerTestBase { } envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; - TestLb lb_{priority_set_, lb_stats_, runtime_, random_, common_config_}; + TestLb lb_{priority_set_, stats_, runtime_, random_, common_config_}; }; INSTANTIATE_TEST_SUITE_P(PrimaryOrFailover, LoadBalancerBaseTest, ::testing::Values(true)); @@ -607,8 +607,8 @@ class TestZoneAwareLb : public ZoneAwareLoadBalancerBase { class ZoneAwareLoadBalancerBaseTest : public LoadBalancerTestBase { public: envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; - TestZoneAwareLb lb_{priority_set_, lb_stats_, runtime_, random_, common_config_}; - TestZoneAwareLoadBalancer lbx_{priority_set_, lb_stats_, runtime_, random_, common_config_}; + TestZoneAwareLb lb_{priority_set_, stats_, runtime_, random_, common_config_}; + TestZoneAwareLoadBalancer lbx_{priority_set_, stats_, runtime_, random_, common_config_}; }; // Tests the source type static methods in zone aware load balancer. @@ -699,7 +699,7 @@ class RoundRobinLoadBalancerTest : public LoadBalancerTestBase { local_priority_set_->getOrCreateHostSet(0); } lb_ = std::make_shared(priority_set_, local_priority_set_.get(), - lb_stats_, runtime_, random_, common_config_, + stats_, runtime_, random_, common_config_, round_robin_lb_config_, simTime()); } @@ -1147,7 +1147,7 @@ TEST_P(RoundRobinLoadBalancerTest, MaxUnhealthyPanic) { EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); EXPECT_EQ(hostSet().healthy_hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(3UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(3UL, stats_.lb_healthy_panic_.value()); } // Test that no hosts are selected when fail_traffic_on_panic is enabled. @@ -1176,7 +1176,7 @@ TEST_P(RoundRobinLoadBalancerTest, MaxUnhealthyPanicDisableOnPanic) { EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); EXPECT_EQ(hostSet().healthy_hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); } // Ensure if the panic threshold is 0%, panic mode is disabled. @@ -1190,7 +1190,7 @@ TEST_P(RoundRobinLoadBalancerTest, DisablePanicMode) { EXPECT_CALL(runtime_.snapshot_, getInteger("upstream.healthy_panic_threshold", 50)) .WillRepeatedly(Return(0)); EXPECT_EQ(nullptr, lb_->chooseHost(nullptr)); - EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); } // Test of host set selection with host filter @@ -1270,9 +1270,9 @@ TEST_P(RoundRobinLoadBalancerTest, ZoneAwareSmallCluster) { if (&hostSet() == &host_set_) { // Cluster size is computed once at zone aware struct regeneration point. - EXPECT_EQ(1U, lb_stats_.lb_zone_cluster_too_small_.value()); + EXPECT_EQ(1U, stats_.lb_zone_cluster_too_small_.value()); } else { - EXPECT_EQ(0U, lb_stats_.lb_zone_cluster_too_small_.value()); + EXPECT_EQ(0U, stats_.lb_zone_cluster_too_small_.value()); return; } EXPECT_CALL(runtime_.snapshot_, getInteger("upstream.zone_routing.min_cluster_size", 7)) @@ -1314,7 +1314,7 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareDifferentZoneSize) { .WillRepeatedly(Return(7)); EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, lb_stats_.lb_zone_number_differs_.value()); + EXPECT_EQ(1U, stats_.lb_zone_number_differs_.value()); } TEST_P(RoundRobinLoadBalancerTest, ZoneAwareRoutingLargeZoneSwitchOnOff) { @@ -1344,9 +1344,9 @@ TEST_P(RoundRobinLoadBalancerTest, ZoneAwareRoutingLargeZoneSwitchOnOff) { // There is only one host in the given zone for zone aware routing. EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[0][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, lb_stats_.lb_zone_routing_all_directly_.value()); + EXPECT_EQ(1U, stats_.lb_zone_routing_all_directly_.value()); EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[0][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(2U, lb_stats_.lb_zone_routing_all_directly_.value()); + EXPECT_EQ(2U, stats_.lb_zone_routing_all_directly_.value()); // Disable runtime global zone routing. EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.zone_routing.enabled", 100)) @@ -1397,12 +1397,12 @@ TEST_P(RoundRobinLoadBalancerTest, ZoneAwareRoutingSmallZone) { // There is only one host in the given zone for zone aware routing. EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(100)); EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[0][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, lb_stats_.lb_zone_routing_sampled_.value()); + EXPECT_EQ(1U, stats_.lb_zone_routing_sampled_.value()); // Force request out of small zone. EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(9999)).WillOnce(Return(2)); EXPECT_EQ(hostSet().healthy_hosts_per_locality_->get()[1][0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, lb_stats_.lb_zone_routing_cross_zone_.value()); + EXPECT_EQ(1U, stats_.lb_zone_routing_cross_zone_.value()); } TEST_P(RoundRobinLoadBalancerTest, LowPrecisionForDistribution) { @@ -1468,7 +1468,7 @@ TEST_P(RoundRobinLoadBalancerTest, LowPrecisionForDistribution) { // Force request out of small zone and to randomly select zone. EXPECT_CALL(random_, random()).WillOnce(Return(0)).WillOnce(Return(9999)).WillOnce(Return(2)); lb_->chooseHost(nullptr); - EXPECT_EQ(1U, lb_stats_.lb_zone_no_capacity_left_.value()); + EXPECT_EQ(1U, stats_.lb_zone_no_capacity_left_.value()); } TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingOneZone) { @@ -1536,8 +1536,8 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingLocalEmpty) { // Local cluster is not OK, we'll do regular routing. EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, lb_stats_.lb_healthy_panic_.value()); - EXPECT_EQ(1U, lb_stats_.lb_local_cluster_not_ok_.value()); + EXPECT_EQ(0U, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1U, stats_.lb_local_cluster_not_ok_.value()); } TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingLocalEmptyFailTrafficOnPanic) { @@ -1573,8 +1573,8 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingLocalEmptyFailTrafficOnPani // Local cluster is not OK, we'll do regular routing (and select no host, since we're in global // panic). EXPECT_EQ(nullptr, lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, lb_stats_.lb_healthy_panic_.value()); - EXPECT_EQ(1U, lb_stats_.lb_local_cluster_not_ok_.value()); + EXPECT_EQ(0U, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1U, stats_.lb_local_cluster_not_ok_.value()); } // Validate that if we have healthy host lists >= 2, but there is no local @@ -1602,8 +1602,8 @@ TEST_P(RoundRobinLoadBalancerTest, NoZoneAwareRoutingNoLocalLocality) { // Local cluster is not OK, we'll do regular routing. EXPECT_EQ(hostSet().healthy_hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, lb_stats_.lb_healthy_panic_.value()); - EXPECT_EQ(1U, lb_stats_.lb_local_cluster_not_ok_.value()); + EXPECT_EQ(0U, stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1U, stats_.lb_local_cluster_not_ok_.value()); } INSTANTIATE_TEST_SUITE_P(PrimaryOrFailover, RoundRobinLoadBalancerTest, @@ -2021,7 +2021,7 @@ class LeastRequestLoadBalancerTest : public LoadBalancerTestBase { public: LeastRequestLoadBalancer lb_{priority_set_, nullptr, - lb_stats_, + stats_, runtime_, random_, common_config_, @@ -2099,10 +2099,10 @@ TEST_P(LeastRequestLoadBalancerTest, PNC) { // Creating various load balancer objects with different choice configs. envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_choice_count()->set_value(2); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; lr_lb_config.mutable_choice_count()->set_value(5); - LeastRequestLoadBalancer lb_5{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_5{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; // Verify correct number of choices. @@ -2178,7 +2178,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithInvalidActiveRequestBias envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; EXPECT_CALL(runtime_.snapshot_, getDouble("ar_bias", 1.0)).WillRepeatedly(Return(-1.0)); @@ -2232,7 +2232,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithCustomActiveRequestBias) envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; EXPECT_CALL(runtime_.snapshot_, getDouble("ar_bias", 1.0)).WillRepeatedly(Return(0.0)); @@ -2279,7 +2279,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceCallbacks) { TEST_P(LeastRequestLoadBalancerTest, SlowStartWithDefaultParams) { envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; const auto slow_start_window = EdfLoadBalancerBasePeer::slowStartWindow(static_cast(lb_2)); @@ -2300,7 +2300,7 @@ TEST_P(LeastRequestLoadBalancerTest, SlowStartNoWait) { lr_lb_config.mutable_slow_start_config()->mutable_slow_start_window()->set_seconds(60); lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; simTime().advanceTimeWait(std::chrono::seconds(1)); @@ -2371,7 +2371,7 @@ TEST_P(LeastRequestLoadBalancerTest, SlowStartWaitForPassingHC) { lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(0.9); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, lb_stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; simTime().advanceTimeWait(std::chrono::seconds(1)); @@ -2490,7 +2490,7 @@ INSTANTIATE_TEST_SUITE_P(PrimaryOrFailover, LeastRequestLoadBalancerTest, class RandomLoadBalancerTest : public LoadBalancerTestBase { public: void init() { - lb_ = std::make_shared(priority_set_, nullptr, lb_stats_, runtime_, random_, + lb_ = std::make_shared(priority_set_, nullptr, stats_, runtime_, random_, common_config_); } std::shared_ptr lb_; diff --git a/test/common/upstream/load_balancer_simulation_test.cc b/test/common/upstream/load_balancer_simulation_test.cc index 43a575a75fe64..76b27bb98aff4 100644 --- a/test/common/upstream/load_balancer_simulation_test.cc +++ b/test/common/upstream/load_balancer_simulation_test.cc @@ -107,7 +107,7 @@ TEST(DISABLED_LeastRequestLoadBalancerWeightTest, Weight) { class DISABLED_SimulationTest : public testing::Test { public: DISABLED_SimulationTest() - : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) { + : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) { ON_CALL(runtime_.snapshot_, getInteger("upstream.healthy_panic_threshold", 50U)) .WillByDefault(Return(50U)); ON_CALL(runtime_.snapshot_, featureEnabled("upstream.zone_routing.enabled", 100)) @@ -128,7 +128,7 @@ class DISABLED_SimulationTest : public testing::Test { std::vector healthy_destination_cluster) { local_priority_set_ = new PrioritySetImpl; // TODO(mattklein123): make load balancer per originating cluster host. - RandomLoadBalancer lb(priority_set_, local_priority_set_, lb_stats_, runtime_, random_, + RandomLoadBalancer lb(priority_set_, local_priority_set_, stats_, runtime_, random_, common_config_); HostsPerLocalitySharedPtr upstream_per_zone_hosts = @@ -246,7 +246,7 @@ class DISABLED_SimulationTest : public testing::Test { Random::RandomGeneratorImpl random_; Stats::IsolatedStoreImpl stats_store_; ClusterLbStatNames lb_stat_names_; - ClusterLbStats lb_stats_; + ClusterLbStats stats_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; }; diff --git a/test/common/upstream/maglev_lb_test.cc b/test/common/upstream/maglev_lb_test.cc index 09c925cf49078..997d3764fe64d 100644 --- a/test/common/upstream/maglev_lb_test.cc +++ b/test/common/upstream/maglev_lb_test.cc @@ -45,10 +45,10 @@ class TestLoadBalancerContext : public LoadBalancerContextBase { class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::Test { public: MaglevLoadBalancerTest() - : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) {} + : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) {} void createLb() { - lb_ = std::make_unique(priority_set_, lb_stats_, stats_store_, runtime_, + lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, random_, config_, common_config_); } @@ -65,7 +65,7 @@ class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public test std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; ClusterLbStatNames lb_stat_names_; - ClusterLbStats lb_stats_; + ClusterLbStats stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; NiceMock runtime_; diff --git a/test/common/upstream/random_load_balancer_fuzz_test.cc b/test/common/upstream/random_load_balancer_fuzz_test.cc index 85a223f1e9606..6d5700654989e 100644 --- a/test/common/upstream/random_load_balancer_fuzz_test.cc +++ b/test/common/upstream/random_load_balancer_fuzz_test.cc @@ -21,7 +21,7 @@ DEFINE_PROTO_FUZZER(const test::common::upstream::RandomLoadBalancerTestCase& in try { load_balancer_fuzz.lb_ = std::make_unique( - load_balancer_fuzz.priority_set_, nullptr, load_balancer_fuzz.lb_stats_, + load_balancer_fuzz.priority_set_, nullptr, load_balancer_fuzz.stats_, load_balancer_fuzz.runtime_, load_balancer_fuzz.random_, input.load_balancer_test_case().common_lb_config()); } catch (EnvoyException& e) { diff --git a/test/common/upstream/ring_hash_lb_test.cc b/test/common/upstream/ring_hash_lb_test.cc index 9d40875bede73..4e5775be8ed2d 100644 --- a/test/common/upstream/ring_hash_lb_test.cc +++ b/test/common/upstream/ring_hash_lb_test.cc @@ -58,10 +58,10 @@ class RingHashLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::TestWithParam { public: RingHashLoadBalancerTest() - : lb_stat_names_(stats_store_.symbolTable()), lb_stats_(lb_stat_names_, stats_store_) {} + : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) {} void init() { - lb_ = std::make_unique(priority_set_, lb_stats_, stats_store_, runtime_, + lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, random_, config_, common_config_); lb_->initialize(); } @@ -76,7 +76,7 @@ class RingHashLoadBalancerTest : public Event::TestUsingSimulatedTime, std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; ClusterLbStatNames lb_stat_names_; - ClusterLbStats lb_stats_; + ClusterLbStats stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; NiceMock runtime_; @@ -215,7 +215,7 @@ TEST_P(RingHashLoadBalancerTest, Basic) { EXPECT_CALL(random_, random()).WillOnce(Return(16117243373044804880UL)); EXPECT_EQ(hostSet().hosts_[0], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); hostSet().healthy_hosts_.clear(); hostSet().runCallbacks({}, {}); @@ -224,7 +224,7 @@ TEST_P(RingHashLoadBalancerTest, Basic) { TestLoadBalancerContext context(0); EXPECT_EQ(hostSet().hosts_[4], lb->chooseHost(&context)); } - EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); } // Ensure if all the hosts with priority 0 unhealthy, the next priority hosts are used. @@ -321,7 +321,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithMurmur2) { EXPECT_CALL(random_, random()).WillOnce(Return(10150910876324007730UL)); EXPECT_EQ(hostSet().hosts_[2], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); } // Expect reasonable results with hostname. @@ -384,7 +384,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithHostname) { EXPECT_EQ(hostSet().hosts_[3], lb->chooseHost(&context)); } { EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); hostSet().healthy_hosts_.clear(); hostSet().runCallbacks({}, {}); @@ -393,7 +393,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithHostname) { TestLoadBalancerContext context(0); EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(&context)); } - EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); } // Expect reasonable results with metadata hash_key. @@ -456,7 +456,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithMetadataHashKey) { EXPECT_EQ(hostSet().hosts_[3], lb->chooseHost(&context)); } { EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(nullptr)); } - EXPECT_EQ(0UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(0UL, stats_.lb_healthy_panic_.value()); hostSet().healthy_hosts_.clear(); hostSet().runCallbacks({}, {}); @@ -465,7 +465,7 @@ TEST_P(RingHashLoadBalancerTest, BasicWithMetadataHashKey) { TestLoadBalancerContext context(0); EXPECT_EQ(hostSet().hosts_[5], lb->chooseHost(&context)); } - EXPECT_EQ(1UL, lb_stats_.lb_healthy_panic_.value()); + EXPECT_EQ(1UL, stats_.lb_healthy_panic_.value()); } // Test the same ring as Basic but exercise retry host predicate behavior. diff --git a/test/common/upstream/round_robin_load_balancer_fuzz_test.cc b/test/common/upstream/round_robin_load_balancer_fuzz_test.cc index 2ecad7819299e..75a456f44c87f 100644 --- a/test/common/upstream/round_robin_load_balancer_fuzz_test.cc +++ b/test/common/upstream/round_robin_load_balancer_fuzz_test.cc @@ -29,7 +29,7 @@ DEFINE_PROTO_FUZZER(const test::common::upstream::RoundRobinLoadBalancerTestCase zone_aware_load_balancer_fuzz.lb_ = std::make_unique( zone_aware_load_balancer_fuzz.priority_set_, zone_aware_load_balancer_fuzz.local_priority_set_.get(), - zone_aware_load_balancer_fuzz.lb_stats_, zone_aware_load_balancer_fuzz.runtime_, + zone_aware_load_balancer_fuzz.stats_, zone_aware_load_balancer_fuzz.runtime_, zone_aware_load_balancer_fuzz.random_, zone_aware_load_balancer_test_case.load_balancer_test_case().common_lb_config(), input.round_robin_lb_config(), zone_aware_load_balancer_fuzz.simTime()); diff --git a/test/common/upstream/subset_lb_test.cc b/test/common/upstream/subset_lb_test.cc index 8749389992032..40e44d0fbbefb 100644 --- a/test/common/upstream/subset_lb_test.cc +++ b/test/common/upstream/subset_lb_test.cc @@ -170,7 +170,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, public: SubsetLoadBalancerTest() : scope_(stats_store_.createScope("testprefix")), lb_stat_names_(stats_store_.symbolTable()), - lb_stats_(lb_stat_names_, stats_store_) { + stats_(lb_stat_names_, stats_store_) { least_request_lb_config_.mutable_choice_count()->set_value(2); } @@ -239,7 +239,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, } lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, *scope_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, *scope_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); } @@ -289,7 +289,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, {}, {}, {}, absl::nullopt); lb_ = std::make_shared( - lb_type_, priority_set_, &local_priority_set_, lb_stats_, *scope_, runtime_, random_, + lb_type_, priority_set_, &local_priority_set_, stats_, *scope_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); } @@ -528,7 +528,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, Stats::IsolatedStoreImpl stats_store_; Stats::ScopeSharedPtr scope_; ClusterLbStatNames lb_stat_names_; - ClusterLbStats lb_stats_; + ClusterLbStats stats_; PrioritySetImpl local_priority_set_; HostVectorSharedPtr local_hosts_; HostsPerLocalitySharedPtr local_hosts_per_locality_; @@ -542,8 +542,8 @@ TEST_F(SubsetLoadBalancerTest, NoFallback) { init(); EXPECT_EQ(nullptr, lb_->chooseHost(nullptr)); - EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); EXPECT_EQ(nullptr, lb_->peekAnotherHost(nullptr)); EXPECT_FALSE(lb_->lifetimeCallbacks().has_value()); @@ -600,8 +600,8 @@ TEST_F(SubsetLoadBalancerTest, FallbackAnyEndpoint) { init(); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, FallbackAnyEndpointAfterUpdate) { @@ -632,8 +632,8 @@ TEST_F(SubsetLoadBalancerTest, FallbackDefaultSubset) { }); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); } TEST_F(SubsetLoadBalancerTest, FallbackPanicMode) { @@ -651,9 +651,9 @@ TEST_F(SubsetLoadBalancerTest, FallbackPanicMode) { }); EXPECT_TRUE(lb_->chooseHost(nullptr) != nullptr); - EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_panic_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_fallback_panic_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, FallbackPanicModeWithUpdates) { @@ -709,8 +709,8 @@ TEST_F(SubsetLoadBalancerTest, FallbackEmptyDefaultSubsetConvertsToAnyEndpoint) EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(nullptr)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(nullptr)); - EXPECT_EQ(2U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_selected_.value()); } TEST_F(SubsetLoadBalancerTest, FallbackOnUnknownMetadata) { @@ -750,8 +750,8 @@ TEST_F(SubsetLoadBalancerTest, BalancesSubset) { EXPECT_EQ(host_set_.hosts_[2], lb_->chooseHost(&context_11)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_11)); - EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, BalancesSubsetAfterUpdate) { @@ -778,7 +778,7 @@ TEST_P(SubsetLoadBalancerTest, BalancesSubsetAfterUpdate) { EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[2], lb_->chooseHost(&context_11)); EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_11)); - EXPECT_EQ(2U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_created_.value()); modifyHosts({makeHost("tcp://127.0.0.1:8000", {{"version", "1.2"}}), makeHost("tcp://127.0.0.1:8001", {{"version", "1.0"}})}, @@ -790,8 +790,8 @@ TEST_P(SubsetLoadBalancerTest, BalancesSubsetAfterUpdate) { EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_11)); EXPECT_EQ(host_set_.hosts_[2], lb_->chooseHost(&context_12)); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); } TEST_P(SubsetLoadBalancerTest, ListAsAnyEnabled) { @@ -981,9 +981,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { // Add hosts initial hosts. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"default", "true"}}}}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -995,9 +995,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1009,9 +1009,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { // No hosts added nor removed, so we bypass modifyHosts(). host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_13)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1022,9 +1022,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1036,9 +1036,9 @@ TEST_P(SubsetLoadBalancerTest, OnlyMetadataChanged) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1053,43 +1053,43 @@ TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurged) { // Simple add and remove. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"stage", "prod"}}}}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); host_set_.hosts_[0]->metadata(buildMetadataWithStage("1.3")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); // Move host that was in the version + stage subset into a new version only subset. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.4")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_removed_.value()); // Create a new version + stage subset. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.5", "devel")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(7U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(7U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_removed_.value()); // Now move it back to its original version + stage subset. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.0", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(9U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(6U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(9U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(6U, stats_.lb_subsets_removed_.value()); // Finally, remove the original version + stage subset again. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.6")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(10U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(8U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(10U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(8U, stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedCollapsed) { @@ -1100,30 +1100,30 @@ TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedCollapsed) { // Init subsets. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"stage", "prod"}}}}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); // Get rid of 1.0. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); // Get rid of stage prod. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(1U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_removed_.value()); // Add stage prod back. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedVersionChanged) { @@ -1134,24 +1134,24 @@ TEST_P(SubsetLoadBalancerTest, EmptySubsetsPurgedVersionChanged) { // Init subsets. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"stage", "prod"}}}}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); // Get rid of 1.0. host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.2", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); // Change versions. host_set_.hosts_[0]->metadata(buildMetadataWithStage("1.3")); host_set_.hosts_[1]->metadata(buildMetadataWithStage("1.4", "prod")); host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(7U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(7U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { @@ -1178,9 +1178,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { // Add hosts initial hosts. init({{"tcp://127.0.0.1:8000", {{"version", "1.2"}}}, {"tcp://127.0.0.1:8001", {{"version", "1.0"}, {"default", "true"}}}}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(3U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1193,9 +1193,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { // Add a new host. modifyHosts({makeHost("tcp://127.0.0.1:8002", {{"version", "1.3"}})}, {}); - EXPECT_EQ(4U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1207,9 +1207,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { modifyHosts({}, {host_set_.hosts_[2]}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1222,9 +1222,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { modifyHosts({makeHost("tcp://127.0.0.1:8003", {{"version", "1.4"}})}, {host_set_.hosts_[1]}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_default)); @@ -1237,9 +1237,9 @@ TEST_P(SubsetLoadBalancerTest, MetadataChangedHostsAddedRemoved) { host_set_.runCallbacks({}, {}); - EXPECT_EQ(3U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(5U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(3U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(5U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_removed_.value()); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_12)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_default)); @@ -1266,20 +1266,20 @@ TEST_P(SubsetLoadBalancerTest, UpdateRemovingLastSubsetHost) { TestLoadBalancerContext context({{"version", "1.0"}}); EXPECT_EQ(host_v10, lb_->chooseHost(&context)); - EXPECT_EQ(1U, lb_stats_.lb_subsets_selected_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_created_.value()); modifyHosts({}, {host_v10}); // fallback to any endpoint EXPECT_EQ(host_v11, lb_->chooseHost(&context)); - EXPECT_EQ(1U, lb_stats_.lb_subsets_selected_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(2U, lb_stats_.lb_subsets_created_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_selected_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(2U, stats_.lb_subsets_created_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, UpdateRemovingUnknownHost) { @@ -1510,7 +1510,7 @@ TEST_F(SubsetLoadBalancerTest, IgnoresHostsWithoutMetadata) { host_set_.healthy_hosts_per_locality_ = host_set_.hosts_per_locality_; lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); @@ -1930,7 +1930,7 @@ TEST_F(SubsetLoadBalancerTest, DisabledLocalityWeightAwareness) { host_set_, {1, 100}); lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); @@ -1954,7 +1954,7 @@ TEST_F(SubsetLoadBalancerTest, DoesNotCheckHostHealth) { EXPECT_CALL(*mock_host, weight()).WillRepeatedly(Return(1)); lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); } @@ -1978,7 +1978,7 @@ TEST_F(SubsetLoadBalancerTest, EnabledLocalityWeightAwareness) { host_set_, {1, 100}); lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); @@ -2014,7 +2014,7 @@ TEST_F(SubsetLoadBalancerTest, EnabledScaleLocalityWeights) { host_set_, {50, 50}); lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); @@ -2060,7 +2060,7 @@ TEST_F(SubsetLoadBalancerTest, EnabledScaleLocalityWeightsRounding) { host_set_, {2, 2}); lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.0"}}); @@ -2093,7 +2093,7 @@ TEST_F(SubsetLoadBalancerTest, ScaleLocalityWeightsWithNoLocalityWeights) { host_set_); lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, lb_stats_, stats_store_, runtime_, random_, subset_info_, + lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, common_config_, simTime()); } @@ -2111,13 +2111,13 @@ TEST_P(SubsetLoadBalancerTest, GaugesUpdatedOnDestroy) { {"tcp://127.0.0.1:80", {{"version", "1.0"}}}, }); - EXPECT_EQ(1U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(0U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_removed_.value()); lb_ = nullptr; - EXPECT_EQ(0U, lb_stats_.lb_subsets_active_.value()); - EXPECT_EQ(1U, lb_stats_.lb_subsets_removed_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_active_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_removed_.value()); } TEST_P(SubsetLoadBalancerTest, SubsetSelectorNoFallbackPerSelector) { @@ -2146,8 +2146,8 @@ TEST_P(SubsetLoadBalancerTest, SubsetSelectorNoFallbackPerSelector) { EXPECT_EQ(host_set_.hosts_[1], lb_->chooseHost(&context_10)); EXPECT_EQ(host_set_.hosts_[3], lb_->chooseHost(&context_11)); EXPECT_EQ(nullptr, lb_->chooseHost(&context_12)); - EXPECT_EQ(0U, lb_stats_.lb_subsets_fallback_.value()); - EXPECT_EQ(4U, lb_stats_.lb_subsets_selected_.value()); + EXPECT_EQ(0U, stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(4U, stats_.lb_subsets_selected_.value()); } TEST_P(SubsetLoadBalancerTest, FallbackNotDefinedForIntermediateSelector) { @@ -2418,7 +2418,7 @@ TEST_P(SubsetLoadBalancerTest, KeysSubsetFallbackToNotExistingSelector) { TestLoadBalancerContext context_nx({{"version", "1.0"}, {"stage", "test"}}); EXPECT_EQ(host_set_.hosts_[0], lb_->chooseHost(&context_nx)); - EXPECT_EQ(1U, lb_stats_.lb_subsets_fallback_.value()); + EXPECT_EQ(1U, stats_.lb_subsets_fallback_.value()); } TEST_P(SubsetLoadBalancerTest, MetadataFallbackList) { From fc425ca3636cfc43a645619668ee1b4bd5fd5c9e Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 10 Nov 2022 14:50:19 -0500 Subject: [PATCH 010/122] fix merge error Signed-off-by: Xin Zhuang --- source/common/upstream/thread_aware_lb_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/upstream/thread_aware_lb_impl.h b/source/common/upstream/thread_aware_lb_impl.h index 030d63143b426..b320f7599cf84 100644 --- a/source/common/upstream/thread_aware_lb_impl.h +++ b/source/common/upstream/thread_aware_lb_impl.h @@ -111,7 +111,7 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), - factory_(new LoadBalancerFactoryImpl(lb_stats, random, override_host_status_)) {} + factory_(new LoadBalancerFactoryImpl(lb_stats, random)) {} private: struct PerPriorityState { From 7214c3bd7b0f061fc65c4c0ea14c6eda38324380 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 10:52:18 -0500 Subject: [PATCH 011/122] resovle one million conflicts Signed-off-by: Xin Zhuang --- source/common/conn_pool/conn_pool_base.cc | 78 ------- source/common/http/codec_client.cc | 2 +- source/common/http/codec_client.h | 4 - source/common/http/conn_pool_base.cc | 15 -- source/common/http/conn_pool_base.h | 10 +- source/common/http/conn_pool_grid.cc | 4 - source/common/http/http1/conn_pool.cc | 8 - source/common/http/http2/conn_pool.cc | 2 +- source/common/http/http3/conn_pool.cc | 4 - source/common/router/retry_state_impl.cc | 24 --- source/common/router/router.cc | 28 --- source/common/router/upstream_codec_filter.cc | 4 +- source/common/router/upstream_request.cc | 12 +- source/common/tcp/conn_pool.cc | 10 +- source/common/tcp_proxy/tcp_proxy.cc | 20 -- .../common/upstream/cluster_manager_impl.cc | 12 -- source/common/upstream/cluster_manager_impl.h | 8 - source/common/upstream/conn_pool_map_impl.h | 2 +- .../upstream/health_checker_base_impl.cc | 2 +- source/common/upstream/load_balancer_impl.cc | 20 +- source/common/upstream/load_balancer_impl.h | 35 +-- .../common/upstream/thread_aware_lb_impl.cc | 2 +- source/common/upstream/upstream_impl.h | 4 - .../original_dst/original_dst_cluster.cc | 6 +- .../network/common/redis/client_impl.cc | 43 ---- .../network/redis_proxy/conn_pool_impl.cc | 23 -- .../filters/udp/udp_proxy/udp_proxy_filter.cc | 20 -- .../stat_sinks/common/statsd/statsd.cc | 12 -- .../extensions/stat_sinks/hystrix/hystrix.cc | 4 - test/common/conn_pool/conn_pool_base_test.cc | 20 +- test/common/router/retry_state_impl_test.cc | 93 -------- test/common/upstream/health_check_fuzz.cc | 12 -- .../upstream/health_checker_impl_test.cc | 200 ------------------ .../upstream/load_balancer_benchmark.cc | 5 - .../upstream/load_balancer_impl_test.cc | 8 - test/common/upstream/maglev_lb_test.cc | 8 - test/common/upstream/ring_hash_lb_test.cc | 8 - test/common/upstream/upstream_impl_test.cc | 27 +-- .../clusters/aggregate/cluster_test.cc | 5 - .../stats_sinks/common/statsd/statsd_test.cc | 12 -- .../stats_sinks/hystrix/hystrix_test.cc | 6 +- test/mocks/upstream/cluster_info.cc | 12 -- test/mocks/upstream/cluster_info.h | 12 -- 43 files changed, 49 insertions(+), 797 deletions(-) diff --git a/source/common/conn_pool/conn_pool_base.cc b/source/common/conn_pool/conn_pool_base.cc index d254af27066ab..e2d308ca4ad89 100644 --- a/source/common/conn_pool/conn_pool_base.cc +++ b/source/common/conn_pool/conn_pool_base.cc @@ -135,11 +135,7 @@ ConnPoolImplBase::tryCreateNewConnection(float global_preconnect_ratio) { const bool can_create_connection = host_->canCreateConnection(priority_); if (!can_create_connection) { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_overflow_.inc(); -======= host_->cluster().trafficStats()->upstream_cx_overflow_.inc(); ->>>>>>> main } // If we are at the connection circuit-breaker limit due to other upstreams having // too many open connections, and this upstream has no connections, always create one, to @@ -172,22 +168,14 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& ASSERT(client.readyForStream()); if (client.state() == Envoy::ConnectionPool::ActiveClient::State::ReadyForEarlyData) { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_0rtt_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_0rtt_.inc(); ->>>>>>> main } if (enforceMaxRequests() && !host_->cluster().resourceManager(priority_).requests().canCreate()) { ENVOY_LOG(debug, "max streams overflow"); onPoolFailure(client.real_host_description_, absl::string_view(), ConnectionPool::PoolFailureReason::Overflow, context); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_pending_overflow_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_pending_overflow_.inc(); ->>>>>>> main return; } ENVOY_CONN_LOG(debug, "creating stream", client); @@ -197,11 +185,7 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& client.remaining_streams_--; if (client.remaining_streams_ == 0) { ENVOY_CONN_LOG(debug, "maximum streams per connection, start draining", client); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_max_requests_.inc(); -======= host_->cluster().trafficStats()->upstream_cx_max_requests_.inc(); ->>>>>>> main transitionActiveClientState(client, Envoy::ConnectionPool::ActiveClient::State::Draining); } else if (capacity == 1) { // As soon as the new stream is created, the client will be maxed out. @@ -218,13 +202,8 @@ void ConnPoolImplBase::attachStreamToClient(Envoy::ConnectionPool::ActiveClient& num_active_streams_++; host_->stats().rq_total_.inc(); host_->stats().rq_active_.inc(); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_total_.inc(); - host_->cluster().trafficStats()->>upstream_rq_active_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_total_.inc(); host_->cluster().trafficStats()->upstream_rq_active_.inc(); ->>>>>>> main host_->cluster().resourceManager(priority_).requests().inc(); onPoolReady(client, context); @@ -237,11 +216,7 @@ void ConnPoolImplBase::onStreamClosed(Envoy::ConnectionPool::ActiveClient& clien state_.decrActiveStreams(1); num_active_streams_--; host_->stats().rq_active_.dec(); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_active_.dec(); -======= host_->cluster().trafficStats()->upstream_rq_active_.dec(); ->>>>>>> main host_->cluster().resourceManager(priority_).requests().dec(); // We don't update the capacity for HTTP/3 as the stream count should only // increase when a MAX_STREAMS frame is received. @@ -307,11 +282,7 @@ ConnectionPool::Cancellable* ConnPoolImplBase::newStreamImpl(AttachContext& cont ENVOY_LOG(debug, "max pending streams overflow"); onPoolFailure(nullptr, absl::string_view(), ConnectionPool::PoolFailureReason::Overflow, context); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_pending_overflow_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_pending_overflow_.inc(); ->>>>>>> main return nullptr; } @@ -519,11 +490,7 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view if (!client.hasHandshakeCompleted()) { client.has_handshake_completed_ = true; -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_connect_fail_.inc(); -======= host_->cluster().trafficStats()->upstream_cx_connect_fail_.inc(); ->>>>>>> main host_->stats().cx_connect_fail_.inc(); onConnectFailed(client); @@ -628,11 +595,7 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view client.currentUnusedCapacity()); // No need to update connecting capacity and connect_timer_ as the client is still connecting. ASSERT(client.state() == ActiveClient::State::Connecting); -<<<<<<< HEAD - host()->cluster().trafficStats()->>upstream_cx_connect_with_0_rtt_.inc(); -======= host()->cluster().trafficStats()->upstream_cx_connect_with_0_rtt_.inc(); ->>>>>>> main transitionActiveClientState(client, (client.currentUnusedCapacity() > 0 ? ActiveClient::State::ReadyForEarlyData : ActiveClient::State::Busy)); @@ -643,22 +606,13 @@ void ConnPoolImplBase::onConnectionEvent(ActiveClient& client, absl::string_view PendingStream::PendingStream(ConnPoolImplBase& parent, bool can_send_early_data) : parent_(parent), can_send_early_data_(can_send_early_data) { -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_rq_pending_total_.inc(); - parent_.host()->cluster().trafficStats()->>upstream_rq_pending_active_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_rq_pending_total_.inc(); parent_.host()->cluster().trafficStats()->upstream_rq_pending_active_.inc(); ->>>>>>> main parent_.host()->cluster().resourceManager(parent_.priority()).pendingRequests().inc(); } PendingStream::~PendingStream() { -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_rq_pending_active_.dec(); -======= parent_.host()->cluster().trafficStats()->upstream_rq_pending_active_.dec(); ->>>>>>> main parent_.host()->cluster().resourceManager(parent_.priority()).pendingRequests().dec(); } @@ -676,11 +630,7 @@ void ConnPoolImplBase::purgePendingStreams( while (!pending_streams_to_purge_.empty()) { PendingStreamPtr stream = pending_streams_to_purge_.front()->removeFromList(pending_streams_to_purge_); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_pending_failure_eject_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_pending_failure_eject_.inc(); ->>>>>>> main onPoolFailure(host_description, failure_reason, reason, stream->context()); } } @@ -733,11 +683,7 @@ void ConnPoolImplBase::onPendingStreamCancel(PendingStream& stream, } } -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_cancelled_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_cancelled_.inc(); ->>>>>>> main checkForIdleAndCloseIdleConnsIfDraining(); } @@ -811,28 +757,16 @@ ActiveClient::ActiveClient(ConnPoolImplBase& parent, uint32_t lifetime_stream_li concurrent_stream_limit_(translateZeroToUnlimited(concurrent_stream_limit)), connect_timer_(parent_.dispatcher().createTimer([this]() { onConnectTimeout(); })) { conn_connect_ms_ = std::make_unique( -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_cx_connect_ms_, - parent_.dispatcher().timeSource()); - conn_length_ = std::make_unique( - parent_.host()->cluster().trafficStats()->>upstream_cx_length_ms_, -======= parent_.host()->cluster().trafficStats()->upstream_cx_connect_ms_, parent_.dispatcher().timeSource()); conn_length_ = std::make_unique( parent_.host()->cluster().trafficStats()->upstream_cx_length_ms_, ->>>>>>> main parent_.dispatcher().timeSource()); connect_timer_->enableTimer(parent_.host()->cluster().connectTimeout()); parent_.host()->stats().cx_total_.inc(); parent_.host()->stats().cx_active_.inc(); -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_cx_total_.inc(); - parent_.host()->cluster().trafficStats()->>upstream_cx_active_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_cx_total_.inc(); parent_.host()->cluster().trafficStats()->upstream_cx_active_.inc(); ->>>>>>> main parent_.host()->cluster().resourceManager(parent_.priority()).connections().inc(); } @@ -844,11 +778,7 @@ void ActiveClient::releaseResourcesBase() { conn_length_->complete(); -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_cx_active_.dec(); -======= parent_.host()->cluster().trafficStats()->upstream_cx_active_.dec(); ->>>>>>> main parent_.host()->stats().cx_active_.dec(); parent_.host()->cluster().resourceManager(parent_.priority()).connections().dec(); } @@ -856,11 +786,7 @@ void ActiveClient::releaseResourcesBase() { void ActiveClient::onConnectTimeout() { ENVOY_CONN_LOG(debug, "connect timeout", *this); -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_cx_connect_timeout_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_cx_connect_timeout_.inc(); ->>>>>>> main timed_out_ = true; close(); } @@ -885,11 +811,7 @@ void ActiveClient::onConnectionDurationTimeout() { } ENVOY_CONN_LOG(debug, "max connection duration reached, start draining", *this); -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.inc(); ->>>>>>> main parent_.transitionActiveClientState(*this, Envoy::ConnectionPool::ActiveClient::State::Draining); // Close out the draining client if we no longer have active streams. diff --git a/source/common/http/codec_client.cc b/source/common/http/codec_client.cc index 6c84286757d27..99998ae5c8ec7 100644 --- a/source/common/http/codec_client.cc +++ b/source/common/http/codec_client.cc @@ -172,7 +172,7 @@ void CodecClient::onData(Buffer::Instance& data) { (!active_requests_.empty() || getPrematureResponseHttpCode(status) != Code::RequestTimeout)) { <<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_protocol_error_.inc(); + host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); ======= host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); >>>>>>> main diff --git a/source/common/http/codec_client.h b/source/common/http/codec_client.h index 19a6649df675a..65c3d9715f849 100644 --- a/source/common/http/codec_client.h +++ b/source/common/http/codec_client.h @@ -164,11 +164,7 @@ class CodecClient : protected Logger::Loggable, } void onIdleTimeout() { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_idle_timeout_.inc(); -======= host_->cluster().trafficStats()->upstream_cx_idle_timeout_.inc(); ->>>>>>> main close(); } diff --git a/source/common/http/conn_pool_base.cc b/source/common/http/conn_pool_base.cc index a31666f546f98..afec14e51bf9b 100644 --- a/source/common/http/conn_pool_base.cc +++ b/source/common/http/conn_pool_base.cc @@ -99,11 +99,7 @@ static const uint64_t DEFAULT_MAX_STREAMS = (1 << 29); void MultiplexedActiveClientBase::onGoAway(Http::GoAwayErrorCode) { ENVOY_CONN_LOG(debug, "remote goaway", *codec_client_); -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_cx_close_notify_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_cx_close_notify_.inc(); ->>>>>>> main if (state() != ActiveClient::State::Draining) { if (codec_client_->numActiveRequests() == 0) { codec_client_->close(); @@ -164,27 +160,16 @@ void MultiplexedActiveClientBase::onStreamReset(Http::StreamResetReason reason) switch (reason) { case StreamResetReason::ConnectionTermination: case StreamResetReason::ConnectionFailure: -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_rq_pending_failure_eject_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_rq_pending_failure_eject_.inc(); ->>>>>>> main closed_with_active_rq_ = true; break; case StreamResetReason::LocalReset: case StreamResetReason::ProtocolError: case StreamResetReason::OverloadManager: -<<<<<<< HEAD - parent_.host()->cluster().trafficStats()->>upstream_rq_tx_reset_.inc(); - break; - case StreamResetReason::RemoteReset: - parent_.host()->cluster().trafficStats()->>upstream_rq_rx_reset_.inc(); -======= parent_.host()->cluster().trafficStats()->upstream_rq_tx_reset_.inc(); break; case StreamResetReason::RemoteReset: parent_.host()->cluster().trafficStats()->upstream_rq_rx_reset_.inc(); ->>>>>>> main break; case StreamResetReason::LocalRefusedStreamReset: case StreamResetReason::RemoteRefusedStreamReset: diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index 479d28515da8a..9747257bf676c 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -130,11 +130,11 @@ class ActiveClient : public Envoy::ConnectionPool::ActiveClient { codec_client_->addConnectionCallbacks(*this); codec_client_->setConnectionStats( <<<<<<< HEAD - {parent_.host()->cluster().trafficStats()->>upstream_cx_rx_bytes_total_, - parent_.host()->cluster().trafficStats()->>upstream_cx_rx_bytes_buffered_, - parent_.host()->cluster().trafficStats()->>upstream_cx_tx_bytes_total_, - parent_.host()->cluster().trafficStats()->>upstream_cx_tx_bytes_buffered_, - &parent_.host()->cluster().trafficStats()->>bind_errors_, nullptr}); + {parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_total_, + parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, + parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_total_, + parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, + &parent_.host()->cluster().trafficStats()->bind_errors_, nullptr}); ======= {parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_total_, parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, diff --git a/source/common/http/conn_pool_grid.cc b/source/common/http/conn_pool_grid.cc index d241cf9d72e3d..1e6e6cf3419d0 100644 --- a/source/common/http/conn_pool_grid.cc +++ b/source/common/http/conn_pool_grid.cc @@ -382,11 +382,7 @@ HttpServerPropertiesCache::Http3StatusTracker& ConnectivityGrid::getHttp3StatusT bool ConnectivityGrid::isHttp3Broken() const { return getHttp3StatusTracker().isHttp3Broken(); } void ConnectivityGrid::markHttp3Broken() { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_http3_broken_.inc(); -======= host_->cluster().trafficStats()->upstream_http3_broken_.inc(); ->>>>>>> main getHttp3StatusTracker().markHttp3Broken(); } diff --git a/source/common/http/http1/conn_pool.cc b/source/common/http/http1/conn_pool.cc index 7293364fdd707..0439641c472f2 100644 --- a/source/common/http/http1/conn_pool.cc +++ b/source/common/http/http1/conn_pool.cc @@ -42,11 +42,7 @@ void ActiveClient::StreamWrapper::decodeHeaders(ResponseHeaderMapPtr&& headers, close_connection_ = HeaderUtility::shouldCloseConnection(parent_.codec_client_->protocol(), *headers); if (close_connection_) { -<<<<<<< HEAD - parent_.parent().host()->cluster().trafficStats()->>upstream_cx_close_notify_.inc(); -======= parent_.parent().host()->cluster().trafficStats()->upstream_cx_close_notify_.inc(); ->>>>>>> main } ResponseDecoderWrapper::decodeHeaders(std::move(headers), end_stream); } @@ -80,11 +76,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, : Envoy::Http::ActiveClient(parent, parent.host()->cluster().maxRequestsPerConnection(), /* effective_concurrent_stream_limit */ 1, /* configured_concurrent_stream_limit */ 1, data) { -<<<<<<< HEAD - parent.host()->cluster().trafficStats()->>upstream_cx_http1_total_.inc(); -======= parent.host()->cluster().trafficStats()->upstream_cx_http1_total_.inc(); ->>>>>>> main } ActiveClient::~ActiveClient() { ASSERT(!stream_wrapper_.get()); } diff --git a/source/common/http/http2/conn_pool.cc b/source/common/http/http2/conn_pool.cc index a1af39169a8f0..62c5a46aa6e9e 100644 --- a/source/common/http/http2/conn_pool.cc +++ b/source/common/http/http2/conn_pool.cc @@ -46,7 +46,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, parent, calculateInitialStreamsLimit(parent.cache(), parent.origin(), parent.host()), parent.host()->cluster().http2Options().max_concurrent_streams().value(), <<<<<<< HEAD - parent.host()->cluster().trafficStats()->>upstream_cx_http2_total_, data) {} + parent.host()->cluster().trafficStats()->upstream_cx_http2_total_, data) {} ======= parent.host()->cluster().trafficStats()->upstream_cx_http2_total_, data) {} >>>>>>> main diff --git a/source/common/http/http3/conn_pool.cc b/source/common/http/http3/conn_pool.cc index f281e5241544e..ea7d365601386 100644 --- a/source/common/http/http3/conn_pool.cc +++ b/source/common/http/http3/conn_pool.cc @@ -41,11 +41,7 @@ ActiveClient::ActiveClient(Envoy::Http::HttpConnPoolImplBase& parent, Upstream::Host::CreateConnectionData& data) : MultiplexedActiveClientBase( parent, getMaxStreams(parent.host()->cluster()), getMaxStreams(parent.host()->cluster()), -<<<<<<< HEAD - parent.host()->cluster().trafficStats()->>upstream_cx_http3_total_, data), -======= parent.host()->cluster().trafficStats()->upstream_cx_http3_total_, data), ->>>>>>> main async_connect_callback_(parent_.dispatcher().createSchedulableCallback([this]() { if (state() != Envoy::ConnectionPool::ActiveClient::State::Connecting) { return; diff --git a/source/common/router/retry_state_impl.cc b/source/common/router/retry_state_impl.cc index 2616a93b50f27..f45144832f629 100644 --- a/source/common/router/retry_state_impl.cc +++ b/source/common/router/retry_state_impl.cc @@ -185,21 +185,13 @@ void RetryStateImpl::enableBackoffTimer() { // be reused. ratelimited_backoff_strategy_.reset(); -<<<<<<< HEAD - cluster_.trafficStats()->>upstream_rq_retry_backoff_ratelimited_.inc(); -======= cluster_.trafficStats()->upstream_rq_retry_backoff_ratelimited_.inc(); ->>>>>>> main } else { // Otherwise we use a fully jittered exponential backoff algorithm. retry_timer_->enableTimer(std::chrono::milliseconds(backoff_strategy_->nextBackOffMs())); -<<<<<<< HEAD - cluster_.trafficStats()->>upstream_rq_retry_backoff_exponential_.inc(); -======= cluster_.trafficStats()->upstream_rq_retry_backoff_exponential_.inc(); ->>>>>>> main } } @@ -285,11 +277,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba // retry this particular request, we can infer that we did a retry earlier // and it was successful. if ((backoff_callback_ || next_loop_callback_) && would_retry == RetryDecision::NoRetry) { -<<<<<<< HEAD - cluster_.trafficStats()->>upstream_rq_retry_success_.inc(); -======= cluster_.trafficStats()->upstream_rq_retry_success_.inc(); ->>>>>>> main if (vcluster_) { vcluster_->stats().upstream_rq_retry_success_.inc(); } @@ -307,11 +295,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba // The request has exhausted the number of retries allotted to it by the retry policy configured // (or the x-envoy-max-retries header). if (retries_remaining_ == 0) { -<<<<<<< HEAD - cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.inc(); -======= cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.inc(); ->>>>>>> main if (vcluster_) { vcluster_->stats().upstream_rq_retry_limit_exceeded_.inc(); } @@ -324,11 +308,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba retries_remaining_--; if (!cluster_.resourceManager(priority_).retries().canCreate()) { -<<<<<<< HEAD - cluster_.trafficStats()->>upstream_rq_retry_overflow_.inc(); -======= cluster_.trafficStats()->upstream_rq_retry_overflow_.inc(); ->>>>>>> main if (vcluster_) { vcluster_->stats().upstream_rq_retry_overflow_.inc(); } @@ -344,11 +324,7 @@ RetryStatus RetryStateImpl::shouldRetry(RetryDecision would_retry, DoRetryCallba ASSERT(!backoff_callback_ && !next_loop_callback_); cluster_.resourceManager(priority_).retries().inc(); -<<<<<<< HEAD - cluster_.trafficStats()->>upstream_rq_retry_.inc(); -======= cluster_.trafficStats()->upstream_rq_retry_.inc(); ->>>>>>> main if (vcluster_) { vcluster_->stats().upstream_rq_retry_.inc(); } diff --git a/source/common/router/router.cc b/source/common/router/router.cc index ce0c0e82f9cec..ad95d17026133 100644 --- a/source/common/router/router.cc +++ b/source/common/router/router.cc @@ -509,11 +509,7 @@ Http::FilterHeadersStatus Filter::decodeHeaders(Http::RequestHeaderMap& headers, modify_headers(headers); }, absl::nullopt, StreamInfo::ResponseCodeDetails::get().MaintenanceMode); -<<<<<<< HEAD - cluster_->trafficStats()->>upstream_rq_maintenance_mode_.inc(); -======= cluster_->trafficStats()->upstream_rq_maintenance_mode_.inc(); ->>>>>>> main return Http::FilterHeadersStatus::StopIteration; } @@ -758,11 +754,7 @@ Http::FilterDataStatus Filter::decodeData(Buffer::Instance& data, bool end_strea "The request payload has at least {} bytes data which exceeds buffer limit {}. Give " "up on the retry/shadow.", getLength(callbacks_->decodingBuffer()) + data.length(), retry_shadow_buffer_limit_); -<<<<<<< HEAD - cluster_->trafficStats()->>retry_or_shadow_abandoned_.inc(); -======= cluster_->trafficStats()->retry_or_shadow_abandoned_.inc(); ->>>>>>> main retry_state_.reset(); buffering = false; active_shadow_policies_.clear(); @@ -964,11 +956,7 @@ void Filter::onResponseTimeout() { if (Runtime::runtimeFeatureEnabled( "envoy.reloadable_features.do_not_await_headers_on_upstream_timeout_to_emit_stats") || upstream_request->awaitingHeaders()) { -<<<<<<< HEAD - cluster_->trafficStats()->>upstream_rq_timeout_.inc(); -======= cluster_->trafficStats()->upstream_rq_timeout_.inc(); ->>>>>>> main if (request_vcluster_) { request_vcluster_->stats().upstream_rq_timeout_.inc(); } @@ -1043,20 +1031,12 @@ void Filter::onSoftPerTryTimeout(UpstreamRequest& upstream_request) { void Filter::onPerTryIdleTimeout(UpstreamRequest& upstream_request) { onPerTryTimeoutCommon(upstream_request, -<<<<<<< HEAD - cluster_->trafficStats()->>upstream_rq_per_try_idle_timeout_, -======= cluster_->trafficStats()->upstream_rq_per_try_idle_timeout_, ->>>>>>> main StreamInfo::ResponseCodeDetails::get().UpstreamPerTryIdleTimeout); } void Filter::onPerTryTimeout(UpstreamRequest& upstream_request) { -<<<<<<< HEAD - onPerTryTimeoutCommon(upstream_request, cluster_->trafficStats()->>upstream_rq_per_try_timeout_, -======= onPerTryTimeoutCommon(upstream_request, cluster_->trafficStats()->upstream_rq_per_try_timeout_, ->>>>>>> main StreamInfo::ResponseCodeDetails::get().UpstreamPerTryTimeout); } @@ -1645,11 +1625,7 @@ bool Filter::setupRedirect(const Http::ResponseHeaderMap& headers) { convertRequestHeadersForInternalRedirect(*downstream_headers_, *location, status_code) && callbacks_->recreateStream(&headers)) { ENVOY_STREAM_LOG(debug, "Internal redirect succeeded", *callbacks_); -<<<<<<< HEAD - cluster_->trafficStats()->>upstream_internal_redirect_succeeded_total_.inc(); -======= cluster_->trafficStats()->upstream_internal_redirect_succeeded_total_.inc(); ->>>>>>> main return true; } // convertRequestHeadersForInternalRedirect logs failure reasons but log @@ -1662,11 +1638,7 @@ bool Filter::setupRedirect(const Http::ResponseHeaderMap& headers) { ENVOY_STREAM_LOG(trace, "Internal redirect failed: missing location header", *callbacks_); } -<<<<<<< HEAD - cluster_->trafficStats()->>upstream_internal_redirect_failed_total_.inc(); -======= cluster_->trafficStats()->upstream_internal_redirect_failed_total_.inc(); ->>>>>>> main return false; } diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index 082b9ad999116..2ae6715115b05 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -29,7 +29,7 @@ namespace Router { void UpstreamCodecFilter::onBelowWriteBufferLowWatermark() { <<<<<<< HEAD - callbacks_->clusterInfo()->trafficStats()->>upstream_flow_control_resumed_reading_total_.inc(); + callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); ======= callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); >>>>>>> main @@ -38,7 +38,7 @@ void UpstreamCodecFilter::onBelowWriteBufferLowWatermark() { void UpstreamCodecFilter::onAboveWriteBufferHighWatermark() { <<<<<<< HEAD - callbacks_->clusterInfo()->trafficStats()->>upstream_flow_control_paused_reading_total_.inc(); + callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); ======= callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); >>>>>>> main diff --git a/source/common/router/upstream_request.cc b/source/common/router/upstream_request.cc index cf165ed34b578..8db8b3749bc3f 100644 --- a/source/common/router/upstream_request.cc +++ b/source/common/router/upstream_request.cc @@ -198,7 +198,7 @@ void UpstreamRequest::cleanUp() { while (downstream_data_disabled_ != 0) { parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); <<<<<<< HEAD - parent_.cluster()->trafficStats()->>upstream_flow_control_drained_total_.inc(); + parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); ======= parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); >>>>>>> main @@ -758,7 +758,7 @@ UpstreamToDownstream& UpstreamRequest::upstreamToDownstream() { void UpstreamRequest::onStreamMaxDurationReached() { <<<<<<< HEAD - upstream_host_->cluster().trafficStats()->>upstream_rq_max_duration_reached_.inc(); + upstream_host_->cluster().trafficStats()->upstream_rq_max_duration_reached_.inc(); ======= upstream_host_->cluster().trafficStats()->upstream_rq_max_duration_reached_.inc(); >>>>>>> main @@ -789,7 +789,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onAboveWriteBufferHighWatermar // If there are multiple calls to readDisable either the codec (H2) or the underlying // Network::Connection (H1) will handle reference counting. <<<<<<< HEAD - parent_.parent_.cluster()->trafficStats()->>upstream_flow_control_paused_reading_total_.inc(); + parent_.parent_.cluster()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); ======= parent_.parent_.cluster()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); >>>>>>> main @@ -802,7 +802,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onBelowWriteBufferLowWatermark // One source of connection blockage has buffer available. Pass this on to the stream, which // will resume reads if this was the last remaining high watermark. <<<<<<< HEAD - parent_.parent_.cluster()->trafficStats()->>upstream_flow_control_resumed_reading_total_.inc(); + parent_.parent_.cluster()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); ======= parent_.parent_.cluster()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); >>>>>>> main @@ -821,7 +821,7 @@ void UpstreamRequest::disableDataFromDownstreamForFlowControl() { // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); <<<<<<< HEAD - parent_.cluster()->trafficStats()->>upstream_flow_control_backed_up_total_.inc(); + parent_.cluster()->trafficStats()->upstream_flow_control_backed_up_total_.inc(); ======= parent_.cluster()->trafficStats()->upstream_flow_control_backed_up_total_.inc(); >>>>>>> main @@ -841,7 +841,7 @@ void UpstreamRequest::enableDataFromDownstreamForFlowControl() { // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); <<<<<<< HEAD - parent_.cluster()->trafficStats()->>upstream_flow_control_drained_total_.inc(); + parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); ======= parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); >>>>>>> main diff --git a/source/common/tcp/conn_pool.cc b/source/common/tcp/conn_pool.cc index dc966d1a61b5c..d42a42cb07eb2 100644 --- a/source/common/tcp/conn_pool.cc +++ b/source/common/tcp/conn_pool.cc @@ -26,11 +26,11 @@ ActiveTcpClient::ActiveTcpClient(Envoy::ConnectionPool::ConnPoolImplBase& parent read_filter_handle_ = std::make_shared(*this); connection_->addReadFilter(read_filter_handle_); <<<<<<< HEAD - connection_->setConnectionStats({host->cluster().trafficStats()->>upstream_cx_rx_bytes_total_, - host->cluster().trafficStats()->>upstream_cx_rx_bytes_buffered_, - host->cluster().trafficStats()->>upstream_cx_tx_bytes_total_, - host->cluster().trafficStats()->>upstream_cx_tx_bytes_buffered_, - &host->cluster().trafficStats()->>bind_errors_, nullptr}); + connection_->setConnectionStats({host->cluster().trafficStats()->upstream_cx_rx_bytes_total_, + host->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, + host->cluster().trafficStats()->upstream_cx_tx_bytes_total_, + host->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, + &host->cluster().trafficStats()->bind_errors_, nullptr}); ======= connection_->setConnectionStats({host->cluster().trafficStats()->upstream_cx_rx_bytes_total_, host->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, diff --git a/source/common/tcp_proxy/tcp_proxy.cc b/source/common/tcp_proxy/tcp_proxy.cc index ba6da25ec3cb6..385a45a6c86d1 100644 --- a/source/common/tcp_proxy/tcp_proxy.cc +++ b/source/common/tcp_proxy/tcp_proxy.cc @@ -235,20 +235,12 @@ void Filter::readDisableUpstream(bool disable) { read_callbacks_->upstreamHost() ->cluster() .trafficStats() -<<<<<<< HEAD ->upstream_flow_control_paused_reading_total_.inc(); -======= - .upstream_flow_control_paused_reading_total_.inc(); ->>>>>>> main } else { read_callbacks_->upstreamHost() ->cluster() .trafficStats() -<<<<<<< HEAD ->upstream_flow_control_resumed_reading_total_.inc(); -======= - .upstream_flow_control_resumed_reading_total_.inc(); ->>>>>>> main } } @@ -385,11 +377,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { // will never be released. if (!cluster->resourceManager(Upstream::ResourcePriority::Default).connections().canCreate()) { getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::UpstreamOverflow); -<<<<<<< HEAD - cluster->trafficStats()->>upstream_cx_overflow_.inc(); -======= cluster->trafficStats()->upstream_cx_overflow_.inc(); ->>>>>>> main onInitFailure(UpstreamFailureReason::ResourceLimitExceeded); return Network::FilterStatus::StopIteration; } @@ -397,11 +385,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { const uint32_t max_connect_attempts = config_->maxConnectAttempts(); if (connect_attempts_ >= max_connect_attempts) { getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::UpstreamRetryLimitExceeded); -<<<<<<< HEAD - cluster->trafficStats()->>upstream_cx_connect_attempts_exceeded_.inc(); -======= cluster->trafficStats()->upstream_cx_connect_attempts_exceeded_.inc(); ->>>>>>> main onInitFailure(UpstreamFailureReason::ConnectFailed); return Network::FilterStatus::StopIteration; } @@ -433,11 +417,7 @@ Network::FilterStatus Filter::establishUpstreamConnection() { if (!maybeTunnel(*thread_local_cluster)) { // Either cluster is unknown or there are no healthy hosts. tcpConnPool() increments -<<<<<<< HEAD - // cluster->trafficStats()->>upstream_cx_none_healthy in the latter case. -======= // cluster->trafficStats()->upstream_cx_none_healthy in the latter case. ->>>>>>> main getStreamInfo().setResponseFlag(StreamInfo::ResponseFlag::NoHealthyUpstream); onInitFailure(UpstreamFailureReason::NoHealthyUpstream); } diff --git a/source/common/upstream/cluster_manager_impl.cc b/source/common/upstream/cluster_manager_impl.cc index 6efe9ec0ac481..ec04673386eac 100644 --- a/source/common/upstream/cluster_manager_impl.cc +++ b/source/common/upstream/cluster_manager_impl.cc @@ -1153,11 +1153,7 @@ Host::CreateConnectionData ClusterManagerImpl::ThreadLocalClusterManagerImpl::Cl } return conn_info; } else { -<<<<<<< HEAD - cluster_info_->trafficStats()->>upstream_cx_none_healthy_.inc(); -======= cluster_info_->trafficStats()->upstream_cx_none_healthy_.inc(); ->>>>>>> main return {nullptr, nullptr}; } } @@ -1629,11 +1625,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::httpConnPoolImp if (!host) { if (!peek) { ENVOY_LOG(debug, "no healthy host for HTTP connection pool"); -<<<<<<< HEAD - cluster_info_->trafficStats()->>upstream_cx_none_healthy_.inc(); -======= cluster_info_->trafficStats()->upstream_cx_none_healthy_.inc(); ->>>>>>> main } return nullptr; } @@ -1763,11 +1755,7 @@ ClusterManagerImpl::ThreadLocalClusterManagerImpl::ClusterEntry::tcpConnPoolImpl if (!host) { if (!peek) { ENVOY_LOG(debug, "no healthy host for TCP connection pool"); -<<<<<<< HEAD - cluster_info_->trafficStats()->>upstream_cx_none_healthy_.inc(); -======= cluster_info_->trafficStats()->upstream_cx_none_healthy_.inc(); ->>>>>>> main } return nullptr; } diff --git a/source/common/upstream/cluster_manager_impl.h b/source/common/upstream/cluster_manager_impl.h index 706eb021aaa0f..e6db6e308c6ce 100644 --- a/source/common/upstream/cluster_manager_impl.h +++ b/source/common/upstream/cluster_manager_impl.h @@ -328,11 +328,7 @@ class ClusterManagerImpl : public ClusterManager, void initializeSecondaryClusters(const envoy::config::bootstrap::v3::Bootstrap& bootstrap) override; -<<<<<<< HEAD const ClusterTrafficStatNames& clusterStatNames() const override { return cluster_stat_names_; } -======= - const ClusterTrafficStatNames& clusterStatNames() const override { return cluster_stat_names_; } ->>>>>>> main const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { return cluster_config_update_stat_names_; } @@ -792,11 +788,7 @@ class ClusterManagerImpl : public ClusterManager, Event::Dispatcher& dispatcher_; Http::Context& http_context_; Router::Context& router_context_; -<<<<<<< HEAD - ClusterTrafficStatNames cluster_stat_names_; -======= ClusterTrafficStatNames cluster_stat_names_; ->>>>>>> main ClusterConfigUpdateStatNames cluster_config_update_stat_names_; ClusterLbStatNames cluster_lb_stat_names_; ClusterEndpointStatNames cluster_endpoint_stat_names_; diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index 47ee1ea92083e..939a42156d21a 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -36,7 +36,7 @@ ConnPoolMap::getPool(const KEY_TYPE& key, const PoolFactory // We're full. Try to free up a pool. If we can't, bail out. if (!freeOnePool()) { <<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_pool_overflow_.inc(); + host_->cluster().trafficStats()->upstream_cx_pool_overflow_.inc(); ======= host_->cluster().trafficStats()->upstream_cx_pool_overflow_.inc(); >>>>>>> main diff --git a/source/common/upstream/health_checker_base_impl.cc b/source/common/upstream/health_checker_base_impl.cc index c736671732703..8fa0b66c959b6 100644 --- a/source/common/upstream/health_checker_base_impl.cc +++ b/source/common/upstream/health_checker_base_impl.cc @@ -106,7 +106,7 @@ std::chrono::milliseconds HealthCheckerImplBase::interval(HealthState state, // refer to the HealthCheck API documentation for more details. uint64_t base_time_ms; <<<<<<< HEAD - if (cluster_.info()->trafficStats()->>upstream_cx_total_.used()) { + if (cluster_.info()->trafficStats()->upstream_cx_total_.used()) { ======= if (cluster_.info()->trafficStats()->upstream_cx_total_.used()) { >>>>>>> main diff --git a/source/common/upstream/load_balancer_impl.cc b/source/common/upstream/load_balancer_impl.cc index c34dcf6bbf2a2..2ed3728267962 100644 --- a/source/common/upstream/load_balancer_impl.cc +++ b/source/common/upstream/load_balancer_impl.cc @@ -109,14 +109,10 @@ LoadBalancerBase::choosePriority(uint64_t hash, const HealthyLoad& healthy_per_p } LoadBalancerBase::LoadBalancerBase( -<<<<<<< HEAD - const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, -======= const PrioritySet& priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, ->>>>>>> main Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : stats_(lb_stats), runtime_(runtime), random_(random), + : stats_(stats), runtime_(runtime), random_(random), default_healthy_panic_percent_(PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT( common_config, healthy_panic_threshold, 100, 50)), priority_set_(priority_set) { @@ -355,15 +351,10 @@ LoadBalancerBase::chooseHostSet(LoadBalancerContext* context, uint64_t hash) con } ZoneAwareLoadBalancerBase::ZoneAwareLoadBalancerBase( -<<<<<<< HEAD - const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, -======= const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), + : LoadBalancerBase(priority_set, stats, runtime, random, common_config), local_priority_set_(local_priority_set), routing_enabled_(PROTOBUF_PERCENT_TO_ROUNDED_INTEGER_OR_DEFAULT( common_config.zone_aware_lb_config(), routing_enabled, 100, 100)), @@ -726,17 +717,12 @@ const HostVector& ZoneAwareLoadBalancerBase::hostSourceToHosts(HostsSource hosts } EdfLoadBalancerBase::EdfLoadBalancerBase( -<<<<<<< HEAD - const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, -======= const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional slow_start_config, TimeSource& time_source) - : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, lb_stats, runtime, random, + : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, stats, runtime, random, common_config), seed_(random_.random()), slow_start_window_(slow_start_config.has_value() diff --git a/source/common/upstream/load_balancer_impl.h b/source/common/upstream/load_balancer_impl.h index 20aca3baedc47..a8483408ec8eb 100644 --- a/source/common/upstream/load_balancer_impl.h +++ b/source/common/upstream/load_balancer_impl.h @@ -68,13 +68,8 @@ class LoadBalancerBase : public LoadBalancer { */ void recalculateLoadInTotalPanic(); -<<<<<<< HEAD - LoadBalancerBase(const PrioritySet& priority_set, ClusterLbStats& lb_stats, - Runtime::Loader& runtime, Random::RandomGenerator& random, -======= LoadBalancerBase(const PrioritySet& priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); // Choose host set randomly, based on the healthy_per_priority_load_ and @@ -204,13 +199,8 @@ class ZoneAwareLoadBalancerBase : public LoadBalancerBase { protected: // Both priority_set and local_priority_set if non-null must have at least one host set. ZoneAwareLoadBalancerBase( -<<<<<<< HEAD - const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, -======= const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); // When deciding which hosts to use on an LB decision, we need to know how to index into the @@ -411,13 +401,8 @@ class EdfLoadBalancerBase : public ZoneAwareLoadBalancerBase, Logger::Loggable { public: EdfLoadBalancerBase( -<<<<<<< HEAD - const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, -======= const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional slow_start_cofig, TimeSource& time_source); @@ -484,19 +469,14 @@ class EdfLoadBalancerBase : public ZoneAwareLoadBalancerBase, class RoundRobinLoadBalancer : public EdfLoadBalancerBase { public: RoundRobinLoadBalancer( -<<<<<<< HEAD - const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, -======= const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional round_robin_config, TimeSource& time_source) : EdfLoadBalancerBase( - priority_set, local_priority_set, lb_stats, runtime, random, common_config, + priority_set, local_priority_set, stats, runtime, random, common_config, (round_robin_config.has_value() && round_robin_config.value().has_slow_start_config()) ? absl::optional( round_robin_config.value().slow_start_config()) @@ -567,19 +547,14 @@ class RoundRobinLoadBalancer : public EdfLoadBalancerBase { class LeastRequestLoadBalancer : public EdfLoadBalancerBase { public: LeastRequestLoadBalancer( -<<<<<<< HEAD - const PrioritySet& priority_set, const PrioritySet* local_priority_set, - ClusterLbStats& lb_stats, Runtime::Loader& runtime, Random::RandomGenerator& random, -======= const PrioritySet& priority_set, const PrioritySet* local_priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, Random::RandomGenerator& random, ->>>>>>> main const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config, const absl::optional least_request_config, TimeSource& time_source) : EdfLoadBalancerBase( - priority_set, local_priority_set, lb_stats, runtime, random, common_config, + priority_set, local_priority_set, stats, runtime, random, common_config, (least_request_config.has_value() && least_request_config.value().has_slow_start_config()) ? absl::optional( @@ -672,14 +647,10 @@ class RandomLoadBalancer : public ZoneAwareLoadBalancerBase, Logger::Loggable { public: RandomLoadBalancer(const PrioritySet& priority_set, const PrioritySet* local_priority_set, -<<<<<<< HEAD - ClusterLbStats& lb_stats, Runtime::Loader& runtime, -======= ClusterLbStats& stats, Runtime::Loader& runtime, ->>>>>>> main Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, lb_stats, runtime, random, + : ZoneAwareLoadBalancerBase(priority_set, local_priority_set, stats, runtime, random, common_config) {} // Upstream::ZoneAwareLoadBalancerBase diff --git a/source/common/upstream/thread_aware_lb_impl.cc b/source/common/upstream/thread_aware_lb_impl.cc index c5bdfacb6f3dc..99966d52f6bd2 100644 --- a/source/common/upstream/thread_aware_lb_impl.cc +++ b/source/common/upstream/thread_aware_lb_impl.cc @@ -191,7 +191,7 @@ double ThreadAwareLoadBalancerBase::BoundedLoadHashingLoadBalancer::hostOverload // and alert the user if that's the case. <<<<<<< HEAD - const uint32_t overall_active = host.cluster().trafficStats()->>upstream_rq_active_.value(); + const uint32_t overall_active = host.cluster().trafficStats()->upstream_rq_active_.value(); ======= const uint32_t overall_active = host.cluster().trafficStats()->upstream_rq_active_.value(); >>>>>>> main diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index f20bc190c78a8..5bd26e3b96ffc 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -803,11 +803,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } -<<<<<<< HEAD LazyInitStats& trafficStats() const override { return traffic_stats_; } -======= - ClusterTrafficStats& trafficStats() const override { return stats_; } ->>>>>>> main ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } diff --git a/source/extensions/clusters/original_dst/original_dst_cluster.cc b/source/extensions/clusters/original_dst/original_dst_cluster.cc index c2901119e45b5..c493784276d73 100644 --- a/source/extensions/clusters/original_dst/original_dst_cluster.cc +++ b/source/extensions/clusters/original_dst/original_dst_cluster.cc @@ -124,11 +124,7 @@ OriginalDstCluster::LoadBalancer::requestOverrideHost(LoadBalancerContext* conte if (request_host == nullptr) { ENVOY_LOG(debug, "original_dst_load_balancer: invalid override header value. {}", request_override_host); -<<<<<<< HEAD - parent_->info()->trafficStats()->>original_dst_host_invalid_.inc(); -======= - parent_->info()->trafficStats()->original_dst_host_invalid_.inc(); ->>>>>>> main + parent_->info()->trafficStats()-> original_dst_host_invalid_.inc(); return nullptr; } ENVOY_LOG(debug, "Using request override host {}.", request_override_host); diff --git a/source/extensions/filters/network/common/redis/client_impl.cc b/source/extensions/filters/network/common/redis/client_impl.cc index ed48584491160..5bf5b690d082f 100644 --- a/source/extensions/filters/network/common/redis/client_impl.cc +++ b/source/extensions/filters/network/common/redis/client_impl.cc @@ -77,15 +77,9 @@ ClientImpl::ClientImpl(Upstream::HostConstSharedPtr host, Event::Dispatcher& dis flush_timer_(dispatcher.createTimer([this]() { flushBufferAndResetTimer(); })), time_source_(dispatcher.timeSource()), redis_command_stats_(redis_command_stats), scope_(scope), is_transaction_client_(is_transaction_client) { -<<<<<<< HEAD - host->cluster().trafficStats()->>upstream_cx_total_.inc(); - host->stats().cx_total_.inc(); - host->cluster().trafficStats()->>upstream_cx_active_.inc(); -======= host->cluster().trafficStats()->upstream_cx_total_.inc(); host->stats().cx_total_.inc(); host->cluster().trafficStats()->upstream_cx_active_.inc(); ->>>>>>> main host->stats().cx_active_.inc(); connect_or_op_timer_->enableTimer(host->cluster().connectTimeout()); } @@ -93,11 +87,7 @@ ClientImpl::ClientImpl(Upstream::HostConstSharedPtr host, Event::Dispatcher& dis ClientImpl::~ClientImpl() { ASSERT(pending_requests_.empty()); ASSERT(connection_->state() == Network::Connection::State::Closed); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_active_.dec(); -======= host_->cluster().trafficStats()->upstream_cx_active_.dec(); ->>>>>>> main host_->stats().cx_active_.dec(); } @@ -151,17 +141,10 @@ PoolRequest* ClientImpl::makeRequest(const RespValue& request, ClientCallbacks& void ClientImpl::onConnectOrOpTimeout() { putOutlierEvent(Upstream::Outlier::Result::LocalOriginTimeout); if (connected_) { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_timeout_.inc(); - host_->stats().rq_timeout_.inc(); - } else { - host_->cluster().trafficStats()->>upstream_cx_connect_timeout_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_timeout_.inc(); host_->stats().rq_timeout_.inc(); } else { host_->cluster().trafficStats()->upstream_cx_connect_timeout_.inc(); ->>>>>>> main host_->stats().cx_connect_fail_.inc(); } @@ -173,11 +156,7 @@ void ClientImpl::onData(Buffer::Instance& data) { decoder_->decode(data); } catch (ProtocolError&) { putOutlierEvent(Upstream::Outlier::Result::ExtOriginRequestFailed); -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_protocol_error_.inc(); -======= host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); ->>>>>>> main host_->stats().rq_error_.inc(); connection_->close(Network::ConnectionCloseType::NoFlush); } @@ -206,11 +185,7 @@ void ClientImpl::onEvent(Network::ConnectionEvent event) { if (!request.canceled_) { request.callbacks_.onFailure(); } else { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_cancelled_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_cancelled_.inc(); ->>>>>>> main } pending_requests_.pop_front(); } @@ -223,11 +198,7 @@ void ClientImpl::onEvent(Network::ConnectionEvent event) { } if (event == Network::ConnectionEvent::RemoteClose && !connected_) { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_cx_connect_fail_.inc(); -======= host_->cluster().trafficStats()->upstream_cx_connect_fail_.inc(); ->>>>>>> main host_->stats().cx_connect_fail_.inc(); } } @@ -250,11 +221,7 @@ void ClientImpl::onRespValue(RespValuePtr&& value) { // result in closing the connection. pending_requests_.pop_front(); if (canceled) { -<<<<<<< HEAD - host_->cluster().trafficStats()->>upstream_rq_cancelled_.inc(); -======= host_->cluster().trafficStats()->upstream_rq_cancelled_.inc(); ->>>>>>> main } else if (config_.enableRedirection() && !is_transaction_client_ && (value->type() == Common::Redis::RespType::Error)) { std::vector err = StringUtil::splitToken(value->asString(), " ", false); @@ -296,24 +263,14 @@ ClientImpl::PendingRequest::PendingRequest(ClientImpl& parent, ClientCallbacks& command_request_timer_ = parent_.redis_command_stats_->createCommandTimer( parent_.scope_, command_, parent_.time_source_); } -<<<<<<< HEAD - parent.host_->cluster().trafficStats()->>upstream_rq_total_.inc(); - parent.host_->stats().rq_total_.inc(); - parent.host_->cluster().trafficStats()->>upstream_rq_active_.inc(); -======= parent.host_->cluster().trafficStats()->upstream_rq_total_.inc(); parent.host_->stats().rq_total_.inc(); parent.host_->cluster().trafficStats()->upstream_rq_active_.inc(); ->>>>>>> main parent.host_->stats().rq_active_.inc(); } ClientImpl::PendingRequest::~PendingRequest() { -<<<<<<< HEAD - parent_.host_->cluster().trafficStats()->>upstream_rq_active_.dec(); -======= parent_.host_->cluster().trafficStats()->upstream_rq_active_.dec(); ->>>>>>> main parent_.host_->stats().rq_active_.dec(); } diff --git a/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc b/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc index a164eb56806e5..fb04dfbc585e3 100644 --- a/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc +++ b/source/extensions/filters/network/redis_proxy/conn_pool_impl.cc @@ -454,11 +454,7 @@ void InstanceImpl::PendingRequest::onRedirection(Common::Redis::RespValuePtr&& v host_address); auto host = host_; onResponse(std::move(resp_value_)); -<<<<<<< HEAD - host->cluster().trafficStats()->>upstream_internal_redirect_failed_total_.inc(); -======= host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); ->>>>>>> main } else { doRedirection(std::move(resp_value_), formatAddress(*result.host_info_.value()->address()->ip()), ask_redirection_); @@ -474,11 +470,7 @@ void InstanceImpl::PendingRequest::onRedirection(Common::Redis::RespValuePtr&& v host_address); auto host = host_; onResponse(std::move(resp_value_)); -<<<<<<< HEAD - host->cluster().trafficStats()->>upstream_internal_redirect_failed_total_.inc(); -======= host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); ->>>>>>> main return; } PANIC_DUE_TO_CORRUPT_ENUM; @@ -495,11 +487,7 @@ void InstanceImpl::PendingRequest::onLoadDnsCacheComplete( ENVOY_LOG(debug, "DNS lookup failed"); auto host = host_; onResponse(std::move(resp_value_)); -<<<<<<< HEAD - host->cluster().trafficStats()->>upstream_internal_redirect_failed_total_.inc(); -======= host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); ->>>>>>> main } else { doRedirection(std::move(resp_value_), formatAddress(*host_info->address()->ip()), ask_redirection_); @@ -521,27 +509,16 @@ void InstanceImpl::PendingRequest::doRedirection(Common::Redis::RespValuePtr&& v !parent_.makeRequestToHost(host_address, Common::Redis::Utility::AskingRequest::instance(), null_client_callbacks)) { onResponse(std::move(value)); -<<<<<<< HEAD - host->cluster().trafficStats()->>upstream_internal_redirect_failed_total_.inc(); -======= host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); ->>>>>>> main } else { request_handler_ = parent_.makeRequestToHost(host_address, getRequest(incoming_request_), *this); if (!request_handler_) { onResponse(std::move(value)); -<<<<<<< HEAD - host->cluster().trafficStats()->>upstream_internal_redirect_failed_total_.inc(); - } else { - parent_.refresh_manager_->onRedirection(parent_.cluster_name_); - host->cluster().trafficStats()->>upstream_internal_redirect_succeeded_total_.inc(); -======= host->cluster().trafficStats()->upstream_internal_redirect_failed_total_.inc(); } else { parent_.refresh_manager_->onRedirection(parent_.cluster_name_); host->cluster().trafficStats()->upstream_internal_redirect_succeeded_total_.inc(); ->>>>>>> main } } } diff --git a/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc b/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc index 0bfd352e2bf6f..cb0480018b109 100644 --- a/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc +++ b/source/extensions/filters/udp/udp_proxy/udp_proxy_filter.cc @@ -128,11 +128,7 @@ UdpProxyFilter::ClusterInfo::createSession(Network::UdpRecvData::LocalPeerAddres .connections() .canCreate()) { ENVOY_LOG(debug, "cannot create new connection."); -<<<<<<< HEAD - cluster_.info()->trafficStats()->>upstream_cx_overflow_.inc(); -======= cluster_.info()->trafficStats()->upstream_cx_overflow_.inc(); ->>>>>>> main return nullptr; } @@ -143,11 +139,7 @@ UdpProxyFilter::ClusterInfo::createSession(Network::UdpRecvData::LocalPeerAddres auto host = chooseHost(addresses.peer_); if (host == nullptr) { ENVOY_LOG(debug, "cannot find any valid host."); -<<<<<<< HEAD - cluster_.info()->trafficStats()->>upstream_cx_none_healthy_.inc(); -======= cluster_.info()->trafficStats()->upstream_cx_none_healthy_.inc(); ->>>>>>> main return nullptr; } return createSessionWithHost(std::move(addresses), host); @@ -220,11 +212,7 @@ UdpProxyFilter::PerPacketLoadBalancingClusterInfo::onData(Network::UdpRecvData& auto host = chooseHost(data.addresses_.peer_); if (host == nullptr) { ENVOY_LOG(debug, "cannot find any valid host."); -<<<<<<< HEAD - cluster_.info()->trafficStats()->>upstream_cx_none_healthy_.inc(); -======= cluster_.info()->trafficStats()->upstream_cx_none_healthy_.inc(); ->>>>>>> main return Network::FilterStatus::StopIteration; } @@ -419,11 +407,7 @@ void UdpProxyFilter::ActiveSession::write(const Buffer::Instance& buffer) { cluster_.cluster_stats_.sess_tx_errors_.inc(); } else { cluster_.cluster_stats_.sess_tx_datagrams_.inc(); -<<<<<<< HEAD - cluster_.cluster_.info()->trafficStats()->>upstream_cx_tx_bytes_total_.add(buffer_length); -======= cluster_.cluster_.info()->trafficStats()->upstream_cx_tx_bytes_total_.add(buffer_length); ->>>>>>> main } } @@ -436,11 +420,7 @@ void UdpProxyFilter::ActiveSession::processPacket(Network::Address::InstanceCons const uint64_t buffer_length = buffer->length(); cluster_.cluster_stats_.sess_rx_datagrams_.inc(); -<<<<<<< HEAD - cluster_.cluster_.info()->trafficStats()->>upstream_cx_rx_bytes_total_.add(buffer_length); -======= cluster_.cluster_.info()->trafficStats()->upstream_cx_rx_bytes_total_.add(buffer_length); ->>>>>>> main Network::UdpSendData data{addresses_.local_->ip(), *addresses_.peer_, *buffer}; const Api::IoCallUint64Result rc = cluster_.filter_.read_callbacks_->udpListener().send(data); diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index 24f0393ae46f9..e5f62a9d1a778 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -330,11 +330,7 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { // since if we stay over, the other threads will eventually kill their connections too. // TODO(mattklein123): The use of the stat is somewhat of a hack, and should be replaced with // real flow control callbacks once they are available. -<<<<<<< HEAD - if (parent_.cluster_info_->trafficStats()->>upstream_cx_tx_bytes_buffered_.value() > -======= if (parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_buffered_.value() > ->>>>>>> main MAX_BUFFERED_STATS_BYTES) { if (connection_) { connection_->close(Network::ConnectionCloseType::NoFlush); @@ -359,19 +355,11 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { connection_ = std::move(info.connection_); connection_->addConnectionCallbacks(*this); connection_->setConnectionStats( -<<<<<<< HEAD - {parent_.cluster_info_->trafficStats()->>upstream_cx_rx_bytes_total_, - parent_.cluster_info_->trafficStats()->>upstream_cx_rx_bytes_buffered_, - parent_.cluster_info_->trafficStats()->>upstream_cx_tx_bytes_total_, - parent_.cluster_info_->trafficStats()->>upstream_cx_tx_bytes_buffered_, - &parent_.cluster_info_->trafficStats()->>bind_errors_, nullptr}); -======= {parent_.cluster_info_->trafficStats()->upstream_cx_rx_bytes_total_, parent_.cluster_info_->trafficStats()->upstream_cx_rx_bytes_buffered_, parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_total_, parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_buffered_, &parent_.cluster_info_->trafficStats()->bind_errors_, nullptr}); ->>>>>>> main connection_->connect(); } diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index 91cbb66705d6a..99017874299c4 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -90,11 +90,7 @@ uint64_t HystrixSink::getRollingValue(RollingWindow rolling_window) { void HystrixSink::updateRollingWindowMap(const Upstream::ClusterInfo& cluster_info, ClusterStatsCache& cluster_stats_cache) { -<<<<<<< HEAD Upstream::ClusterTrafficStats& cluster_stats = *cluster_info.trafficStats(); -======= - Upstream::ClusterTrafficStats& cluster_stats = cluster_info.trafficStats(); ->>>>>>> main Stats::Scope& cluster_stats_scope = cluster_info.statsScope(); // Combining timeouts+retries - retries are counted as separate requests diff --git a/test/common/conn_pool/conn_pool_base_test.cc b/test/common/conn_pool/conn_pool_base_test.cc index 320d17ab46f2e..3dba2010c758d 100644 --- a/test/common/conn_pool/conn_pool_base_test.cc +++ b/test/common/conn_pool/conn_pool_base_test.cc @@ -375,7 +375,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationBusy) { // connection. advanceTimeAndRun(max_connection_duration_ - 1); <<<<<<< HEAD - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ======= EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); >>>>>>> main @@ -385,7 +385,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationBusy) { // because there's a busy client. advanceTimeAndRun(2); <<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); >>>>>>> main @@ -404,7 +404,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationReady) { // connection. advanceTimeAndRun(max_connection_duration_ - 1); <<<<<<< HEAD - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ======= EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); >>>>>>> main @@ -414,7 +414,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationReady) { // because there's nothing to drain. advanceTimeAndRun(2); <<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); >>>>>>> main @@ -428,7 +428,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { // that is already draining. advanceTimeAndRun(max_connection_duration_ + 1); <<<<<<< HEAD - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ======= EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); >>>>>>> main @@ -444,7 +444,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyClosed) { // client that is already closed. advanceTimeAndRun(max_connection_duration_ + 1); <<<<<<< HEAD - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->>upstream_cx_max_duration_reached_.value()); + EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ======= EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); >>>>>>> main @@ -590,7 +590,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); <<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->>upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); >>>>>>> main @@ -603,7 +603,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { CHECK_STATE(2 /*active*/, 0 /*pending*/, 0 /*connecting capacity*/); <<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->>upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); >>>>>>> main @@ -629,7 +629,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, EarlyDataStreamsReachConcurrentStreamLimi CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); <<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->>upstream_rq_0rtt_.value()); + EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); >>>>>>> main @@ -638,7 +638,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, EarlyDataStreamsReachConcurrentStreamLimi EXPECT_EQ(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/true)); CHECK_STATE(2 /*active*/, 0 /*pending*/, concurrent_streams_ - 2 /*connecting capacity*/); <<<<<<< HEAD - EXPECT_EQ(2, pool_.host()->cluster().trafficStats()->>upstream_rq_0rtt_.value()); + EXPECT_EQ(2, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ======= EXPECT_EQ(2, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); >>>>>>> main diff --git a/test/common/router/retry_state_impl_test.cc b/test/common/router/retry_state_impl_test.cc index 3b6cc14149063..f772846071634 100644 --- a/test/common/router/retry_state_impl_test.cc +++ b/test/common/router/retry_state_impl_test.cc @@ -157,15 +157,9 @@ class RouterRetryStateImplTest : public testing::Test { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); } @@ -223,17 +217,10 @@ TEST_F(RouterRetryStateImplTest, PolicyRefusedStream) { state_->shouldRetryReset(remote_refused_stream_reset_, RetryState::Http3Used::No, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -266,17 +253,10 @@ TEST_F(RouterRetryStateImplTest, PolicyAltProtocolPostHandshakeFailure) { state_->shouldRetryReset(remote_refused_stream_reset_, RetryState::Http3Used::No, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -320,17 +300,10 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -417,17 +390,10 @@ TEST_F(RouterRetryStateImplTest, PolicyGatewayErrorRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -471,17 +437,10 @@ TEST_F(RouterRetryStateImplTest, Policy5xxRemote200RemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -573,11 +532,7 @@ TEST_F(RouterRetryStateImplTest, NoRetryUponTooEarlyStatusCodeWithDownstreamEarl EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); -<<<<<<< HEAD - EXPECT_EQ(0UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -873,17 +828,10 @@ TEST_F(RouterRetryStateImplTest, PolicyResetRemoteReset) { EXPECT_EQ(RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(remote_reset_, RetryState::Http3Used::No, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -967,17 +915,10 @@ TEST_F(RouterRetryStateImplTest, RouteConfigNoRetriesAllowed) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } @@ -1007,11 +948,7 @@ TEST_F(RouterRetryStateImplTest, NoAvailableRetries) { EXPECT_EQ( RetryStatus::NoOverflow, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_overflow_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_overflow_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_overflow_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_overflow_.value()); } @@ -1051,15 +988,9 @@ TEST_F(RouterRetryStateImplTest, MaxRetriesHeader) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(3UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); - EXPECT_EQ(0UL, cluster_.trafficStats()->>upstream_rq_retry_success_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); -======= EXPECT_EQ(3UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_success_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); ->>>>>>> main EXPECT_EQ(3UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_success_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); @@ -1131,13 +1062,8 @@ TEST_F(RouterRetryStateImplTest, Backoff) { EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(response_headers, request_headers, header_callback_)); -<<<<<<< HEAD - EXPECT_EQ(5UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_success_.value()); -======= EXPECT_EQ(5UL, cluster_.trafficStats()->upstream_rq_retry_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_success_.value()); ->>>>>>> main EXPECT_EQ(5UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_success_.value()); EXPECT_EQ(5UL, route_stats_context_.stats().upstream_rq_retry_.value()); @@ -1380,13 +1306,8 @@ TEST_F(RouterRetryStateImplTest, RateLimitedRetryBackoffStrategy) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryHeaders(response_headers_reset_2, request_headers, header_callback_)); -<<<<<<< HEAD - EXPECT_EQ(2UL, cluster_.trafficStats()->>upstream_rq_retry_backoff_ratelimited_.value()); - EXPECT_EQ(2UL, cluster_.trafficStats()->>upstream_rq_retry_backoff_exponential_.value()); -======= EXPECT_EQ(2UL, cluster_.trafficStats()->upstream_rq_retry_backoff_ratelimited_.value()); EXPECT_EQ(2UL, cluster_.trafficStats()->upstream_rq_retry_backoff_exponential_.value()); ->>>>>>> main } TEST_F(RouterRetryStateImplTest, HostSelectionAttempts) { @@ -1422,17 +1343,10 @@ TEST_F(RouterRetryStateImplTest, ZeroMaxRetriesHeader) { RetryStatus::NoRetryLimitExceeded, state_->shouldRetryReset(connect_failure_, RetryState::Http3Used::Unknown, reset_callback_)); -<<<<<<< HEAD - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_.value()); } @@ -1453,17 +1367,10 @@ TEST_F(RouterRetryStateImplTest, NoPreferredOverLimitExceeded) { EXPECT_EQ(RetryStatus::No, state_->shouldRetryHeaders(good_response_headers, request_headers, header_callback_)); -<<<<<<< HEAD - EXPECT_EQ(0UL, cluster_.trafficStats()->>upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); - EXPECT_EQ(1UL, cluster_.trafficStats()->>upstream_rq_retry_.value()); -======= EXPECT_EQ(0UL, cluster_.trafficStats()->upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, virtual_cluster_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); EXPECT_EQ(1UL, cluster_.trafficStats()->upstream_rq_retry_.value()); ->>>>>>> main EXPECT_EQ(1UL, virtual_cluster_.stats().upstream_rq_retry_.value()); EXPECT_EQ(0UL, route_stats_context_.stats().upstream_rq_retry_limit_exceeded_.value()); } diff --git a/test/common/upstream/health_check_fuzz.cc b/test/common/upstream/health_check_fuzz.cc index caa6c007386ae..dcc5ab5579f9d 100644 --- a/test/common/upstream/health_check_fuzz.cc +++ b/test/common/upstream/health_check_fuzz.cc @@ -106,11 +106,7 @@ void HttpHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main } expectSessionCreate(); expectStreamCreate(0); @@ -221,11 +217,7 @@ void TcpHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main } expectSessionCreate(); expectClientCreate(); @@ -334,11 +326,7 @@ void GrpcHealthCheckFuzz::initialize(test::common::upstream::HealthCheckTestCase cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", *time_source)}; if (input.upstream_cx_success()) { -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main } expectSessionCreate(); ON_CALL(dispatcher_, createClientConnection_(_, _, _, _)) diff --git a/test/common/upstream/health_checker_impl_test.cc b/test/common/upstream/health_checker_impl_test.cc index 76736ba87b1df..acbe3128c0cbe 100644 --- a/test/common/upstream/health_checker_impl_test.cc +++ b/test/common/upstream/health_checker_impl_test.cc @@ -858,11 +858,7 @@ TEST_F(HttpHealthCheckerImplTest, Success) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -885,11 +881,7 @@ TEST_F(HttpHealthCheckerImplTest, Degraded) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1018,11 +1010,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessIntervalJitterPercent) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1053,11 +1041,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithSpurious1xx) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1085,11 +1069,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithSpuriousMetadata) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1119,13 +1099,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHosts) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime()), makeTestHost(cluster_->info_, "tcp://127.0.0.1:81", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1161,13 +1136,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostSets) { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; cluster_->prioritySet().getMockHostSet(1)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:81", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1200,11 +1170,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1227,11 +1193,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseStringContainsCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1255,11 +1217,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseHexStringContainsCheck) cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1282,11 +1240,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckBuffer) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1311,11 +1265,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckMaxBuffer) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1355,11 +1305,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessExpectedResponseCheckHttp2) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1384,11 +1330,7 @@ TEST_F(HttpHealthCheckerImplTest, FailExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1414,11 +1356,7 @@ TEST_F(HttpHealthCheckerImplTest, FailStatusCheckWithExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1443,11 +1381,7 @@ TEST_F(HttpHealthCheckerImplTest, ImmediateFailExpectedResponseCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1494,11 +1428,7 @@ TEST_F(HttpHealthCheckerImplTest, ZeroRetryInterval) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1557,11 +1487,7 @@ TEST_F(HttpHealthCheckerImplTest, TlsOptions) { allocHealthChecker(yaml); cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1579,11 +1505,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1619,11 +1541,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServicePrefixPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1659,11 +1577,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceExactPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1699,11 +1613,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceRegexPatternCheck) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1747,11 +1657,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithCustomHostValueOnTheHos EXPECT_CALL(*this, onHostStatus(_, HealthTransition::Unchanged)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = {test_host}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1797,11 +1703,7 @@ TEST_F(HttpHealthCheckerImplTest, EXPECT_CALL(*this, onHostStatus(_, HealthTransition::Unchanged)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = {test_host}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1837,11 +1739,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithCustomHostValue) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1906,11 +1804,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAdditionalHeaders) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -1975,11 +1869,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithoutUserAgent) { std::string current_start_time; cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2017,11 +1907,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceDoesNotMatchFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2052,11 +1938,7 @@ TEST_F(HttpHealthCheckerImplTest, ServicePatternDoesNotMatchFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2087,11 +1969,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNotPresentInResponseFail) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2119,11 +1997,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceCheckRuntimeOff) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2150,11 +2024,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceCheckRuntimeOffWithStringPattern) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -2716,11 +2586,7 @@ TEST_F(HttpHealthCheckerImplTest, HealthCheckIntervals) { EXPECT_CALL(*test_sessions_[0]->interval_timer_, enableTimer(std::chrono::milliseconds(5000), _)); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, disableTimer()); respond(0, "200", false); -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); // Needed after a response is sent. @@ -3059,11 +2925,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAltPort) { // Prepares a host with its designated health check port. const HostWithHealthCheckMap hosts{{"127.0.0.1:80", makeHealthCheckConfig(8000)}}; appendTestHosts(cluster_, hosts); -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3096,13 +2958,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostsAndAltPort) { const HostWithHealthCheckMap hosts = {{"127.0.0.1:80", makeHealthCheckConfig(8000)}, {"127.0.0.1:81", makeHealthCheckConfig(8001)}}; appendTestHosts(cluster_, hosts); -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3142,11 +2999,7 @@ TEST_F(HttpHealthCheckerImplTest, SuccessServiceCheckWithAltAddress) { const HostWithHealthCheckMap hosts{ {"127.0.0.1:80", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}}; appendTestHosts(cluster_, hosts); -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3180,13 +3033,8 @@ TEST_F(HttpHealthCheckerImplTest, SuccessWithMultipleHostsAndAltAddress) { {"127.0.0.1:80", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}, {"127.0.0.2:81", makeHealthCheckConfigAltAddress("127.0.0.2", 8000)}}; appendTestHosts(cluster_, hosts); -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(hosts); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3282,11 +3130,7 @@ TEST_F(HttpHealthCheckerImplTest, TransportSocketMatchCriteria) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3327,11 +3171,7 @@ TEST_F(HttpHealthCheckerImplTest, NoTransportSocketMatchCriteria) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3348,11 +3188,7 @@ TEST_F(HttpHealthCheckerImplTest, GoAwayErrorProbeInProgress) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3400,11 +3236,7 @@ TEST_F(HttpHealthCheckerImplTest, GoAwayProbeInProgress) { .WillRepeatedly(Return(false)); cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); @@ -3703,11 +3535,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNameMatch) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3743,11 +3571,7 @@ TEST_F(HttpHealthCheckerImplTest, ServiceNameMismatch) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3773,11 +3597,7 @@ TEST_F(HttpHealthCheckerImplTest, DefaultMethodGet) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -3806,11 +3626,7 @@ TEST_F(HttpHealthCheckerImplTest, MethodHead) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectStreamCreate(0); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); @@ -5050,11 +4866,7 @@ class GrpcHealthCheckerImplTestBase : public Event::TestUsingSimulatedTime, // performed during test case (but possibly on many hosts). void expectHealthchecks(HealthTransition host_changed_state, size_t num_healthchecks) { for (size_t i = 0; i < num_healthchecks; i++) { -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectHealthcheckStart(i); } @@ -5157,11 +4969,7 @@ class GrpcHealthCheckerImplTestBase : public Event::TestUsingSimulatedTime, void runHealthCheck(std::string expected_host) { -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectHealthcheckStart(0); @@ -5311,11 +5119,7 @@ TEST_F(GrpcHealthCheckerImplTest, SuccessWithAdditionalHeaders) { cluster_->prioritySet().getMockHostSet(0)->hosts_ = { makeTestHost(cluster_->info_, "tcp://127.0.0.1:80", metadata, simTime())}; -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main expectSessionCreate(); expectHealthcheckStart(0); @@ -5787,11 +5591,7 @@ TEST_F(GrpcHealthCheckerImplTest, HealthCheckIntervals) { EXPECT_CALL(*test_sessions_[0]->interval_timer_, enableTimer(std::chrono::milliseconds(5000), _)); EXPECT_CALL(*test_sessions_[0]->timeout_timer_, disableTimer()); respondServiceStatus(0, grpc::health::v1::HealthCheckResponse::SERVING); -<<<<<<< HEAD - cluster_->info_->trafficStats()->>upstream_cx_total_.inc(); -======= cluster_->info_->trafficStats()->upstream_cx_total_.inc(); ->>>>>>> main EXPECT_CALL(*test_sessions_[0]->timeout_timer_, enableTimer(_, _)); // Needed after a response is sent. diff --git a/test/common/upstream/load_balancer_benchmark.cc b/test/common/upstream/load_balancer_benchmark.cc index 55e842f1f22c4..5f73b4c685f92 100644 --- a/test/common/upstream/load_balancer_benchmark.cc +++ b/test/common/upstream/load_balancer_benchmark.cc @@ -66,13 +66,8 @@ class BaseTester : public Event::TestUsingSimulatedTime { PrioritySetImpl priority_set_; PrioritySetImpl local_priority_set_; Stats::IsolatedStoreImpl stats_store_; -<<<<<<< HEAD - ClusterLbStatNames lb_stat_names_{stats_store_.symbolTable()}; - ClusterLbStats stats_{lb_stat_names_, stats_store_}; -======= ClusterLbStatNames stat_names_{stats_store_.symbolTable()}; ClusterLbStats stats_{stat_names_, stats_store_}; ->>>>>>> main NiceMock runtime_; Random::RandomGeneratorImpl random_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; diff --git a/test/common/upstream/load_balancer_impl_test.cc b/test/common/upstream/load_balancer_impl_test.cc index c4c2b1316cfad..f66d7593b46b1 100644 --- a/test/common/upstream/load_balancer_impl_test.cc +++ b/test/common/upstream/load_balancer_impl_test.cc @@ -77,20 +77,12 @@ class LoadBalancerTestBase : public Event::TestUsingSimulatedTime, MockHostSet& hostSet() { return GetParam() ? host_set_ : failover_host_set_; } LoadBalancerTestBase() -<<<<<<< HEAD - : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) { -======= : stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_) { ->>>>>>> main least_request_lb_config_.mutable_choice_count()->set_value(2); } Stats::IsolatedStoreImpl stats_store_; -<<<<<<< HEAD - ClusterLbStatNames lb_stat_names_; -======= ClusterLbStatNames stat_names_; ->>>>>>> main ClusterLbStats stats_; NiceMock runtime_; NiceMock random_; diff --git a/test/common/upstream/maglev_lb_test.cc b/test/common/upstream/maglev_lb_test.cc index 99cf33bcc2293..bddd046af23ff 100644 --- a/test/common/upstream/maglev_lb_test.cc +++ b/test/common/upstream/maglev_lb_test.cc @@ -45,11 +45,7 @@ class TestLoadBalancerContext : public LoadBalancerContextBase { class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::Test { public: MaglevLoadBalancerTest() -<<<<<<< HEAD : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) {} -======= - : stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_) {} ->>>>>>> main void createLb() { lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, @@ -68,11 +64,7 @@ class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public test MockHostSet& host_set_ = *priority_set_.getMockHostSet(0); std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; -<<<<<<< HEAD ClusterLbStatNames lb_stat_names_; -======= - ClusterLbStatNames stat_names_; ->>>>>>> main ClusterLbStats stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; diff --git a/test/common/upstream/ring_hash_lb_test.cc b/test/common/upstream/ring_hash_lb_test.cc index 5e777ba94a056..84a24104c1a23 100644 --- a/test/common/upstream/ring_hash_lb_test.cc +++ b/test/common/upstream/ring_hash_lb_test.cc @@ -58,11 +58,7 @@ class RingHashLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::TestWithParam { public: RingHashLoadBalancerTest() -<<<<<<< HEAD - : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) {} -======= : stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_) {} ->>>>>>> main void init() { lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, @@ -79,11 +75,7 @@ class RingHashLoadBalancerTest : public Event::TestUsingSimulatedTime, MockHostSet& failover_host_set_ = *priority_set_.getMockHostSet(1); std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; -<<<<<<< HEAD - ClusterLbStatNames lb_stat_names_; -======= ClusterLbStatNames stat_names_; ->>>>>>> main ClusterLbStats stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index 4a3dfe3ae9b99..6c674b5ccd60a 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -420,11 +420,7 @@ TEST_F(StrictDnsClusterImplTest, Basic) { EXPECT_EQ(1U, cluster.info()->resourceManager(ResourcePriority::Default).maxConnectionsPerHost()); EXPECT_EQ(990U, cluster.info()->resourceManager(ResourcePriority::High).maxConnectionsPerHost()); -<<<<<<< HEAD - cluster.info()->trafficStats()->>upstream_rq_total_.inc(); -======= cluster.info()->trafficStats()->upstream_rq_total_.inc(); ->>>>>>> main EXPECT_EQ(1UL, stats_.counter("cluster.name.upstream_rq_total").value()); EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.maintenance_mode.name", 0)); @@ -725,8 +721,8 @@ TEST_F(StrictDnsClusterImplTest, HostUpdateWithDisabledACEndpoint) { EXPECT_FALSE(hosts[1]->healthFlagGet(Host::HealthFlag::FAILED_ACTIVE_HC)); EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(2UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(2UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); } // Re-resolve the DNS name with only one record, we should have 1 host. @@ -739,8 +735,8 @@ TEST_F(StrictDnsClusterImplTest, HostUpdateWithDisabledACEndpoint) { EXPECT_FALSE(hosts[0]->healthFlagGet(Host::HealthFlag::PENDING_DYNAMIC_REMOVAL)); EXPECT_FALSE(hosts[0]->healthFlagGet(Host::HealthFlag::FAILED_ACTIVE_HC)); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); } } @@ -841,11 +837,7 @@ TEST_F(StrictDnsClusterImplTest, LoadAssignmentBasic) { EXPECT_EQ(3U, cluster.info()->maxRequestsPerConnection()); EXPECT_EQ(0U, cluster.info()->http2Options().hpack_table_size().value()); -<<<<<<< HEAD - cluster.info()->trafficStats()->>upstream_rq_total_.inc(); -======= cluster.info()->trafficStats()->upstream_rq_total_.inc(); ->>>>>>> main EXPECT_EQ(1UL, stats_.counter("cluster.name.upstream_rq_total").value()); EXPECT_CALL(runtime_.snapshot_, featureEnabled("upstream.maintenance_mode.name", 0)); @@ -1946,11 +1938,7 @@ TEST_F(StaticClusterImplTest, AltStatName) { std::move(scope), false); cluster.initialize([] {}); // Increment a stat and verify it is emitted with alt_stat_name -<<<<<<< HEAD - cluster.info()->trafficStats()->>upstream_rq_total_.inc(); -======= cluster.info()->trafficStats()->upstream_rq_total_.inc(); ->>>>>>> main EXPECT_EQ(1UL, stats_.counter("cluster.staticcluster_stats.upstream_rq_total").value()); } @@ -2271,8 +2259,6 @@ TEST_F(StaticClusterImplTest, HealthyStat) { EXPECT_EQ(0UL, cluster.prioritySet().hostSetsPerPriority()[0]->degradedHosts().size()); EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); -<<<<<<< HEAD -======= } TEST_F(StaticClusterImplTest, InitialHostsDisableHC) { @@ -2327,8 +2313,8 @@ TEST_F(StaticClusterImplTest, InitialHostsDisableHC) { // The endpoint with disabled active health check is considered healthy. EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->hosts().size()); EXPECT_EQ(1UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); - EXPECT_EQ(1UL, cluster.info()->stats().membership_healthy_.value()); - EXPECT_EQ(0UL, cluster.info()->stats().membership_degraded_.value()); + EXPECT_EQ(1UL, cluster.info()->endpointStats().membership_healthy_.value()); + EXPECT_EQ(0UL, cluster.info()->endpointStats().membership_degraded_.value()); // Perform a health check for the second host, and then the initialization is finished. EXPECT_CALL(initialized, ready()); @@ -2337,7 +2323,6 @@ TEST_F(StaticClusterImplTest, InitialHostsDisableHC) { health_checker->runCallbacks(cluster.prioritySet().hostSetsPerPriority()[0]->hosts()[0], HealthTransition::Changed); EXPECT_EQ(2UL, cluster.prioritySet().hostSetsPerPriority()[0]->healthyHosts().size()); ->>>>>>> main } TEST_F(StaticClusterImplTest, UrlConfig) { diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 88699caaf7dbb..7149ff73b8f79 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -138,13 +138,8 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::ThreadAwareLoadBalancerPtr thread_aware_lb_; Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; -<<<<<<< HEAD Upstream::ClusterTrafficStatNames stat_names_; LazyInitStats stats_; -======= - Upstream::ClusterTrafficStatNames stat_names_; - Upstream::ClusterTrafficStats stats_; ->>>>>>> main std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/extensions/stats_sinks/common/statsd/statsd_test.cc b/test/extensions/stats_sinks/common/statsd/statsd_test.cc index 275443a2a91d1..fcadb4d6a7102 100644 --- a/test/extensions/stats_sinks/common/statsd/statsd_test.cc +++ b/test/extensions/stats_sinks/common/statsd/statsd_test.cc @@ -226,21 +226,13 @@ TEST_F(TcpStatsdSinkTest, Overflow) { // Synthetically set buffer above high watermark. Make sure we don't write anything. cluster_manager_.active_clusters_["fake_cluster"] ->info_->trafficStats() -<<<<<<< HEAD ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); -======= - .upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); ->>>>>>> main sink_->flush(snapshot_); // Lower and make sure we write. cluster_manager_.active_clusters_["fake_cluster"] ->info_->trafficStats() -<<<<<<< HEAD ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 15); -======= - .upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 15); ->>>>>>> main expectCreateConnection(); EXPECT_CALL(*connection_, write(BufferStringEqual("envoy.test_counter:1|c\n"), _)); sink_->flush(snapshot_); @@ -248,11 +240,7 @@ TEST_F(TcpStatsdSinkTest, Overflow) { // Raise and make sure we don't write and kill connection. cluster_manager_.active_clusters_["fake_cluster"] ->info_->trafficStats() -<<<<<<< HEAD ->upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); -======= - .upstream_cx_tx_bytes_buffered_.set(1024 * 1024 * 17); ->>>>>>> main EXPECT_CALL(*connection_, close(Network::ConnectionCloseType::NoFlush)); sink_->flush(snapshot_); diff --git a/test/extensions/stats_sinks/hystrix/hystrix_test.cc b/test/extensions/stats_sinks/hystrix/hystrix_test.cc index e869d51564d7d..b1d6276761f47 100644 --- a/test/extensions/stats_sinks/hystrix/hystrix_test.cc +++ b/test/extensions/stats_sinks/hystrix/hystrix_test.cc @@ -83,9 +83,9 @@ class ClusterTestInfo { ON_CALL(retry_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_retry_step)); ON_CALL(success_counter_, value()).WillByDefault(Return((i + 1) * success_step)); <<<<<<< HEAD - cluster_info_->trafficStats()->>upstream_rq_timeout_.add(timeout_step); - cluster_info_->trafficStats()->>upstream_rq_per_try_timeout_.add(timeout_retry_step); - cluster_info_->trafficStats()->>upstream_rq_pending_overflow_.add(rejected_step); + cluster_info_->trafficStats()->upstream_rq_timeout_.add(timeout_step); + cluster_info_->trafficStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); + cluster_info_->trafficStats()->upstream_rq_pending_overflow_.add(rejected_step); ======= cluster_info_->trafficStats()->upstream_rq_timeout_.add(timeout_step); cluster_info_->trafficStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index ed715b6231b9d..1288ed48e1778 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -53,22 +53,14 @@ MockUpstreamLocalAddressSelector::MockUpstreamLocalAddressSelector( MockClusterInfo::MockClusterInfo() : http2_options_(::Envoy::Http2::Utility::initializeAndValidateOptions( envoy::config::core::v3::Http2ProtocolOptions())), -<<<<<<< HEAD - upstream_stat_names_(stats_store_.symbolTable()), -======= stat_names_(stats_store_.symbolTable()), ->>>>>>> main config_update_stats_names_(stats_store_.symbolTable()), lb_stat_names_(stats_store_.symbolTable()), endpoint_stat_names_(stats_store_.symbolTable()), cluster_load_report_stat_names_(stats_store_.symbolTable()), cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), -<<<<<<< HEAD traffic_stats_(stats_store_, upstream_stat_names_), -======= - stats_(ClusterInfoImpl::generateStats(stats_store_, stat_names_)), ->>>>>>> main config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), @@ -106,11 +98,7 @@ MockClusterInfo::MockClusterInfo() .WillByDefault(ReturnPointee(&max_response_headers_count_)); ON_CALL(*this, maxRequestsPerConnection()) .WillByDefault(ReturnPointee(&max_requests_per_connection_)); -<<<<<<< HEAD ON_CALL(*this, trafficStats()).WillByDefault(ReturnRef(traffic_stats_)); -======= - ON_CALL(*this, trafficStats()).WillByDefault(ReturnRef(stats_)); ->>>>>>> main ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 19921474fc8c3..c75cea549acea 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -151,11 +151,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); -<<<<<<< HEAD MOCK_METHOD(LazyInitStats&, trafficStats, (), (const)); -======= - MOCK_METHOD(ClusterTrafficStats&, trafficStats, (), (const)); ->>>>>>> main MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); @@ -203,11 +199,7 @@ class MockClusterInfo : public ClusterInfo { uint64_t max_requests_per_connection_{}; uint32_t max_response_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT}; NiceMock stats_store_; -<<<<<<< HEAD - ClusterTrafficStatNames upstream_stat_names_; -======= ClusterTrafficStatNames stat_names_; ->>>>>>> main ClusterConfigUpdateStatNames config_update_stats_names_; ClusterLbStatNames lb_stat_names_; ClusterEndpointStatNames endpoint_stat_names_; @@ -215,11 +207,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; -<<<<<<< HEAD LazyInitStats traffic_stats_; -======= - ClusterTrafficStats stats_; ->>>>>>> main ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; From a20e2350b2a51d5355948a0975c156d7ff4f2a68 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 11:02:20 -0500 Subject: [PATCH 012/122] resolve more merge conflicts Signed-off-by: Xin Zhuang --- source/common/http/codec_client.cc | 4 -- source/common/http/conn_pool_base.h | 8 ---- source/common/http/http2/conn_pool.cc | 4 -- source/common/router/upstream_codec_filter.cc | 8 ---- source/common/router/upstream_request.cc | 24 ----------- source/common/tcp/conn_pool.cc | 8 ---- source/common/upstream/conn_pool_map_impl.h | 4 -- .../upstream/health_checker_base_impl.cc | 4 -- source/common/upstream/maglev_lb.cc | 6 +-- source/common/upstream/maglev_lb.h | 4 -- source/common/upstream/ring_hash_lb.cc | 4 -- source/common/upstream/ring_hash_lb.h | 4 -- .../common/upstream/thread_aware_lb_impl.cc | 4 -- source/common/upstream/thread_aware_lb_impl.h | 18 +-------- source/common/upstream/upstream_impl.h | 9 ----- test/common/conn_pool/conn_pool_base_test.cc | 40 ------------------- .../common/upstream/load_balancer_fuzz_base.h | 8 ---- test/common/upstream/subset_lb_test.cc | 9 ----- .../stats_sinks/hystrix/hystrix_test.cc | 6 --- test/mocks/upstream/cluster_info.cc | 2 +- test/mocks/upstream/cluster_manager.h | 4 -- 21 files changed, 4 insertions(+), 178 deletions(-) diff --git a/source/common/http/codec_client.cc b/source/common/http/codec_client.cc index 99998ae5c8ec7..4369f94909094 100644 --- a/source/common/http/codec_client.cc +++ b/source/common/http/codec_client.cc @@ -171,11 +171,7 @@ void CodecClient::onData(Buffer::Instance& data) { if (!isPrematureResponseError(status) || (!active_requests_.empty() || getPrematureResponseHttpCode(status) != Code::RequestTimeout)) { -<<<<<<< HEAD host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); -======= - host_->cluster().trafficStats()->upstream_cx_protocol_error_.inc(); ->>>>>>> main protocol_error_ = true; } close(); diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index 9747257bf676c..efbd58216fcb1 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -129,19 +129,11 @@ class ActiveClient : public Envoy::ConnectionPool::ActiveClient { codec_client_ = parent.createCodecClient(data); codec_client_->addConnectionCallbacks(*this); codec_client_->setConnectionStats( -<<<<<<< HEAD {parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_total_, parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_total_, parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, &parent_.host()->cluster().trafficStats()->bind_errors_, nullptr}); -======= - {parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_total_, - parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, - parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_total_, - parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, - &parent_.host()->cluster().trafficStats()->bind_errors_, nullptr}); ->>>>>>> main } absl::optional protocol() const override { return codec_client_->protocol(); } diff --git a/source/common/http/http2/conn_pool.cc b/source/common/http/http2/conn_pool.cc index 62c5a46aa6e9e..865f0f0d6dcc2 100644 --- a/source/common/http/http2/conn_pool.cc +++ b/source/common/http/http2/conn_pool.cc @@ -45,11 +45,7 @@ ActiveClient::ActiveClient(HttpConnPoolImplBase& parent, : MultiplexedActiveClientBase( parent, calculateInitialStreamsLimit(parent.cache(), parent.origin(), parent.host()), parent.host()->cluster().http2Options().max_concurrent_streams().value(), -<<<<<<< HEAD parent.host()->cluster().trafficStats()->upstream_cx_http2_total_, data) {} -======= - parent.host()->cluster().trafficStats()->upstream_cx_http2_total_, data) {} ->>>>>>> main ConnectionPool::InstancePtr allocateConnPool(Event::Dispatcher& dispatcher, Random::RandomGenerator& random_generator, diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index 2ae6715115b05..df00ef8813da6 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -28,20 +28,12 @@ namespace Envoy { namespace Router { void UpstreamCodecFilter::onBelowWriteBufferLowWatermark() { -<<<<<<< HEAD callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); -======= - callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); ->>>>>>> main callbacks_->upstreamCallbacks()->upstream()->readDisable(false); } void UpstreamCodecFilter::onAboveWriteBufferHighWatermark() { -<<<<<<< HEAD - callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); -======= callbacks_->clusterInfo()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); ->>>>>>> main callbacks_->upstreamCallbacks()->upstream()->readDisable(true); } diff --git a/source/common/router/upstream_request.cc b/source/common/router/upstream_request.cc index 8db8b3749bc3f..6079d350d61e5 100644 --- a/source/common/router/upstream_request.cc +++ b/source/common/router/upstream_request.cc @@ -197,11 +197,7 @@ void UpstreamRequest::cleanUp() { while (downstream_data_disabled_ != 0) { parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); -<<<<<<< HEAD parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); -======= - parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); ->>>>>>> main --downstream_data_disabled_; } if (allow_upstream_filters_) { @@ -757,11 +753,7 @@ UpstreamToDownstream& UpstreamRequest::upstreamToDownstream() { } void UpstreamRequest::onStreamMaxDurationReached() { -<<<<<<< HEAD - upstream_host_->cluster().trafficStats()->upstream_rq_max_duration_reached_.inc(); -======= upstream_host_->cluster().trafficStats()->upstream_rq_max_duration_reached_.inc(); ->>>>>>> main // The upstream had closed then try to retry along with retry policy. parent_.onStreamMaxDurationReached(*this); @@ -788,11 +780,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onAboveWriteBufferHighWatermar // The downstream connection is overrun. Pause reads from upstream. // If there are multiple calls to readDisable either the codec (H2) or the underlying // Network::Connection (H1) will handle reference counting. -<<<<<<< HEAD - parent_.parent_.cluster()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); -======= parent_.parent_.cluster()->trafficStats()->upstream_flow_control_paused_reading_total_.inc(); ->>>>>>> main parent_.upstream_->readDisable(true); } @@ -801,11 +789,7 @@ void UpstreamRequest::DownstreamWatermarkManager::onBelowWriteBufferLowWatermark // One source of connection blockage has buffer available. Pass this on to the stream, which // will resume reads if this was the last remaining high watermark. -<<<<<<< HEAD parent_.parent_.cluster()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); -======= - parent_.parent_.cluster()->trafficStats()->upstream_flow_control_resumed_reading_total_.inc(); ->>>>>>> main parent_.upstream_->readDisable(false); } @@ -820,11 +804,7 @@ void UpstreamRequest::disableDataFromDownstreamForFlowControl() { // the per try timeout timer is started only after downstream_end_stream_ // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); -<<<<<<< HEAD - parent_.cluster()->trafficStats()->upstream_flow_control_backed_up_total_.inc(); -======= parent_.cluster()->trafficStats()->upstream_flow_control_backed_up_total_.inc(); ->>>>>>> main parent_.callbacks()->onDecoderFilterAboveWriteBufferHighWatermark(); ++downstream_data_disabled_; } @@ -840,11 +820,7 @@ void UpstreamRequest::enableDataFromDownstreamForFlowControl() { // the per try timeout timer is started only after downstream_end_stream_ // is true. ASSERT(parent_.upstreamRequests().size() == 1 || parent_.downstreamEndStream()); -<<<<<<< HEAD - parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); -======= parent_.cluster()->trafficStats()->upstream_flow_control_drained_total_.inc(); ->>>>>>> main parent_.callbacks()->onDecoderFilterBelowWriteBufferLowWatermark(); ASSERT(downstream_data_disabled_ != 0); if (downstream_data_disabled_ > 0) { diff --git a/source/common/tcp/conn_pool.cc b/source/common/tcp/conn_pool.cc index d42a42cb07eb2..b39da30b61a90 100644 --- a/source/common/tcp/conn_pool.cc +++ b/source/common/tcp/conn_pool.cc @@ -25,19 +25,11 @@ ActiveTcpClient::ActiveTcpClient(Envoy::ConnectionPool::ConnPoolImplBase& parent connection_->addConnectionCallbacks(*this); read_filter_handle_ = std::make_shared(*this); connection_->addReadFilter(read_filter_handle_); -<<<<<<< HEAD connection_->setConnectionStats({host->cluster().trafficStats()->upstream_cx_rx_bytes_total_, host->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, host->cluster().trafficStats()->upstream_cx_tx_bytes_total_, host->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, &host->cluster().trafficStats()->bind_errors_, nullptr}); -======= - connection_->setConnectionStats({host->cluster().trafficStats()->upstream_cx_rx_bytes_total_, - host->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, - host->cluster().trafficStats()->upstream_cx_tx_bytes_total_, - host->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, - &host->cluster().trafficStats()->bind_errors_, nullptr}); ->>>>>>> main connection_->noDelay(true); connection_->connect(); } diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index 939a42156d21a..d4360858b58d1 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -35,11 +35,7 @@ ConnPoolMap::getPool(const KEY_TYPE& key, const PoolFactory if (!connPoolResource.canCreate()) { // We're full. Try to free up a pool. If we can't, bail out. if (!freeOnePool()) { -<<<<<<< HEAD host_->cluster().trafficStats()->upstream_cx_pool_overflow_.inc(); -======= - host_->cluster().trafficStats()->upstream_cx_pool_overflow_.inc(); ->>>>>>> main return absl::nullopt; } diff --git a/source/common/upstream/health_checker_base_impl.cc b/source/common/upstream/health_checker_base_impl.cc index 8fa0b66c959b6..6bcfe0f6129a9 100644 --- a/source/common/upstream/health_checker_base_impl.cc +++ b/source/common/upstream/health_checker_base_impl.cc @@ -105,11 +105,7 @@ std::chrono::milliseconds HealthCheckerImplBase::interval(HealthState state, // If a connection has been established, we choose an interval based on the host's health. Please // refer to the HealthCheck API documentation for more details. uint64_t base_time_ms; -<<<<<<< HEAD if (cluster_.info()->trafficStats()->upstream_cx_total_.used()) { -======= - if (cluster_.info()->trafficStats()->upstream_cx_total_.used()) { ->>>>>>> main // When healthy/unhealthy threshold is configured the health transition of a host will be // delayed. In this situation Envoy should use the edge interval settings between health checks. // diff --git a/source/common/upstream/maglev_lb.cc b/source/common/upstream/maglev_lb.cc index 5c7f759a04fac..1f33f094a2250 100644 --- a/source/common/upstream/maglev_lb.cc +++ b/source/common/upstream/maglev_lb.cc @@ -93,15 +93,11 @@ uint64_t MaglevTable::permutation(const TableBuildEntry& entry) { } MaglevLoadBalancer::MaglevLoadBalancer( -<<<<<<< HEAD - const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, -======= const PrioritySet& priority_set, ClusterLbStats& stats, Stats::Scope& scope, ->>>>>>> main Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ThreadAwareLoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), + : ThreadAwareLoadBalancerBase(priority_set, stats, runtime, random, common_config), scope_(scope.createScope("maglev_lb.")), stats_(generateStats(*scope_)), table_size_(config ? PROTOBUF_GET_WRAPPED_OR_DEFAULT(config.value(), table_size, MaglevTable::DefaultTableSize) diff --git a/source/common/upstream/maglev_lb.h b/source/common/upstream/maglev_lb.h index c73a3c35300fa..3f0d4d5b554e4 100644 --- a/source/common/upstream/maglev_lb.h +++ b/source/common/upstream/maglev_lb.h @@ -72,11 +72,7 @@ class MaglevLoadBalancer : public ThreadAwareLoadBalancerBase, Logger::Loggable { public: MaglevLoadBalancer( -<<<<<<< HEAD - const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, -======= const PrioritySet& priority_set, ClusterLbStats& stats, Stats::Scope& scope, ->>>>>>> main Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); diff --git a/source/common/upstream/ring_hash_lb.cc b/source/common/upstream/ring_hash_lb.cc index 91190e7568639..58c66b7d98fa5 100644 --- a/source/common/upstream/ring_hash_lb.cc +++ b/source/common/upstream/ring_hash_lb.cc @@ -17,11 +17,7 @@ namespace Envoy { namespace Upstream { RingHashLoadBalancer::RingHashLoadBalancer( -<<<<<<< HEAD const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, -======= - const PrioritySet& priority_set, ClusterLbStats& stats, Stats::Scope& scope, ->>>>>>> main Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) diff --git a/source/common/upstream/ring_hash_lb.h b/source/common/upstream/ring_hash_lb.h index 635960b9be751..2ad0fe263dae9 100644 --- a/source/common/upstream/ring_hash_lb.h +++ b/source/common/upstream/ring_hash_lb.h @@ -41,11 +41,7 @@ class RingHashLoadBalancer : public ThreadAwareLoadBalancerBase, Logger::Loggable { public: RingHashLoadBalancer( -<<<<<<< HEAD - const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, -======= const PrioritySet& priority_set, ClusterLbStats& stats, Stats::Scope& scope, ->>>>>>> main Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config); diff --git a/source/common/upstream/thread_aware_lb_impl.cc b/source/common/upstream/thread_aware_lb_impl.cc index 99966d52f6bd2..a2d7e17c8cac0 100644 --- a/source/common/upstream/thread_aware_lb_impl.cc +++ b/source/common/upstream/thread_aware_lb_impl.cc @@ -190,11 +190,7 @@ double ThreadAwareLoadBalancerBase::BoundedLoadHashingLoadBalancer::hostOverload // TODO(scheler): This will not work if rq_active cluster stat is disabled, need to detect // and alert the user if that's the case. -<<<<<<< HEAD const uint32_t overall_active = host.cluster().trafficStats()->upstream_rq_active_.value(); -======= - const uint32_t overall_active = host.cluster().trafficStats()->upstream_rq_active_.value(); ->>>>>>> main const uint32_t host_active = host.stats().rq_active_.value(); const uint32_t total_slots = ((overall_active + 1) * hash_balance_factor_ + 99) / 100; diff --git a/source/common/upstream/thread_aware_lb_impl.h b/source/common/upstream/thread_aware_lb_impl.h index 6c570f33d5da9..2cd2b78a17cb6 100644 --- a/source/common/upstream/thread_aware_lb_impl.h +++ b/source/common/upstream/thread_aware_lb_impl.h @@ -107,15 +107,11 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL protected: ThreadAwareLoadBalancerBase( -<<<<<<< HEAD - const PrioritySet& priority_set, ClusterLbStats& lb_stats, Runtime::Loader& runtime, -======= const PrioritySet& priority_set, ClusterLbStats& stats, Runtime::Loader& runtime, ->>>>>>> main Random::RandomGenerator& random, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : LoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), - factory_(new LoadBalancerFactoryImpl(lb_stats, random)) {} + : LoadBalancerBase(priority_set, stats, runtime, random, common_config), + factory_(new LoadBalancerFactoryImpl(stats, random)) {} private: struct PerPriorityState { @@ -125,13 +121,8 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL using PerPriorityStatePtr = std::unique_ptr; struct LoadBalancerImpl : public LoadBalancer { -<<<<<<< HEAD - LoadBalancerImpl(ClusterLbStats& lb_stats, Random::RandomGenerator& random) - : stats_(lb_stats), random_(random) {} -======= LoadBalancerImpl(ClusterLbStats& stats, Random::RandomGenerator& random) : stats_(stats), random_(random) {} ->>>>>>> main // Upstream::LoadBalancer HostConstSharedPtr chooseHost(LoadBalancerContext* context) override; @@ -155,13 +146,8 @@ class ThreadAwareLoadBalancerBase : public LoadBalancerBase, public ThreadAwareL }; struct LoadBalancerFactoryImpl : public LoadBalancerFactory { -<<<<<<< HEAD - LoadBalancerFactoryImpl(ClusterLbStats& lb_stats, Random::RandomGenerator& random) - : stats_(lb_stats), random_(random) {} -======= LoadBalancerFactoryImpl(ClusterLbStats& stats, Random::RandomGenerator& random) : stats_(stats), random_(random) {} ->>>>>>> main // Upstream::LoadBalancerFactory LoadBalancerPtr create() override; diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 5bd26e3b96ffc..15df00648e8e5 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -710,13 +710,8 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcherPtr&& socket_matcher, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); -<<<<<<< HEAD static LazyInitStats generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& cluster_stat_names); -======= - static ClusterTrafficStats generateStats(Stats::Scope& scope, - const ClusterTrafficStatNames& cluster_stat_names); ->>>>>>> main static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); static ClusterCircuitBreakersStats @@ -920,11 +915,7 @@ class ClusterInfoImpl : public ClusterInfo, const uint32_t per_connection_buffer_limit_bytes_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; -<<<<<<< HEAD mutable LazyInitStats traffic_stats_; -======= - mutable ClusterTrafficStats stats_; ->>>>>>> main mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/test/common/conn_pool/conn_pool_base_test.cc b/test/common/conn_pool/conn_pool_base_test.cc index 3dba2010c758d..1313c5d38d69e 100644 --- a/test/common/conn_pool/conn_pool_base_test.cc +++ b/test/common/conn_pool/conn_pool_base_test.cc @@ -374,21 +374,13 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationBusy) { // Verify that advancing to just before the connection duration timeout doesn't drain the // connection. advanceTimeAndRun(max_connection_duration_ - 1); -<<<<<<< HEAD EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); -======= - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ->>>>>>> main EXPECT_EQ(ActiveClient::State::Busy, clients_.back()->state()); // Verify that advancing past the connection duration timeout drains the connection, // because there's a busy client. advanceTimeAndRun(2); -<<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); -======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ->>>>>>> main EXPECT_EQ(ActiveClient::State::Draining, clients_.back()->state()); closeStream(); } @@ -403,21 +395,13 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationReady) { // Verify that advancing to just before the connection duration timeout doesn't close the // connection. advanceTimeAndRun(max_connection_duration_ - 1); -<<<<<<< HEAD - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); -======= EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ->>>>>>> main EXPECT_EQ(ActiveClient::State::Ready, clients_.back()->state()); // Verify that advancing past the connection duration timeout closes the connection, // because there's nothing to drain. advanceTimeAndRun(2); -<<<<<<< HEAD EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); -======= - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ->>>>>>> main } TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { @@ -427,11 +411,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyDraining) { // Verify that advancing past the connection duration timeout does nothing to an active client // that is already draining. advanceTimeAndRun(max_connection_duration_ + 1); -<<<<<<< HEAD - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); -======= EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ->>>>>>> main EXPECT_EQ(ActiveClient::State::Draining, clients_.back()->state()); closeStream(); } @@ -443,11 +423,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationAlreadyClosed) { // Verify that advancing past the connection duration timeout does nothing to the active // client that is already closed. advanceTimeAndRun(max_connection_duration_ + 1); -<<<<<<< HEAD EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); -======= - EXPECT_EQ(0, pool_.host()->cluster().trafficStats()->upstream_cx_max_duration_reached_.value()); ->>>>>>> main } TEST_F(ConnPoolImplDispatcherBaseTest, MaxConnectionDurationCallbackWhileClosedBug) { @@ -589,11 +565,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { pool_.onUpstreamReadyForEarlyData(client_ref); CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); -<<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); -======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ->>>>>>> main EXPECT_NE(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/false)); CHECK_STATE(1 /*active*/, 1 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); @@ -602,11 +574,7 @@ TEST_F(ConnPoolImplDispatcherBaseTest, ConnectedZeroRttSendsEarlyData) { clients_.back()->onEvent(Network::ConnectionEvent::Connected); CHECK_STATE(2 /*active*/, 0 /*pending*/, 0 /*connecting capacity*/); -<<<<<<< HEAD - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); -======= EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ->>>>>>> main // Clean up. closeStreamAndDrainClient(); @@ -628,20 +596,12 @@ TEST_F(ConnPoolImplDispatcherBaseTest, EarlyDataStreamsReachConcurrentStreamLimi pool_.onUpstreamReadyForEarlyData(client_ref); CHECK_STATE(1 /*active*/, 0 /*pending*/, concurrent_streams_ - 1 /*connecting capacity*/); -<<<<<<< HEAD EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); -======= - EXPECT_EQ(1, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ->>>>>>> main EXPECT_CALL(pool_, onPoolReady); EXPECT_EQ(nullptr, pool_.newStreamImpl(context_, /*can_send_early_data=*/true)); CHECK_STATE(2 /*active*/, 0 /*pending*/, concurrent_streams_ - 2 /*connecting capacity*/); -<<<<<<< HEAD - EXPECT_EQ(2, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); -======= EXPECT_EQ(2, pool_.host()->cluster().trafficStats()->upstream_rq_0rtt_.value()); ->>>>>>> main EXPECT_EQ(ActiveClient::State::Busy, clients_.back()->state()); // After 1 stream gets closed, the client should transit to ReadyForEarlyData. diff --git a/test/common/upstream/load_balancer_fuzz_base.h b/test/common/upstream/load_balancer_fuzz_base.h index 77ddbe4e42f45..a9bee573c04f0 100644 --- a/test/common/upstream/load_balancer_fuzz_base.h +++ b/test/common/upstream/load_balancer_fuzz_base.h @@ -21,11 +21,7 @@ namespace Upstream { class LoadBalancerFuzzBase { public: LoadBalancerFuzzBase() -<<<<<<< HEAD : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_){}; -======= - : stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_){}; ->>>>>>> main // Initializes load balancer components shared amongst every load balancer, random_, and // priority_set_ @@ -45,11 +41,7 @@ class LoadBalancerFuzzBase { // These public objects shared amongst all types of load balancers will be used to construct load // balancers in specific load balancer fuzz classes Stats::IsolatedStoreImpl stats_store_; -<<<<<<< HEAD ClusterLbStatNames lb_stat_names_; -======= - ClusterLbStatNames stat_names_; ->>>>>>> main ClusterLbStats stats_; NiceMock runtime_; Random::PsuedoRandomGenerator64 random_; diff --git a/test/common/upstream/subset_lb_test.cc b/test/common/upstream/subset_lb_test.cc index 3ed3e679de23f..e38822f63247e 100644 --- a/test/common/upstream/subset_lb_test.cc +++ b/test/common/upstream/subset_lb_test.cc @@ -169,13 +169,8 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::TestWithParam { public: SubsetLoadBalancerTest() -<<<<<<< HEAD - : scope_(stats_store_.createScope("testprefix")), lb_stat_names_(stats_store_.symbolTable()), - stats_(lb_stat_names_, stats_store_) { -======= : scope_(stats_store_.createScope("testprefix")), stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_) { ->>>>>>> main least_request_lb_config_.mutable_choice_count()->set_value(2); } @@ -532,11 +527,7 @@ class SubsetLoadBalancerTest : public Event::TestUsingSimulatedTime, NiceMock random_; Stats::IsolatedStoreImpl stats_store_; Stats::ScopeSharedPtr scope_; -<<<<<<< HEAD - ClusterLbStatNames lb_stat_names_; -======= ClusterLbStatNames stat_names_; ->>>>>>> main ClusterLbStats stats_; PrioritySetImpl local_priority_set_; HostVectorSharedPtr local_hosts_; diff --git a/test/extensions/stats_sinks/hystrix/hystrix_test.cc b/test/extensions/stats_sinks/hystrix/hystrix_test.cc index b1d6276761f47..0a71f9df68360 100644 --- a/test/extensions/stats_sinks/hystrix/hystrix_test.cc +++ b/test/extensions/stats_sinks/hystrix/hystrix_test.cc @@ -82,15 +82,9 @@ class ClusterTestInfo { ON_CALL(error_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_step)); ON_CALL(retry_4xx_counter_, value()).WillByDefault(Return((i + 1) * error_4xx_retry_step)); ON_CALL(success_counter_, value()).WillByDefault(Return((i + 1) * success_step)); -<<<<<<< HEAD cluster_info_->trafficStats()->upstream_rq_timeout_.add(timeout_step); cluster_info_->trafficStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); cluster_info_->trafficStats()->upstream_rq_pending_overflow_.add(rejected_step); -======= - cluster_info_->trafficStats()->upstream_rq_timeout_.add(timeout_step); - cluster_info_->trafficStats()->upstream_rq_per_try_timeout_.add(timeout_retry_step); - cluster_info_->trafficStats()->upstream_rq_pending_overflow_.add(rejected_step); ->>>>>>> main } NiceMock cluster_; diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 1288ed48e1778..16d89c3f36409 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -60,7 +60,7 @@ MockClusterInfo::MockClusterInfo() cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - traffic_stats_(stats_store_, upstream_stat_names_), + traffic_stats_(stats_store_, stat_names_), config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), diff --git a/test/mocks/upstream/cluster_manager.h b/test/mocks/upstream/cluster_manager.h index b3c11e6b9c839..6a068671aee40 100644 --- a/test/mocks/upstream/cluster_manager.h +++ b/test/mocks/upstream/cluster_manager.h @@ -56,11 +56,7 @@ class MockClusterManager : public ClusterManager { MOCK_METHOD(ClusterUpdateCallbacksHandle*, addThreadLocalClusterUpdateCallbacks_, (ClusterUpdateCallbacks & callbacks)); MOCK_METHOD(Config::SubscriptionFactory&, subscriptionFactory, ()); -<<<<<<< HEAD const ClusterTrafficStatNames& clusterStatNames() const override { return cluster_stat_names_; } -======= - const ClusterTrafficStatNames& clusterStatNames() const override { return cluster_stat_names_; } ->>>>>>> main const ClusterConfigUpdateStatNames& clusterConfigUpdateStatNames() const override { return cluster_config_update_stat_names_; } From d9f8f0365253655ba13f42b34bf207b3ed36e82b Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 11:04:30 -0500 Subject: [PATCH 013/122] fix format Signed-off-by: Xin Zhuang --- .../original_dst/original_dst_cluster.cc | 2 +- test/common/http/http1/conn_pool_test.cc | 3 +- .../upstream/load_balancer_benchmark.cc | 4 +- .../upstream/load_balancer_impl_test.cc | 29 ++++------ test/common/upstream/subset_lb_test.cc | 56 +++++++++---------- .../network/common/redis/client_impl_test.cc | 3 +- 6 files changed, 45 insertions(+), 52 deletions(-) diff --git a/source/extensions/clusters/original_dst/original_dst_cluster.cc b/source/extensions/clusters/original_dst/original_dst_cluster.cc index c493784276d73..fe10a85649a5f 100644 --- a/source/extensions/clusters/original_dst/original_dst_cluster.cc +++ b/source/extensions/clusters/original_dst/original_dst_cluster.cc @@ -124,7 +124,7 @@ OriginalDstCluster::LoadBalancer::requestOverrideHost(LoadBalancerContext* conte if (request_host == nullptr) { ENVOY_LOG(debug, "original_dst_load_balancer: invalid override header value. {}", request_override_host); - parent_->info()->trafficStats()-> original_dst_host_invalid_.inc(); + parent_->info()->trafficStats()->original_dst_host_invalid_.inc(); return nullptr; } ENVOY_LOG(debug, "Using request override host {}.", request_override_host); diff --git a/test/common/http/http1/conn_pool_test.cc b/test/common/http/http1/conn_pool_test.cc index bf0ed74a311c8..30a13e46dce90 100644 --- a/test/common/http/http1/conn_pool_test.cc +++ b/test/common/http/http1/conn_pool_test.cc @@ -199,8 +199,7 @@ struct ActiveTestRequest { Network::ConnectionEvent::Connected); } if (type != Type::Pending) { - EXPECT_EQ(current_rq_total + 1, - parent_.cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(current_rq_total + 1, parent_.cluster_->traffic_stats_->upstream_rq_total_.value()); EXPECT_EQ(active_rq_observed + 1, parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default) .requests() diff --git a/test/common/upstream/load_balancer_benchmark.cc b/test/common/upstream/load_balancer_benchmark.cc index 5f73b4c685f92..bf7feac8fe1be 100644 --- a/test/common/upstream/load_balancer_benchmark.cc +++ b/test/common/upstream/load_balancer_benchmark.cc @@ -166,8 +166,8 @@ class MaglevTester : public BaseTester { public: MaglevTester(uint64_t num_hosts, uint32_t weighted_subset_percent = 0, uint32_t weight = 0) : BaseTester(num_hosts, weighted_subset_percent, weight) { - maglev_lb_ = std::make_unique(priority_set_, stats_, stats_store_, - runtime_, random_, config_, common_config_); + maglev_lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, + random_, config_, common_config_); } absl::optional config_; diff --git a/test/common/upstream/load_balancer_impl_test.cc b/test/common/upstream/load_balancer_impl_test.cc index f66d7593b46b1..b503014a30823 100644 --- a/test/common/upstream/load_balancer_impl_test.cc +++ b/test/common/upstream/load_balancer_impl_test.cc @@ -624,8 +624,8 @@ class RoundRobinLoadBalancerTest : public LoadBalancerTestBase { local_priority_set_ = std::make_shared(); local_priority_set_->getOrCreateHostSet(0); } - lb_ = std::make_shared(priority_set_, local_priority_set_.get(), - stats_, runtime_, random_, common_config_, + lb_ = std::make_shared(priority_set_, local_priority_set_.get(), stats_, + runtime_, random_, common_config_, round_robin_lb_config_, simTime()); } @@ -1945,14 +1945,9 @@ TEST_P(RoundRobinLoadBalancerTest, SlowStartNoWaitMinWeightPercent35) { class LeastRequestLoadBalancerTest : public LoadBalancerTestBase { public: - LeastRequestLoadBalancer lb_{priority_set_, - nullptr, - stats_, - runtime_, - random_, - common_config_, - least_request_lb_config_, - simTime()}; + LeastRequestLoadBalancer lb_{ + priority_set_, nullptr, stats_, runtime_, random_, common_config_, least_request_lb_config_, + simTime()}; }; TEST_P(LeastRequestLoadBalancerTest, NoHosts) { EXPECT_EQ(nullptr, lb_.chooseHost(nullptr)); } @@ -2025,10 +2020,10 @@ TEST_P(LeastRequestLoadBalancerTest, PNC) { // Creating various load balancer objects with different choice configs. envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_choice_count()->set_value(2); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; lr_lb_config.mutable_choice_count()->set_value(5); - LeastRequestLoadBalancer lb_5{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_5{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; // Verify correct number of choices. @@ -2104,7 +2099,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithInvalidActiveRequestBias envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; EXPECT_CALL(runtime_.snapshot_, getDouble("ar_bias", 1.0)).WillRepeatedly(Return(-1.0)); @@ -2158,7 +2153,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceWithCustomActiveRequestBias) envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; EXPECT_CALL(runtime_.snapshot_, getDouble("ar_bias", 1.0)).WillRepeatedly(Return(0.0)); @@ -2205,7 +2200,7 @@ TEST_P(LeastRequestLoadBalancerTest, WeightImbalanceCallbacks) { TEST_P(LeastRequestLoadBalancerTest, SlowStartWithDefaultParams) { envoy::config::cluster::v3::Cluster::LeastRequestLbConfig lr_lb_config; - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; const auto slow_start_window = EdfLoadBalancerBasePeer::slowStartWindow(static_cast(lb_2)); @@ -2226,7 +2221,7 @@ TEST_P(LeastRequestLoadBalancerTest, SlowStartNoWait) { lr_lb_config.mutable_slow_start_config()->mutable_slow_start_window()->set_seconds(60); lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(1.0); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; simTime().advanceTimeWait(std::chrono::seconds(1)); @@ -2297,7 +2292,7 @@ TEST_P(LeastRequestLoadBalancerTest, SlowStartWaitForPassingHC) { lr_lb_config.mutable_active_request_bias()->set_runtime_key("ar_bias"); lr_lb_config.mutable_active_request_bias()->set_default_value(0.9); - LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, + LeastRequestLoadBalancer lb_2{priority_set_, nullptr, stats_, runtime_, random_, common_config_, lr_lb_config, simTime()}; simTime().advanceTimeWait(std::chrono::seconds(1)); diff --git a/test/common/upstream/subset_lb_test.cc b/test/common/upstream/subset_lb_test.cc index e38822f63247e..6011423dd3324 100644 --- a/test/common/upstream/subset_lb_test.cc +++ b/test/common/upstream/subset_lb_test.cc @@ -1489,10 +1489,10 @@ TEST_F(SubsetLoadBalancerTest, IgnoresHostsWithoutMetadata) { host_set_.healthy_hosts_ = host_set_.hosts_; host_set_.healthy_hosts_per_locality_ = host_set_.hosts_per_locality_; - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context_version({{"version", "1.0"}}); @@ -1909,10 +1909,10 @@ TEST_F(SubsetLoadBalancerTest, DisabledLocalityWeightAwareness) { }, host_set_, {1, 100}); - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); @@ -1933,10 +1933,10 @@ TEST_F(SubsetLoadBalancerTest, DoesNotCheckHostHealth) { EXPECT_CALL(*mock_host, weight()).WillRepeatedly(Return(1)); - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); } TEST_F(SubsetLoadBalancerTest, EnabledLocalityWeightAwareness) { @@ -1957,10 +1957,10 @@ TEST_F(SubsetLoadBalancerTest, EnabledLocalityWeightAwareness) { }, host_set_, {1, 100}); - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); @@ -1993,10 +1993,10 @@ TEST_F(SubsetLoadBalancerTest, EnabledScaleLocalityWeights) { }, host_set_, {50, 50}); - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.1"}}); // Since we scale the locality weights by number of hosts removed, we expect to see the second @@ -2039,10 +2039,10 @@ TEST_F(SubsetLoadBalancerTest, EnabledScaleLocalityWeightsRounding) { }, host_set_, {2, 2}); - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); TestLoadBalancerContext context({{"version", "1.0"}}); // We expect to see a 33/66 split because 2 * 1 / 2 = 1 and 2 * 3 / 4 = 1.5 -> 2 @@ -2072,10 +2072,10 @@ TEST_F(SubsetLoadBalancerTest, ScaleLocalityWeightsWithNoLocalityWeights) { }, host_set_); - lb_ = std::make_shared( - lb_type_, priority_set_, nullptr, stats_, stats_store_, runtime_, random_, subset_info_, - ring_hash_lb_config_, maglev_lb_config_, round_robin_lb_config_, least_request_lb_config_, - common_config_, simTime()); + lb_ = std::make_shared(lb_type_, priority_set_, nullptr, stats_, stats_store_, + runtime_, random_, subset_info_, ring_hash_lb_config_, + maglev_lb_config_, round_robin_lb_config_, + least_request_lb_config_, common_config_, simTime()); } TEST_P(SubsetLoadBalancerTest, GaugesUpdatedOnDestroy) { diff --git a/test/extensions/filters/network/common/redis/client_impl_test.cc b/test/extensions/filters/network/common/redis/client_impl_test.cc index f9709a6188377..4d616e46c690e 100644 --- a/test/extensions/filters/network/common/redis/client_impl_test.cc +++ b/test/extensions/filters/network/common/redis/client_impl_test.cc @@ -668,8 +668,7 @@ TEST_F(RedisClientImplTest, FailAllWithCancel) { upstream_connection_->raiseEvent(Network::ConnectionEvent::LocalClose); EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1UL, - host_->cluster_.traffic_stats_->upstream_cx_destroy_local_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_local_with_active_rq_.value()); EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_cancelled_.value()); } From f3679298ae39c77b76f324ecd7eb5505f4945725 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 11:13:35 -0500 Subject: [PATCH 014/122] resolve more merge conflicts Signed-off-by: Xin Zhuang --- test/common/grpc/grpc_client_integration_test_harness.h | 4 ++-- test/common/upstream/load_balancer_fuzz_base.h | 4 ++-- test/common/upstream/maglev_lb_test.cc | 4 ++-- .../clusters/original_dst/original_dst_cluster_test.cc | 3 ++- .../filters/http/router/auto_sni_integration_test.cc | 4 ++-- test/integration/alpn_selection_integration_test.cc | 4 ++-- test/integration/base_integration_test.cc | 8 ++++---- test/integration/base_integration_test.h | 2 +- test/integration/integration_admin_test.cc | 5 ++--- test/integration/sds_dynamic_integration_test.cc | 4 ++-- test/integration/ssl_utility.cc | 8 ++++---- test/integration/xfcc_integration_test.cc | 9 ++++----- test/mocks/upstream/cluster_info.cc | 2 +- test/mocks/upstream/cluster_info.h | 2 +- 14 files changed, 31 insertions(+), 32 deletions(-) diff --git a/test/common/grpc/grpc_client_integration_test_harness.h b/test/common/grpc/grpc_client_integration_test_harness.h index b524e840bc65b..49947606770fc 100644 --- a/test/common/grpc/grpc_client_integration_test_harness.h +++ b/test/common/grpc/grpc_client_integration_test_harness.h @@ -567,9 +567,9 @@ class GrpcSslClientIntegrationTest : public GrpcClientIntegrationTest { auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); } bool use_client_cert_{}; diff --git a/test/common/upstream/load_balancer_fuzz_base.h b/test/common/upstream/load_balancer_fuzz_base.h index a9bee573c04f0..f8a33319e04a3 100644 --- a/test/common/upstream/load_balancer_fuzz_base.h +++ b/test/common/upstream/load_balancer_fuzz_base.h @@ -21,7 +21,7 @@ namespace Upstream { class LoadBalancerFuzzBase { public: LoadBalancerFuzzBase() - : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_){}; + : stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_){}; // Initializes load balancer components shared amongst every load balancer, random_, and // priority_set_ @@ -41,7 +41,7 @@ class LoadBalancerFuzzBase { // These public objects shared amongst all types of load balancers will be used to construct load // balancers in specific load balancer fuzz classes Stats::IsolatedStoreImpl stats_store_; - ClusterLbStatNames lb_stat_names_; + ClusterLbStatNames stat_names_; ClusterLbStats stats_; NiceMock runtime_; Random::PsuedoRandomGenerator64 random_; diff --git a/test/common/upstream/maglev_lb_test.cc b/test/common/upstream/maglev_lb_test.cc index bddd046af23ff..a668aafaf7ab8 100644 --- a/test/common/upstream/maglev_lb_test.cc +++ b/test/common/upstream/maglev_lb_test.cc @@ -45,7 +45,7 @@ class TestLoadBalancerContext : public LoadBalancerContextBase { class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public testing::Test { public: MaglevLoadBalancerTest() - : lb_stat_names_(stats_store_.symbolTable()), stats_(lb_stat_names_, stats_store_) {} + : stat_names_(stats_store_.symbolTable()), stats_(stat_names_, stats_store_) {} void createLb() { lb_ = std::make_unique(priority_set_, stats_, stats_store_, runtime_, @@ -64,7 +64,7 @@ class MaglevLoadBalancerTest : public Event::TestUsingSimulatedTime, public test MockHostSet& host_set_ = *priority_set_.getMockHostSet(0); std::shared_ptr info_{new NiceMock()}; Stats::IsolatedStoreImpl stats_store_; - ClusterLbStatNames lb_stat_names_; + ClusterLbStatNames stat_names_; ClusterLbStats stats_; absl::optional config_; envoy::config::cluster::v3::Cluster::CommonLbConfig common_config_; diff --git a/test/extensions/clusters/original_dst/original_dst_cluster_test.cc b/test/extensions/clusters/original_dst/original_dst_cluster_test.cc index 2af963fdbacf5..514309a30ee76 100644 --- a/test/extensions/clusters/original_dst/original_dst_cluster_test.cc +++ b/test/extensions/clusters/original_dst/original_dst_cluster_test.cc @@ -85,7 +85,8 @@ class OriginalDstClusterTest : public Event::TestUsingSimulatedTime, public test }); cluster_->initialize([&]() -> void { initialized_.ready(); }); } - + // NOTE: the cm_.trafficStatNames() is referenced by the MockClusterInfo::trafficStats(), it + // should out live the MockClusterInfo object. NiceMock cm_; NiceMock server_context_; Stats::TestUtil::TestStore stats_store_; diff --git a/test/extensions/filters/http/router/auto_sni_integration_test.cc b/test/extensions/filters/http/router/auto_sni_integration_test.cc index f1999437bd2b1..71e4d4aed849c 100644 --- a/test/extensions/filters/http/router/auto_sni_integration_test.cc +++ b/test/extensions/filters/http/router/auto_sni_integration_test.cc @@ -62,9 +62,9 @@ class AutoSniIntegrationTest : public testing::TestWithParam( tls_context, factory_context_); - static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); } }; diff --git a/test/integration/alpn_selection_integration_test.cc b/test/integration/alpn_selection_integration_test.cc index 549742bc651e7..5cb436295cb10 100644 --- a/test/integration/alpn_selection_integration_test.cc +++ b/test/integration/alpn_selection_integration_test.cc @@ -70,9 +70,9 @@ require_client_certificate: true TestUtility::loadFromYaml(yaml, tls_context); auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); } void createUpstreams() override { diff --git a/test/integration/base_integration_test.cc b/test/integration/base_integration_test.cc index 442deb913434e..8ddccce4934ec 100644 --- a/test/integration/base_integration_test.cc +++ b/test/integration/base_integration_test.cc @@ -129,9 +129,9 @@ BaseIntegrationTest::createUpstreamTlsContext(const FakeUpstreamConfig& upstream if (upstream_config.upstream_protocol_ != Http::CodecType::HTTP3) { auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); } else { envoy::extensions::transport_sockets::quic::v3::QuicDownstreamTransport quic_config; quic_config.mutable_downstream_tls_context()->MergeFrom(tls_context); @@ -538,9 +538,9 @@ void BaseIntegrationTest::createXdsUpstream() { auto cfg = std::make_unique( tls_context, factory_context_); - traffic_stats_store_ = std::make_unique(); + upstream_stats_store_ = std::make_unique(); auto context = std::make_unique( - std::move(cfg), context_manager_, *traffic_stats_store_, std::vector{}); + std::move(cfg), context_manager_, *upstream_stats_store_, std::vector{}); addFakeUpstream(std::move(context), Http::CodecType::HTTP2, /*autonomous_upstream=*/false); } xds_upstream_ = fake_upstreams_.back().get(); diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index 259d11c25e748..e5a52f9b880e4 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -426,7 +426,7 @@ class BaseIntegrationTest : protected Logger::Loggable { void checkForMissingTagExtractionRules(); - std::unique_ptr traffic_stats_store_; + std::unique_ptr upstream_stats_store_; // Make sure the test server will be torn down after any fake client. // The test server owns the runtime, which is often accessed by client and diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index 8da8f58a9b179..4482bf4e351aa 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -134,14 +134,13 @@ TEST_P(IntegrationAdminTest, Admin) { // We need to trigger an inc on the ClusterInfo::trafficStats() to create the upstream stats. absl::Notification n; test_server_->server().dispatcher().post([&]() { - test_server_->server() + (void)*test_server_->server() .clusterManager() .clusters() .getCluster("cluster_0") ->get() .info() - ->trafficStats() - ->bind_errors_.inc(); + ->trafficStats(); n.Notify(); }); n.WaitForNotification(); diff --git a/test/integration/sds_dynamic_integration_test.cc b/test/integration/sds_dynamic_integration_test.cc index b625d12500273..64e4320b9d8b3 100644 --- a/test/integration/sds_dynamic_integration_test.cc +++ b/test/integration/sds_dynamic_integration_test.cc @@ -602,9 +602,9 @@ class SdsDynamicDownstreamCertValidationContextTest : public SdsDynamicDownstrea auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager_, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager_, *upstream_stats_store, std::vector{}); } void TearDown() override { diff --git a/test/integration/ssl_utility.cc b/test/integration/ssl_utility.cc index 366912b05891d..ffc7080e9744f 100644 --- a/test/integration/ssl_utility.cc +++ b/test/integration/ssl_utility.cc @@ -133,10 +133,10 @@ createUpstreamSslContext(ContextManager& context_manager, Api::Api& api, bool us auto cfg = std::make_unique( tls_context, mock_factory_ctx); - static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); if (!use_http3) { return std::make_unique( - std::move(cfg), context_manager, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager, *upstream_stats_store, std::vector{}); } envoy::extensions::transport_sockets::quic::v3::QuicDownstreamTransport quic_config; quic_config.mutable_downstream_tls_context()->MergeFrom(tls_context); @@ -162,9 +162,9 @@ Network::DownstreamTransportSocketFactoryPtr createFakeUpstreamSslContext( auto cfg = std::make_unique( tls_context, factory_context); - static Stats::Scope* traffic_stats_store = new Stats::IsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::IsolatedStoreImpl(); return std::make_unique( - std::move(cfg), context_manager, *traffic_stats_store, std::vector{}); + std::move(cfg), context_manager, *upstream_stats_store, std::vector{}); } Network::Address::InstanceConstSharedPtr getSslAddress(const Network::Address::IpVersion& version, int port) { diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index b97f195c71281..894fdd6e4e480 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -113,9 +113,9 @@ Network::DownstreamTransportSocketFactoryPtr XfccIntegrationTest::createUpstream auto cfg = std::make_unique( tls_context, factory_context_); - static Stats::Scope* traffic_stats_store = new Stats::TestIsolatedStoreImpl(); + static Stats::Scope* upstream_stats_store = new Stats::TestIsolatedStoreImpl(); return std::make_unique( - std::move(cfg), *context_manager_, *traffic_stats_store, std::vector{}); + std::move(cfg), *context_manager_, *upstream_stats_store, std::vector{}); } Network::ClientConnectionPtr XfccIntegrationTest::makeTcpClientConnection() { @@ -932,14 +932,13 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { // trafficStats() to trigger creation of the cluster upstreamStats. absl::Notification n; test_server_->server().dispatcher().post([&]() { - test_server_->server() + (void)*test_server_->server() .clusterManager() .clusters() .getCluster("cluster_0") ->get() .info() - ->trafficStats() - ->upstream_cx_active_.inc(); + ->trafficStats(); n.Notify(); }); diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 16d89c3f36409..00e08e1c5e96f 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -53,7 +53,7 @@ MockUpstreamLocalAddressSelector::MockUpstreamLocalAddressSelector( MockClusterInfo::MockClusterInfo() : http2_options_(::Envoy::Http2::Utility::initializeAndValidateOptions( envoy::config::core::v3::Http2ProtocolOptions())), - stat_names_(stats_store_.symbolTable()), + traffic_stats_names_(stats_store_.symbolTable()), config_update_stats_names_(stats_store_.symbolTable()), lb_stat_names_(stats_store_.symbolTable()), endpoint_stat_names_(stats_store_.symbolTable()), cluster_load_report_stat_names_(stats_store_.symbolTable()), diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index c75cea549acea..91a55e3979f5f 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -199,7 +199,7 @@ class MockClusterInfo : public ClusterInfo { uint64_t max_requests_per_connection_{}; uint32_t max_response_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT}; NiceMock stats_store_; - ClusterTrafficStatNames stat_names_; + ClusterTrafficStatNames traffic_stats_names_; ClusterConfigUpdateStatNames config_update_stats_names_; ClusterLbStatNames lb_stat_names_; ClusterEndpointStatNames endpoint_stat_names_; From 190184767e0668523a056f7b1fdf8248d057cffe Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 11:33:53 -0500 Subject: [PATCH 015/122] resolve more merge conflicts Signed-off-by: Xin Zhuang --- test/mocks/upstream/cluster_info.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 00e08e1c5e96f..9738b576049b1 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -60,7 +60,7 @@ MockClusterInfo::MockClusterInfo() cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - traffic_stats_(stats_store_, stat_names_), + traffic_stats_(stats_store_, traffic_stats_names_), config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), From db04639745b6dfad3a1fcbd9f7c53447deb56d02 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 13:22:12 -0500 Subject: [PATCH 016/122] remove unused method Signed-off-by: Xin Zhuang --- envoy/stats/stats_macros.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index 1eb64fd078139..421e4049d77ca 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -181,8 +181,6 @@ template struct LazyInitStats { StatsStructType* operator->() { return internal_stats_.get(ctor_); } StatsStructType& operator*() { return *internal_stats_.get(ctor_); } - inline Stats::Scope& statsScope() { return scope_; } - Stats::Scope& scope_; std::function ctor_; Thread::AtomicPtr From a4d993f045ebb11c14f6fb6261b61c24098b3a7b Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 15 Nov 2022 14:26:26 -0500 Subject: [PATCH 017/122] fix typos Signed-off-by: Xin Zhuang --- .../gcp_authn_filter_integration_test.cc | 2 +- test/integration/cds_integration_test.cc | 20 +++++++++---------- test/integration/integration_admin_test.cc | 5 ++--- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc index d514be6c80382..2d42864be2634 100644 --- a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc +++ b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc @@ -236,7 +236,7 @@ TEST_P(GcpAuthnFilterIntegrationTest, BasicflowWithoutAudience) { sendRequestToDestinationAndValidateResponse(/*with_audience=*/false); // Verify request has been routed to `cluster_0` but not `gcp_authn` cluster. - // Note that upstream_cx_total is from the lazy-inited ClusterInfo::trafficStats(), so there is + // Note that upstream_cx_total is from the lazy init ClusterInfo::trafficStats(), so there is // no such stat yet. EXPECT_EQ(test_server_->counter("cluster.gcp_authn.upstream_cx_total"), nullptr); EXPECT_GE(test_server_->counter("cluster.cluster_0.upstream_cx_total")->value(), 1); diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 6109ab4e7f77b..9fef66132c75a 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -195,19 +195,17 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - // With https://github.com/envoyproxy/envoy/pull/23921 all the - // upstream_xxxx are lazy-inited. - // We need to trigger an inc on the ClusterInfo::trafficStats() to create the upstream stats. + // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. + // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. absl::Notification n; test_server_->server().dispatcher().post([&]() { - auto _ = *test_server_->server() - .clusterManager() - .clusters() - .getCluster("cluster_1") - ->get() - .info() - ->trafficStats(); - (void)_; + (void)*test_server_->server() + .clusterManager() + .clusters() + .getCluster("cluster_1") + ->get() + .info() + ->trafficStats(); n.Notify(); }); n.WaitForNotification(); diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index 4482bf4e351aa..7781d717371a0 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -129,9 +129,8 @@ TEST_P(IntegrationAdminTest, Admin) { initialize(); BufferingStreamDecoderPtr response; - // With https://github.com/envoyproxy/envoy/pull/23921 all the - // upstream_xxxx are lazy-inited. - // We need to trigger an inc on the ClusterInfo::trafficStats() to create the upstream stats. + // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. + // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. absl::Notification n; test_server_->server().dispatcher().post([&]() { (void)*test_server_->server() From 73b5141addd790dab0768e48543efdf40e0c922a Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 16 Nov 2022 12:14:45 -0500 Subject: [PATCH 018/122] fix Josh comments Signed-off-by: Xin Zhuang --- envoy/stats/BUILD | 8 +++++++ envoy/stats/stats_macros.h | 22 ------------------- envoy/upstream/BUILD | 1 + envoy/upstream/upstream.h | 3 ++- source/common/upstream/BUILD | 1 + source/common/upstream/upstream_impl.cc | 2 +- source/common/upstream/upstream_impl.h | 7 +++--- .../stat_sinks/common/statsd/statsd.cc | 15 ++++++------- test/extensions/clusters/aggregate/BUILD | 1 + .../clusters/aggregate/cluster_test.cc | 2 +- .../original_dst/original_dst_cluster_test.cc | 2 -- test/integration/base_integration_test.h | 20 +++++++++++++++++ test/integration/cds_integration_test.cc | 16 ++------------ test/integration/integration_admin_test.cc | 17 ++------------ test/integration/xfcc_integration_test.cc | 16 +------------- test/mocks/upstream/BUILD | 1 + test/mocks/upstream/cluster_info.cc | 4 ++-- test/mocks/upstream/cluster_info.h | 6 ++--- 18 files changed, 57 insertions(+), 87 deletions(-) diff --git a/envoy/stats/BUILD b/envoy/stats/BUILD index 0af871ae09928..fd23d8004bc2c 100644 --- a/envoy/stats/BUILD +++ b/envoy/stats/BUILD @@ -63,6 +63,14 @@ envoy_cc_library( ], ) +envoy_cc_library( + name = "lazy_init", + hdrs = ["lazy_init.h"], + deps = [ + "//source/common/common:thread_lib", + ], +) + envoy_cc_library( name = "primitive_stats_macros", hdrs = ["primitive_stats_macros.h"], diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index 421e4049d77ca..e1aebc1dd0e8b 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -165,26 +165,4 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ GENERATE_TEXT_READOUT_STRUCT, GENERATE_STATNAME_STRUCT) \ } -/** - * LazyInit$StatsStruct is a wrapper with creator of the actual "$StatsStruct" - * structure. - * It instantiate a $StatsStruct struct when any data member is referenced. - * See https://github.com/envoyproxy/envoy/issues/23575 for more details. - */ -template struct LazyInitStats { - LazyInitStats(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) - : scope_(scope), ctor_([&scope, &stat_names]() -> StatsStructType* { - ENVOY_LOG_MISC(error, "DDDD begin to create stats now..."); - return new StatsStructType(stat_names, scope); - }) {} - - StatsStructType* operator->() { return internal_stats_.get(ctor_); } - StatsStructType& operator*() { return *internal_stats_.get(ctor_); } - - Stats::Scope& scope_; - std::function ctor_; - Thread::AtomicPtr - internal_stats_{}; -}; - } // namespace Envoy diff --git a/envoy/upstream/BUILD b/envoy/upstream/BUILD index be7bd4aea4e87..a2cea9808f249 100644 --- a/envoy/upstream/BUILD +++ b/envoy/upstream/BUILD @@ -161,6 +161,7 @@ envoy_cc_library( "//envoy/runtime:runtime_interface", "//envoy/ssl:context_interface", "//envoy/ssl:context_manager_interface", + "//envoy/stats:lazy_init", "//envoy/upstream:types_interface", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/core/v3:pkg_cc_proto", diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index a23d8cc7cb7c2..c04e81366ea51 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -18,6 +18,7 @@ #include "envoy/network/connection.h" #include "envoy/network/transport_socket.h" #include "envoy/ssl/context.h" +#include "envoy/stats/lazy_init.h" #include "envoy/stats/scope.h" #include "envoy/stats/stats.h" #include "envoy/upstream/health_check_host_monitor.h" @@ -1056,7 +1057,7 @@ class ClusterInfo : public Http::FilterChainFactory { /** * @return ClusterTrafficStats& all traffic related stats for this cluster. */ - virtual LazyInitStats& trafficStats() const PURE; + virtual Stats::LazyInit& trafficStats() const PURE; /** * @return the stats scope that contains all cluster stats. This can be used to produce dynamic diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index 44cee17f4f736..6a0672cfdd490 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -505,6 +505,7 @@ envoy_cc_library( "//source/common/common:dns_utils_lib", "//source/common/common:enum_to_int", "//source/common/common:thread_lib", + "//envoy/stats:lazy_init", "//source/common/common:utility_lib", "//source/common/http/http1:codec_stats_lib", "//source/common/http/http2:codec_stats_lib", diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index eb659879791fd..6b20d8c515431 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -832,7 +832,7 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add } } -LazyInitStats +Stats::LazyInit ClusterInfoImpl::generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& stat_names) { return {scope, stat_names}; } diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 15df00648e8e5..21d025d82e5b9 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -29,6 +29,7 @@ #include "envoy/server/filter_config.h" #include "envoy/server/transport_socket_config.h" #include "envoy/ssl/context_manager.h" +#include "envoy/stats/lazy_init.h" #include "envoy/stats/scope.h" #include "envoy/thread_local/thread_local.h" #include "envoy/upstream/cluster_manager.h" @@ -710,7 +711,7 @@ class ClusterInfoImpl : public ClusterInfo, TransportSocketMatcherPtr&& socket_matcher, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static LazyInitStats + static Stats::LazyInit generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& cluster_stat_names); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); @@ -798,7 +799,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - LazyInitStats& trafficStats() const override { return traffic_stats_; } + Stats::LazyInit& trafficStats() const override { return traffic_stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } @@ -915,7 +916,7 @@ class ClusterInfoImpl : public ClusterInfo, const uint32_t per_connection_buffer_limit_bytes_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; - mutable LazyInitStats traffic_stats_; + mutable Stats::LazyInit traffic_stats_; mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index e5f62a9d1a778..9561bce251d77 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -330,8 +330,8 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { // since if we stay over, the other threads will eventually kill their connections too. // TODO(mattklein123): The use of the stat is somewhat of a hack, and should be replaced with // real flow control callbacks once they are available. - if (parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_buffered_.value() > - MAX_BUFFERED_STATS_BYTES) { + auto& cluster_traffic_stats = *parent_.cluster_info_->trafficStats(); + if (cluster_traffic_stats.upstream_cx_tx_bytes_buffered_.value() > MAX_BUFFERED_STATS_BYTES) { if (connection_) { connection_->close(Network::ConnectionCloseType::NoFlush); } @@ -354,12 +354,11 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { connection_ = std::move(info.connection_); connection_->addConnectionCallbacks(*this); - connection_->setConnectionStats( - {parent_.cluster_info_->trafficStats()->upstream_cx_rx_bytes_total_, - parent_.cluster_info_->trafficStats()->upstream_cx_rx_bytes_buffered_, - parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_total_, - parent_.cluster_info_->trafficStats()->upstream_cx_tx_bytes_buffered_, - &parent_.cluster_info_->trafficStats()->bind_errors_, nullptr}); + connection_->setConnectionStats({cluster_traffic_stats.upstream_cx_rx_bytes_total_, + cluster_traffic_stats.upstream_cx_rx_bytes_buffered_, + cluster_traffic_stats.upstream_cx_tx_bytes_total_, + cluster_traffic_stats.upstream_cx_tx_bytes_buffered_, + &cluster_traffic_stats.bind_errors_, nullptr}); connection_->connect(); } diff --git a/test/extensions/clusters/aggregate/BUILD b/test/extensions/clusters/aggregate/BUILD index d026ef39cf8fa..1cddba3902e65 100644 --- a/test/extensions/clusters/aggregate/BUILD +++ b/test/extensions/clusters/aggregate/BUILD @@ -16,6 +16,7 @@ envoy_extension_cc_test( srcs = ["cluster_test.cc"], extension_names = ["envoy.clusters.aggregate"], deps = [ + "//envoy/stats:lazy_init", "//source/extensions/clusters/aggregate:cluster", "//source/extensions/transport_sockets/raw_buffer:config", "//test/common/upstream:utility_lib", diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 7149ff73b8f79..df0d1d3738f52 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -139,7 +139,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterTrafficStatNames stat_names_; - LazyInitStats stats_; + Stats::LazyInit stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/extensions/clusters/original_dst/original_dst_cluster_test.cc b/test/extensions/clusters/original_dst/original_dst_cluster_test.cc index 514309a30ee76..22ad47203bb64 100644 --- a/test/extensions/clusters/original_dst/original_dst_cluster_test.cc +++ b/test/extensions/clusters/original_dst/original_dst_cluster_test.cc @@ -85,8 +85,6 @@ class OriginalDstClusterTest : public Event::TestUsingSimulatedTime, public test }); cluster_->initialize([&]() -> void { initialized_.ready(); }); } - // NOTE: the cm_.trafficStatNames() is referenced by the MockClusterInfo::trafficStats(), it - // should out live the MockClusterInfo object. NiceMock cm_; NiceMock server_context_; Stats::TestUtil::TestStore stats_store_; diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index e5a52f9b880e4..0a877c77bbe23 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -109,6 +109,26 @@ class BaseIntegrationTest : protected Logger::Loggable { void registerPort(const std::string& key, uint32_t port); uint32_t lookupPort(const std::string& key); + bool forceCreationOfClusterTrafficStats(absl::string_view cluster_name) { + // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. + // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. + absl::Notification n; + + bool cluster_found = false; + test_server_->server().dispatcher().post([&]() { + const auto& cluster_ref = + test_server_->server().clusterManager().clusters().getCluster(cluster_name); + if (cluster_ref.has_value()) { + const auto& traffic_stats = *cluster_ref->get().info()->trafficStats(); + (void)traffic_stats; + cluster_found = true; + } + n.Notify(); + }); + n.WaitForNotification(); + return cluster_found; + } + // Set the endpoint's socket address to point at upstream at given index. void setUpstreamAddress(uint32_t upstream_index, envoy::config::endpoint::v3::LbEndpoint& endpoint) const; diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 9fef66132c75a..2defe3135fc60 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -195,20 +195,8 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. - // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. - absl::Notification n; - test_server_->server().dispatcher().post([&]() { - (void)*test_server_->server() - .clusterManager() - .clusters() - .getCluster("cluster_1") - ->get() - .info() - ->trafficStats(); - n.Notify(); - }); - n.WaitForNotification(); + + ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); test_server_->waitForCounterExists("cluster.cluster_1.upstream_cx_total"); Stats::CounterSharedPtr cx_counter = test_server_->counter("cluster.cluster_1.upstream_cx_total"); diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index 7781d717371a0..ed1dc31677008 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -129,20 +129,8 @@ TEST_P(IntegrationAdminTest, Admin) { initialize(); BufferingStreamDecoderPtr response; - // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. - // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. - absl::Notification n; - test_server_->server().dispatcher().post([&]() { - (void)*test_server_->server() - .clusterManager() - .clusters() - .getCluster("cluster_0") - ->get() - .info() - ->trafficStats(); - n.Notify(); - }); - n.WaitForNotification(); + + ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_0")); EXPECT_EQ("404", request("admin", "GET", "/notfound", response)); EXPECT_EQ("text/plain; charset=UTF-8", contentType(response)); @@ -247,7 +235,6 @@ TEST_P(IntegrationAdminTest, Admin) { response->body(), HasSubstr("envoy_listener_admin_http_downstream_rq_xx{envoy_response_code_class=\"4\"," "envoy_http_conn_manager_prefix=\"admin\"} 2\n")); - EXPECT_THAT(response->body(), HasSubstr("# TYPE envoy_cluster_upstream_cx_active gauge\n")); EXPECT_THAT(response->body(), HasSubstr("envoy_cluster_upstream_cx_active{envoy_cluster_name=\"cluster_0\"} 0\n")); diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index 894fdd6e4e480..901ff80da46d9 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -928,21 +928,7 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { } }; - // Since ClusterInfo::trafficStats() are lazy-init, we need to update any stat for a cluster's - // trafficStats() to trigger creation of the cluster upstreamStats. - absl::Notification n; - test_server_->server().dispatcher().post([&]() { - (void)*test_server_->server() - .clusterManager() - .clusters() - .getCluster("cluster_0") - ->get() - .info() - ->trafficStats(); - n.Notify(); - }); - - n.WaitForNotification(); + ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_0")); for (const Stats::CounterSharedPtr& counter : test_server_->counters()) { test_name_against_mapping(tag_extracted_counter_map, *counter); diff --git a/test/mocks/upstream/BUILD b/test/mocks/upstream/BUILD index 624a336837ac7..c88e2897b07ab 100644 --- a/test/mocks/upstream/BUILD +++ b/test/mocks/upstream/BUILD @@ -14,6 +14,7 @@ envoy_cc_mock( hdrs = ["cluster_info.h"], deps = [ ":transport_socket_match_mocks", + "//envoy/stats:lazy_init", "//envoy/upstream:cluster_manager_interface", "//envoy/upstream:upstream_interface", "//source/common/common:thread_lib", diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 9738b576049b1..36603af704a2e 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -53,14 +53,14 @@ MockUpstreamLocalAddressSelector::MockUpstreamLocalAddressSelector( MockClusterInfo::MockClusterInfo() : http2_options_(::Envoy::Http2::Utility::initializeAndValidateOptions( envoy::config::core::v3::Http2ProtocolOptions())), - traffic_stats_names_(stats_store_.symbolTable()), + traffic_stat_names_(stats_store_.symbolTable()), config_update_stats_names_(stats_store_.symbolTable()), lb_stat_names_(stats_store_.symbolTable()), endpoint_stat_names_(stats_store_.symbolTable()), cluster_load_report_stat_names_(stats_store_.symbolTable()), cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - traffic_stats_(stats_store_, traffic_stats_names_), + traffic_stats_(stats_store_, traffic_stat_names_), config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 91a55e3979f5f..3f3505ea9be9b 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -151,7 +151,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); - MOCK_METHOD(LazyInitStats&, trafficStats, (), (const)); + MOCK_METHOD(Stats::LazyInit&, trafficStats, (), (const)); MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); @@ -199,7 +199,7 @@ class MockClusterInfo : public ClusterInfo { uint64_t max_requests_per_connection_{}; uint32_t max_response_headers_count_{Http::DEFAULT_MAX_HEADERS_COUNT}; NiceMock stats_store_; - ClusterTrafficStatNames traffic_stats_names_; + ClusterTrafficStatNames traffic_stat_names_; ClusterConfigUpdateStatNames config_update_stats_names_; ClusterLbStatNames lb_stat_names_; ClusterEndpointStatNames endpoint_stat_names_; @@ -207,7 +207,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; - LazyInitStats traffic_stats_; + Stats::LazyInit traffic_stats_; ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; From 505104e57087e9c75c6416a94ed2a1e2bf771dc9 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 16 Nov 2022 14:33:56 -0500 Subject: [PATCH 019/122] ove stats::lazyInit to source/... Signed-off-by: Xin Zhuang --- source/common/upstream/ring_hash_lb.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/common/upstream/ring_hash_lb.cc b/source/common/upstream/ring_hash_lb.cc index 58c66b7d98fa5..7548e0d5f1027 100644 --- a/source/common/upstream/ring_hash_lb.cc +++ b/source/common/upstream/ring_hash_lb.cc @@ -17,11 +17,11 @@ namespace Envoy { namespace Upstream { RingHashLoadBalancer::RingHashLoadBalancer( - const PrioritySet& priority_set, ClusterLbStats& lb_stats, Stats::Scope& scope, + const PrioritySet& priority_set, ClusterLbStats& stats, Stats::Scope& scope, Runtime::Loader& runtime, Random::RandomGenerator& random, const absl::optional& config, const envoy::config::cluster::v3::Cluster::CommonLbConfig& common_config) - : ThreadAwareLoadBalancerBase(priority_set, lb_stats, runtime, random, common_config), + : ThreadAwareLoadBalancerBase(priority_set, stats, runtime, random, common_config), scope_(scope.createScope("ring_hash_lb.")), stats_(generateStats(*scope_)), min_ring_size_(config ? PROTOBUF_GET_WRAPPED_OR_DEFAULT(config.value(), minimum_ring_size, DefaultMinRingSize) From 53b0a20e62b8cc20d957cefbaac746a7126ef4b0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 16 Nov 2022 14:34:30 -0500 Subject: [PATCH 020/122] ove stats::lazyInit to source/... Signed-off-by: Xin Zhuang --- source/common/http/BUILD | 2 ++ source/common/http/codec_client.h | 1 + source/common/http/conn_pool_base.h | 1 + source/common/http/http1/BUILD | 1 + source/common/http/http1/conn_pool.cc | 1 + source/common/router/BUILD | 2 ++ source/common/router/retry_state_impl.h | 1 + source/common/router/upstream_codec_filter.cc | 1 + source/common/stats/BUILD | 9 ++++++ source/common/stats/lazy_init.h | 29 +++++++++++++++++++ source/common/stats/utility.h | 1 + source/common/tcp/conn_pool.cc | 11 +++---- source/common/upstream/BUILD | 3 +- source/common/upstream/load_balancer_impl.h | 1 + source/common/upstream/upstream_impl.h | 2 +- 15 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 source/common/stats/lazy_init.h diff --git a/source/common/http/BUILD b/source/common/http/BUILD index fb3beedd9febb..e7ecded3a0f22 100644 --- a/source/common/http/BUILD +++ b/source/common/http/BUILD @@ -43,6 +43,7 @@ envoy_cc_library( hdrs = ["async_client_utility.h"], deps = [ "//envoy/http:async_client_interface", + "//source/common/stats:lazy_init", ], ) @@ -54,6 +55,7 @@ envoy_cc_library( ":codec_wrappers_lib", ":exception_lib", ":status_lib", + "//source/common/stats:lazy_init", ":utility_lib", "//envoy/event:deferred_deletable", "//envoy/http:codec_interface", diff --git a/source/common/http/codec_client.h b/source/common/http/codec_client.h index 65c3d9715f849..a5e918e8f2ff5 100644 --- a/source/common/http/codec_client.h +++ b/source/common/http/codec_client.h @@ -18,6 +18,7 @@ #include "source/common/http/codec_wrappers.h" #include "source/common/network/filter_impl.h" #include "source/common/runtime/runtime_features.h" +#include "source/common/stats/lazy_init.h" namespace Envoy { namespace Http { diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index efbd58216fcb1..7bf3ff6445618 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -10,6 +10,7 @@ #include "source/common/http/codec_client.h" #include "source/common/http/http_server_properties_cache_impl.h" #include "source/common/http/utility.h" +#include "source/common/stats/lazy_init.h" #include "absl/strings/string_view.h" diff --git a/source/common/http/http1/BUILD b/source/common/http/http1/BUILD index 82fecf2b2164c..f4a67e4c406c5 100644 --- a/source/common/http/http1/BUILD +++ b/source/common/http/http1/BUILD @@ -81,6 +81,7 @@ envoy_cc_library( "//source/common/http:conn_pool_base_lib", "//source/common/http:headers_lib", "//source/common/runtime:runtime_features_lib", + "//source/common/stats:lazy_init", "//source/common/upstream:upstream_lib", ], ) diff --git a/source/common/http/http1/conn_pool.cc b/source/common/http/http1/conn_pool.cc index 0439641c472f2..b28cf58715996 100644 --- a/source/common/http/http1/conn_pool.cc +++ b/source/common/http/http1/conn_pool.cc @@ -16,6 +16,7 @@ #include "source/common/http/header_utility.h" #include "source/common/http/headers.h" #include "source/common/runtime/runtime_features.h" +#include "source/common/stats/lazy_init.h" #include "absl/strings/match.h" diff --git a/source/common/router/BUILD b/source/common/router/BUILD index 5160a42a4f504..ce9f4883ff0e6 100644 --- a/source/common/router/BUILD +++ b/source/common/router/BUILD @@ -265,6 +265,7 @@ envoy_cc_library( "//source/common/http:header_utility_lib", "//source/common/http:headers_lib", "//source/common/http:utility_lib", + "//source/common/stats:lazy_init", "@envoy_api//envoy/config/route/v3:pkg_cc_proto", ], ) @@ -364,6 +365,7 @@ envoy_cc_library( "//source/common/http:headers_lib", "//source/common/http:message_lib", "//source/common/http:utility_lib", + "//source/common/stats:lazy_init", "//source/extensions/filters/http/common:factory_base_lib", "@envoy_api//envoy/extensions/filters/http/upstream_codec/v3:pkg_cc_proto", ], diff --git a/source/common/router/retry_state_impl.h b/source/common/router/retry_state_impl.h index ca41e429b92ac..306eaa71120f6 100644 --- a/source/common/router/retry_state_impl.h +++ b/source/common/router/retry_state_impl.h @@ -14,6 +14,7 @@ #include "source/common/common/backoff_strategy.h" #include "source/common/http/header_utility.h" +#include "source/common/stats/lazy_init.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index df00ef8813da6..c5b59da66eb54 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -23,6 +23,7 @@ #include "source/common/http/headers.h" #include "source/common/http/message_impl.h" #include "source/common/http/utility.h" +#include "source/common/stats/lazy_init.h" namespace Envoy { namespace Router { diff --git a/source/common/stats/BUILD b/source/common/stats/BUILD index 5dabf51657c15..52a8876cca125 100644 --- a/source/common/stats/BUILD +++ b/source/common/stats/BUILD @@ -36,6 +36,14 @@ envoy_cc_library( ], ) +envoy_cc_library( + name = "lazy_init", + hdrs = ["lazy_init.h"], + deps = [ + "//source/common/common:thread_lib", + ], +) + envoy_cc_library( name = "histogram_lib", srcs = ["histogram_impl.cc"], @@ -281,6 +289,7 @@ envoy_cc_library( srcs = ["utility.cc"], hdrs = ["utility.h"], deps = [ + ":lazy_init", ":symbol_table_lib", "//envoy/stats:stats_interface", ], diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h new file mode 100644 index 0000000000000..931bcfb8be97d --- /dev/null +++ b/source/common/stats/lazy_init.h @@ -0,0 +1,29 @@ +#pragma once + +#include "source/common/common/thread.h" + +namespace Envoy { +namespace Stats { + +/** + * LazyInit is a wrapper with creator of the actual "$StatsStruct" + * structure. + * It instantiate a $StatsStruct struct when any data member is referenced. + * See https://github.com/envoyproxy/envoy/issues/23575 for more details. + */ +template struct LazyInit { + LazyInit(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) + : ctor_([&scope, &stat_names]() -> StatsStructType* { + return new StatsStructType(stat_names, scope); + }) {} + + StatsStructType* operator->() { return internal_stats_.get(ctor_); } + StatsStructType& operator*() { return *internal_stats_.get(ctor_); } + + std::function ctor_; + Thread::AtomicPtr + internal_stats_{}; +}; + +} // namespace Stats +} // namespace Envoy \ No newline at end of file diff --git a/source/common/stats/utility.h b/source/common/stats/utility.h index 528514d4ec89d..2b198869e5ea6 100644 --- a/source/common/stats/utility.h +++ b/source/common/stats/utility.h @@ -6,6 +6,7 @@ #include "envoy/stats/stats.h" #include "source/common/common/thread.h" +#include "source/common/stats/lazy_init.h" #include "source/common/stats/symbol_table.h" #include "absl/container/inlined_vector.h" diff --git a/source/common/tcp/conn_pool.cc b/source/common/tcp/conn_pool.cc index b39da30b61a90..663b579f0ee8c 100644 --- a/source/common/tcp/conn_pool.cc +++ b/source/common/tcp/conn_pool.cc @@ -25,11 +25,12 @@ ActiveTcpClient::ActiveTcpClient(Envoy::ConnectionPool::ConnPoolImplBase& parent connection_->addConnectionCallbacks(*this); read_filter_handle_ = std::make_shared(*this); connection_->addReadFilter(read_filter_handle_); - connection_->setConnectionStats({host->cluster().trafficStats()->upstream_cx_rx_bytes_total_, - host->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, - host->cluster().trafficStats()->upstream_cx_tx_bytes_total_, - host->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, - &host->cluster().trafficStats()->bind_errors_, nullptr}); + auto& cluster_traffic_stats = *host->cluster().trafficStats(); + connection_->setConnectionStats({cluster_traffic_stats.upstream_cx_rx_bytes_total_, + cluster_traffic_stats.upstream_cx_rx_bytes_buffered_, + cluster_traffic_stats.upstream_cx_tx_bytes_total_, + cluster_traffic_stats.upstream_cx_tx_bytes_buffered_, + &cluster_traffic_stats.bind_errors_, nullptr}); connection_->noDelay(true); connection_->connect(); } diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index 6a0672cfdd490..b270571ee3086 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -267,6 +267,7 @@ envoy_cc_library( "//source/common/common:assert_lib", "//source/common/protobuf:utility_lib", "//source/common/runtime:runtime_protos_lib", + "//source/common/stats:lazy_init", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", ], ) @@ -505,7 +506,6 @@ envoy_cc_library( "//source/common/common:dns_utils_lib", "//source/common/common:enum_to_int", "//source/common/common:thread_lib", - "//envoy/stats:lazy_init", "//source/common/common:utility_lib", "//source/common/http/http1:codec_stats_lib", "//source/common/http/http2:codec_stats_lib", @@ -572,6 +572,7 @@ envoy_cc_library( "//source/common/init:manager_lib", "//source/common/shared_pool:shared_pool_lib", "//source/common/stats:isolated_store_lib", + "//source/common/stats:lazy_init", "//source/common/stats:stats_lib", "//source/extensions/filters/network/http_connection_manager:config", "//source/extensions/upstreams/http:config", diff --git a/source/common/upstream/load_balancer_impl.h b/source/common/upstream/load_balancer_impl.h index a8483408ec8eb..6017bfd6a4ea4 100644 --- a/source/common/upstream/load_balancer_impl.h +++ b/source/common/upstream/load_balancer_impl.h @@ -17,6 +17,7 @@ #include "source/common/protobuf/utility.h" #include "source/common/runtime/runtime_protos.h" +#include "source/common/stats/lazy_init.h" #include "source/common/upstream/edf_scheduler.h" namespace Envoy { diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 21d025d82e5b9..690f8ab1fdbb9 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -29,7 +29,6 @@ #include "envoy/server/filter_config.h" #include "envoy/server/transport_socket_config.h" #include "envoy/ssl/context_manager.h" -#include "envoy/stats/lazy_init.h" #include "envoy/stats/scope.h" #include "envoy/thread_local/thread_local.h" #include "envoy/upstream/cluster_manager.h" @@ -52,6 +51,7 @@ #include "source/common/network/utility.h" #include "source/common/shared_pool/shared_pool.h" #include "source/common/stats/isolated_store_impl.h" +#include "source/common/stats/lazy_init.h" #include "source/common/upstream/load_balancer_impl.h" #include "source/common/upstream/outlier_detection_impl.h" #include "source/common/upstream/resource_manager_impl.h" From 7bd6b96895464ee8b8bbca3d702aeba45c00c996 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 16 Nov 2022 14:34:37 -0500 Subject: [PATCH 021/122] move stats::lazyInit to source/... Signed-off-by: Xin Zhuang --- envoy/stats/BUILD | 8 -------- envoy/stats/stats_macros.h | 7 +++++++ envoy/upstream/BUILD | 1 - envoy/upstream/upstream.h | 1 - test/extensions/clusters/aggregate/BUILD | 2 +- test/mocks/upstream/BUILD | 2 +- 6 files changed, 9 insertions(+), 12 deletions(-) diff --git a/envoy/stats/BUILD b/envoy/stats/BUILD index fd23d8004bc2c..0af871ae09928 100644 --- a/envoy/stats/BUILD +++ b/envoy/stats/BUILD @@ -63,14 +63,6 @@ envoy_cc_library( ], ) -envoy_cc_library( - name = "lazy_init", - hdrs = ["lazy_init.h"], - deps = [ - "//source/common/common:thread_lib", - ], -) - envoy_cc_library( name = "primitive_stats_macros", hdrs = ["primitive_stats_macros.h"], diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index e1aebc1dd0e8b..cf61a86bb872f 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -165,4 +165,11 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ GENERATE_TEXT_READOUT_STRUCT, GENERATE_STATNAME_STRUCT) \ } +namespace Stats { + +// Template that lazy-init a StatsStruct. +template struct LazyInit; + +} // namespace Stats + } // namespace Envoy diff --git a/envoy/upstream/BUILD b/envoy/upstream/BUILD index a2cea9808f249..be7bd4aea4e87 100644 --- a/envoy/upstream/BUILD +++ b/envoy/upstream/BUILD @@ -161,7 +161,6 @@ envoy_cc_library( "//envoy/runtime:runtime_interface", "//envoy/ssl:context_interface", "//envoy/ssl:context_manager_interface", - "//envoy/stats:lazy_init", "//envoy/upstream:types_interface", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/core/v3:pkg_cc_proto", diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index c04e81366ea51..0ae5904a795aa 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -18,7 +18,6 @@ #include "envoy/network/connection.h" #include "envoy/network/transport_socket.h" #include "envoy/ssl/context.h" -#include "envoy/stats/lazy_init.h" #include "envoy/stats/scope.h" #include "envoy/stats/stats.h" #include "envoy/upstream/health_check_host_monitor.h" diff --git a/test/extensions/clusters/aggregate/BUILD b/test/extensions/clusters/aggregate/BUILD index 1cddba3902e65..aa34a3473e3d7 100644 --- a/test/extensions/clusters/aggregate/BUILD +++ b/test/extensions/clusters/aggregate/BUILD @@ -16,7 +16,7 @@ envoy_extension_cc_test( srcs = ["cluster_test.cc"], extension_names = ["envoy.clusters.aggregate"], deps = [ - "//envoy/stats:lazy_init", + "//source/common/stats:lazy_init", "//source/extensions/clusters/aggregate:cluster", "//source/extensions/transport_sockets/raw_buffer:config", "//test/common/upstream:utility_lib", diff --git a/test/mocks/upstream/BUILD b/test/mocks/upstream/BUILD index c88e2897b07ab..2bf041e828343 100644 --- a/test/mocks/upstream/BUILD +++ b/test/mocks/upstream/BUILD @@ -14,7 +14,6 @@ envoy_cc_mock( hdrs = ["cluster_info.h"], deps = [ ":transport_socket_match_mocks", - "//envoy/stats:lazy_init", "//envoy/upstream:cluster_manager_interface", "//envoy/upstream:upstream_interface", "//source/common/common:thread_lib", @@ -23,6 +22,7 @@ envoy_cc_mock( "//source/common/http/http1:codec_stats_lib", "//source/common/http/http2:codec_stats_lib", "//source/common/network:raw_buffer_socket_lib", + "//source/common/stats:lazy_init", "//source/common/upstream:upstream_includes", "//source/common/upstream:upstream_lib", "//test/mocks/runtime:runtime_mocks", From 56ccf5acaec640605238d9b40230b8caf5afcc0e Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 16 Nov 2022 14:49:16 -0500 Subject: [PATCH 022/122] format fix for stats/lazy_init.h Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 931bcfb8be97d..1a512abb1d394 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -26,4 +26,4 @@ template struct LazyInit { }; } // namespace Stats -} // namespace Envoy \ No newline at end of file +} // namespace Envoy From 0a0e1e0f7970f57ab3e99f4efa5fdf3e09bfa886 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 18 Nov 2022 11:23:29 -0500 Subject: [PATCH 023/122] fixes for Joshua comments Signed-off-by: Xin Zhuang --- envoy/stats/stats.h | 3 +++ source/common/stats/lazy_init.h | 4 ++-- source/common/tcp/conn_pool.cc | 2 +- source/common/upstream/upstream_impl.cc | 14 ++++++++------ .../stat_sinks/common/statsd/statsd.cc | 2 +- test/integration/base_integration_test.h | 18 +++++++++++++----- test/integration/cds_integration_test.cc | 1 - test/integration/integration_admin_test.cc | 2 -- test/integration/xfcc_integration_test.cc | 2 -- 9 files changed, 28 insertions(+), 20 deletions(-) diff --git a/envoy/stats/stats.h b/envoy/stats/stats.h index 9db2c9dbcac9a..ef13ff4d9a85b 100644 --- a/envoy/stats/stats.h +++ b/envoy/stats/stats.h @@ -209,5 +209,8 @@ using SizeFn = std::function; */ template using StatFn = std::function; +// Template that lazy-init a StatsStruct. +template struct LazyInit; + } // namespace Stats } // namespace Envoy diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 1a512abb1d394..462dfb2270d86 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -6,9 +6,9 @@ namespace Envoy { namespace Stats { /** - * LazyInit is a wrapper with creator of the actual "$StatsStruct" + * LazyInit is a wrapper with creator of the actual "StatsStructType" * structure. - * It instantiate a $StatsStruct struct when any data member is referenced. + * It instantiates a $StatsStruct struct when any data member is referenced. * See https://github.com/envoyproxy/envoy/issues/23575 for more details. */ template struct LazyInit { diff --git a/source/common/tcp/conn_pool.cc b/source/common/tcp/conn_pool.cc index 663b579f0ee8c..35afe2d6e8e18 100644 --- a/source/common/tcp/conn_pool.cc +++ b/source/common/tcp/conn_pool.cc @@ -25,7 +25,7 @@ ActiveTcpClient::ActiveTcpClient(Envoy::ConnectionPool::ConnPoolImplBase& parent connection_->addConnectionCallbacks(*this); read_filter_handle_ = std::make_shared(*this); connection_->addReadFilter(read_filter_handle_); - auto& cluster_traffic_stats = *host->cluster().trafficStats(); + Upstream::ClusterTrafficStats& cluster_traffic_stats = *host->cluster().trafficStats(); connection_->setConnectionStats({cluster_traffic_stats.upstream_cx_rx_bytes_total_, cluster_traffic_stats.upstream_cx_rx_bytes_buffered_, cluster_traffic_stats.upstream_cx_tx_bytes_total_, diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 6b20d8c515431..c4c377274fd04 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -2085,21 +2085,23 @@ getDnsLookupFamilyFromCluster(const envoy::config::cluster::v3::Cluster& cluster void reportUpstreamCxDestroy(const Upstream::HostDescriptionConstSharedPtr& host, Network::ConnectionEvent event) { - host->cluster().trafficStats()->upstream_cx_destroy_.inc(); + Upstream::ClusterTrafficStats& stats = *host->cluster().trafficStats(); + stats.upstream_cx_destroy_.inc(); if (event == Network::ConnectionEvent::RemoteClose) { - host->cluster().trafficStats()->upstream_cx_destroy_remote_.inc(); + stats.upstream_cx_destroy_remote_.inc(); } else { - host->cluster().trafficStats()->upstream_cx_destroy_local_.inc(); + stats.upstream_cx_destroy_local_.inc(); } } void reportUpstreamCxDestroyActiveRequest(const Upstream::HostDescriptionConstSharedPtr& host, Network::ConnectionEvent event) { - host->cluster().trafficStats()->upstream_cx_destroy_with_active_rq_.inc(); + Upstream::ClusterTrafficStats& stats = *host->cluster().trafficStats(); + stats.upstream_cx_destroy_with_active_rq_.inc(); if (event == Network::ConnectionEvent::RemoteClose) { - host->cluster().trafficStats()->upstream_cx_destroy_remote_with_active_rq_.inc(); + stats.upstream_cx_destroy_remote_with_active_rq_.inc(); } else { - host->cluster().trafficStats()->upstream_cx_destroy_local_with_active_rq_.inc(); + stats.upstream_cx_destroy_local_with_active_rq_.inc(); } } diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index 9561bce251d77..062fdfd01fca9 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -330,7 +330,7 @@ void TcpStatsdSink::TlsSink::write(Buffer::Instance& buffer) { // since if we stay over, the other threads will eventually kill their connections too. // TODO(mattklein123): The use of the stat is somewhat of a hack, and should be replaced with // real flow control callbacks once they are available. - auto& cluster_traffic_stats = *parent_.cluster_info_->trafficStats(); + Upstream::ClusterTrafficStats& cluster_traffic_stats = *parent_.cluster_info_->trafficStats(); if (cluster_traffic_stats.upstream_cx_tx_bytes_buffered_.value() > MAX_BUFFERED_STATS_BYTES) { if (connection_) { connection_->close(Network::ConnectionCloseType::NoFlush); diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index 0a877c77bbe23..2327d517dd838 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -109,23 +109,31 @@ class BaseIntegrationTest : protected Logger::Loggable { void registerPort(const std::string& key, uint32_t port); uint32_t lookupPort(const std::string& key); + /** + * @brief Schedule a callback on main thread to force create the traffic stats for the given + * cluster. + * + * @param cluster_name name of the cluster. + * @return true if cluster is found. + * @return false otherwise. + */ bool forceCreationOfClusterTrafficStats(absl::string_view cluster_name) { // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. - absl::Notification n; + absl::Notification notifier; bool cluster_found = false; test_server_->server().dispatcher().post([&]() { - const auto& cluster_ref = + const ClusterConstOptRef& cluster_ref = test_server_->server().clusterManager().clusters().getCluster(cluster_name); if (cluster_ref.has_value()) { const auto& traffic_stats = *cluster_ref->get().info()->trafficStats(); - (void)traffic_stats; + traffic_stats; cluster_found = true; } - n.Notify(); + notifier.Notify(); }); - n.WaitForNotification(); + notifier.WaitForNotification(); return cluster_found; } diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 2defe3135fc60..c7633fa4902b8 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -195,7 +195,6 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); test_server_->waitForCounterExists("cluster.cluster_1.upstream_cx_total"); diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index ed1dc31677008..87a0383b589c3 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -129,9 +129,7 @@ TEST_P(IntegrationAdminTest, Admin) { initialize(); BufferingStreamDecoderPtr response; - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_0")); - EXPECT_EQ("404", request("admin", "GET", "/notfound", response)); EXPECT_EQ("text/plain; charset=UTF-8", contentType(response)); EXPECT_THAT(response->body(), HasSubstr("invalid path. admin commands are:")); diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index 901ff80da46d9..1f7dfae2f4c56 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -927,9 +927,7 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { extracted_name_map.erase(it); } }; - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_0")); - for (const Stats::CounterSharedPtr& counter : test_server_->counters()) { test_name_against_mapping(tag_extracted_counter_map, *counter); } From 385a47d2ae01df05f0f51a626988bfe9bd59f2fe Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 18 Nov 2022 13:25:33 -0500 Subject: [PATCH 024/122] fix unused warning Signed-off-by: Xin Zhuang --- test/integration/base_integration_test.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index 2327d517dd838..2cad6d2f72cfd 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -124,11 +124,11 @@ class BaseIntegrationTest : protected Logger::Loggable { bool cluster_found = false; test_server_->server().dispatcher().post([&]() { - const ClusterConstOptRef& cluster_ref = + const Upstream::ClusterConstOptRef& cluster_ref = test_server_->server().clusterManager().clusters().getCluster(cluster_name); if (cluster_ref.has_value()) { - const auto& traffic_stats = *cluster_ref->get().info()->trafficStats(); - traffic_stats; + const Upstream::ClusterTrafficStats& traffic_stats ABSL_ATTRIBUTE_UNUSED = + *cluster_ref->get().info()->trafficStats(); cluster_found = true; } notifier.Notify(); From 8a9b2b8178cfb99c411fe987871a983d8aca73c1 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 18 Nov 2022 13:43:59 -0500 Subject: [PATCH 025/122] change to Envoy style unused parameter macro Signed-off-by: Xin Zhuang --- test/integration/base_integration_test.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index 2cad6d2f72cfd..e3dd4e5442bfc 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -127,8 +127,9 @@ class BaseIntegrationTest : protected Logger::Loggable { const Upstream::ClusterConstOptRef& cluster_ref = test_server_->server().clusterManager().clusters().getCluster(cluster_name); if (cluster_ref.has_value()) { - const Upstream::ClusterTrafficStats& traffic_stats ABSL_ATTRIBUTE_UNUSED = + const Upstream::ClusterTrafficStats& traffic_stats = *cluster_ref->get().info()->trafficStats(); + UNREFERENCED_PARAMETER(traffic_stats); cluster_found = true; } notifier.Notify(); From 229006e777a891e2022c9662eda857c5f1bf47fe Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 18 Nov 2022 13:53:48 -0500 Subject: [PATCH 026/122] remove the unused var that captures the returned stats obj Signed-off-by: Xin Zhuang --- test/integration/base_integration_test.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index e3dd4e5442bfc..4a02479eee416 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -127,9 +127,7 @@ class BaseIntegrationTest : protected Logger::Loggable { const Upstream::ClusterConstOptRef& cluster_ref = test_server_->server().clusterManager().clusters().getCluster(cluster_name); if (cluster_ref.has_value()) { - const Upstream::ClusterTrafficStats& traffic_stats = - *cluster_ref->get().info()->trafficStats(); - UNREFERENCED_PARAMETER(traffic_stats); + *cluster_ref->get().info()->trafficStats(); cluster_found = true; } notifier.Notify(); From 49056da5812d475e96ac6709c4f0285c9f75ebe9 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 21 Nov 2022 16:23:33 -0500 Subject: [PATCH 027/122] add performance tests Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 22e16577b110f..6beb3cb897358 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -214,6 +214,26 @@ envoy_cc_benchmark_binary( ], ) +envoy_cc_benchmark_binary( + name = "lazyinit_stats_benchmark", + srcs = ["lazyinit_stats_speed_test.cc"], + external_deps = [ + "benchmark", + ], + deps = [ + "//source/common/stats:thread_local_store_lib", + "//source/common/common:random_generator_lib", + + "//source/common/stats:symbol_table_lib", + "//source/common/stats:isolated_store_lib", + "//source/common/stats:lazy_init", + "//source/common/common:utility_lib", + "//source/common/runtime:runtime_lib", + "//test/test_common:real_threads_test_helper_lib", + + ], +) + envoy_benchmark_test( name = "symbol_table_benchmark_test", benchmark_binary = "symbol_table_benchmark", From 359ca2ade9dac6dc38ea3a51a38c14223f17b972 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 21 Nov 2022 16:24:43 -0500 Subject: [PATCH 028/122] add performance tests source file Signed-off-by: Xin Zhuang --- .../common/stats/lazyinit_stats_speed_test.cc | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 test/common/stats/lazyinit_stats_speed_test.cc diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc new file mode 100644 index 0000000000000..fd1192751fdc6 --- /dev/null +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -0,0 +1,184 @@ +#include "source/common/stats/symbol_table.h" +#include "envoy/upstream/upstream.h" +#include "test/benchmark/main.h" +#include "benchmark/benchmark.h" +#include "source/common/stats/isolated_store_impl.h" +#include "test/test_common/real_threads_test_helper.h" +#include "source/common/thread_local/thread_local_impl.h" +#include "source/common/common/random_generator.h" +#include "source/common/stats/thread_local_store.h" + +namespace Envoy { + +namespace { + +using Upstream::ClusterTrafficStats; + +// Benchmark no-lazy-init on stats. +void benchmarkLazyInitCreation(::benchmark::State& state) { + const bool lazy_init = state.range(0) == 1; + const uint64_t num_stats = state.range(1); + Stats::IsolatedStoreImpl stats_store; + Upstream::ClusterTrafficStatNames stat_names{stats_store.symbolTable()}; + std::vector scopes; + std::vector>> lazy_stats; + std::vector> normal_stats; + + for (auto _ : state) { // NOLINT: Silences warning about dead store + for (uint64_t i = 0; i < num_stats; ++i) { + std::string new_cluster_name = absl::StrCat("cluster_", i); + auto scope = stats_store.createScope(new_cluster_name); + scopes.push_back(scope); + if (lazy_init) { + lazy_stats.push_back( + std::make_shared>(*scope, stat_names)); + } else { + normal_stats.push_back(std::make_shared(stat_names, *scope)); + } + } + } +} + +BENCHMARK(benchmarkLazyInitCreation) + ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->Unit(::benchmark::kMillisecond); + +// Benchmark lazy-init stats in same thread, mimicking main thread creation. +void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { + const bool lazy_init = state.range(0) == 1; + const uint64_t num_stats = state.range(1); + Stats::IsolatedStoreImpl stats_store; + Upstream::ClusterTrafficStatNames stat_names{stats_store.symbolTable()}; + std::vector scopes; + std::vector>> lazy_stats; + std::vector> normal_stats; + + for (auto _ : state) { // NOLINT: Silences warning about dead store + for (uint64_t i = 0; i < num_stats; ++i) { + std::string new_cluster_name = absl::StrCat("cluster_", i); + auto scope = stats_store.createScope(new_cluster_name); + scopes.push_back(scope); + if (lazy_init) { + auto lazy_stat = std::make_shared>(*scope, stat_names); + *(*lazy_stat); + lazy_stats.push_back(std::move(lazy_stat)); + } else { + normal_stats.push_back(std::make_shared(stat_names, *scope)); + } + } + } +} + +BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) + ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->Unit(::benchmark::kMillisecond); + +class ThreadLocalStoreNoMocksTestBase { +public: + ThreadLocalStoreNoMocksTestBase() + : alloc_(symbol_table_), store_(std::make_unique(alloc_)), + pool_(symbol_table_) {} + ~ThreadLocalStoreNoMocksTestBase() { + if (store_ != nullptr) { + store_->shutdownThreading(); + } + } + + Stats::StatName makeStatName(absl::string_view name) { return pool_.add(name); } + + Stats::SymbolTableImpl symbol_table_; + Stats::AllocatorImpl alloc_; + Stats::ThreadLocalStoreImplPtr store_; + Stats::StatNamePool pool_; +}; + +class ThreadLocalRealThreadsTestBase : public Thread::RealThreadsTestHelper, + public ThreadLocalStoreNoMocksTestBase { +public: + ThreadLocalRealThreadsTestBase(uint32_t num_threads) : RealThreadsTestHelper(num_threads) { + runOnMainBlocking([this]() { store_->initializeThreading(*main_dispatcher_, *tls_); }); + } + + ~ThreadLocalRealThreadsTestBase() { + // TODO(chaoqin-li1123): clean this up when we figure out how to free the threading resources in + // RealThreadsTestHelper. + shutdownThreading(); + exitThreads([this]() { store_.reset(); }); + } + + void shutdownThreading() { + runOnMainBlocking([this]() { + if (!tls_->isShutdown()) { + tls_->shutdownGlobalThreading(); + } + store_->shutdownThreading(); + tls_->shutdownThread(); + }); + } +}; + +class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { +public: + MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) {} +}; + +// Benchmark lazy-init stats in different thread, mimicking worker threads creation. +void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { + const bool lazy_init = state.range(0) == 1; + const uint64_t num_stats = state.range(1); + Envoy::Event::Libevent::Global::initialize(); + ENVOY_LOG_MISC(error, "INIT CALLED!"); + MultiThreadLazyinitStatsTest test; + std::vector scopes; + std::vector>> lazy_stats; + std::vector> normal_stats; + Upstream::ClusterTrafficStatNames stat_names{test.store_->symbolTable()}; + + for (auto _ : state) { // NOLINT: Silences warning about dead store + test.runOnMainBlocking([&]() { // Create stats on main-thread. + for (uint64_t i = 0; i < num_stats; ++i) { + std::string new_cluster_name = absl::StrCat("cluster_", i); + auto scope = test.store_->createScope(new_cluster_name); + scopes.push_back(scope); + if (lazy_init) { + lazy_stats.push_back( + std::make_shared>(*scope, stat_names)); + } else { + normal_stats.push_back(std::make_shared(stat_names, *scope)); + } + } + }); + + Envoy::Random::RandomGeneratorImpl random; + // indexes of stats on which the upstream_rq_active_.inc() will be called. + std::vector stat_indexes(num_stats); + for (uint64_t i = 0; i < num_stats; ++i) { + stat_indexes.push_back(random.random() % num_stats); + } + std::atomic_uint64_t idx = 0; + test.runOnAllWorkersBlocking([&]() { + while (true) { + uint64_t index = ++idx; + if (index <= num_stats) { + if (lazy_init) { + // Lazy-init on workers happen when the "index"-th stat instance is not created. + (*lazy_stats[index])->upstream_rq_active_.inc(); + (*lazy_stats[index])->upstream_rq_total_.inc(); + + } else { + normal_stats[index]->upstream_rq_active_.inc(); + normal_stats[index]->upstream_rq_total_.inc(); + } + } + } + }); + } +} + +BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) + ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->Unit(::benchmark::kMillisecond); + +} // namespace + +} // namespace Envoy \ No newline at end of file From e4dc4e19b30bc0e700186663bca0b362083d22d5 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 21 Nov 2022 16:43:52 -0500 Subject: [PATCH 029/122] remove debugging lines, add more test args Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index fd1192751fdc6..006f1d09eb169 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -40,7 +40,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init stats in same thread, mimicking main thread creation. @@ -70,7 +70,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); class ThreadLocalStoreNoMocksTestBase { @@ -127,7 +127,6 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); Envoy::Event::Libevent::Global::initialize(); - ENVOY_LOG_MISC(error, "INIT CALLED!"); MultiThreadLazyinitStatsTest test; std::vector scopes; std::vector>> lazy_stats; @@ -158,8 +157,8 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta std::atomic_uint64_t idx = 0; test.runOnAllWorkersBlocking([&]() { while (true) { - uint64_t index = ++idx; - if (index <= num_stats) { + uint64_t index = idx++; + if (index < num_stats) { if (lazy_init) { // Lazy-init on workers happen when the "index"-th stat instance is not created. (*lazy_stats[index])->upstream_rq_active_.inc(); @@ -169,6 +168,8 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta normal_stats[index]->upstream_rq_active_.inc(); normal_stats[index]->upstream_rq_total_.inc(); } + } else { + break; } } }); @@ -176,7 +177,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); } // namespace From f40a7161fc0671f3047356bf78dc8a3e1e6815cc Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 21 Nov 2022 19:21:22 -0500 Subject: [PATCH 030/122] upload with some simplification Signed-off-by: Xin Zhuang --- source/common/http/conn_pool_base.h | 9 +++-- .../common/stats/lazyinit_stats_speed_test.cc | 33 +++++++------------ 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index 7bf3ff6445618..d2daa93de09be 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -129,12 +129,11 @@ class ActiveClient : public Envoy::ConnectionPool::ActiveClient { real_host_description_ = data.host_description_; codec_client_ = parent.createCodecClient(data); codec_client_->addConnectionCallbacks(*this); + Upstream::ClusterTrafficStats& traffic_stats = *parent_.host()->cluster().trafficStats(); codec_client_->setConnectionStats( - {parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_total_, - parent_.host()->cluster().trafficStats()->upstream_cx_rx_bytes_buffered_, - parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_total_, - parent_.host()->cluster().trafficStats()->upstream_cx_tx_bytes_buffered_, - &parent_.host()->cluster().trafficStats()->bind_errors_, nullptr}); + {traffic_stats.upstream_cx_rx_bytes_total_, traffic_stats.upstream_cx_rx_bytes_buffered_, + traffic_stats.upstream_cx_tx_bytes_total_, traffic_stats.upstream_cx_tx_bytes_buffered_, + &traffic_stats.bind_errors_, nullptr}); } absl::optional protocol() const override { return codec_client_->protocol(); } diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 006f1d09eb169..a16874930041e 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -14,7 +14,7 @@ namespace { using Upstream::ClusterTrafficStats; -// Benchmark no-lazy-init on stats. +// Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. void benchmarkLazyInitCreation(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); @@ -43,7 +43,7 @@ BENCHMARK(benchmarkLazyInitCreation) ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); -// Benchmark lazy-init stats in same thread, mimicking main thread creation. +// Benchmark lazy-init of stats in same thread, mimicking main thread creation. void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); @@ -122,7 +122,7 @@ class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) {} }; -// Benchmark lazy-init stats in different thread, mimicking worker threads creation. +// Benchmark lazy-init stats in different worker thread, mimicking worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); @@ -147,29 +147,19 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } } }); - Envoy::Random::RandomGeneratorImpl random; // indexes of stats on which the upstream_rq_active_.inc() will be called. - std::vector stat_indexes(num_stats); - for (uint64_t i = 0; i < num_stats; ++i) { - stat_indexes.push_back(random.random() % num_stats); - } std::atomic_uint64_t idx = 0; test.runOnAllWorkersBlocking([&]() { - while (true) { - uint64_t index = idx++; - if (index < num_stats) { - if (lazy_init) { - // Lazy-init on workers happen when the "index"-th stat instance is not created. - (*lazy_stats[index])->upstream_rq_active_.inc(); - (*lazy_stats[index])->upstream_rq_total_.inc(); - - } else { - normal_stats[index]->upstream_rq_active_.inc(); - normal_stats[index]->upstream_rq_total_.inc(); - } + while (++idx <= num_stats) { + const uint64_t index = random.random() % num_stats; + if (lazy_init) { + // Lazy-init on workers happen when the "index"-th stat instance is not created. + (*lazy_stats[index])->upstream_rq_active_.inc(); + (*lazy_stats[index])->upstream_rq_total_.inc(); } else { - break; + normal_stats[index]->upstream_rq_active_.inc(); + normal_stats[index]->upstream_rq_total_.inc(); } } }); @@ -178,6 +168,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) + ->UseRealTime() ->Unit(::benchmark::kMillisecond); } // namespace From 9eba33cd16b2ab60df5f492489d42f1f6f24132b Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 22 Nov 2022 14:25:54 -0500 Subject: [PATCH 031/122] add more benchmark, adjust the creation-on-worker test Signed-off-by: Xin Zhuang --- .../common/stats/lazyinit_stats_speed_test.cc | 68 ++++++++++++++++--- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index a16874930041e..a2440d6d3e029 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -147,19 +147,21 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } } }); - Envoy::Random::RandomGeneratorImpl random; - // indexes of stats on which the upstream_rq_active_.inc() will be called. - std::atomic_uint64_t idx = 0; + std::atomic_int thread_idx = 0; test.runOnAllWorkersBlocking([&]() { - while (++idx <= num_stats) { - const uint64_t index = random.random() % num_stats; + int32_t batch_size = num_stats / 5; + int t_idx = thread_idx++; + uint64_t begin = t_idx * batch_size; + uint64_t end = std::min(begin + batch_size, num_stats); + for (uint64_t idx = begin; idx < end; ++idx) { if (lazy_init) { // Lazy-init on workers happen when the "index"-th stat instance is not created. - (*lazy_stats[index])->upstream_rq_active_.inc(); - (*lazy_stats[index])->upstream_rq_total_.inc(); + ClusterTrafficStats& stats = *(*lazy_stats[idx]); + UNREFERENCED_PARAMETER(stats); + } else { - normal_stats[index]->upstream_rq_active_.inc(); - normal_stats[index]->upstream_rq_total_.inc(); + ClusterTrafficStats& stats = *normal_stats[idx]; + UNREFERENCED_PARAMETER(stats); } } }); @@ -168,7 +170,53 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) - ->UseRealTime() + ->Unit(::benchmark::kMillisecond); + +// Benchmark mimicks that worker threads inc the stats. +void benchmarkLazyInitStatsAccess(::benchmark::State& state) { + const bool lazy_init = state.range(0) == 1; + const uint64_t num_stats = state.range(1); + Envoy::Event::Libevent::Global::initialize(); + MultiThreadLazyinitStatsTest test; + std::vector scopes; + std::vector>> lazy_stats; + std::vector> normal_stats; + Upstream::ClusterTrafficStatNames stat_names{test.store_->symbolTable()}; + + for (auto _ : state) { // NOLINT: Silences warning about dead store + test.runOnMainBlocking([&]() { // Create stats on main-thread. + for (uint64_t i = 0; i < num_stats; ++i) { + std::string new_cluster_name = absl::StrCat("cluster_", i); + auto scope = test.store_->createScope(new_cluster_name); + scopes.push_back(scope); + if (lazy_init) { + auto ptr = std::make_shared>(*scope, stat_names); + *(*ptr); + lazy_stats.push_back(std::move(ptr)); + } else { + normal_stats.push_back(std::make_shared(stat_names, *scope)); + } + } + }); + test.runOnAllWorkersBlocking([&]() { + // 50 x num_stats inc() calls. + for (uint64_t idx = 0; idx < 10 * num_stats; ++idx) { + if (lazy_init) { + // Lazy-init on workers happen when the "index"-th stat instance is not created. + ClusterTrafficStats& stats = *(*lazy_stats[idx]); + stats.upstream_cx_active_.inc(); + + } else { + ClusterTrafficStats& stats = *normal_stats[idx]; + stats.upstream_cx_active_.inc(); + } + } + }); + } +} + +BENCHMARK(benchmarkLazyInitStatsAccess) + ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); } // namespace From c9da4f3077ebfa66bd5516d2e0150c21b6e02287 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 22 Nov 2022 17:27:30 -0500 Subject: [PATCH 032/122] fix format Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 12 +++++------- test/common/stats/lazyinit_stats_speed_test.cc | 17 ++++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 6beb3cb897358..37ac85ee3a002 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -221,16 +221,14 @@ envoy_cc_benchmark_binary( "benchmark", ], deps = [ - "//source/common/stats:thread_local_store_lib", "//source/common/common:random_generator_lib", - - "//source/common/stats:symbol_table_lib", - "//source/common/stats:isolated_store_lib", - "//source/common/stats:lazy_init", "//source/common/common:utility_lib", "//source/common/runtime:runtime_lib", - "//test/test_common:real_threads_test_helper_lib", - + "//source/common/stats:isolated_store_lib", + "//source/common/stats:lazy_init", + "//source/common/stats:symbol_table_lib", + "//source/common/stats:thread_local_store_lib", + "//test/test_common:real_threads_test_helper_lib", ], ) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index a2440d6d3e029..bb1241f9940f5 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -1,12 +1,15 @@ -#include "source/common/stats/symbol_table.h" #include "envoy/upstream/upstream.h" -#include "test/benchmark/main.h" -#include "benchmark/benchmark.h" -#include "source/common/stats/isolated_store_impl.h" -#include "test/test_common/real_threads_test_helper.h" -#include "source/common/thread_local/thread_local_impl.h" + #include "source/common/common/random_generator.h" +#include "source/common/stats/isolated_store_impl.h" +#include "source/common/stats/symbol_table.h" #include "source/common/stats/thread_local_store.h" +#include "source/common/thread_local/thread_local_impl.h" + +#include "test/benchmark/main.h" +#include "test/test_common/real_threads_test_helper.h" + +#include "benchmark/benchmark.h" namespace Envoy { @@ -221,4 +224,4 @@ BENCHMARK(benchmarkLazyInitStatsAccess) } // namespace -} // namespace Envoy \ No newline at end of file +} // namespace Envoy From b29c4221596c09454c184e228ed7ddc6aee149a0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 22 Nov 2022 17:56:31 -0500 Subject: [PATCH 033/122] fix bug in benchmark Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index bb1241f9940f5..ef554be60f2f2 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -43,7 +43,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimicking main thread creation. @@ -73,7 +73,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); class ThreadLocalStoreNoMocksTestBase { @@ -172,7 +172,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimicks that worker threads inc the stats. @@ -206,11 +206,11 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { for (uint64_t idx = 0; idx < 10 * num_stats; ++idx) { if (lazy_init) { // Lazy-init on workers happen when the "index"-th stat instance is not created. - ClusterTrafficStats& stats = *(*lazy_stats[idx]); + ClusterTrafficStats& stats = *(*lazy_stats[idx % num_stats]); stats.upstream_cx_active_.inc(); } else { - ClusterTrafficStats& stats = *normal_stats[idx]; + ClusterTrafficStats& stats = *normal_stats[idx % num_stats]; stats.upstream_cx_active_.inc(); } } @@ -219,7 +219,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 10000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); } // namespace From 1c0fbeaac768023edcb05127e8ca5245a89de3a4 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 10:33:56 -0500 Subject: [PATCH 034/122] fix josh comments Signed-off-by: Xin Zhuang --- envoy/stats/stats.h | 2 +- envoy/stats/stats_macros.h | 8 --- source/common/stats/lazy_init.h | 16 +++-- test/common/stats/BUILD | 20 ++++-- .../common/stats/lazyinit_stats_speed_test.cc | 62 +++--------------- test/common/stats/real_thread_test_base.cc | 43 +++++++++++++ test/common/stats/real_thread_test_base.h | 40 ++++++++++++ test/common/stats/thread_local_store_test.cc | 63 ++----------------- test/integration/base_integration_test.h | 3 +- test/test_common/real_threads_test_helper.h | 2 + 10 files changed, 126 insertions(+), 133 deletions(-) create mode 100644 test/common/stats/real_thread_test_base.cc create mode 100644 test/common/stats/real_thread_test_base.h diff --git a/envoy/stats/stats.h b/envoy/stats/stats.h index ef13ff4d9a85b..1c15d5aba21f6 100644 --- a/envoy/stats/stats.h +++ b/envoy/stats/stats.h @@ -210,7 +210,7 @@ using SizeFn = std::function; template using StatFn = std::function; // Template that lazy-init a StatsStruct. -template struct LazyInit; +template class LazyInit; } // namespace Stats } // namespace Envoy diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index cf61a86bb872f..dd36d903ff5db 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -164,12 +164,4 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ ALL_STATS(GENERATE_COUNTER_STRUCT, GENERATE_GAUGE_STRUCT, GENERATE_HISTOGRAM_STRUCT, \ GENERATE_TEXT_READOUT_STRUCT, GENERATE_STATNAME_STRUCT) \ } - -namespace Stats { - -// Template that lazy-init a StatsStruct. -template struct LazyInit; - -} // namespace Stats - } // namespace Envoy diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 462dfb2270d86..6fa38c505fb00 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -6,20 +6,26 @@ namespace Envoy { namespace Stats { /** - * LazyInit is a wrapper with creator of the actual "StatsStructType" - * structure. - * It instantiates a $StatsStruct struct when any data member is referenced. - * See https://github.com/envoyproxy/envoy/issues/23575 for more details. + * Lazy-initialization wrapper for StatsStructType, intended for deferred instantiation of a block + * of stats that might not be needed in a given Envoy process. + * + * This class is thread-safe -- instantiations can occur on multiple concurrent threads. */ -template struct LazyInit { +template class LazyInit { +public: + // Capture the stat names object and the scope with a ctor, that can be used to instantiate a + // StatsStructType object later. + // Just like any StatsStruct, caller should make sure scope and stat_names outlive this object. LazyInit(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) : ctor_([&scope, &stat_names]() -> StatsStructType* { return new StatsStructType(stat_names, scope); }) {} + // Helper operators to get-or-create and return the StatsStructType object. StatsStructType* operator->() { return internal_stats_.get(ctor_); } StatsStructType& operator*() { return *internal_stats_.get(ctor_); } +private: std::function ctor_; Thread::AtomicPtr internal_stats_{}; diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 37ac85ee3a002..7b3879bff2cd5 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -99,6 +99,18 @@ envoy_cc_test( ], ) +envoy_cc_test_library( + name = "real_thread_test_base", + srcs = ["real_thread_test_base.cc"], + hdrs = ["real_thread_test_base.h"], + deps = [ + "//source/common/stats:thread_local_store_lib", + "//source/common/thread_local:thread_local_lib", + "//test/mocks/thread_local:thread_local_mocks", + "//test/test_common:real_threads_test_helper_lib", + ], +) + envoy_cc_test_library( name = "stat_test_utility_lib", srcs = ["stat_test_utility.cc"], @@ -221,14 +233,13 @@ envoy_cc_benchmark_binary( "benchmark", ], deps = [ + ":real_thread_test_base", "//source/common/common:random_generator_lib", "//source/common/common:utility_lib", "//source/common/runtime:runtime_lib", "//source/common/stats:isolated_store_lib", "//source/common/stats:lazy_init", "//source/common/stats:symbol_table_lib", - "//source/common/stats:thread_local_store_lib", - "//test/test_common:real_threads_test_helper_lib", ], ) @@ -281,18 +292,15 @@ envoy_cc_test( name = "thread_local_store_test", srcs = ["thread_local_store_test.cc"], deps = [ + ":real_thread_test_base", ":stat_test_utility_lib", "//source/common/memory:stats_lib", "//source/common/stats:stats_matcher_lib", "//source/common/stats:symbol_table_lib", - "//source/common/stats:thread_local_store_lib", - "//source/common/thread_local:thread_local_lib", "//test/mocks/event:event_mocks", "//test/mocks/server:instance_mocks", "//test/mocks/stats:stats_mocks", - "//test/mocks/thread_local:thread_local_mocks", "//test/test_common:logging_lib", - "//test/test_common:real_threads_test_helper_lib", "//test/test_common:test_time_lib", "//test/test_common:utility_lib", "@envoy_api//envoy/config/metrics/v3:pkg_cc_proto", diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index ef554be60f2f2..7053f6059970f 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -7,13 +7,14 @@ #include "source/common/thread_local/thread_local_impl.h" #include "test/benchmark/main.h" +#include "test/common/stats/real_thread_test_base.h" #include "test/test_common/real_threads_test_helper.h" #include "benchmark/benchmark.h" namespace Envoy { -namespace { +namespace Stats { using Upstream::ClusterTrafficStats; @@ -76,60 +77,17 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); -class ThreadLocalStoreNoMocksTestBase { -public: - ThreadLocalStoreNoMocksTestBase() - : alloc_(symbol_table_), store_(std::make_unique(alloc_)), - pool_(symbol_table_) {} - ~ThreadLocalStoreNoMocksTestBase() { - if (store_ != nullptr) { - store_->shutdownThreading(); - } - } - - Stats::StatName makeStatName(absl::string_view name) { return pool_.add(name); } - - Stats::SymbolTableImpl symbol_table_; - Stats::AllocatorImpl alloc_; - Stats::ThreadLocalStoreImplPtr store_; - Stats::StatNamePool pool_; -}; - -class ThreadLocalRealThreadsTestBase : public Thread::RealThreadsTestHelper, - public ThreadLocalStoreNoMocksTestBase { -public: - ThreadLocalRealThreadsTestBase(uint32_t num_threads) : RealThreadsTestHelper(num_threads) { - runOnMainBlocking([this]() { store_->initializeThreading(*main_dispatcher_, *tls_); }); - } - - ~ThreadLocalRealThreadsTestBase() { - // TODO(chaoqin-li1123): clean this up when we figure out how to free the threading resources in - // RealThreadsTestHelper. - shutdownThreading(); - exitThreads([this]() { store_.reset(); }); - } - - void shutdownThreading() { - runOnMainBlocking([this]() { - if (!tls_->isShutdown()) { - tls_->shutdownGlobalThreading(); - } - store_->shutdownThreading(); - tls_->shutdownThread(); - }); - } -}; - class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { public: - MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) {} + MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) { + Envoy::Event::Libevent::Global::initialize(); + } }; // Benchmark lazy-init stats in different worker thread, mimicking worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); - Envoy::Event::Libevent::Global::initialize(); MultiThreadLazyinitStatsTest test; std::vector scopes; std::vector>> lazy_stats; @@ -159,12 +117,9 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta for (uint64_t idx = begin; idx < end; ++idx) { if (lazy_init) { // Lazy-init on workers happen when the "index"-th stat instance is not created. - ClusterTrafficStats& stats = *(*lazy_stats[idx]); - UNREFERENCED_PARAMETER(stats); - + *(*lazy_stats[idx]); } else { - ClusterTrafficStats& stats = *normal_stats[idx]; - UNREFERENCED_PARAMETER(stats); + *normal_stats[idx]; } } }); @@ -179,7 +134,6 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) void benchmarkLazyInitStatsAccess(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); - Envoy::Event::Libevent::Global::initialize(); MultiThreadLazyinitStatsTest test; std::vector scopes; std::vector>> lazy_stats; @@ -222,6 +176,6 @@ BENCHMARK(benchmarkLazyInitStatsAccess) ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) ->Unit(::benchmark::kMillisecond); -} // namespace +} // namespace Stats } // namespace Envoy diff --git a/test/common/stats/real_thread_test_base.cc b/test/common/stats/real_thread_test_base.cc new file mode 100644 index 0000000000000..0082440a896bf --- /dev/null +++ b/test/common/stats/real_thread_test_base.cc @@ -0,0 +1,43 @@ +#include "test/common/stats/real_thread_test_base.h" + +namespace Envoy { +namespace Stats { + +ThreadLocalStoreNoMocksTestBase::ThreadLocalStoreNoMocksTestBase() + : alloc_(symbol_table_), store_(std::make_unique(alloc_)), + pool_(symbol_table_) {} + +ThreadLocalStoreNoMocksTestBase::~ThreadLocalStoreNoMocksTestBase() { + if (store_ != nullptr) { + store_->shutdownThreading(); + } +} + +StatName ThreadLocalStoreNoMocksTestBase::makeStatName(absl::string_view name) { + return pool_.add(name); +} + +ThreadLocalRealThreadsTestBase::ThreadLocalRealThreadsTestBase(uint32_t num_threads) + : RealThreadsTestHelper(num_threads) { + runOnMainBlocking([this]() { store_->initializeThreading(*main_dispatcher_, *tls_); }); +} + +ThreadLocalRealThreadsTestBase::~ThreadLocalRealThreadsTestBase() { + // TODO(chaoqin-li1123): clean this up when we figure out how to free the threading resources in + // RealThreadsTestHelper. + shutdownThreading(); + exitThreads([this]() { store_.reset(); }); +} + +void ThreadLocalRealThreadsTestBase::shutdownThreading() { + runOnMainBlocking([this]() { + if (!tls_->isShutdown()) { + tls_->shutdownGlobalThreading(); + } + store_->shutdownThreading(); + tls_->shutdownThread(); + }); +} + +} // namespace Stats +} // namespace Envoy \ No newline at end of file diff --git a/test/common/stats/real_thread_test_base.h b/test/common/stats/real_thread_test_base.h new file mode 100644 index 0000000000000..ef326f7515788 --- /dev/null +++ b/test/common/stats/real_thread_test_base.h @@ -0,0 +1,40 @@ +#pragma once + +#include "source/common/stats/thread_local_store.h" +#include "source/common/thread_local/thread_local_impl.h" + +#include "test/mocks/thread_local/mocks.h" +#include "test/test_common/real_threads_test_helper.h" + +namespace Envoy { +namespace Stats { + +class ThreadLocalStoreNoMocksTestBase { +public: + ThreadLocalStoreNoMocksTestBase(); + ~ThreadLocalStoreNoMocksTestBase(); + + StatName makeStatName(absl::string_view name); + + SymbolTableImpl symbol_table_; + AllocatorImpl alloc_; + ThreadLocalStoreImplPtr store_; + StatNamePool pool_; +}; + +class ThreadLocalRealThreadsTestBase : public Thread::RealThreadsTestHelper, + public ThreadLocalStoreNoMocksTestBase { +protected: + static constexpr uint32_t NumScopes = 1000; + static constexpr uint32_t NumIters = 35; + +public: + ThreadLocalRealThreadsTestBase(uint32_t num_threads); + + ~ThreadLocalRealThreadsTestBase(); + + void shutdownThreading(); +}; + +} // namespace Stats +} // namespace Envoy diff --git a/test/common/stats/thread_local_store_test.cc b/test/common/stats/thread_local_store_test.cc index 93e633fbe9995..524715f219671 100644 --- a/test/common/stats/thread_local_store_test.cc +++ b/test/common/stats/thread_local_store_test.cc @@ -15,15 +15,14 @@ #include "source/common/stats/symbol_table.h" #include "source/common/stats/tag_producer_impl.h" #include "source/common/stats/thread_local_store.h" -#include "source/common/thread_local/thread_local_impl.h" +#include "test/common/stats/real_thread_test_base.h" #include "test/common/stats/stat_test_utility.h" #include "test/mocks/event/mocks.h" #include "test/mocks/server/instance.h" #include "test/mocks/stats/mocks.h" #include "test/mocks/thread_local/mocks.h" #include "test/test_common/logging.h" -#include "test/test_common/real_threads_test_helper.h" #include "test/test_common/utility.h" #include "absl/strings/str_split.h" @@ -756,26 +755,7 @@ TEST_F(StatsThreadLocalStoreTest, SharedScopes) { tls_.shutdownThread(); } -class ThreadLocalStoreNoMocksTestBase : public testing::Test { -public: - ThreadLocalStoreNoMocksTestBase() - : alloc_(symbol_table_), store_(std::make_unique(alloc_)), - pool_(symbol_table_) {} - ~ThreadLocalStoreNoMocksTestBase() override { - if (store_ != nullptr) { - store_->shutdownThreading(); - } - } - - StatName makeStatName(absl::string_view name) { return pool_.add(name); } - - SymbolTableImpl symbol_table_; - AllocatorImpl alloc_; - ThreadLocalStoreImplPtr store_; - StatNamePool pool_; -}; - -class LookupWithStatNameTest : public ThreadLocalStoreNoMocksTestBase {}; +class LookupWithStatNameTest : public ThreadLocalStoreNoMocksTestBase, public testing::Test {}; TEST_F(LookupWithStatNameTest, All) { ScopeSharedPtr scope1 = store_->scopeFromStatName(makeStatName("scope1")); @@ -1684,39 +1664,7 @@ TEST_F(HistogramTest, ForEachHistogram) { EXPECT_EQ(deleted_histogram.unit(), Histogram::Unit::Unspecified); } -class ThreadLocalRealThreadsTestBase : public Thread::RealThreadsTestHelper, - public ThreadLocalStoreNoMocksTestBase { -protected: - static constexpr uint32_t NumScopes = 1000; - static constexpr uint32_t NumIters = 35; - -public: - ThreadLocalRealThreadsTestBase(uint32_t num_threads) - : RealThreadsTestHelper(num_threads), pool_(store_->symbolTable()) { - runOnMainBlocking([this]() { store_->initializeThreading(*main_dispatcher_, *tls_); }); - } - - ~ThreadLocalRealThreadsTestBase() override { - // TODO(chaoqin-li1123): clean this up when we figure out how to free the threading resources in - // RealThreadsTestHelper. - shutdownThreading(); - exitThreads([this]() { store_.reset(); }); - } - - void shutdownThreading() { - runOnMainBlocking([this]() { - if (!tls_->isShutdown()) { - tls_->shutdownGlobalThreading(); - } - store_->shutdownThreading(); - tls_->shutdownThread(); - }); - } - - StatNamePool pool_; -}; - -class OneWorkerThread : public ThreadLocalRealThreadsTestBase { +class OneWorkerThread : public ThreadLocalRealThreadsTestBase, public testing::Test { protected: static constexpr uint32_t NumThreads = 1; OneWorkerThread() : ThreadLocalRealThreadsTestBase(NumThreads) {} @@ -1760,7 +1708,8 @@ TEST_F(OneWorkerThread, DeleteForEachRace) { wait_for_main(); } -class ClusterShutdownCleanupStarvationTest : public ThreadLocalRealThreadsTestBase { +class ClusterShutdownCleanupStarvationTest : public ThreadLocalRealThreadsTestBase, + public testing::Test { protected: static constexpr uint32_t NumThreads = 2; @@ -1844,7 +1793,7 @@ TEST_F(ClusterShutdownCleanupStarvationTest, TwelveThreadsWithoutBlockade) { store_->sync().signal(ThreadLocalStoreImpl::MainDispatcherCleanupSync); } -class HistogramThreadTest : public ThreadLocalRealThreadsTestBase { +class HistogramThreadTest : public ThreadLocalRealThreadsTestBase, public testing::Test { protected: static constexpr uint32_t NumThreads = 10; diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index 4a02479eee416..383d30bb5ba04 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -114,8 +114,7 @@ class BaseIntegrationTest : protected Logger::Loggable { * cluster. * * @param cluster_name name of the cluster. - * @return true if cluster is found. - * @return false otherwise. + * @return whether cluster is found. */ bool forceCreationOfClusterTrafficStats(absl::string_view cluster_name) { // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. diff --git a/test/test_common/real_threads_test_helper.h b/test/test_common/real_threads_test_helper.h index 4d591b1dc639b..53978f2ed7e5f 100644 --- a/test/test_common/real_threads_test_helper.h +++ b/test/test_common/real_threads_test_helper.h @@ -1,3 +1,5 @@ +#pragma once + #include "source/common/event/dispatcher_impl.h" #include "source/common/thread_local/thread_local_impl.h" From 0587cf4db78d8396278b0196575022e49be40ca0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 10:47:29 -0500 Subject: [PATCH 035/122] fix format Signed-off-by: Xin Zhuang --- test/mocks/upstream/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/mocks/upstream/BUILD b/test/mocks/upstream/BUILD index 54a8169498cd9..71c79ca8b9698 100644 --- a/test/mocks/upstream/BUILD +++ b/test/mocks/upstream/BUILD @@ -22,8 +22,8 @@ envoy_cc_mock( "//source/common/http/http1:codec_stats_lib", "//source/common/http/http2:codec_stats_lib", "//source/common/network:raw_buffer_socket_lib", - "//source/common/stats:lazy_init", "//source/common/router:upstream_codec_filter_lib", + "//source/common/stats:lazy_init", "//source/common/upstream:upstream_includes", "//source/common/upstream:upstream_lib", "//test/mocks/runtime:runtime_mocks", From 5b2ea43de1dfa57caac962782aff8fd07e6a7100 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 11:30:38 -0500 Subject: [PATCH 036/122] remove the largest scale as it takes a long time Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 7053f6059970f..93944445fbac3 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -44,7 +44,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimicking main thread creation. @@ -74,7 +74,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { @@ -127,7 +127,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimicks that worker threads inc the stats. @@ -173,7 +173,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000, 500000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); } // namespace Stats From c7f120e72352899eb25613d5ed88398e39ef7c60 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 12:08:28 -0500 Subject: [PATCH 037/122] fix spelling errors Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 6 +++--- tools/spelling/spelling_dictionary.txt | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 93944445fbac3..0e1f287700339 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -47,7 +47,7 @@ BENCHMARK(benchmarkLazyInitCreation) ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); -// Benchmark lazy-init of stats in same thread, mimicking main thread creation. +// Benchmark lazy-init of stats in same thread, mimics main thread creation. void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); @@ -84,7 +84,7 @@ class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { } }; -// Benchmark lazy-init stats in different worker thread, mimicking worker threads creation. +// Benchmark lazy-init stats in different worker thread, mimics worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); @@ -130,7 +130,7 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); -// Benchmark mimicks that worker threads inc the stats. +// Benchmark mimics that worker threads inc the stats. void benchmarkLazyInitStatsAccess(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; const uint64_t num_stats = state.range(1); diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index a674aa44a8d8a..1154396185106 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -895,6 +895,7 @@ metatable microbenchmarks midp milli +mimics misconfiguration misconfigured mixin From 56cf103f86187b61a8aaed5aae6a893b7e11f4cd Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 12:41:04 -0500 Subject: [PATCH 038/122] fix format check error, not sure why Envoy does not like atomic_int Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 0e1f287700339..b615c4a4ab42f 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -108,10 +108,10 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } } }); - std::atomic_int thread_idx = 0; + std::atomic thread_idx = 0; test.runOnAllWorkersBlocking([&]() { int32_t batch_size = num_stats / 5; - int t_idx = thread_idx++; + int t_idx = thread_idx.fetch_add(1, std::memory_order_relaxed); uint64_t begin = t_idx * batch_size; uint64_t end = std::min(begin + batch_size, num_stats); for (uint64_t idx = begin; idx < end; ++idx) { From 58ab4d890f389636b9bc9b09c4f57e26aff96336 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 14:03:40 -0500 Subject: [PATCH 039/122] more comments adjustments Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 1 + .../common/stats/lazyinit_stats_speed_test.cc | 40 ++++++++++--------- test/common/stats/real_thread_test_base.cc | 2 +- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 7b3879bff2cd5..3afd5e6335a21 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -240,6 +240,7 @@ envoy_cc_benchmark_binary( "//source/common/stats:isolated_store_lib", "//source/common/stats:lazy_init", "//source/common/stats:symbol_table_lib", + "//source/exe:process_wide_lib", ], ) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index b615c4a4ab42f..e05c8f613d7b1 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -5,6 +5,7 @@ #include "source/common/stats/symbol_table.h" #include "source/common/stats/thread_local_store.h" #include "source/common/thread_local/thread_local_impl.h" +#include "source/exe/process_wide.h" #include "test/benchmark/main.h" #include "test/common/stats/real_thread_test_base.h" @@ -21,7 +22,7 @@ using Upstream::ClusterTrafficStats; // Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. void benchmarkLazyInitCreation(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; - const uint64_t num_stats = state.range(1); + const uint64_t num_clusters = state.range(1); Stats::IsolatedStoreImpl stats_store; Upstream::ClusterTrafficStatNames stat_names{stats_store.symbolTable()}; std::vector scopes; @@ -29,7 +30,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { std::vector> normal_stats; for (auto _ : state) { // NOLINT: Silences warning about dead store - for (uint64_t i = 0; i < num_stats; ++i) { + for (uint64_t i = 0; i < num_clusters; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); auto scope = stats_store.createScope(new_cluster_name); scopes.push_back(scope); @@ -50,7 +51,7 @@ BENCHMARK(benchmarkLazyInitCreation) // Benchmark lazy-init of stats in same thread, mimics main thread creation. void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; - const uint64_t num_stats = state.range(1); + const uint64_t num_clusters = state.range(1); Stats::IsolatedStoreImpl stats_store; Upstream::ClusterTrafficStatNames stat_names{stats_store.symbolTable()}; std::vector scopes; @@ -58,7 +59,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { std::vector> normal_stats; for (auto _ : state) { // NOLINT: Silences warning about dead store - for (uint64_t i = 0; i < num_stats; ++i) { + for (uint64_t i = 0; i < num_clusters; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); auto scope = stats_store.createScope(new_cluster_name); scopes.push_back(scope); @@ -79,15 +80,14 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { public: - MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) { - Envoy::Event::Libevent::Global::initialize(); - } + MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) {} + ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). }; -// Benchmark lazy-init stats in different worker thread, mimics worker threads creation. +// Benchmark lazy-init stats in different worker threads, mimics worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; - const uint64_t num_stats = state.range(1); + const uint64_t num_clusters = state.range(1); MultiThreadLazyinitStatsTest test; std::vector scopes; std::vector>> lazy_stats; @@ -96,7 +96,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta for (auto _ : state) { // NOLINT: Silences warning about dead store test.runOnMainBlocking([&]() { // Create stats on main-thread. - for (uint64_t i = 0; i < num_stats; ++i) { + for (uint64_t i = 0; i < num_clusters; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); auto scope = test.store_->createScope(new_cluster_name); scopes.push_back(scope); @@ -110,11 +110,13 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta }); std::atomic thread_idx = 0; test.runOnAllWorkersBlocking([&]() { - int32_t batch_size = num_stats / 5; - int t_idx = thread_idx.fetch_add(1, std::memory_order_relaxed); + int32_t batch_size = num_clusters / 5; + int t_idx = thread_idx++; uint64_t begin = t_idx * batch_size; - uint64_t end = std::min(begin + batch_size, num_stats); + uint64_t end = std::min(begin + batch_size, num_clusters); for (uint64_t idx = begin; idx < end; ++idx) { + // Instantiate the actual ClusterTrafficStats objects in worker threads, in batches to avoid + // possible contention. if (lazy_init) { // Lazy-init on workers happen when the "index"-th stat instance is not created. *(*lazy_stats[idx]); @@ -133,7 +135,7 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) // Benchmark mimics that worker threads inc the stats. void benchmarkLazyInitStatsAccess(::benchmark::State& state) { const bool lazy_init = state.range(0) == 1; - const uint64_t num_stats = state.range(1); + const uint64_t num_clusters = state.range(1); MultiThreadLazyinitStatsTest test; std::vector scopes; std::vector>> lazy_stats; @@ -142,7 +144,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { for (auto _ : state) { // NOLINT: Silences warning about dead store test.runOnMainBlocking([&]() { // Create stats on main-thread. - for (uint64_t i = 0; i < num_stats; ++i) { + for (uint64_t i = 0; i < num_clusters; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); auto scope = test.store_->createScope(new_cluster_name); scopes.push_back(scope); @@ -156,15 +158,15 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } }); test.runOnAllWorkersBlocking([&]() { - // 50 x num_stats inc() calls. - for (uint64_t idx = 0; idx < 10 * num_stats; ++idx) { + // 50 x num_clusters inc() calls. + for (uint64_t idx = 0; idx < 10 * num_clusters; ++idx) { if (lazy_init) { // Lazy-init on workers happen when the "index"-th stat instance is not created. - ClusterTrafficStats& stats = *(*lazy_stats[idx % num_stats]); + ClusterTrafficStats& stats = *(*lazy_stats[idx % num_clusters]); stats.upstream_cx_active_.inc(); } else { - ClusterTrafficStats& stats = *normal_stats[idx % num_stats]; + ClusterTrafficStats& stats = *normal_stats[idx % num_clusters]; stats.upstream_cx_active_.inc(); } } diff --git a/test/common/stats/real_thread_test_base.cc b/test/common/stats/real_thread_test_base.cc index 0082440a896bf..7350765e018b6 100644 --- a/test/common/stats/real_thread_test_base.cc +++ b/test/common/stats/real_thread_test_base.cc @@ -40,4 +40,4 @@ void ThreadLocalRealThreadsTestBase::shutdownThreading() { } } // namespace Stats -} // namespace Envoy \ No newline at end of file +} // namespace Envoy From 9b9962fdd1ac69816f10d31b8458e2dd46667939 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 14:08:58 -0500 Subject: [PATCH 040/122] remove the move, shared_ptr is light weight enough to copy around Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index e05c8f613d7b1..74db12c0702b7 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -151,7 +151,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { if (lazy_init) { auto ptr = std::make_shared>(*scope, stat_names); *(*ptr); - lazy_stats.push_back(std::move(ptr)); + lazy_stats.push_back(ptr); } else { normal_stats.push_back(std::make_shared(stat_names, *scope)); } From 4d3ed7305bfa736f5cde2653da012214917755f5 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 23 Nov 2022 14:49:03 -0500 Subject: [PATCH 041/122] refactor lazyini speed test Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 2 +- .../common/stats/lazyinit_stats_speed_test.cc | 144 +++++++----------- 2 files changed, 59 insertions(+), 87 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 6fa38c505fb00..cd2bfe4d04691 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -15,7 +15,7 @@ template class LazyInit { public: // Capture the stat names object and the scope with a ctor, that can be used to instantiate a // StatsStructType object later. - // Just like any StatsStruct, caller should make sure scope and stat_names outlive this object. + // Caller should make sure scope and stat_names outlive this object. LazyInit(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) : ctor_([&scope, &stat_names]() -> StatsStructType* { return new StatsStructType(stat_names, scope); diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 74db12c0702b7..2ab1b7fec3f69 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -19,29 +19,47 @@ namespace Stats { using Upstream::ClusterTrafficStats; -// Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. -void benchmarkLazyInitCreation(::benchmark::State& state) { - const bool lazy_init = state.range(0) == 1; - const uint64_t num_clusters = state.range(1); - Stats::IsolatedStoreImpl stats_store; - Upstream::ClusterTrafficStatNames stat_names{stats_store.symbolTable()}; - std::vector scopes; - std::vector>> lazy_stats; - std::vector> normal_stats; +class LazyInitStatsBenchmarkBase { +public: + LazyInitStatsBenchmarkBase(bool lazy, const uint64_t n_clusters, Stats::Store& s) + : lazy_init_(lazy), num_clusters_(n_clusters), stat_store_(s), + stat_names_(stat_store_.symbolTable()) {} - for (auto _ : state) { // NOLINT: Silences warning about dead store - for (uint64_t i = 0; i < num_clusters; ++i) { + void createStats(bool defer_init) { + for (uint64_t i = 0; i < num_clusters_; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); - auto scope = stats_store.createScope(new_cluster_name); - scopes.push_back(scope); - if (lazy_init) { - lazy_stats.push_back( - std::make_shared>(*scope, stat_names)); + auto scope = stat_store_.createScope(new_cluster_name); + scopes_.push_back(scope); + if (lazy_init_) { + auto lazy_stat = + std::make_shared>(*scope, stat_names_); + lazy_stats_.push_back(lazy_stat); + if (!defer_init) { + *(*lazy_stat); + } } else { - normal_stats.push_back(std::make_shared(stat_names, *scope)); + normal_stats_.push_back(std::make_shared(stat_names_, *scope)); } } } + + const bool lazy_init_; + const uint64_t num_clusters_; + Stats::Store& stat_store_; + Upstream::ClusterTrafficStatNames stat_names_; + std::vector scopes_; + std::vector>> lazy_stats_; + std::vector> normal_stats_; +}; + +// Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. +void benchmarkLazyInitCreation(::benchmark::State& state) { + Stats::IsolatedStoreImpl stats_store; + LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); + + for (auto _ : state) { // NOLINT: Silences warning about dead store + base.createStats(/*defer_init=*/true); + } } BENCHMARK(benchmarkLazyInitCreation) @@ -50,27 +68,11 @@ BENCHMARK(benchmarkLazyInitCreation) // Benchmark lazy-init of stats in same thread, mimics main thread creation. void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { - const bool lazy_init = state.range(0) == 1; - const uint64_t num_clusters = state.range(1); Stats::IsolatedStoreImpl stats_store; - Upstream::ClusterTrafficStatNames stat_names{stats_store.symbolTable()}; - std::vector scopes; - std::vector>> lazy_stats; - std::vector> normal_stats; + LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); for (auto _ : state) { // NOLINT: Silences warning about dead store - for (uint64_t i = 0; i < num_clusters; ++i) { - std::string new_cluster_name = absl::StrCat("cluster_", i); - auto scope = stats_store.createScope(new_cluster_name); - scopes.push_back(scope); - if (lazy_init) { - auto lazy_stat = std::make_shared>(*scope, stat_names); - *(*lazy_stat); - lazy_stats.push_back(std::move(lazy_stat)); - } else { - normal_stats.push_back(std::make_shared(stat_names, *scope)); - } - } + base.createStats(/*defer_init=*/false); } } @@ -78,50 +80,39 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) ->Unit(::benchmark::kMillisecond); -class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase { +class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase, + public LazyInitStatsBenchmarkBase { public: - MultiThreadLazyinitStatsTest() : ThreadLocalRealThreadsTestBase(5) {} + MultiThreadLazyinitStatsTest(bool lazy, const uint64_t n_clusters) + : ThreadLocalRealThreadsTestBase(5), + LazyInitStatsBenchmarkBase(lazy, n_clusters, *ThreadLocalRealThreadsTestBase::store_) {} ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). }; // Benchmark lazy-init stats in different worker threads, mimics worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { - const bool lazy_init = state.range(0) == 1; - const uint64_t num_clusters = state.range(1); - MultiThreadLazyinitStatsTest test; - std::vector scopes; - std::vector>> lazy_stats; - std::vector> normal_stats; - Upstream::ClusterTrafficStatNames stat_names{test.store_->symbolTable()}; + + MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); for (auto _ : state) { // NOLINT: Silences warning about dead store test.runOnMainBlocking([&]() { // Create stats on main-thread. - for (uint64_t i = 0; i < num_clusters; ++i) { - std::string new_cluster_name = absl::StrCat("cluster_", i); - auto scope = test.store_->createScope(new_cluster_name); - scopes.push_back(scope); - if (lazy_init) { - lazy_stats.push_back( - std::make_shared>(*scope, stat_names)); - } else { - normal_stats.push_back(std::make_shared(stat_names, *scope)); - } - } + test.createStats(/*defer_init=*/true); }); + std::atomic thread_idx = 0; test.runOnAllWorkersBlocking([&]() { - int32_t batch_size = num_clusters / 5; + int32_t batch_size = test.num_clusters_ / 5; int t_idx = thread_idx++; uint64_t begin = t_idx * batch_size; - uint64_t end = std::min(begin + batch_size, num_clusters); + uint64_t end = std::min(begin + batch_size, test.num_clusters_); for (uint64_t idx = begin; idx < end; ++idx) { // Instantiate the actual ClusterTrafficStats objects in worker threads, in batches to avoid // possible contention. - if (lazy_init) { + if (test.lazy_init_) { // Lazy-init on workers happen when the "index"-th stat instance is not created. - *(*lazy_stats[idx]); + *(*test.lazy_stats_[idx]); } else { - *normal_stats[idx]; + *test.normal_stats_[idx]; } } }); @@ -134,39 +125,20 @@ BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) // Benchmark mimics that worker threads inc the stats. void benchmarkLazyInitStatsAccess(::benchmark::State& state) { - const bool lazy_init = state.range(0) == 1; - const uint64_t num_clusters = state.range(1); - MultiThreadLazyinitStatsTest test; - std::vector scopes; - std::vector>> lazy_stats; - std::vector> normal_stats; - Upstream::ClusterTrafficStatNames stat_names{test.store_->symbolTable()}; + MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); for (auto _ : state) { // NOLINT: Silences warning about dead store test.runOnMainBlocking([&]() { // Create stats on main-thread. - for (uint64_t i = 0; i < num_clusters; ++i) { - std::string new_cluster_name = absl::StrCat("cluster_", i); - auto scope = test.store_->createScope(new_cluster_name); - scopes.push_back(scope); - if (lazy_init) { - auto ptr = std::make_shared>(*scope, stat_names); - *(*ptr); - lazy_stats.push_back(ptr); - } else { - normal_stats.push_back(std::make_shared(stat_names, *scope)); - } - } + test.createStats(/*defer_init=*/false); }); test.runOnAllWorkersBlocking([&]() { - // 50 x num_clusters inc() calls. - for (uint64_t idx = 0; idx < 10 * num_clusters; ++idx) { - if (lazy_init) { - // Lazy-init on workers happen when the "index"-th stat instance is not created. - ClusterTrafficStats& stats = *(*lazy_stats[idx % num_clusters]); + // 50 x num_clusters_ inc() calls. + for (uint64_t idx = 0; idx < 10 * test.num_clusters_; ++idx) { + if (test.lazy_init_) { + ClusterTrafficStats& stats = *(*test.lazy_stats_[idx % test.num_clusters_]); stats.upstream_cx_active_.inc(); - } else { - ClusterTrafficStats& stats = *normal_stats[idx % num_clusters]; + ClusterTrafficStats& stats = *test.normal_stats_[idx % test.num_clusters_]; stats.upstream_cx_active_.inc(); } } From 19386ba3107846e79f1fcceae71792697eb1cfcc Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 28 Nov 2022 12:12:04 -0500 Subject: [PATCH 042/122] add runtime-flag Signed-off-by: Xin Zhuang --- source/common/runtime/runtime_features.cc | 4 ++++ source/common/stats/BUILD | 2 +- source/common/stats/lazy_init.h | 8 ++++++-- source/common/stats/utility.h | 1 - source/common/upstream/BUILD | 1 + source/common/upstream/conn_pool_map_impl.h | 1 + source/extensions/stat_sinks/common/statsd/BUILD | 1 + source/extensions/stat_sinks/common/statsd/statsd.cc | 1 + source/extensions/stat_sinks/hystrix/BUILD | 1 + source/extensions/stat_sinks/hystrix/hystrix.cc | 1 + test/common/stats/lazyinit_stats_speed_test.cc | 1 + 11 files changed, 18 insertions(+), 4 deletions(-) diff --git a/source/common/runtime/runtime_features.cc b/source/common/runtime/runtime_features.cc index fe142a15ec9e2..b41d8b0944bdc 100644 --- a/source/common/runtime/runtime_features.cc +++ b/source/common/runtime/runtime_features.cc @@ -93,6 +93,10 @@ FALSE_RUNTIME_GUARD(envoy_reloadable_features_runtime_initialized); // Android. FALSE_RUNTIME_GUARD(envoy_reloadable_features_always_use_v6); +// TODO(stevenzzzz): Flip this to true and/or remove completely if verified in prod LazyInit +// can defer Stats creation in worker threads without major performance penalty. +FALSE_RUNTIME_GUARD(envoy_reloadable_features_enable_stats_lazyinit); + // Block of non-boolean flags. These are deprecated. Do not add more. ABSL_FLAG(uint64_t, envoy_headermap_lazy_map_min_size, 3, ""); // NOLINT ABSL_FLAG(uint64_t, re2_max_program_size_error_level, 100, ""); // NOLINT diff --git a/source/common/stats/BUILD b/source/common/stats/BUILD index 52a8876cca125..894fe3b738452 100644 --- a/source/common/stats/BUILD +++ b/source/common/stats/BUILD @@ -41,6 +41,7 @@ envoy_cc_library( hdrs = ["lazy_init.h"], deps = [ "//source/common/common:thread_lib", + "//source/common/runtime:runtime_features_lib", ], ) @@ -289,7 +290,6 @@ envoy_cc_library( srcs = ["utility.cc"], hdrs = ["utility.h"], deps = [ - ":lazy_init", ":symbol_table_lib", "//envoy/stats:stats_interface", ], diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index cd2bfe4d04691..6a11023738d63 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -1,6 +1,7 @@ #pragma once #include "source/common/common/thread.h" +#include "source/common/runtime/runtime_features.h" namespace Envoy { namespace Stats { @@ -19,8 +20,11 @@ template class LazyInit { LazyInit(Stats::Scope& scope, const typename StatsStructType::StatNameType& stat_names) : ctor_([&scope, &stat_names]() -> StatsStructType* { return new StatsStructType(stat_names, scope); - }) {} - + }) { + if (Runtime::runtimeFeatureEnabled("envoy.reloadable_features.enable_stats_lazyinit")) { + internal_stats_.get(ctor_); + } + } // Helper operators to get-or-create and return the StatsStructType object. StatsStructType* operator->() { return internal_stats_.get(ctor_); } StatsStructType& operator*() { return *internal_stats_.get(ctor_); } diff --git a/source/common/stats/utility.h b/source/common/stats/utility.h index 2b198869e5ea6..528514d4ec89d 100644 --- a/source/common/stats/utility.h +++ b/source/common/stats/utility.h @@ -6,7 +6,6 @@ #include "envoy/stats/stats.h" #include "source/common/common/thread.h" -#include "source/common/stats/lazy_init.h" #include "source/common/stats/symbol_table.h" #include "absl/container/inlined_vector.h" diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index 758414a2d0ea8..a42db7a9af42d 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -168,6 +168,7 @@ envoy_cc_library( hdrs = ["conn_pool_map_impl.h"], deps = [ ":conn_pool_map", + "//source/common/stats:lazy_init", ], ) diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index d4360858b58d1..25436cb6bfdc5 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -1,5 +1,6 @@ #pragma once +#include "source/common/stats/lazy_init.h" #include "source/common/upstream/conn_pool_map.h" namespace Envoy { diff --git a/source/extensions/stat_sinks/common/statsd/BUILD b/source/extensions/stat_sinks/common/statsd/BUILD index 2d74e42869e9e..784eede2d9db9 100644 --- a/source/extensions/stat_sinks/common/statsd/BUILD +++ b/source/extensions/stat_sinks/common/statsd/BUILD @@ -30,5 +30,6 @@ envoy_cc_library( "//source/common/common:utility_lib", "//source/common/config:utility_lib", "//source/common/network:address_lib", + "//source/common/stats:lazy_init", ], ) diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index 062fdfd01fca9..f89637c69cf88 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -19,6 +19,7 @@ #include "source/common/config/utility.h" #include "source/common/network/socket_interface.h" #include "source/common/network/utility.h" +#include "source/common/stats/lazy_init.h" #include "source/common/stats/symbol_table.h" #include "absl/strings/str_join.h" diff --git a/source/extensions/stat_sinks/hystrix/BUILD b/source/extensions/stat_sinks/hystrix/BUILD index 25a1ffa4a49f1..eda767079e127 100644 --- a/source/extensions/stat_sinks/hystrix/BUILD +++ b/source/extensions/stat_sinks/hystrix/BUILD @@ -37,6 +37,7 @@ envoy_cc_library( "//source/common/common:logger_lib", "//source/common/config:well_known_names", "//source/common/http:headers_lib", + "//source/common/stats:lazy_init", "//source/common/stats:symbol_table_lib", "//source/common/stats:utility_lib", ], diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index 25e81763ca6f6..15f030c1e2d19 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -11,6 +11,7 @@ #include "source/common/common/logger.h" #include "source/common/config/well_known_names.h" #include "source/common/http/headers.h" +#include "source/common/stats/lazy_init.h" #include "source/common/stats/utility.h" #include "absl/strings/str_cat.h" diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 2ab1b7fec3f69..b1d1e3e6b144e 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -2,6 +2,7 @@ #include "source/common/common/random_generator.h" #include "source/common/stats/isolated_store_impl.h" +#include "source/common/stats/lazy_init.h" #include "source/common/stats/symbol_table.h" #include "source/common/stats/thread_local_store.h" #include "source/common/thread_local/thread_local_impl.h" From e94d69e021f9513026fe40c74e5e4a8ead1879ca Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 28 Nov 2022 12:55:13 -0500 Subject: [PATCH 043/122] inline the method Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 6a11023738d63..639ebfc42cfad 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -26,8 +26,8 @@ template class LazyInit { } } // Helper operators to get-or-create and return the StatsStructType object. - StatsStructType* operator->() { return internal_stats_.get(ctor_); } - StatsStructType& operator*() { return *internal_stats_.get(ctor_); } + inline StatsStructType* operator->() { return internal_stats_.get(ctor_); } + inline StatsStructType& operator*() { return *internal_stats_.get(ctor_); } private: std::function ctor_; From ceb5f23cd73090f646f843b258f88805d2b7a59c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 29 Nov 2022 10:00:56 -0500 Subject: [PATCH 044/122] add TODO for ctor_ cleanup Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 639ebfc42cfad..bfbd08ca33705 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -30,6 +30,8 @@ template class LazyInit { inline StatsStructType& operator*() { return *internal_stats_.get(ctor_); } private: + // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it + // when the nested object is created. std::function ctor_; Thread::AtomicPtr internal_stats_{}; From 2923d2bbb93390771d139a3687d60781190d51c3 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 30 Nov 2022 00:11:54 -0500 Subject: [PATCH 045/122] fix bug in destruction order, add missing build rule so that CI runs the benchmark Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 5 +++++ test/common/stats/lazyinit_stats_speed_test.cc | 14 +++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 3afd5e6335a21..c571285f4c6d3 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -244,6 +244,11 @@ envoy_cc_benchmark_binary( ], ) +envoy_benchmark_test( + name = "lazyinit_stats_benchmark_test", + benchmark_binary = "lazyinit_stats_benchmark", +) + envoy_benchmark_test( name = "symbol_table_benchmark_test", benchmark_binary = "symbol_table_benchmark", diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index b1d1e3e6b144e..5a2de5a3f66e7 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -47,10 +47,10 @@ class LazyInitStatsBenchmarkBase { const bool lazy_init_; const uint64_t num_clusters_; Stats::Store& stat_store_; - Upstream::ClusterTrafficStatNames stat_names_; std::vector scopes_; std::vector>> lazy_stats_; std::vector> normal_stats_; + Upstream::ClusterTrafficStatNames stat_names_; }; // Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. @@ -64,7 +64,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimics main thread creation. @@ -78,7 +78,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase, @@ -87,12 +87,11 @@ class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase, MultiThreadLazyinitStatsTest(bool lazy, const uint64_t n_clusters) : ThreadLocalRealThreadsTestBase(5), LazyInitStatsBenchmarkBase(lazy, n_clusters, *ThreadLocalRealThreadsTestBase::store_) {} - ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). }; // Benchmark lazy-init stats in different worker threads, mimics worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { - + ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); for (auto _ : state) { // NOLINT: Silences warning about dead store @@ -121,11 +120,12 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimics that worker threads inc the stats. void benchmarkLazyInitStatsAccess(::benchmark::State& state) { + ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); for (auto _ : state) { // NOLINT: Silences warning about dead store @@ -148,7 +148,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000, 100000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); } // namespace Stats From 53d74984e93c660c91d08d003ed551f6c041fccc Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 30 Nov 2022 00:53:57 -0500 Subject: [PATCH 046/122] deflaky benchmark test Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 5a2de5a3f66e7..ed671563fd3f8 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -87,6 +87,18 @@ class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase, MultiThreadLazyinitStatsTest(bool lazy, const uint64_t n_clusters) : ThreadLocalRealThreadsTestBase(5), LazyInitStatsBenchmarkBase(lazy, n_clusters, *ThreadLocalRealThreadsTestBase::store_) {} + + ~MultiThreadLazyinitStatsTest() { + shutdownThreading(); + // First, wait for the main-dispatcher to initiate the cross-thread TLS cleanup. + mainDispatchBlock(); + + // Next, wait for all the worker threads to complete their TLS cleanup. + tlsBlock(); + + // Finally, wait for the final central-cache cleanup, which occurs on the main thread. + mainDispatchBlock(); + } }; // Benchmark lazy-init stats in different worker threads, mimics worker threads creation. From 3d01fe3509fc9e3f85af25ac3066ba492adb3267 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 30 Nov 2022 12:25:51 -0500 Subject: [PATCH 047/122] remove the largest scale so that the test doesn't timeout. Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 3 +++ test/common/stats/lazyinit_stats_speed_test.cc | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index c571285f4c6d3..0c7185bc20cce 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -232,6 +232,8 @@ envoy_cc_benchmark_binary( external_deps = [ "benchmark", ], + copts = ["opt", + ], deps = [ ":real_thread_test_base", "//source/common/common:random_generator_lib", @@ -247,6 +249,7 @@ envoy_cc_benchmark_binary( envoy_benchmark_test( name = "lazyinit_stats_benchmark_test", benchmark_binary = "lazyinit_stats_benchmark", + size = "large", ) envoy_benchmark_test( diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index ed671563fd3f8..ed76c8cc81fc8 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -64,7 +64,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 10000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimics main thread creation. @@ -78,7 +78,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 10000}}) ->Unit(::benchmark::kMillisecond); class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase, @@ -132,7 +132,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 10000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimics that worker threads inc the stats. @@ -160,7 +160,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 10000}}) ->Unit(::benchmark::kMillisecond); } // namespace Stats From 0774ce81be0c85274ab2629f7eb6a882b68cdce8 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 30 Nov 2022 12:26:06 -0500 Subject: [PATCH 048/122] remove the largest scale so that the test doesn't timeout. Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 0c7185bc20cce..b88570ba9f8ed 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -232,8 +232,6 @@ envoy_cc_benchmark_binary( external_deps = [ "benchmark", ], - copts = ["opt", - ], deps = [ ":real_thread_test_base", "//source/common/common:random_generator_lib", From d249fd549c38072b55a61a5aa79f7d63449ccd19 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 30 Nov 2022 13:17:44 -0500 Subject: [PATCH 049/122] add back the larger scale Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index ed76c8cc81fc8..ed671563fd3f8 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -64,7 +64,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimics main thread creation. @@ -78,7 +78,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsTestBase, @@ -132,7 +132,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimics that worker threads inc the stats. @@ -160,7 +160,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); } // namespace Stats From 67d75e23520a749745e2bd89a438f6789f5ddeb1 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 30 Nov 2022 13:46:16 -0500 Subject: [PATCH 050/122] fix format test/common/stats/BUILD Signed-off-by: Xin Zhuang --- test/common/stats/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index b88570ba9f8ed..f6f113d95abf6 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -246,8 +246,8 @@ envoy_cc_benchmark_binary( envoy_benchmark_test( name = "lazyinit_stats_benchmark_test", - benchmark_binary = "lazyinit_stats_benchmark", size = "large", + benchmark_binary = "lazyinit_stats_benchmark", ) envoy_benchmark_test( From ed5af28511a6f5a1d0639252b53b82c2bba85c91 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 6 Dec 2022 18:08:46 -0500 Subject: [PATCH 051/122] save some temp work Signed-off-by: Xin Zhuang --- api/envoy/config/metrics/v3/stats.proto | 2 ++ envoy/stats/store.h | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/api/envoy/config/metrics/v3/stats.proto b/api/envoy/config/metrics/v3/stats.proto index fb73e91f8f998..388ad1275fb75 100644 --- a/api/envoy/config/metrics/v3/stats.proto +++ b/api/envoy/config/metrics/v3/stats.proto @@ -109,6 +109,8 @@ message StatsConfig { // 3600000 // ] repeated HistogramBucketSettings histogram_bucket_settings = 4; + // When true, enable lazy init feature for stats that's of Stats::LazyInit type. + bool enable_lazy_init = 5; } // Configuration for disabling stat instantiation. diff --git a/envoy/stats/store.h b/envoy/stats/store.h index a7be0c6d57738..d67d5fa6e8a2b 100644 --- a/envoy/stats/store.h +++ b/envoy/stats/store.h @@ -147,6 +147,12 @@ class StoreRoot : public Store { * during hot restart. */ virtual void setSinkPredicates(std::unique_ptr&& sink_predicates) PURE; + + /** + * @brief If true, defer stats instantiation of Stats::LazyInit type. + */ + virtual bool enableLazyInit() const PURE; + bool setEnableLazyInit(const bool lazy) PURE; }; using StoreRootPtr = std::unique_ptr; From efb2ab62b59ebc6a0f0c29559679ae9a61f8c934 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 15 Dec 2022 19:38:10 -0500 Subject: [PATCH 052/122] some merge issue Signed-off-by: Xin Zhuang --- source/server/configuration_impl.h | 2 +- test/common/http/codec_client_test.cc | 6 +- test/common/http/http1/conn_pool_test.cc | 48 +++++------ test/common/http/http2/conn_pool_test.cc | 82 +++++++++---------- test/common/stats/real_thread_test_base.cc | 4 +- test/common/tcp/conn_pool_test.cc | 20 ++--- .../udp/udp_proxy/udp_proxy_filter_test.cc | 50 ++++++----- 7 files changed, 111 insertions(+), 101 deletions(-) diff --git a/source/server/configuration_impl.h b/source/server/configuration_impl.h index 6d66a61cd4bd3..22958cec9547c 100644 --- a/source/server/configuration_impl.h +++ b/source/server/configuration_impl.h @@ -56,7 +56,7 @@ class StatsConfigImpl : public StatsConfig { bool flushOnAdmin() const override { return flush_on_admin_; } void addSink(Stats::SinkPtr sink) { sinks_.emplace_back(std::move(sink)); } - bool enableLazyInitStats() { return enable_lazyinit_stats_; } + bool enableLazyInitStats() const override { return enable_lazyinit_stats_; } private: std::list sinks_; diff --git a/test/common/http/codec_client_test.cc b/test/common/http/codec_client_test.cc index 4c46a755c8d00..5c90f678bfa95 100644 --- a/test/common/http/codec_client_test.cc +++ b/test/common/http/codec_client_test.cc @@ -258,7 +258,7 @@ TEST_F(CodecClientTest, ProtocolError) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, 408Response) { @@ -270,7 +270,7 @@ TEST_F(CodecClientTest, 408Response) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, PrematureResponse) { @@ -281,7 +281,7 @@ TEST_F(CodecClientTest, PrematureResponse) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, WatermarkPassthrough) { diff --git a/test/common/http/http1/conn_pool_test.cc b/test/common/http/http1/conn_pool_test.cc index 30a13e46dce90..dc4110ec13557 100644 --- a/test/common/http/http1/conn_pool_test.cc +++ b/test/common/http/http1/conn_pool_test.cc @@ -175,7 +175,7 @@ struct ActiveTestRequest { : parent_(parent), client_index_(client_index) { uint64_t active_rq_observed = parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default).requests().count(); - uint64_t current_rq_total = parent_.cluster_->traffic_stats_->upstream_rq_total_.value(); + uint64_t current_rq_total = parent_.cluster_->trafficStats()->upstream_rq_total_.value(); if (type == Type::CreateConnection) { parent.conn_pool_->expectClientCreate(); } @@ -199,7 +199,7 @@ struct ActiveTestRequest { Network::ConnectionEvent::Connected); } if (type != Type::Pending) { - EXPECT_EQ(current_rq_total + 1, parent_.cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(current_rq_total + 1, parent_.cluster_->trafficStats()->upstream_rq_total_.value()); EXPECT_EQ(active_rq_observed + 1, parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default) .requests() @@ -440,7 +440,7 @@ TEST_F(Http1ConnPoolImplTest, MaxPendingRequests) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_overflow_.value()); } /** @@ -464,8 +464,8 @@ TEST_F(Http1ConnPoolImplTest, ConnectFailure) { EXPECT_CALL(*conn_pool_, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); } /** @@ -553,9 +553,9 @@ TEST_F(Http1ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*conn_pool_, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_rq_total_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_rq_total_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_timeout_.value()); } /** @@ -655,7 +655,7 @@ TEST_F(Http1ConnPoolImplTest, MaxConnections) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_overflow_.value()); EXPECT_EQ(1U, cluster_->circuit_breakers_stats_.cx_open_.value()); EXPECT_NE(nullptr, handle); @@ -719,7 +719,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseWithoutHeader) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -803,7 +803,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -841,7 +841,7 @@ TEST_F(Http1ConnPoolImplTest, ProxyConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -878,7 +878,7 @@ TEST_F(Http1ConnPoolImplTest, Http10NoConnectionKeepAlive) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -920,8 +920,8 @@ TEST_F(Http1ConnPoolImplTest, MaxRequestsPerConnection) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_max_requests_.value()); } TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { @@ -943,7 +943,7 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { r1.completeResponse(false); conn_pool_->expectAndRunUpstreamReady(); r3.startRequest(); - EXPECT_EQ(3U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(3U, cluster_->trafficStats()->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); r2.completeResponse(false); @@ -956,8 +956,8 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, DrainCallback) { @@ -971,7 +971,7 @@ TEST_F(Http1ConnPoolImplTest, DrainCallback) { conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainAndDelete); r2.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); EXPECT_CALL(drained, ready()).Times(AtLeast(1)); @@ -1048,8 +1048,8 @@ TEST_F(Http1ConnPoolImplTest, RemoteCloseToCompleteResponse) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, NoActiveConnectionsByDefault) { @@ -1093,13 +1093,13 @@ TEST_F(Http1ConnPoolImplTest, PendingRequestIsConsideredActive) { EXPECT_CALL(*conn_pool_, onClientDestroy()); r1.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_rq_total_.value()); conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainExistingConnections); conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_local_.value()); } // Schedulable callback that can track it's destruction. diff --git a/test/common/http/http2/conn_pool_test.cc b/test/common/http/http2/conn_pool_test.cc index 17823ad3ef516..4cae273e5a1f2 100644 --- a/test/common/http/http2/conn_pool_test.cc +++ b/test/common/http/http2/conn_pool_test.cc @@ -634,8 +634,8 @@ TEST_F(Http2ConnPoolImplTest, DrainConnections) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } // Test that cluster.http2_protocol_options.max_concurrent_streams limits @@ -688,7 +688,7 @@ TEST_F(Http2ConnPoolImplTest, MaxConcurrentRequestsPerStream) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_total_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_total_.value()); } // Verifies that requests are queued up in the conn pool until the connection becomes ready. @@ -732,8 +732,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreams) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } // Verifies that the correct number of CONNECTING connections are created for @@ -853,8 +853,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsFailure) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } // Verifies resets due to local connection closes are tracked correctly. @@ -909,8 +909,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsRequestOverflow) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } // Verifies that we honor the max pending requests circuit breaker. @@ -947,8 +947,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsMaxPendingCircuitBreaker) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { @@ -973,8 +973,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } /** @@ -1004,8 +1004,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyBufferLimits) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { @@ -1019,7 +1019,7 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { r1.callbacks_.outer_encoder_ ->encodeHeaders(TestRequestHeaderMapImpl{{":path", "/"}, {":method", "GET"}}, true) .ok()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_active_.value()); EXPECT_CALL(r1.decoder_, decodeHeaders_(_, true)); r1.inner_decoder_->decodeHeaders( ResponseHeaderMapPtr{new TestResponseHeaderMapImpl{{":status", "200"}}}, true); @@ -1038,9 +1038,9 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, LocalReset) { @@ -1059,11 +1059,11 @@ TEST_F(Http2ConnPoolImplTest, LocalReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_tx_reset_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_tx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, RemoteReset) { @@ -1082,11 +1082,11 @@ TEST_F(Http2ConnPoolImplTest, RemoteReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_rx_reset_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_rx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { @@ -1111,8 +1111,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { @@ -1155,8 +1155,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainPrimary) { @@ -1278,13 +1278,13 @@ TEST_F(Http2ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_total_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_local_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { @@ -1310,8 +1310,8 @@ TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, GoAway) { @@ -1348,7 +1348,7 @@ TEST_F(Http2ConnPoolImplTest, GoAway) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_close_notify_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_close_notify_.value()); } TEST_F(Http2ConnPoolImplTest, NoActiveConnectionsByDefault) { diff --git a/test/common/stats/real_thread_test_base.cc b/test/common/stats/real_thread_test_base.cc index 7350765e018b6..1ff91fd099e2a 100644 --- a/test/common/stats/real_thread_test_base.cc +++ b/test/common/stats/real_thread_test_base.cc @@ -5,7 +5,7 @@ namespace Stats { ThreadLocalStoreNoMocksTestBase::ThreadLocalStoreNoMocksTestBase() : alloc_(symbol_table_), store_(std::make_unique(alloc_)), - pool_(symbol_table_) {} + scope_(*store_->rootScope()), pool_(symbol_table_) {} ThreadLocalStoreNoMocksTestBase::~ThreadLocalStoreNoMocksTestBase() { if (store_ != nullptr) { @@ -18,7 +18,7 @@ StatName ThreadLocalStoreNoMocksTestBase::makeStatName(absl::string_view name) { } ThreadLocalRealThreadsTestBase::ThreadLocalRealThreadsTestBase(uint32_t num_threads) - : RealThreadsTestHelper(num_threads) { + : RealThreadsTestHelper(num_threads), pool_(store_->symbolTable()) { runOnMainBlocking([this]() { store_->initializeThreading(*main_dispatcher_, *tls_); }); } diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index 78de9cb0c8bd8..226b470b5d660 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -569,7 +569,7 @@ TEST_F(TcpConnPoolImplTest, MaxPendingRequests) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Overflow, callbacks2.reason_); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_overflow_.value()); } /** @@ -597,8 +597,8 @@ TEST_F(TcpConnPoolImplTest, RemoteConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::RemoteConnectionFailure, callbacks.reason_); EXPECT_EQ("foo", callbacks.failure_reason_string_); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); } /** @@ -623,8 +623,8 @@ TEST_F(TcpConnPoolImplTest, LocalConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::LocalConnectionFailure, callbacks.reason_); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); } /** @@ -655,8 +655,8 @@ TEST_F(TcpConnPoolImplTest, ConnectTimeout) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks1.reason_); EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks2.reason_); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_timeout_.value()); } /** @@ -781,7 +781,7 @@ TEST_F(TcpConnPoolImplTest, MaxConnections) { // Request 2 should not kick off a new connection. ConnPoolCallbacks callbacks2; handle = conn_pool_->newConnection(callbacks2); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -828,8 +828,8 @@ TEST_F(TcpConnPoolImplTest, MaxRequestsPerConnection) { callbacks.conn_data_.reset(); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_max_requests_.value()); } /* diff --git a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc index 78014ad92105b..11102f0c45c18 100644 --- a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc +++ b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc @@ -593,19 +593,22 @@ stat_prefix: foo test_sessions_[0].expectWriteToUpstream("hello", 0, nullptr, true); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_tx_bytes_total_.value()); + EXPECT_EQ(5, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_tx_bytes_total_.value()); test_sessions_[0].recvDataFromUpstream("world2", 0, SOCKET_ERROR_MSG_SIZE); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_rx_bytes_total_.value()); + EXPECT_EQ(6, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_tx_errors_.value()); test_sessions_[0].recvDataFromUpstream("world2", SOCKET_ERROR_MSG_SIZE, 0); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_rx_bytes_total_.value()); + EXPECT_EQ(6, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -615,8 +618,9 @@ stat_prefix: foo test_sessions_[0].expectWriteToUpstream("hello", SOCKET_ERROR_MSG_SIZE); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(10 /*rx_bytes*/, 2 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_tx_bytes_total_.value()); + EXPECT_EQ(5, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_tx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -691,8 +695,9 @@ stat_prefix: foo EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_none_healthy_.value()); } // No cluster at filter creation. @@ -799,8 +804,9 @@ stat_prefix: foo // This should hit the session circuit breaker. recvDataFromDownstream("10.0.0.2:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_overflow_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); @@ -995,8 +1001,9 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(0, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(0, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_none_healthy_.value()); } // Verify that when on second packet no host is available, message is dropped. @@ -1020,16 +1027,18 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(0, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_none_healthy_.value()); + EXPECT_EQ(0, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_none_healthy_.value()); EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello2"); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_none_healthy_.value()); } // Verify that all sessions for a host are removed when a host is removed. @@ -1132,8 +1141,9 @@ use_per_packet_load_balancing: true 0, 0, 0, 0, 0); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ - ->traffic_stats_->upstream_cx_overflow_.value()); + EXPECT_EQ(1, + factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() + ->upstream_cx_overflow_.value()); } // Make sure socket option is set correctly if use_original_src_ip is set in case of ipv6. From bd1309734678b70537c38ccb8dc21260c1165dcc Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 15 Dec 2022 19:39:35 -0500 Subject: [PATCH 053/122] vscode very slow on saving Signed-off-by: Xin Zhuang --- test/common/stats/real_thread_test_base.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/common/stats/real_thread_test_base.h b/test/common/stats/real_thread_test_base.h index ef326f7515788..30982e39148f7 100644 --- a/test/common/stats/real_thread_test_base.h +++ b/test/common/stats/real_thread_test_base.h @@ -19,9 +19,12 @@ class ThreadLocalStoreNoMocksTestBase { SymbolTableImpl symbol_table_; AllocatorImpl alloc_; ThreadLocalStoreImplPtr store_; + Scope& scope_; StatNamePool pool_; }; +// Helper base class for threadlocal stats testing in multiple-workers setup. +// This is used in threadlocal store tests. class ThreadLocalRealThreadsTestBase : public Thread::RealThreadsTestHelper, public ThreadLocalStoreNoMocksTestBase { protected: From a9627e84773e9507a5b273065e4c5e56fc82ab0c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 16 Dec 2022 11:50:50 -0500 Subject: [PATCH 054/122] Make cds_integration_test.cc parameterized on stats-lazyinit, revert a bunch of unnecessary test mutations Signed-off-by: Xin Zhuang --- source/common/runtime/runtime_features.cc | 4 - source/common/stats/BUILD | 1 - source/common/stats/lazy_init.h | 7 +- source/common/upstream/upstream_impl.cc | 6 +- source/server/configuration_impl.cc | 19 +- source/server/configuration_impl.h | 4 +- test/common/grpc/grpc_client_integration.h | 25 + test/common/stats/real_thread_test_base.cc | 2 +- test/common/upstream/upstream_impl_test.cc | 975 +++++++++--------- .../clusters/aggregate/cluster_test.cc | 2 +- .../proxy_filter_test.cc | 2 +- .../gcp_authn_filter_integration_test.cc | 4 +- test/integration/BUILD | 2 +- test/integration/cds_integration_test.cc | 18 +- test/integration/integration_admin_test.cc | 1 - test/integration/integration_test.cc | 4 +- test/integration/xfcc_integration_test.cc | 2 +- test/mocks/upstream/cluster_info.h | 1 - 18 files changed, 545 insertions(+), 534 deletions(-) diff --git a/source/common/runtime/runtime_features.cc b/source/common/runtime/runtime_features.cc index a0c500275a79e..95d12c11d8675 100644 --- a/source/common/runtime/runtime_features.cc +++ b/source/common/runtime/runtime_features.cc @@ -96,10 +96,6 @@ FALSE_RUNTIME_GUARD(envoy_reloadable_features_always_use_v6); // TODO(alyssawilk) remove in Q2. FALSE_RUNTIME_GUARD(envoy_reloadable_features_no_delay_close_for_upgrades); -// TODO(stevenzzzz): Flip this to true and/or remove completely if verified in prod LazyInit -// can defer Stats creation in worker threads without major performance penalty. -FALSE_RUNTIME_GUARD(envoy_reloadable_features_enable_stats_lazyinit); - // Block of non-boolean flags. These are deprecated. Do not add more. ABSL_FLAG(uint64_t, envoy_headermap_lazy_map_min_size, 3, ""); // NOLINT ABSL_FLAG(uint64_t, re2_max_program_size_error_level, 100, ""); // NOLINT diff --git a/source/common/stats/BUILD b/source/common/stats/BUILD index dfa9f5b5974b9..d5a13935c74d0 100644 --- a/source/common/stats/BUILD +++ b/source/common/stats/BUILD @@ -41,7 +41,6 @@ envoy_cc_library( hdrs = ["lazy_init.h"], deps = [ "//source/common/common:thread_lib", - "//source/common/runtime:runtime_features_lib", ], ) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 1909dc67de752..44c1d3f4581cd 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -1,7 +1,6 @@ #pragma once #include "source/common/common/thread.h" -#include "source/common/runtime/runtime_features.h" namespace Envoy { namespace Stats { @@ -28,11 +27,7 @@ template class LazyInit : public LazyableInterface StatsStructType* { return new StatsStructType(stat_names, scope); - }) { - if (Runtime::runtimeFeatureEnabled("envoy.reloadable_features.enable_stats_lazyinit")) { - internal_stats_.get(ctor_); - } - } + }) {} // Helper operators to get-or-create and return the StatsStructType object. inline StatsStructType* operator->() override { return internal_stats_.get(ctor_); } inline StatsStructType& operator*() override { return *internal_stats_.get(ctor_); } diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 329238cc4f29e..acffb219797d4 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -997,9 +997,9 @@ ClusterInfoImpl::ClusterInfoImpl( per_connection_buffer_limit_bytes_( PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, per_connection_buffer_limit_bytes, 1024 * 1024)), socket_matcher_(std::move(socket_matcher)), stats_scope_(std::move(stats_scope)), - traffic_stats_( -generateStats(*stats_scope_, factory_context.clusterManager().clusterStatNames(), - server_context.statsConfig().enableLazyInitStats())), + traffic_stats_(generateStats(*stats_scope_, + factory_context.clusterManager().clusterStatNames(), + server_context.statsConfig().enableLazyInitStats())), config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), *stats_scope_), lb_stats_(factory_context.clusterManager().clusterLbStatNames(), *stats_scope_), diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index fad692e615eb6..dcef0b098fd08 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -88,6 +88,10 @@ void MainImpl::initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstr // tracing configuration is missing from the bootstrap config. initializeTracers(bootstrap.tracing(), server); + // stats_config_ should be set before creating the ClusterManagers so that it is available + // from the ServerFactoryContext when creating the static clusters and stats sinks. + stats_config_ = std::make_unique(bootstrap); + const auto& secrets = bootstrap.static_resources().secrets(); ENVOY_LOG(info, "loading {} static secret(s)", secrets.size()); for (ssize_t i = 0; i < secrets.size(); i++) { @@ -104,18 +108,15 @@ void MainImpl::initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstr ENVOY_LOG(debug, "listener #{}:", i); server.listenerManager().addOrUpdateListener(listeners[i], "", false); } - initializeWatchdogs(bootstrap, server); - initializeStatsConfig(bootstrap, server); + // This has to happen after ClusterManager initilization, as it depends on config from + // ClusterManager. + loadSinksIntoStatsConfig(bootstrap, server); } -void MainImpl::initializeStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, - Instance& server) { - ENVOY_LOG(info, "loading stats configuration"); - - // stats_config_ should be set before populating the sinks so that it is available - // from the ServerFactoryContext when creating the stats sinks. - stats_config_ = std::make_unique(bootstrap); +void MainImpl::loadSinksIntoStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, + Instance& server) { + ENVOY_LOG(info, "loading stats sinks configuration"); for (const envoy::config::metrics::v3::StatsSink& sink_object : bootstrap.stats_sinks()) { // Generate factory and translate stats sink custom config. diff --git a/source/server/configuration_impl.h b/source/server/configuration_impl.h index 22958cec9547c..b2cbb9b0c47bb 100644 --- a/source/server/configuration_impl.h +++ b/source/server/configuration_impl.h @@ -131,8 +131,8 @@ class MainImpl : Logger::Loggable, public Main { /** * Initialize stats configuration. */ - void initializeStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, - Instance& server); + void loadSinksIntoStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, + Instance& server); /** * Initialize watchdog(s). Call before accessing any watchdog configuration. diff --git a/test/common/grpc/grpc_client_integration.h b/test/common/grpc/grpc_client_integration.h index 84abeda51cf35..cbf37d37f6ea2 100644 --- a/test/common/grpc/grpc_client_integration.h +++ b/test/common/grpc/grpc_client_integration.h @@ -120,6 +120,25 @@ class DeltaSotwIntegrationParamTest ClientType clientType() const override { return std::get<1>(GetParam()); } SotwOrDelta sotwOrDelta() const { return std::get<2>(GetParam()); } }; +class DeltaSotwStatsLazyInitIntegrationParamTest + : public BaseGrpcClientIntegrationParamTest, + public testing::TestWithParam< + std::tuple> { +public: + ~DeltaSotwStatsLazyInitIntegrationParamTest() override = default; + static std::string protocolTestParamsToString( + const ::testing::TestParamInfo< + std::tuple>& p) { + return fmt::format("{}_{}_{}_{}", TestUtility::ipVersionToString(std::get<0>(p.param)), + std::get<1>(p.param) == ClientType::GoogleGrpc ? "GoogleGrpc" : "EnvoyGrpc", + std::get<2>(p.param) == SotwOrDelta::Delta ? "Delta" : "StateOfTheWorld", + std::get<3>(p.param) ? "_LazyInitStats" : ""); + } + Network::Address::IpVersion ipVersion() const override { return std::get<0>(GetParam()); } + ClientType clientType() const override { return std::get<1>(GetParam()); } + SotwOrDelta sotwOrDelta() const { return std::get<2>(GetParam()); } + bool enableLazyInitStats() const { return std::get<3>(GetParam()); } +}; // Skip tests based on gRPC client type. #define SKIP_IF_GRPC_CLIENT(client_type) \ @@ -142,6 +161,12 @@ class DeltaSotwIntegrationParamTest testing::Combine(testing::ValuesIn(TestEnvironment::getIpVersionsForTest()), \ testing::ValuesIn(TestEnvironment::getsGrpcVersionsForTest()), \ testing::Values(Grpc::SotwOrDelta::Sotw, Grpc::SotwOrDelta::Delta)) +#define DELTA_SOTW_GRPC_CLIENT_LAZYINITSTATS_INTEGRATION_PARAMS \ + testing::Combine(testing::ValuesIn(TestEnvironment::getIpVersionsForTest()), \ + testing::ValuesIn(TestEnvironment::getsGrpcVersionsForTest()), \ + testing::Values(Grpc::SotwOrDelta::Sotw, Grpc::SotwOrDelta::Delta), \ + testing::Bool()) + #define UNIFIED_LEGACY_GRPC_CLIENT_INTEGRATION_PARAMS \ testing::Combine(testing::ValuesIn(TestEnvironment::getIpVersionsForTest()), \ testing::ValuesIn(TestEnvironment::getsGrpcVersionsForTest()), \ diff --git a/test/common/stats/real_thread_test_base.cc b/test/common/stats/real_thread_test_base.cc index 1ff91fd099e2a..6afba10c8283d 100644 --- a/test/common/stats/real_thread_test_base.cc +++ b/test/common/stats/real_thread_test_base.cc @@ -18,7 +18,7 @@ StatName ThreadLocalStoreNoMocksTestBase::makeStatName(absl::string_view name) { } ThreadLocalRealThreadsTestBase::ThreadLocalRealThreadsTestBase(uint32_t num_threads) - : RealThreadsTestHelper(num_threads), pool_(store_->symbolTable()) { + : RealThreadsTestHelper(num_threads) { runOnMainBlocking([this]() { store_->initializeThreading(*main_dispatcher_, *tls_); }); } diff --git a/test/common/upstream/upstream_impl_test.cc b/test/common/upstream/upstream_impl_test.cc index d4ccdc087dcb8..1e67c380266c6 100644 --- a/test/common/upstream/upstream_impl_test.cc +++ b/test/common/upstream/upstream_impl_test.cc @@ -3366,34 +3366,34 @@ class ClusterInfoImplTest : public testing::TestWithParam { Api::ApiPtr api_; }; - struct Foo : public Envoy::Config::TypedMetadata::Object {}; +struct Foo : public Envoy::Config::TypedMetadata::Object {}; - struct Baz : public Envoy::Config::TypedMetadata::Object { - Baz(std::string n) : name(n) {} - std::string name; - }; +struct Baz : public Envoy::Config::TypedMetadata::Object { + Baz(std::string n) : name(n) {} + std::string name; +}; - class BazFactory : public ClusterTypedMetadataFactory { - public: - std::string name() const override { return "baz"; } - // Returns nullptr (conversion failure) if d is empty. - std::unique_ptr - parse(const ProtobufWkt::Struct& d) const override { - if (d.fields().find("name") != d.fields().end()) { - return std::make_unique(d.fields().at("name").string_value()); - } - throw EnvoyException("Cannot create a Baz when metadata is empty."); +class BazFactory : public ClusterTypedMetadataFactory { +public: + std::string name() const override { return "baz"; } + // Returns nullptr (conversion failure) if d is empty. + std::unique_ptr + parse(const ProtobufWkt::Struct& d) const override { + if (d.fields().find("name") != d.fields().end()) { + return std::make_unique(d.fields().at("name").string_value()); } + throw EnvoyException("Cannot create a Baz when metadata is empty."); + } - std::unique_ptr - parse(const ProtobufWkt::Any&) const override { - return nullptr; - } - }; + std::unique_ptr + parse(const ProtobufWkt::Any&) const override { + return nullptr; + } +}; - // Cluster metadata and common config retrieval. - TEST_P(ClusterInfoImplTest, Metadata) { - const std::string yaml = R"EOF( +// Cluster metadata and common config retrieval. +TEST_P(ClusterInfoImplTest, Metadata) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3413,22 +3413,22 @@ class ClusterInfoImplTest : public testing::TestWithParam { value: 0.3 )EOF"; - BazFactory baz_factory; - Registry::InjectFactory registered_factory(baz_factory); - auto cluster = makeCluster(yaml); - - EXPECT_EQ("meh", cluster->info()->typedMetadata().get(baz_factory.name())->name); - EXPECT_EQ(nullptr, cluster->info()->typedMetadata().get(baz_factory.name())); - EXPECT_EQ("test_value", - Config::Metadata::metadataValue(&cluster->info()->metadata(), "com.bar.foo", "baz") - .string_value()); - EXPECT_EQ(0.3, cluster->info()->lbConfig().healthy_panic_threshold().value()); - EXPECT_EQ(LoadBalancerType::Maglev, cluster->info()->lbType()); - } + BazFactory baz_factory; + Registry::InjectFactory registered_factory(baz_factory); + auto cluster = makeCluster(yaml); + + EXPECT_EQ("meh", cluster->info()->typedMetadata().get(baz_factory.name())->name); + EXPECT_EQ(nullptr, cluster->info()->typedMetadata().get(baz_factory.name())); + EXPECT_EQ("test_value", + Config::Metadata::metadataValue(&cluster->info()->metadata(), "com.bar.foo", "baz") + .string_value()); + EXPECT_EQ(0.3, cluster->info()->lbConfig().healthy_panic_threshold().value()); + EXPECT_EQ(LoadBalancerType::Maglev, cluster->info()->lbType()); +} - // Verify retry budget default values are honored. - TEST_P(ClusterInfoImplTest, RetryBudgetDefaultPopulation) { - std::string yaml = R"EOF( +// Verify retry budget default values are honored. +TEST_P(ClusterInfoImplTest, RetryBudgetDefaultPopulation) { + std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3459,39 +3459,39 @@ class ClusterInfoImplTest : public testing::TestWithParam { min_retry_concurrency: 123 )EOF"; - makeCluster(yaml); - absl::optional budget_percent; - absl::optional min_retry_concurrency; - auto threshold = cluster_config_.circuit_breakers().thresholds(); - - std::tie(budget_percent, min_retry_concurrency) = - RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[0]); - EXPECT_EQ(budget_percent, absl::nullopt); - EXPECT_EQ(min_retry_concurrency, absl::nullopt); - - std::tie(budget_percent, min_retry_concurrency) = - RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[1]); - EXPECT_EQ(budget_percent, 20.0); - EXPECT_EQ(min_retry_concurrency, 3UL); - - std::tie(budget_percent, min_retry_concurrency) = - RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[2]); - EXPECT_EQ(budget_percent, 20.0); - EXPECT_EQ(min_retry_concurrency, 3UL); - - std::tie(budget_percent, min_retry_concurrency) = - RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[3]); - EXPECT_EQ(budget_percent, 42.0); - EXPECT_EQ(min_retry_concurrency, 3UL); - - std::tie(budget_percent, min_retry_concurrency) = - RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[4]); - EXPECT_EQ(budget_percent, 20.0); - EXPECT_EQ(min_retry_concurrency, 123UL); - } + makeCluster(yaml); + absl::optional budget_percent; + absl::optional min_retry_concurrency; + auto threshold = cluster_config_.circuit_breakers().thresholds(); + + std::tie(budget_percent, min_retry_concurrency) = + RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[0]); + EXPECT_EQ(budget_percent, absl::nullopt); + EXPECT_EQ(min_retry_concurrency, absl::nullopt); + + std::tie(budget_percent, min_retry_concurrency) = + RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[1]); + EXPECT_EQ(budget_percent, 20.0); + EXPECT_EQ(min_retry_concurrency, 3UL); + + std::tie(budget_percent, min_retry_concurrency) = + RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[2]); + EXPECT_EQ(budget_percent, 20.0); + EXPECT_EQ(min_retry_concurrency, 3UL); + + std::tie(budget_percent, min_retry_concurrency) = + RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[3]); + EXPECT_EQ(budget_percent, 42.0); + EXPECT_EQ(min_retry_concurrency, 3UL); + + std::tie(budget_percent, min_retry_concurrency) = + RetryBudgetTestClusterInfo::getRetryBudgetParams(threshold[4]); + EXPECT_EQ(budget_percent, 20.0); + EXPECT_EQ(min_retry_concurrency, 123UL); +} - TEST_P(ClusterInfoImplTest, UnsupportedPerHostFields) { - std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, UnsupportedPerHostFields) { + std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3505,13 +3505,13 @@ class ClusterInfoImplTest : public testing::TestWithParam { max_retries: 123 )EOF"; - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "Unsupported field in per_host_thresholds"); - } + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "Unsupported field in per_host_thresholds"); +} - // Eds service_name is populated. - TEST_P(ClusterInfoImplTest, EdsServiceNamePopulation) { - const std::string yaml = R"EOF( +// Eds service_name is populated. +TEST_P(ClusterInfoImplTest, EdsServiceNamePopulation) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: EDS @@ -3530,10 +3530,10 @@ class ClusterInfoImplTest : public testing::TestWithParam { healthy_panic_threshold: value: 0.3 )EOF"; - auto cluster = makeCluster(yaml); - EXPECT_EQ(cluster->info()->edsServiceName(), "service_foo"); + auto cluster = makeCluster(yaml); + EXPECT_EQ(cluster->info()->edsServiceName(), "service_foo"); - const std::string unexpected_eds_config_yaml = R"EOF( + const std::string unexpected_eds_config_yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3552,13 +3552,13 @@ class ClusterInfoImplTest : public testing::TestWithParam { healthy_panic_threshold: value: 0.3 )EOF"; - EXPECT_THROW_WITH_MESSAGE(makeCluster(unexpected_eds_config_yaml), EnvoyException, - "eds_cluster_config set in a non-EDS cluster"); - } + EXPECT_THROW_WITH_MESSAGE(makeCluster(unexpected_eds_config_yaml), EnvoyException, + "eds_cluster_config set in a non-EDS cluster"); +} - // Typed metadata loading throws exception. - TEST_P(ClusterInfoImplTest, BrokenTypedMetadata) { - const std::string yaml = R"EOF( +// Typed metadata loading throws exception. +TEST_P(ClusterInfoImplTest, BrokenTypedMetadata) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3578,15 +3578,15 @@ class ClusterInfoImplTest : public testing::TestWithParam { value: 0.3 )EOF"; - BazFactory baz_factory; - Registry::InjectFactory registered_factory(baz_factory); - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "Cannot create a Baz when metadata is empty."); - } + BazFactory baz_factory; + Registry::InjectFactory registered_factory(baz_factory); + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "Cannot create a Baz when metadata is empty."); +} - // Cluster extension protocol options fails validation when configured for an unregistered filter. - TEST_P(ClusterInfoImplTest, ExtensionProtocolOptionsForUnknownFilter) { - const std::string yaml = R"EOF( +// Cluster extension protocol options fails validation when configured for an unregistered filter. +TEST_P(ClusterInfoImplTest, ExtensionProtocolOptionsForUnknownFilter) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3606,13 +3606,13 @@ class ClusterInfoImplTest : public testing::TestWithParam { option: "value" )EOF"; - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "Didn't find a registered network or http filter or " - "protocol options implementation for name: 'no_such_filter'"); - } + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "Didn't find a registered network or http filter or " + "protocol options implementation for name: 'no_such_filter'"); +} - TEST_P(ClusterInfoImplTest, TypedExtensionProtocolOptionsForUnknownFilter) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, TypedExtensionProtocolOptionsForUnknownFilter) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3630,24 +3630,24 @@ class ClusterInfoImplTest : public testing::TestWithParam { "@type": type.googleapis.com/google.protobuf.Struct )EOF"; - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "Didn't find a registered network or http filter or " - "protocol options implementation for name: 'no_such_filter'"); - } + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "Didn't find a registered network or http filter or " + "protocol options implementation for name: 'no_such_filter'"); +} - TEST_P(ClusterInfoImplTest, TestTrackRequestResponseSizesNotSetInConfig) { - const std::string yaml_disabled = R"EOF( +TEST_P(ClusterInfoImplTest, TestTrackRequestResponseSizesNotSetInConfig) { + const std::string yaml_disabled = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN )EOF"; - auto cluster = makeCluster(yaml_disabled); - // By default, histograms tracking request/response sizes are not published. - EXPECT_FALSE(cluster->info()->requestResponseSizeStats().has_value()); + auto cluster = makeCluster(yaml_disabled); + // By default, histograms tracking request/response sizes are not published. + EXPECT_FALSE(cluster->info()->requestResponseSizeStats().has_value()); - const std::string yaml_disabled2 = R"EOF( + const std::string yaml_disabled2 = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3655,10 +3655,10 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_cluster_stats: { timeout_budgets : true } )EOF"; - cluster = makeCluster(yaml_disabled2); - EXPECT_FALSE(cluster->info()->requestResponseSizeStats().has_value()); + cluster = makeCluster(yaml_disabled2); + EXPECT_FALSE(cluster->info()->requestResponseSizeStats().has_value()); - const std::string yaml_disabled3 = R"EOF( + const std::string yaml_disabled3 = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3666,12 +3666,12 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_cluster_stats: { request_response_sizes : false } )EOF"; - cluster = makeCluster(yaml_disabled3); - EXPECT_FALSE(cluster->info()->requestResponseSizeStats().has_value()); - } + cluster = makeCluster(yaml_disabled3); + EXPECT_FALSE(cluster->info()->requestResponseSizeStats().has_value()); +} - TEST_P(ClusterInfoImplTest, TestTrackRequestResponseSizes) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, TestTrackRequestResponseSizes) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3679,20 +3679,20 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_cluster_stats: { request_response_sizes : true } )EOF"; - auto cluster = makeCluster(yaml); - // The stats should be created. - ASSERT_TRUE(cluster->info()->requestResponseSizeStats().has_value()); + auto cluster = makeCluster(yaml); + // The stats should be created. + ASSERT_TRUE(cluster->info()->requestResponseSizeStats().has_value()); - Upstream::ClusterRequestResponseSizeStats req_resp_stats = - cluster->info()->requestResponseSizeStats()->get(); + Upstream::ClusterRequestResponseSizeStats req_resp_stats = + cluster->info()->requestResponseSizeStats()->get(); - EXPECT_EQ(Stats::Histogram::Unit::Bytes, req_resp_stats.upstream_rq_headers_size_.unit()); - EXPECT_EQ(Stats::Histogram::Unit::Bytes, req_resp_stats.upstream_rq_body_size_.unit()); - EXPECT_EQ(Stats::Histogram::Unit::Bytes, req_resp_stats.upstream_rs_body_size_.unit()); - } + EXPECT_EQ(Stats::Histogram::Unit::Bytes, req_resp_stats.upstream_rq_headers_size_.unit()); + EXPECT_EQ(Stats::Histogram::Unit::Bytes, req_resp_stats.upstream_rq_body_size_.unit()); + EXPECT_EQ(Stats::Histogram::Unit::Bytes, req_resp_stats.upstream_rs_body_size_.unit()); +} - TEST_P(ClusterInfoImplTest, TestTrackRemainingResourcesGauges) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, TestTrackRemainingResourcesGauges) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3714,53 +3714,52 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_remaining: true )EOF"; - auto cluster = makeCluster(yaml); - - // The value of a remaining resource gauge will always be 0 for the default - // priority circuit breaker since track_remaining is false - Stats::Gauge& default_remaining_retries = - stats_.gauge("cluster.name.circuit_breakers.default.remaining_retries", - Stats::Gauge::ImportMode::Accumulate); - EXPECT_EQ(0U, default_remaining_retries.value()); - cluster->info()->resourceManager(ResourcePriority::Default).retries().inc(); - EXPECT_EQ(0U, default_remaining_retries.value()); - cluster->info()->resourceManager(ResourcePriority::Default).retries().dec(); - EXPECT_EQ(0U, default_remaining_retries.value()); - - // This gauge will be correctly set since we have opted in to tracking remaining - // resource gauges in the high priority circuit breaker. - Stats::Gauge& high_remaining_retries = - stats_.gauge("cluster.name.circuit_breakers.high.remaining_retries", - Stats::Gauge::ImportMode::Accumulate); - EXPECT_EQ(4U, high_remaining_retries.value()); - cluster->info()->resourceManager(ResourcePriority::High).retries().inc(); - EXPECT_EQ(3U, high_remaining_retries.value()); - cluster->info()->resourceManager(ResourcePriority::High).retries().dec(); - EXPECT_EQ(4U, high_remaining_retries.value()); - } + auto cluster = makeCluster(yaml); - TEST_P(ClusterInfoImplTest, DefaultConnectTimeout) { - const std::string yaml = R"EOF( + // The value of a remaining resource gauge will always be 0 for the default + // priority circuit breaker since track_remaining is false + Stats::Gauge& default_remaining_retries = + stats_.gauge("cluster.name.circuit_breakers.default.remaining_retries", + Stats::Gauge::ImportMode::Accumulate); + EXPECT_EQ(0U, default_remaining_retries.value()); + cluster->info()->resourceManager(ResourcePriority::Default).retries().inc(); + EXPECT_EQ(0U, default_remaining_retries.value()); + cluster->info()->resourceManager(ResourcePriority::Default).retries().dec(); + EXPECT_EQ(0U, default_remaining_retries.value()); + + // This gauge will be correctly set since we have opted in to tracking remaining + // resource gauges in the high priority circuit breaker. + Stats::Gauge& high_remaining_retries = stats_.gauge( + "cluster.name.circuit_breakers.high.remaining_retries", Stats::Gauge::ImportMode::Accumulate); + EXPECT_EQ(4U, high_remaining_retries.value()); + cluster->info()->resourceManager(ResourcePriority::High).retries().inc(); + EXPECT_EQ(3U, high_remaining_retries.value()); + cluster->info()->resourceManager(ResourcePriority::High).retries().dec(); + EXPECT_EQ(4U, high_remaining_retries.value()); +} + +TEST_P(ClusterInfoImplTest, DefaultConnectTimeout) { + const std::string yaml = R"EOF( name: cluster1 type: STRICT_DNS lb_policy: ROUND_ROBIN )EOF"; - auto cluster = makeCluster(yaml); - envoy::config::cluster::v3::Cluster cluster_config = parseClusterFromV3Yaml(yaml); + auto cluster = makeCluster(yaml); + envoy::config::cluster::v3::Cluster cluster_config = parseClusterFromV3Yaml(yaml); - EXPECT_FALSE(cluster_config.has_connect_timeout()); - EXPECT_EQ(std::chrono::seconds(5), cluster->info()->connectTimeout()); - } + EXPECT_FALSE(cluster_config.has_connect_timeout()); + EXPECT_EQ(std::chrono::seconds(5), cluster->info()->connectTimeout()); +} - TEST_P(ClusterInfoImplTest, MaxConnectionDurationTest) { - const std::string yaml_base = R"EOF( +TEST_P(ClusterInfoImplTest, MaxConnectionDurationTest) { + const std::string yaml_base = R"EOF( name: {} type: STRICT_DNS lb_policy: ROUND_ROBIN )EOF"; - const std::string yaml_set_max_connection_duration = yaml_base + R"EOF( + const std::string yaml_set_max_connection_duration = yaml_base + R"EOF( typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions @@ -3770,18 +3769,18 @@ class ClusterInfoImplTest : public testing::TestWithParam { max_connection_duration: {} )EOF"; - auto cluster1 = makeCluster(fmt::format(yaml_base, "cluster1")); - EXPECT_EQ(absl::nullopt, cluster1->info()->maxConnectionDuration()); + auto cluster1 = makeCluster(fmt::format(yaml_base, "cluster1")); + EXPECT_EQ(absl::nullopt, cluster1->info()->maxConnectionDuration()); - auto cluster2 = makeCluster(fmt::format(yaml_set_max_connection_duration, "cluster2", "9s")); - EXPECT_EQ(std::chrono::seconds(9), cluster2->info()->maxConnectionDuration()); + auto cluster2 = makeCluster(fmt::format(yaml_set_max_connection_duration, "cluster2", "9s")); + EXPECT_EQ(std::chrono::seconds(9), cluster2->info()->maxConnectionDuration()); - auto cluster3 = makeCluster(fmt::format(yaml_set_max_connection_duration, "cluster3", "0s")); - EXPECT_EQ(absl::nullopt, cluster3->info()->maxConnectionDuration()); - } + auto cluster3 = makeCluster(fmt::format(yaml_set_max_connection_duration, "cluster3", "0s")); + EXPECT_EQ(absl::nullopt, cluster3->info()->maxConnectionDuration()); +} - TEST_P(ClusterInfoImplTest, Timeouts) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, Timeouts) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3801,18 +3800,18 @@ class ClusterInfoImplTest : public testing::TestWithParam { value: 0.3 )EOF"; - BazFactory baz_factory; - Registry::InjectFactory registered_factory(baz_factory); - auto cluster1 = makeCluster(yaml); - ASSERT_TRUE(cluster1->info()->idleTimeout().has_value()); - EXPECT_EQ(std::chrono::hours(1), cluster1->info()->idleTimeout().value()); + BazFactory baz_factory; + Registry::InjectFactory registered_factory(baz_factory); + auto cluster1 = makeCluster(yaml); + ASSERT_TRUE(cluster1->info()->idleTimeout().has_value()); + EXPECT_EQ(std::chrono::hours(1), cluster1->info()->idleTimeout().value()); - const std::string explicit_timeout = R"EOF( + const std::string explicit_timeout = R"EOF( common_http_protocol_options: idle_timeout: 1s )EOF"; - const std::string explicit_timeout_new = R"EOF( + const std::string explicit_timeout_new = R"EOF( typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions @@ -3822,7 +3821,7 @@ class ClusterInfoImplTest : public testing::TestWithParam { idle_timeout: 1s )EOF"; - const std::string explicit_timeout_bad = R"EOF( + const std::string explicit_timeout_bad = R"EOF( typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions @@ -3830,27 +3829,27 @@ class ClusterInfoImplTest : public testing::TestWithParam { idle_timeout: 1s )EOF"; - { - auto cluster2 = makeCluster(yaml + explicit_timeout); - ASSERT_TRUE(cluster2->info()->idleTimeout().has_value()); - EXPECT_EQ(std::chrono::seconds(1), cluster2->info()->idleTimeout().value()); - } - { - auto cluster2 = makeCluster(yaml + explicit_timeout_new); - ASSERT_TRUE(cluster2->info()->idleTimeout().has_value()); - EXPECT_EQ(std::chrono::seconds(1), cluster2->info()->idleTimeout().value()); - } - { - auto cluster2 = makeCluster(yaml + explicit_timeout_new); - EXPECT_THROW_WITH_REGEX(makeCluster(yaml + explicit_timeout_bad), EnvoyException, - ".*Proto constraint validation failed.*"); - } - const std::string no_timeout = R"EOF( + { + auto cluster2 = makeCluster(yaml + explicit_timeout); + ASSERT_TRUE(cluster2->info()->idleTimeout().has_value()); + EXPECT_EQ(std::chrono::seconds(1), cluster2->info()->idleTimeout().value()); + } + { + auto cluster2 = makeCluster(yaml + explicit_timeout_new); + ASSERT_TRUE(cluster2->info()->idleTimeout().has_value()); + EXPECT_EQ(std::chrono::seconds(1), cluster2->info()->idleTimeout().value()); + } + { + auto cluster2 = makeCluster(yaml + explicit_timeout_new); + EXPECT_THROW_WITH_REGEX(makeCluster(yaml + explicit_timeout_bad), EnvoyException, + ".*Proto constraint validation failed.*"); + } + const std::string no_timeout = R"EOF( common_http_protocol_options: idle_timeout: 0s )EOF"; - const std::string no_timeout_new = R"EOF( + const std::string no_timeout_new = R"EOF( typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions @@ -3860,31 +3859,31 @@ class ClusterInfoImplTest : public testing::TestWithParam { idle_timeout: 0s )EOF"; - { - auto cluster3 = makeCluster(yaml + no_timeout); - EXPECT_FALSE(cluster3->info()->idleTimeout().has_value()); - } + { + auto cluster3 = makeCluster(yaml + no_timeout); + EXPECT_FALSE(cluster3->info()->idleTimeout().has_value()); + } - { - auto cluster3 = makeCluster(yaml + no_timeout_new); - EXPECT_FALSE(cluster3->info()->idleTimeout().has_value()); - } + { + auto cluster3 = makeCluster(yaml + no_timeout_new); + EXPECT_FALSE(cluster3->info()->idleTimeout().has_value()); } +} - TEST_P(ClusterInfoImplTest, TestTrackTimeoutBudgetsNotSetInConfig) { - // Check that without the flag specified, the histogram is null. - const std::string yaml_disabled = R"EOF( +TEST_P(ClusterInfoImplTest, TestTrackTimeoutBudgetsNotSetInConfig) { + // Check that without the flag specified, the histogram is null. + const std::string yaml_disabled = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN )EOF"; - auto cluster = makeCluster(yaml_disabled); - // The stats will be null if they have not been explicitly turned on. - EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); + auto cluster = makeCluster(yaml_disabled); + // The stats will be null if they have not been explicitly turned on. + EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); - const std::string yaml_disabled2 = R"EOF( + const std::string yaml_disabled2 = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3892,10 +3891,10 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_cluster_stats: { request_response_sizes : true } )EOF"; - cluster = makeCluster(yaml_disabled2); - EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); + cluster = makeCluster(yaml_disabled2); + EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); - const std::string yaml_disabled3 = R"EOF( + const std::string yaml_disabled3 = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3903,13 +3902,13 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_cluster_stats: { timeout_budgets : false } )EOF"; - cluster = makeCluster(yaml_disabled3); - EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); - } + cluster = makeCluster(yaml_disabled3); + EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); +} - TEST_P(ClusterInfoImplTest, TestTrackTimeoutBudgets) { - // Check that with the flag, the histogram is created. - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, TestTrackTimeoutBudgets) { + // Check that with the flag, the histogram is created. + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3917,32 +3916,32 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_cluster_stats: { timeout_budgets : true } )EOF"; - auto cluster = makeCluster(yaml); - // The stats should be created. - ASSERT_TRUE(cluster->info()->timeoutBudgetStats().has_value()); - - Upstream::ClusterTimeoutBudgetStats tb_stats = cluster->info()->timeoutBudgetStats()->get(); - EXPECT_EQ(Stats::Histogram::Unit::Unspecified, - tb_stats.upstream_rq_timeout_budget_percent_used_.unit()); - EXPECT_EQ(Stats::Histogram::Unit::Unspecified, - tb_stats.upstream_rq_timeout_budget_per_try_percent_used_.unit()); - } + auto cluster = makeCluster(yaml); + // The stats should be created. + ASSERT_TRUE(cluster->info()->timeoutBudgetStats().has_value()); + + Upstream::ClusterTimeoutBudgetStats tb_stats = cluster->info()->timeoutBudgetStats()->get(); + EXPECT_EQ(Stats::Histogram::Unit::Unspecified, + tb_stats.upstream_rq_timeout_budget_percent_used_.unit()); + EXPECT_EQ(Stats::Histogram::Unit::Unspecified, + tb_stats.upstream_rq_timeout_budget_per_try_percent_used_.unit()); +} - TEST_P(ClusterInfoImplTest, DEPRECATED_FEATURE_TEST(TestTrackTimeoutBudgetsOld)) { - // Check that without the flag specified, the histogram is null. - const std::string yaml_disabled = R"EOF( +TEST_P(ClusterInfoImplTest, DEPRECATED_FEATURE_TEST(TestTrackTimeoutBudgetsOld)) { + // Check that without the flag specified, the histogram is null. + const std::string yaml_disabled = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN )EOF"; - auto cluster = makeCluster(yaml_disabled); - // The stats will be null if they have not been explicitly turned on. - EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); + auto cluster = makeCluster(yaml_disabled); + // The stats will be null if they have not been explicitly turned on. + EXPECT_FALSE(cluster->info()->timeoutBudgetStats().has_value()); - // Check that with the flag, the histogram is created. - const std::string yaml = R"EOF( + // Check that with the flag, the histogram is created. + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3950,20 +3949,20 @@ class ClusterInfoImplTest : public testing::TestWithParam { track_timeout_budgets: true )EOF"; - cluster = makeCluster(yaml); - // The stats should be created. - ASSERT_TRUE(cluster->info()->timeoutBudgetStats().has_value()); + cluster = makeCluster(yaml); + // The stats should be created. + ASSERT_TRUE(cluster->info()->timeoutBudgetStats().has_value()); - Upstream::ClusterTimeoutBudgetStats tb_stats = cluster->info()->timeoutBudgetStats()->get(); - EXPECT_EQ(Stats::Histogram::Unit::Unspecified, - tb_stats.upstream_rq_timeout_budget_percent_used_.unit()); - EXPECT_EQ(Stats::Histogram::Unit::Unspecified, - tb_stats.upstream_rq_timeout_budget_per_try_percent_used_.unit()); - } + Upstream::ClusterTimeoutBudgetStats tb_stats = cluster->info()->timeoutBudgetStats()->get(); + EXPECT_EQ(Stats::Histogram::Unit::Unspecified, + tb_stats.upstream_rq_timeout_budget_percent_used_.unit()); + EXPECT_EQ(Stats::Histogram::Unit::Unspecified, + tb_stats.upstream_rq_timeout_budget_per_try_percent_used_.unit()); +} - // Validates HTTP2 SETTINGS config. - TEST_P(ClusterInfoImplTest, Http2ProtocolOptions) { - const std::string yaml = R"EOF( +// Validates HTTP2 SETTINGS config. +TEST_P(ClusterInfoImplTest, Http2ProtocolOptions) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -3978,104 +3977,103 @@ class ClusterInfoImplTest : public testing::TestWithParam { value: 12 )EOF"; - auto cluster = makeCluster(yaml); - EXPECT_EQ(cluster->info()->http2Options().hpack_table_size().value(), 2048); - EXPECT_EQ(cluster->info()->http2Options().initial_stream_window_size().value(), 65536); - EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[0].identifier().value(), - 0x10); - EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[0].value().value(), 10); - EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[1].identifier().value(), - 0x12); - EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[1].value().value(), 12); - } + auto cluster = makeCluster(yaml); + EXPECT_EQ(cluster->info()->http2Options().hpack_table_size().value(), 2048); + EXPECT_EQ(cluster->info()->http2Options().initial_stream_window_size().value(), 65536); + EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[0].identifier().value(), + 0x10); + EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[0].value().value(), 10); + EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[1].identifier().value(), + 0x12); + EXPECT_EQ(cluster->info()->http2Options().custom_settings_parameters()[1].value().value(), 12); +} - class TestFilterConfigFactoryBase { - public: - TestFilterConfigFactoryBase( - std::function empty_proto, - std::function - config) - : empty_proto_(empty_proto), config_(config) {} - - ProtobufTypes::MessagePtr createEmptyProtocolOptionsProto() { return empty_proto_(); } - Upstream::ProtocolOptionsConfigConstSharedPtr - createProtocolOptionsConfig(const Protobuf::Message& msg) { - return config_(msg); - } +class TestFilterConfigFactoryBase { +public: + TestFilterConfigFactoryBase( + std::function empty_proto, + std::function config) + : empty_proto_(empty_proto), config_(config) {} + + ProtobufTypes::MessagePtr createEmptyProtocolOptionsProto() { return empty_proto_(); } + Upstream::ProtocolOptionsConfigConstSharedPtr + createProtocolOptionsConfig(const Protobuf::Message& msg) { + return config_(msg); + } - std::function empty_proto_; - std::function config_; - }; + std::function empty_proto_; + std::function config_; +}; - class TestNetworkFilterConfigFactory - : public Server::Configuration::NamedNetworkFilterConfigFactory { - public: - TestNetworkFilterConfigFactory(TestFilterConfigFactoryBase& parent) : parent_(parent) {} +class TestNetworkFilterConfigFactory + : public Server::Configuration::NamedNetworkFilterConfigFactory { +public: + TestNetworkFilterConfigFactory(TestFilterConfigFactoryBase& parent) : parent_(parent) {} - // NamedNetworkFilterConfigFactory - Network::FilterFactoryCb - createFilterFactoryFromProto(const Protobuf::Message&, - Server::Configuration::FactoryContext&) override { - PANIC("not implemented"); - } - ProtobufTypes::MessagePtr createEmptyConfigProto() override { PANIC("not implemented"); } - ProtobufTypes::MessagePtr createEmptyProtocolOptionsProto() override { - return parent_.createEmptyProtocolOptionsProto(); - } - Upstream::ProtocolOptionsConfigConstSharedPtr - createProtocolOptionsConfig(const Protobuf::Message& msg, - Server::Configuration::ProtocolOptionsFactoryContext&) override { - return parent_.createProtocolOptionsConfig(msg); - } - std::string name() const override { CONSTRUCT_ON_FIRST_USE(std::string, "envoy.test.filter"); } - std::set configTypes() override { return {}; }; + // NamedNetworkFilterConfigFactory + Network::FilterFactoryCb + createFilterFactoryFromProto(const Protobuf::Message&, + Server::Configuration::FactoryContext&) override { + PANIC("not implemented"); + } + ProtobufTypes::MessagePtr createEmptyConfigProto() override { PANIC("not implemented"); } + ProtobufTypes::MessagePtr createEmptyProtocolOptionsProto() override { + return parent_.createEmptyProtocolOptionsProto(); + } + Upstream::ProtocolOptionsConfigConstSharedPtr + createProtocolOptionsConfig(const Protobuf::Message& msg, + Server::Configuration::ProtocolOptionsFactoryContext&) override { + return parent_.createProtocolOptionsConfig(msg); + } + std::string name() const override { CONSTRUCT_ON_FIRST_USE(std::string, "envoy.test.filter"); } + std::set configTypes() override { return {}; }; - TestFilterConfigFactoryBase& parent_; - }; + TestFilterConfigFactoryBase& parent_; +}; - class TestHttpFilterConfigFactory : public Server::Configuration::NamedHttpFilterConfigFactory { - public: - TestHttpFilterConfigFactory(TestFilterConfigFactoryBase& parent) : parent_(parent) {} +class TestHttpFilterConfigFactory : public Server::Configuration::NamedHttpFilterConfigFactory { +public: + TestHttpFilterConfigFactory(TestFilterConfigFactoryBase& parent) : parent_(parent) {} - // NamedNetworkFilterConfigFactory - Http::FilterFactoryCb - createFilterFactoryFromProto(const Protobuf::Message&, const std::string&, - Server::Configuration::FactoryContext&) override { - PANIC("not implemented"); - } - ProtobufTypes::MessagePtr createEmptyConfigProto() override { PANIC("not implemented"); } - ProtobufTypes::MessagePtr createEmptyRouteConfigProto() override { PANIC("not implemented"); } - Router::RouteSpecificFilterConfigConstSharedPtr - createRouteSpecificFilterConfig(const Protobuf::Message&, - Server::Configuration::ServerFactoryContext&, - ProtobufMessage::ValidationVisitor&) override { - PANIC("not implemented"); - } + // NamedNetworkFilterConfigFactory + Http::FilterFactoryCb + createFilterFactoryFromProto(const Protobuf::Message&, const std::string&, + Server::Configuration::FactoryContext&) override { + PANIC("not implemented"); + } + ProtobufTypes::MessagePtr createEmptyConfigProto() override { PANIC("not implemented"); } + ProtobufTypes::MessagePtr createEmptyRouteConfigProto() override { PANIC("not implemented"); } + Router::RouteSpecificFilterConfigConstSharedPtr + createRouteSpecificFilterConfig(const Protobuf::Message&, + Server::Configuration::ServerFactoryContext&, + ProtobufMessage::ValidationVisitor&) override { + PANIC("not implemented"); + } - ProtobufTypes::MessagePtr createEmptyProtocolOptionsProto() override { - return parent_.createEmptyProtocolOptionsProto(); - } - Upstream::ProtocolOptionsConfigConstSharedPtr - createProtocolOptionsConfig(const Protobuf::Message& msg, - Server::Configuration::ProtocolOptionsFactoryContext&) override { - return parent_.createProtocolOptionsConfig(msg); - } - std::string name() const override { CONSTRUCT_ON_FIRST_USE(std::string, "envoy.test.filter"); } - std::set configTypes() override { return {}; }; + ProtobufTypes::MessagePtr createEmptyProtocolOptionsProto() override { + return parent_.createEmptyProtocolOptionsProto(); + } + Upstream::ProtocolOptionsConfigConstSharedPtr + createProtocolOptionsConfig(const Protobuf::Message& msg, + Server::Configuration::ProtocolOptionsFactoryContext&) override { + return parent_.createProtocolOptionsConfig(msg); + } + std::string name() const override { CONSTRUCT_ON_FIRST_USE(std::string, "envoy.test.filter"); } + std::set configTypes() override { return {}; }; - TestFilterConfigFactoryBase& parent_; - }; - struct TestFilterProtocolOptionsConfig : public Upstream::ProtocolOptionsConfig {}; - - // Cluster extension protocol options fails validation when configured for filter that does not - // support options. - TEST_P(ClusterInfoImplTest, ExtensionProtocolOptionsForFilterWithoutOptions) { - TestFilterConfigFactoryBase factoryBase( - []() -> ProtobufTypes::MessagePtr { return nullptr; }, - [](const Protobuf::Message&) -> Upstream::ProtocolOptionsConfigConstSharedPtr { - return nullptr; - }); - const std::string yaml = R"EOF( + TestFilterConfigFactoryBase& parent_; +}; +struct TestFilterProtocolOptionsConfig : public Upstream::ProtocolOptionsConfig {}; + +// Cluster extension protocol options fails validation when configured for filter that does not +// support options. +TEST_P(ClusterInfoImplTest, ExtensionProtocolOptionsForFilterWithoutOptions) { + TestFilterConfigFactoryBase factoryBase( + []() -> ProtobufTypes::MessagePtr { return nullptr; }, + [](const Protobuf::Message&) -> Upstream::ProtocolOptionsConfigConstSharedPtr { + return nullptr; + }); + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4095,29 +4093,28 @@ class ClusterInfoImplTest : public testing::TestWithParam { option: "value" )EOF"; - { - TestNetworkFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "filter envoy.test.filter does not support protocol options"); - } - { - TestHttpFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "filter envoy.test.filter does not support protocol options"); - } + { + TestNetworkFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry( + factory); + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "filter envoy.test.filter does not support protocol options"); } + { + TestHttpFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry(factory); + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "filter envoy.test.filter does not support protocol options"); + } +} - TEST_P(ClusterInfoImplTest, TypedExtensionProtocolOptionsForFilterWithoutOptions) { - TestFilterConfigFactoryBase factoryBase( - []() -> ProtobufTypes::MessagePtr { return nullptr; }, - [](const Protobuf::Message&) -> Upstream::ProtocolOptionsConfigConstSharedPtr { - return nullptr; - }); - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, TypedExtensionProtocolOptionsForFilterWithoutOptions) { + TestFilterConfigFactoryBase factoryBase( + []() -> ProtobufTypes::MessagePtr { return nullptr; }, + [](const Protobuf::Message&) -> Upstream::ProtocolOptionsConfigConstSharedPtr { + return nullptr; + }); + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4134,36 +4131,35 @@ class ClusterInfoImplTest : public testing::TestWithParam { envoy.test.filter: { "@type": type.googleapis.com/google.protobuf.Struct } )EOF"; - { - TestNetworkFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "filter envoy.test.filter does not support protocol options"); - } - { - TestHttpFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, - "filter envoy.test.filter does not support protocol options"); - } + { + TestNetworkFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry( + factory); + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "filter envoy.test.filter does not support protocol options"); + } + { + TestHttpFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry(factory); + EXPECT_THROW_WITH_MESSAGE(makeCluster(yaml), EnvoyException, + "filter envoy.test.filter does not support protocol options"); } +} - // Cluster retrieval of typed extension protocol options. - TEST_P(ClusterInfoImplTest, ExtensionProtocolOptionsForFilterWithOptions) { - auto protocol_options = std::make_shared(); +// Cluster retrieval of typed extension protocol options. +TEST_P(ClusterInfoImplTest, ExtensionProtocolOptionsForFilterWithOptions) { + auto protocol_options = std::make_shared(); - TestFilterConfigFactoryBase factoryBase( - []() -> ProtobufTypes::MessagePtr { return std::make_unique(); }, - [&](const Protobuf::Message& msg) -> Upstream::ProtocolOptionsConfigConstSharedPtr { - const auto& msg_struct = dynamic_cast(msg); - EXPECT_TRUE(msg_struct.fields().find("option") != msg_struct.fields().end()); + TestFilterConfigFactoryBase factoryBase( + []() -> ProtobufTypes::MessagePtr { return std::make_unique(); }, + [&](const Protobuf::Message& msg) -> Upstream::ProtocolOptionsConfigConstSharedPtr { + const auto& msg_struct = dynamic_cast(msg); + EXPECT_TRUE(msg_struct.fields().find("option") != msg_struct.fields().end()); - return protocol_options; - }); + return protocol_options; + }); - const std::string yaml = R"EOF( + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4183,7 +4179,7 @@ class ClusterInfoImplTest : public testing::TestWithParam { option: "value" )EOF"; - const std::string typed_yaml = R"EOF( + const std::string typed_yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4203,52 +4199,50 @@ class ClusterInfoImplTest : public testing::TestWithParam { option: "value" )EOF"; - // This vector is used to gather clusters with extension_protocol_options from the different - // types of extension factories (network, http). - std::vector> clusters; + // This vector is used to gather clusters with extension_protocol_options from the different + // types of extension factories (network, http). + std::vector> clusters; - { - // Get the cluster with extension_protocol_options for a network filter factory. - TestNetworkFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - clusters.push_back(makeCluster(yaml)); - } - { - // Get the cluster with extension_protocol_options for an http filter factory. - TestHttpFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - clusters.push_back(makeCluster(yaml)); - } - { - // Get the cluster with extension_protocol_options for a network filter factory. - TestNetworkFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - clusters.push_back(makeCluster(typed_yaml)); - } - { - // Get the cluster with extension_protocol_options for an http filter factory. - TestHttpFilterConfigFactory factory(factoryBase); - Registry::InjectFactory registry( - factory); - clusters.push_back(makeCluster(typed_yaml)); - } + { + // Get the cluster with extension_protocol_options for a network filter factory. + TestNetworkFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry( + factory); + clusters.push_back(makeCluster(yaml)); + } + { + // Get the cluster with extension_protocol_options for an http filter factory. + TestHttpFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry(factory); + clusters.push_back(makeCluster(yaml)); + } + { + // Get the cluster with extension_protocol_options for a network filter factory. + TestNetworkFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry( + factory); + clusters.push_back(makeCluster(typed_yaml)); + } + { + // Get the cluster with extension_protocol_options for an http filter factory. + TestHttpFilterConfigFactory factory(factoryBase); + Registry::InjectFactory registry(factory); + clusters.push_back(makeCluster(typed_yaml)); + } - // Make sure that the clusters created from both factories are as expected. - for (auto&& cluster : clusters) { - std::shared_ptr stored_options = - cluster->info()->extensionProtocolOptionsTyped( - "envoy.test.filter"); - EXPECT_NE(nullptr, protocol_options); - // Same pointer - EXPECT_EQ(stored_options.get(), protocol_options.get()); - } + // Make sure that the clusters created from both factories are as expected. + for (auto&& cluster : clusters) { + std::shared_ptr stored_options = + cluster->info()->extensionProtocolOptionsTyped( + "envoy.test.filter"); + EXPECT_NE(nullptr, protocol_options); + // Same pointer + EXPECT_EQ(stored_options.get(), protocol_options.get()); } +} - TEST_P(ClusterInfoImplTest, UseDownstreamHttpProtocolWithDowngrade) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, UseDownstreamHttpProtocolWithDowngrade) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4256,21 +4250,21 @@ class ClusterInfoImplTest : public testing::TestWithParam { protocol_selection: USE_DOWNSTREAM_PROTOCOL )EOF"; - auto cluster = makeCluster(yaml); - - EXPECT_EQ(Http::Protocol::Http10, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); - EXPECT_EQ(Http::Protocol::Http11, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http11})[0]); - EXPECT_EQ(Http::Protocol::Http2, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http2})[0]); - // This will get downgraded because the cluster does not support HTTP/3 - EXPECT_EQ(Http::Protocol::Http2, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http3})[0]); - } + auto cluster = makeCluster(yaml); + + EXPECT_EQ(Http::Protocol::Http10, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); + EXPECT_EQ(Http::Protocol::Http11, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http11})[0]); + EXPECT_EQ(Http::Protocol::Http2, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http2})[0]); + // This will get downgraded because the cluster does not support HTTP/3 + EXPECT_EQ(Http::Protocol::Http2, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http3})[0]); +} - TEST_P(ClusterInfoImplTest, UpstreamHttp2Protocol) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, UpstreamHttp2Protocol) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4278,39 +4272,39 @@ class ClusterInfoImplTest : public testing::TestWithParam { http2_protocol_options: {} )EOF"; - auto cluster = makeCluster(yaml); + auto cluster = makeCluster(yaml); - EXPECT_EQ(Http::Protocol::Http2, cluster->info()->upstreamHttpProtocol(absl::nullopt)[0]); - EXPECT_EQ(Http::Protocol::Http2, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); - EXPECT_EQ(Http::Protocol::Http2, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http11})[0]); - EXPECT_EQ(Http::Protocol::Http2, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http2})[0]); - } + EXPECT_EQ(Http::Protocol::Http2, cluster->info()->upstreamHttpProtocol(absl::nullopt)[0]); + EXPECT_EQ(Http::Protocol::Http2, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); + EXPECT_EQ(Http::Protocol::Http2, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http11})[0]); + EXPECT_EQ(Http::Protocol::Http2, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http2})[0]); +} - TEST_P(ClusterInfoImplTest, UpstreamHttp11Protocol) { - const std::string yaml = R"EOF( +TEST_P(ClusterInfoImplTest, UpstreamHttp11Protocol) { + const std::string yaml = R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN )EOF"; - auto cluster = makeCluster(yaml); + auto cluster = makeCluster(yaml); - EXPECT_EQ(Http::Protocol::Http11, cluster->info()->upstreamHttpProtocol(absl::nullopt)[0]); - EXPECT_EQ(Http::Protocol::Http11, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); - EXPECT_EQ(Http::Protocol::Http11, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http11})[0]); - EXPECT_EQ(Http::Protocol::Http11, - cluster->info()->upstreamHttpProtocol({Http::Protocol::Http2})[0]); - } + EXPECT_EQ(Http::Protocol::Http11, cluster->info()->upstreamHttpProtocol(absl::nullopt)[0]); + EXPECT_EQ(Http::Protocol::Http11, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); + EXPECT_EQ(Http::Protocol::Http11, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http11})[0]); + EXPECT_EQ(Http::Protocol::Http11, + cluster->info()->upstreamHttpProtocol({Http::Protocol::Http2})[0]); +} #ifdef ENVOY_ENABLE_QUIC - TEST_P(ClusterInfoImplTest, Http3) { - const std::string yaml = TestEnvironment::substitute(R"EOF( +TEST_P(ClusterInfoImplTest, Http3) { + const std::string yaml = TestEnvironment::substitute(R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4345,12 +4339,12 @@ class ClusterInfoImplTest : public testing::TestWithParam { exact: 127.0.0.1 san_type: IP_ADDRESS )EOF", - Network::Address::IpVersion::v4); - auto cluster1 = makeCluster(yaml); - ASSERT_TRUE(cluster1->info()->idleTimeout().has_value()); - EXPECT_EQ(std::chrono::hours(1), cluster1->info()->idleTimeout().value()); + Network::Address::IpVersion::v4); + auto cluster1 = makeCluster(yaml); + ASSERT_TRUE(cluster1->info()->idleTimeout().has_value()); + EXPECT_EQ(std::chrono::hours(1), cluster1->info()->idleTimeout().value()); - const std::string explicit_http3 = R"EOF( + const std::string explicit_http3 = R"EOF( typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions @@ -4362,7 +4356,7 @@ class ClusterInfoImplTest : public testing::TestWithParam { idle_timeout: 1s )EOF"; - const std::string downstream_http3 = R"EOF( + const std::string downstream_http3 = R"EOF( typed_extension_protocol_options: envoy.extensions.upstreams.http.v3.HttpProtocolOptions: "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions @@ -4372,22 +4366,19 @@ class ClusterInfoImplTest : public testing::TestWithParam { idle_timeout: 1s )EOF"; - auto explicit_h3 = makeCluster(yaml + explicit_http3); - EXPECT_EQ(Http::Protocol::Http3, - explicit_h3->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); - EXPECT_EQ(explicit_h3->info() - ->http3Options() - .quic_protocol_options() - .max_concurrent_streams() - .value(), - 2); - - auto downstream_h3 = makeCluster(yaml + downstream_http3); - EXPECT_EQ(Http::Protocol::Http3, - downstream_h3->info()->upstreamHttpProtocol({Http::Protocol::Http3})[0]); - EXPECT_FALSE( - downstream_h3->info()->http3Options().quic_protocol_options().has_max_concurrent_streams()); - } + auto explicit_h3 = makeCluster(yaml + explicit_http3); + EXPECT_EQ(Http::Protocol::Http3, + explicit_h3->info()->upstreamHttpProtocol({Http::Protocol::Http10})[0]); + EXPECT_EQ( + explicit_h3->info()->http3Options().quic_protocol_options().max_concurrent_streams().value(), + 2); + + auto downstream_h3 = makeCluster(yaml + downstream_http3); + EXPECT_EQ(Http::Protocol::Http3, + downstream_h3->info()->upstreamHttpProtocol({Http::Protocol::Http3})[0]); + EXPECT_FALSE( + downstream_h3->info()->http3Options().quic_protocol_options().has_max_concurrent_streams()); +} TEST_P(ClusterInfoImplTest, Http3BadConfig) { const std::string yaml = TestEnvironment::substitute(R"EOF( @@ -4558,8 +4549,8 @@ TEST_P(ClusterInfoImplTest, UseDownstreamHttpProtocolWithoutDowngrade) { } #else - TEST_P(ClusterInfoImplTest, Http3BadConfig) { - const std::string yaml = TestEnvironment::substitute(R"EOF( +TEST_P(ClusterInfoImplTest, Http3BadConfig) { + const std::string yaml = TestEnvironment::substitute(R"EOF( name: name connect_timeout: 0.25s type: STRICT_DNS @@ -4580,11 +4571,11 @@ TEST_P(ClusterInfoImplTest, UseDownstreamHttpProtocolWithoutDowngrade) { common_http_protocol_options: idle_timeout: 1s )EOF", - Network::Address::IpVersion::v4); + Network::Address::IpVersion::v4); - EXPECT_THROW_WITH_REGEX(makeCluster(yaml), EnvoyException, - "HTTP3 configured but not enabled in the build."); - } + EXPECT_THROW_WITH_REGEX(makeCluster(yaml), EnvoyException, + "HTTP3 configured but not enabled in the build."); +} #endif // ENVOY_ENABLE_QUIC TEST_P(ClusterInfoImplTest, Http2Auto) { diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 55c11793a3489..81176c50b7ea3 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -139,7 +139,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterTrafficStatNames stat_names_; - std::unique_ptr traffic_stats_; + std::unique_ptr traffic_stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc index 0745401a05aeb..f29923761e979 100644 --- a/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc +++ b/test/extensions/filters/http/dynamic_forward_proxy/proxy_filter_test.cc @@ -258,7 +258,7 @@ TEST_F(ProxyFilterTest, CircuitBreakerOverflowWithDnsCacheResourceManager) { filter2->decodeHeaders(request_headers_, false)); // Cluster circuit breaker overflow counter won't be incremented. - EXPECT_EQ(0, cm_.thread_local_cluster_.cluster_.info_->traffic_stats_ + EXPECT_EQ(0, cm_.thread_local_cluster_.cluster_.info_->trafficStats() ->upstream_rq_pending_overflow_.value()); filter2->onDestroy(); EXPECT_CALL(*handle, onDestroy()); diff --git a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc index c133a78552ac3..1134c0434d9dc 100644 --- a/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc +++ b/test/extensions/filters/http/gcp_authn/gcp_authn_filter_integration_test.cc @@ -270,9 +270,7 @@ TEST_P(GcpAuthnFilterIntegrationTest, BasicflowWithoutAudience) { sendRequestToDestinationAndValidateResponse(/*with_audience=*/false); // Verify request has been routed to `cluster_0` but not `gcp_authn` cluster. - // Note that upstream_cx_total is from the lazy init ClusterInfo::trafficStats(), so there is - // no such stat yet. - EXPECT_EQ(test_server_->counter("cluster.gcp_authn.upstream_cx_total"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.gcp_authn.upstream_cx_total")->value(), 0); EXPECT_GE(test_server_->counter("cluster.cluster_0.upstream_cx_total")->value(), 1); // Clean up the codec and connections. diff --git a/test/integration/BUILD b/test/integration/BUILD index 3a86d1896f746..276ec8d644cfe 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -117,7 +117,7 @@ envoy_cc_test( data = [ "//test/config/integration/certs", ], - shard_count = 4, + shard_count = 8, deps = [ ":http_integration_lib", "//source/common/config:protobuf_link_hacks", diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index c7633fa4902b8..383f4c573d67a 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -29,7 +29,8 @@ const char ClusterName2[] = "cluster_2"; const int UpstreamIndex1 = 1; const int UpstreamIndex2 = 2; -class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public HttpIntegrationTest { +class CdsIntegrationTest : public Grpc::DeltaSotwStatsLazyInitIntegrationParamTest, + public HttpIntegrationTest { public: CdsIntegrationTest() : HttpIntegrationTest(Http::CodecType::HTTP2, ipVersion(), @@ -44,6 +45,9 @@ class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public Ht sotwOrDelta() == Grpc::SotwOrDelta::UnifiedDelta) ? "true" : "false"); + config_helper_.addConfigModifier([this](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_lazyinit_stats(this->enableLazyInitStats()); + }); use_lds_ = false; sotw_or_delta_ = sotwOrDelta(); } @@ -142,7 +146,7 @@ class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public Ht }; INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, CdsIntegrationTest, - DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); + DELTA_SOTW_GRPC_CLIENT_LAZYINITSTATS_INTEGRATION_PARAMS); // 1) Envoy starts up with no static clusters (other than the CDS-over-gRPC server). // 2) Envoy is told of a cluster via CDS. @@ -194,10 +198,14 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { // Make sure that clusters won't create new connections on teardown. TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); + // This line ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); - - test_server_->waitForCounterExists("cluster.cluster_1.upstream_cx_total"); + if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); + } else { + EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + } Stats::CounterSharedPtr cx_counter = test_server_->counter("cluster.cluster_1.upstream_cx_total"); // Confirm no upstream connection is attempted so far. EXPECT_EQ(0, cx_counter->value()); diff --git a/test/integration/integration_admin_test.cc b/test/integration/integration_admin_test.cc index 8fcb2cfc2f797..f9e5b7027072c 100644 --- a/test/integration/integration_admin_test.cc +++ b/test/integration/integration_admin_test.cc @@ -129,7 +129,6 @@ TEST_P(IntegrationAdminTest, Admin) { initialize(); BufferingStreamDecoderPtr response; - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_0")); EXPECT_EQ("404", request("admin", "GET", "/notfound", response)); EXPECT_EQ("text/plain; charset=UTF-8", contentType(response)); EXPECT_THAT(response->body(), HasSubstr("invalid path. admin commands are:")); diff --git a/test/integration/integration_test.cc b/test/integration/integration_test.cc index 22c7af3c3b058..3593d61e3f001 100644 --- a/test/integration/integration_test.cc +++ b/test/integration/integration_test.cc @@ -2462,8 +2462,8 @@ TEST_P(IntegrationTest, SetRouteToDelegatingRouteWithClusterOverride) { // Even though headers specify cluster_0, set_route_filter modifies cached route cluster of // current request to cluster_override. // cluster_0 trafficStats() not created yet. - EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_cx_total"), nullptr); - EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_rq_total"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_cx_total")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_rq_total")->value(), 0); EXPECT_EQ(1, test_server_->counter("cluster.cluster_override.upstream_cx_total")->value()); EXPECT_EQ(1, test_server_->counter("cluster.cluster_override.upstream_rq_200")->value()); diff --git a/test/integration/xfcc_integration_test.cc b/test/integration/xfcc_integration_test.cc index f5275544c2429..4ae3733f2f177 100644 --- a/test/integration/xfcc_integration_test.cc +++ b/test/integration/xfcc_integration_test.cc @@ -917,7 +917,7 @@ TEST_P(XfccIntegrationTest, TagExtractedNameGenerationTest) { extracted_name_map.erase(it); } }; - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_0")); + for (const Stats::CounterSharedPtr& counter : test_server_->counters()) { test_name_against_mapping(tag_extracted_counter_map, *counter); } diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 32e6fd0f2205f..681195b8c5547 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -11,7 +11,6 @@ #include "envoy/config/typed_metadata.h" #include "envoy/stats/scope.h" #include "envoy/upstream/cluster_manager.h" - #include "envoy/upstream/upstream.h" #include "source/common/common/thread.h" From 24a9e33d6a74143344e1b2cd111855f0b251b179 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 16 Dec 2022 17:03:11 -0500 Subject: [PATCH 055/122] add lazyinit trafficStats CDS integration test Signed-off-by: Xin Zhuang --- envoy/stats/stats_macros.h | 1 + source/common/stats/lazy_init.h | 26 +++++-- source/common/upstream/upstream_impl.cc | 1 + source/common/upstream/upstream_impl.h | 2 + .../buffer_accounting_integration_test.cc | 28 -------- test/integration/cds_integration_test.cc | 72 +++++++++++++++++-- test/integration/http_integration.cc | 29 ++++++++ test/integration/http_integration.h | 2 + 8 files changed, 125 insertions(+), 36 deletions(-) diff --git a/envoy/stats/stats_macros.h b/envoy/stats/stats_macros.h index dd36d903ff5db..6f49344fa7adc 100644 --- a/envoy/stats/stats_macros.h +++ b/envoy/stats/stats_macros.h @@ -153,6 +153,7 @@ static inline std::string statPrefixJoin(absl::string_view prefix, absl::string_ #define MAKE_STATS_STRUCT(StatsStruct, StatNamesStruct, ALL_STATS) \ struct StatsStruct { \ using StatNameType = StatNamesStruct; \ + static const absl::string_view typeName() { return #StatsStruct; } \ StatsStruct(const StatNamesStruct& stat_names, Envoy::Stats::Scope& scope, \ Envoy::Stats::StatName prefix = Envoy::Stats::StatName()) \ : stat_names_(stat_names) \ diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 44c1d3f4581cd..dd032e537248f 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -25,14 +25,32 @@ template class LazyInit : public LazyableInterface StatsStructType* { + : inited_(Stats::Utility::gaugeFromElements( + scope, {Stats::DynamicName(StatsStructType::typeName()), Stats::DynamicName("inited")}, + Stats::Gauge::ImportMode::NeverImport)), + ctor_([&scope, &stat_names, this]() -> StatsStructType* { + inited_.inc(); + ENVOY_LOG_MISC(error, "DDDD III inc {} now : {}", inited_.name(), inited_.value()); return new StatsStructType(stat_names, scope); - }) {} + }) { + if (inited_.value() > 0) { + // Create the nested StatsStructType. + instantiate(); + } + } // Helper operators to get-or-create and return the StatsStructType object. - inline StatsStructType* operator->() override { return internal_stats_.get(ctor_); } - inline StatsStructType& operator*() override { return *internal_stats_.get(ctor_); } + inline StatsStructType* operator->() override { return instantiate(); } + inline StatsStructType& operator*() override { return *instantiate(); } + ~LazyInit() { + if (inited_.value() > 0) { + inited_.dec(); + ENVOY_LOG_MISC(error, "DDDD DDD dec {} now : {}", inited_.name(), inited_.value()); + } + } private: + inline StatsStructType* instantiate() { return internal_stats_.get(ctor_); } + Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. std::function ctor_; diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index acffb219797d4..b46dd489897c0 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -1046,6 +1046,7 @@ ClusterInfoImpl::ClusterInfoImpl( factory_context_( std::make_unique(*stats_scope_, runtime, factory_context)), upstream_context_(server_context, init_manager, *stats_scope_) { + ENVOY_LOG_MISC(error, "DDD CCC created clusterINFO: {}", config.name()); #ifdef WIN32 if (set_local_interface_name_on_upstream_connections_) { throw EnvoyException("set_local_interface_name_on_upstream_connections_ cannot be set to true " diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 02cb430e9587d..9fc595461c44d 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -703,6 +703,8 @@ class ClusterInfoImpl : public ClusterInfo, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); + ~ClusterInfoImpl() { ENVOY_LOG_MISC(error, "DDD DDD Deleting clusterINFO: {}", this->name()); } + static std::unique_ptr generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& cluster_stat_names, bool lazyinit = false); diff --git a/test/integration/buffer_accounting_integration_test.cc b/test/integration/buffer_accounting_integration_test.cc index abc9cc2e1bb6a..de5bc872ebb04 100644 --- a/test/integration/buffer_accounting_integration_test.cc +++ b/test/integration/buffer_accounting_integration_test.cc @@ -47,34 +47,6 @@ std::string protocolTestParamsAndBoolToString( : "without_per_stream_buffer_accounting"); } -void runOnWorkerThreadsAndWaitforCompletion(Server::Instance& server, std::function func) { - absl::Notification done_notification; - ThreadLocal::TypedSlotPtr<> slot; - Envoy::Thread::ThreadId main_tid; - server.dispatcher().post([&] { - slot = ThreadLocal::TypedSlot<>::makeUnique(server.threadLocal()); - slot->set( - [](Envoy::Event::Dispatcher&) -> std::shared_ptr { - return nullptr; - }); - - main_tid = server.api().threadFactory().currentThreadId(); - - slot->runOnAllThreads( - [main_tid, &server, &func](OptRef) { - // Run on the worker thread. - if (server.api().threadFactory().currentThreadId() != main_tid) { - func(); - } - }, - [&slot, &done_notification] { - slot.reset(nullptr); - done_notification.Notify(); - }); - }); - done_notification.WaitForNotification(); -} - void waitForNumTurns(std::vector& turns, absl::Mutex& mu, uint32_t expected_size) { absl::MutexLock l(&mu); diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 383f4c573d67a..07fe3d9a476a7 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -201,8 +201,10 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { // This line ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } else { EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); } @@ -232,6 +234,66 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { EXPECT_LE(cx_counter->value(), 1); } +// Test that TrafficStats lazyinit when configured. +TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { + initialize(); + // This line ensures that the ClusterInfoImpl is created already. + test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); + if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + } else { + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); + } + Http::TestRequestHeaderMapImpl request_headers{ + {":method", "GET"}, + {":path", "/cluster1"}, + {":scheme", "http"}, + {":authority", "host"}, + }; + BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( + lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); + ASSERT_TRUE(response->complete()); + cleanupUpstreamAndDownstream(); + if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + } + // Cluster_1 trafficStats updated. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + + // Now update cluster1. + envoy::config::cluster::v3::Cluster cluster1_updated = + cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), + Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); + sendDiscoveryResponse(Config::TypeUrl::get().Cluster, + {cluster1_}, {cluster1_}, {}, "42"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + // Now the ClusterTrafficStats.inited gauge is still 1. + if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + } + // Cluster traffic stats not lost. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + + // Remove "cluster_1". + sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, + {ClusterName1}, "42"); + test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + // Make sure the deferred deletion of "cluster_1" is done. + runOnWorkerThreadsAndWaitforCompletion( + test_server_->server(), []() { ENVOY_LOG_MISC(error, "DDD run on all threads."); }); + absl::Notification notification; + test_server_->server().dispatcher().post([¬ification]() { notification.Notify(); }); + notification.WaitForNotification(); + // Now the stats are gone. + if (this->enableLazyInitStats()) { + auto DDD = test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"); + ENVOY_LOG_MISC(error, "DDD {} ", DDD ? DDD->value() : -999); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + } + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); +} + // Test the fast addition and removal of clusters when they use ThreadAwareLb. TEST_P(CdsIntegrationTest, CdsClusterWithThreadAwareLbCycleUpDownUp) { // Calls our initialize(), which includes establishing a listener, route, and cluster. @@ -242,8 +304,8 @@ TEST_P(CdsIntegrationTest, CdsClusterWithThreadAwareLbCycleUpDownUp) { EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "55", {}, {}, {})); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); - // Make sure that Envoy's ClusterManager has made use of the DiscoveryResponse that says cluster_1 - // is gone. + // Make sure that Envoy's ClusterManager has made use of the DiscoveryResponse that says + // cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); // Update cluster1_ to use MAGLEV load balancer policy. @@ -361,7 +423,8 @@ TEST_P(CdsIntegrationTest, TwoClustersAndRedirects) { } // Tests that when Envoy's delta xDS stream dis/reconnects, Envoy can inform the server of the -// resources it already has: the reconnected stream need not start with a state-of-the-world update. +// resources it already has: the reconnected stream need not start with a state-of-the-world +// update. TEST_P(CdsIntegrationTest, VersionsRememberedAfterReconnect) { SKIP_IF_XDS_IS(Grpc::SotwOrDelta::Sotw); SKIP_IF_XDS_IS(Grpc::SotwOrDelta::UnifiedSotw); @@ -496,7 +559,8 @@ TEST_P(CdsIntegrationTest, CdsClusterDownWithLotsOfIdleConnections) { // This test verifies that Envoy can delete a cluster with a lot of connections in the connecting // state and associated pending requests. The recursion guard in the -// ConnPoolImplBase::closeIdleConnectionsForDrainingPool() would fire if it was called recursively. +// ConnPoolImplBase::closeIdleConnectionsForDrainingPool() would fire if it was called +// recursively. // // Test is currently disabled as there is presently no reliable way of making upstream connections // hang in connecting state. diff --git a/test/integration/http_integration.cc b/test/integration/http_integration.cc index 71a29fd4f18e6..4fa73cced88cc 100644 --- a/test/integration/http_integration.cc +++ b/test/integration/http_integration.cc @@ -74,6 +74,35 @@ typeToCodecType(Http::CodecType type) { } // namespace +void runOnWorkerThreadsAndWaitforCompletion(Server::Instance& server, std::function func) { + absl::Notification done_notification; + ThreadLocal::TypedSlotPtr<> slot; + Envoy::Thread::ThreadId main_tid; + server.dispatcher().post([&] { + slot = ThreadLocal::TypedSlot<>::makeUnique(server.threadLocal()); + slot->set( + [](Envoy::Event::Dispatcher&) -> std::shared_ptr { + return nullptr; + }); + + main_tid = server.api().threadFactory().currentThreadId(); + + slot->runOnAllThreads( + [main_tid, &server, &func](OptRef) { + // Run on the worker thread. + if (server.api().threadFactory().currentThreadId() != main_tid) { + func(); + } + }, + [&slot, &done_notification] { + slot.reset(nullptr); + done_notification.Notify(); + }); + }); + done_notification.WaitForNotification(); +} + + IntegrationCodecClient::IntegrationCodecClient( Event::Dispatcher& dispatcher, Random::RandomGenerator& random, Network::ClientConnectionPtr&& conn, Upstream::HostDescriptionConstSharedPtr host_description, diff --git a/test/integration/http_integration.h b/test/integration/http_integration.h index 9b71dfa6e4f08..53300a532612c 100644 --- a/test/integration/http_integration.h +++ b/test/integration/http_integration.h @@ -26,6 +26,8 @@ enum class Http2Impl { Oghttp2, }; +// Runs 'func' on all worker threads. +void runOnWorkerThreadsAndWaitforCompletion(Server::Instance& server, std::function func); /** * HTTP codec client used during integration testing. */ From 988d83b1df468eec53325c26b80f4ac4f01549c4 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 5 Jan 2023 15:27:36 -0500 Subject: [PATCH 056/122] fix failing integration test Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 3 --- source/common/upstream/upstream_impl.cc | 1 - source/common/upstream/upstream_impl.h | 2 -- test/integration/cds_integration_test.cc | 24 +++++++++++++++++------- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index dd032e537248f..79a8557e29bf2 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -30,11 +30,9 @@ template class LazyInit : public LazyableInterface StatsStructType* { inited_.inc(); - ENVOY_LOG_MISC(error, "DDDD III inc {} now : {}", inited_.name(), inited_.value()); return new StatsStructType(stat_names, scope); }) { if (inited_.value() > 0) { - // Create the nested StatsStructType. instantiate(); } } @@ -44,7 +42,6 @@ template class LazyInit : public LazyableInterface 0) { inited_.dec(); - ENVOY_LOG_MISC(error, "DDDD DDD dec {} now : {}", inited_.name(), inited_.value()); } } diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index b46dd489897c0..acffb219797d4 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -1046,7 +1046,6 @@ ClusterInfoImpl::ClusterInfoImpl( factory_context_( std::make_unique(*stats_scope_, runtime, factory_context)), upstream_context_(server_context, init_manager, *stats_scope_) { - ENVOY_LOG_MISC(error, "DDD CCC created clusterINFO: {}", config.name()); #ifdef WIN32 if (set_local_interface_name_on_upstream_connections_) { throw EnvoyException("set_local_interface_name_on_upstream_connections_ cannot be set to true " diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 9fc595461c44d..02cb430e9587d 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -703,8 +703,6 @@ class ClusterInfoImpl : public ClusterInfo, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - ~ClusterInfoImpl() { ENVOY_LOG_MISC(error, "DDD DDD Deleting clusterINFO: {}", this->name()); } - static std::unique_ptr generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& cluster_stat_names, bool lazyinit = false); diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 07fe3d9a476a7..7835dfa31d3dc 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -236,6 +236,8 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { // Test that TrafficStats lazyinit when configured. TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { + this->use_real_stats_ = true; + initialize(); // This line ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); @@ -279,16 +281,24 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + auto run_on_main_thread_and_wait_for_completion = [this]() { + absl::Notification notification; + test_server_->server().dispatcher().post([¬ification]() { + ENVOY_LOG_MISC(info, "Run on main thread."); + notification.Notify(); + }); + notification.WaitForNotification(); + }; + run_on_main_thread_and_wait_for_completion(); // Make sure the deferred deletion of "cluster_1" is done. - runOnWorkerThreadsAndWaitforCompletion( - test_server_->server(), []() { ENVOY_LOG_MISC(error, "DDD run on all threads."); }); - absl::Notification notification; - test_server_->server().dispatcher().post([¬ification]() { notification.Notify(); }); - notification.WaitForNotification(); + runOnWorkerThreadsAndWaitforCompletion(test_server_->server(), + []() { ENVOY_LOG_MISC(info, "Run on all threads."); }); + run_on_main_thread_and_wait_for_completion(); + runOnWorkerThreadsAndWaitforCompletion(test_server_->server(), + []() { ENVOY_LOG_MISC(info, "Run on all threads."); }); + // Now the stats are gone. if (this->enableLazyInitStats()) { - auto DDD = test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"); - ENVOY_LOG_MISC(error, "DDD {} ", DDD ? DDD->value() : -999); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); } EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); From 3b74ba9a4e3dd75f0833175be23e4a5465d7cfd8 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 6 Jan 2023 09:09:34 -0500 Subject: [PATCH 057/122] adjust how racing removed between testing and Envoy threads. Signed-off-by: Xin Zhuang --- test/integration/cds_integration_test.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 7835dfa31d3dc..89b9823418eac 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -281,6 +281,11 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + // This sleep is necessary to remove the race between testing thread and main thread, to make + // sure that the deferred deletion callbacks of the TLS 'cluster_1' queued in main and worker + // threads dispatchers first. + absl::SleepFor(absl::Seconds(1)); + auto run_on_main_thread_and_wait_for_completion = [this]() { absl::Notification notification; test_server_->server().dispatcher().post([¬ification]() { @@ -294,8 +299,6 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { runOnWorkerThreadsAndWaitforCompletion(test_server_->server(), []() { ENVOY_LOG_MISC(info, "Run on all threads."); }); run_on_main_thread_and_wait_for_completion(); - runOnWorkerThreadsAndWaitforCompletion(test_server_->server(), - []() { ENVOY_LOG_MISC(info, "Run on all threads."); }); // Now the stats are gone. if (this->enableLazyInitStats()) { From 9083edead85276c7ec78e0b5b45b0485708454e4 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 6 Jan 2023 10:23:39 -0500 Subject: [PATCH 058/122] again adjust how racing removed between testing and Envoy threads. Signed-off-by: Xin Zhuang --- test/integration/cds_integration_test.cc | 37 +++++++++++------------- 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 89b9823418eac..b3586f027f0db 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -281,30 +281,27 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); - // This sleep is necessary to remove the race between testing thread and main thread, to make - // sure that the deferred deletion callbacks of the TLS 'cluster_1' queued in main and worker - // threads dispatchers first. - absl::SleepFor(absl::Seconds(1)); - - auto run_on_main_thread_and_wait_for_completion = [this]() { - absl::Notification notification; - test_server_->server().dispatcher().post([¬ification]() { - ENVOY_LOG_MISC(info, "Run on main thread."); - notification.Notify(); - }); - notification.WaitForNotification(); - }; - run_on_main_thread_and_wait_for_completion(); - // Make sure the deferred deletion of "cluster_1" is done. - runOnWorkerThreadsAndWaitforCompletion(test_server_->server(), - []() { ENVOY_LOG_MISC(info, "Run on all threads."); }); - run_on_main_thread_and_wait_for_completion(); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); + // Add "cluster_2". + sendDiscoveryResponse( + Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {ClusterName1}, "43"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); + EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // +1, +1, +2 - // Now the stats are gone. if (this->enableLazyInitStats()) { + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // No cluster_2 stats yet. + EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); + } else { + // cluster_1 stats are gone. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // cluster_2 stats created. + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); } - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); } // Test the fast addition and removal of clusters when they use ThreadAwareLb. From 6c8b41a882d2263dc778061f2aed223bbfd346d5 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 9 Jan 2023 12:41:09 -0500 Subject: [PATCH 059/122] fixes for joshua comments Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 2 ++ envoy/stats/stats.h | 5 +++- envoy/upstream/upstream.h | 6 ++-- source/common/stats/lazy_init.h | 28 ++++++++++++------ source/common/upstream/upstream_impl.cc | 10 +++---- source/common/upstream/upstream_impl.h | 8 ++--- .../clusters/aggregate/cluster_test.cc | 5 ++-- .../buffer_accounting_integration_test.cc | 28 ++++++++++++++++++ test/integration/cds_integration_test.cc | 13 ++++++--- test/integration/http_integration.cc | 29 ------------------- test/integration/http_integration.h | 2 -- test/mocks/upstream/cluster_info.cc | 2 +- test/mocks/upstream/cluster_info.h | 4 +-- 13 files changed, 80 insertions(+), 62 deletions(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index d052bce932ab6..1e450b8f010d8 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -164,6 +164,8 @@ message Bootstrap { repeated metrics.v3.StatsSink stats_sinks = 6; // When true, enable lazy init feature for stats that's of Stats::LazyInit type. + // List of lazy init compatible stats: + // * ClusterTrafficStats bool enable_lazyinit_stats = 37; // Configuration for internal processing of stats. diff --git a/envoy/stats/stats.h b/envoy/stats/stats.h index a97de72e2b69f..3bed8c48d610c 100644 --- a/envoy/stats/stats.h +++ b/envoy/stats/stats.h @@ -209,7 +209,10 @@ using SizeFn = std::function; */ template using StatFn = std::function; -// Template that lazy-init a StatsStruct. +// Template that lazily initializes a StatsStruct. +// The bootstrap config :ref:`enable_lazyinit_stats +// ` decides if stats lazy +// initialzation is enabled or not. template class LazyInit; template class DirectStats; diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 473bf975a9547..5b4a8637ea1c8 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -34,7 +34,7 @@ namespace Envoy { namespace Stats { -template class LazyableInterface; +template class LazyCompatibleInterface; } namespace Http { @@ -772,7 +772,7 @@ MAKE_STAT_NAMES_STRUCT(ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); MAKE_STATS_STRUCT(ClusterTrafficStats, ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); using LazyInitClusterTrafficStats = Stats::LazyInit; using DirectInitClusterTrafficStats = Stats::DirectStats; -using LazyableClusterTrafficStats = Stats::LazyableInterface; +using LazyCompatibleClusterTrafficStats = Stats::LazyCompatibleInterface; MAKE_STAT_NAMES_STRUCT(ClusterLoadReportStatNames, ALL_CLUSTER_LOAD_REPORT_STATS); MAKE_STATS_STRUCT(ClusterLoadReportStats, ClusterLoadReportStatNames, @@ -1075,7 +1075,7 @@ class ClusterInfo : public Http::FilterChainFactory { /** * @return all traffic related stats for this cluster. */ - virtual LazyableClusterTrafficStats& trafficStats() const PURE; + virtual LazyCompatibleClusterTrafficStats& trafficStats() const PURE; /** * @return the stats scope that contains all cluster stats. This can be used to produce dynamic * stats that will be freed when the cluster is removed. diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 79a8557e29bf2..9340526f7e256 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -5,12 +5,20 @@ namespace Envoy { namespace Stats { -template class LazyableInterface { +/** + * Interface for stats lazy initialization. + * To reduce memory and CPU consumption, Envoy can enable the bootstrap config + * :ref:`enable_lazyinit_stats + * `. + * A 'StatsStructType' is only created when any of its field is referenced. + * See more context: https://github.com/envoyproxy/envoy/issues/23575 + */ +template class LazyCompatibleInterface { public: // Helper operators to get-or-create and return the StatsStructType object. virtual StatsStructType* operator->() PURE; virtual StatsStructType& operator*() PURE; - virtual ~LazyableInterface() {} + virtual ~LazyCompatibleInterface() = default; }; /** @@ -19,18 +27,19 @@ template class LazyableInterface { * * This class is thread-safe -- instantiations can occur on multiple concurrent threads. */ -template class LazyInit : public LazyableInterface { +template +class LazyInit : public LazyCompatibleInterface { public: // Capture the stat names object and the scope with a ctor, that can be used to instantiate a // StatsStructType object later. // Caller should make sure scope and stat_names outlive this object. - LazyInit(const typename StatsStructType::StatNameType& stat_names, Stats::Scope& scope) + LazyInit(const typename StatsStructType::StatNameType& stat_names, Stats::ScopeSharedPtr scope) : inited_(Stats::Utility::gaugeFromElements( - scope, {Stats::DynamicName(StatsStructType::typeName()), Stats::DynamicName("inited")}, - Stats::Gauge::ImportMode::NeverImport)), - ctor_([&scope, &stat_names, this]() -> StatsStructType* { + *scope, {Stats::DynamicName(StatsStructType::typeName()), Stats::DynamicName("inited")}, + Stats::Gauge::ImportMode::Accumulate)), + ctor_([scope = std::move(scope), &stat_names, this]() -> StatsStructType* { inited_.inc(); - return new StatsStructType(stat_names, scope); + return new StatsStructType(stat_names, *scope); }) { if (inited_.value() > 0) { instantiate(); @@ -56,7 +65,8 @@ template class LazyInit : public LazyableInterface class DirectStats : public LazyableInterface { +template +class DirectStats : public LazyCompatibleInterface { public: DirectStats(const typename StatsStructType::StatNameType& stat_names, Stats::Scope& scope) : stats_(stat_names, scope) {} diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 89eeb0b38c2e7..97575afe32efe 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -846,13 +846,13 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add } } -std::unique_ptr -ClusterInfoImpl::generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& stat_names, - bool lazyinit) { +std::unique_ptr +ClusterInfoImpl::generateStats(Stats::ScopeSharedPtr scope, + const ClusterTrafficStatNames& stat_names, bool lazyinit) { if (lazyinit) { return std::make_unique(stat_names, scope); } else { - return std::make_unique(stat_names, scope); + return std::make_unique(stat_names, *scope); } } @@ -999,7 +999,7 @@ ClusterInfoImpl::ClusterInfoImpl( per_connection_buffer_limit_bytes_( PROTOBUF_GET_WRAPPED_OR_DEFAULT(config, per_connection_buffer_limit_bytes, 1024 * 1024)), socket_matcher_(std::move(socket_matcher)), stats_scope_(std::move(stats_scope)), - traffic_stats_(generateStats(*stats_scope_, + traffic_stats_(generateStats(stats_scope_, factory_context.clusterManager().clusterStatNames(), server_context.statsConfig().enableLazyInitStats())), config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index e169a27ba3178..752282d5c94ef 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -705,8 +705,8 @@ class ClusterInfoImpl : public ClusterInfo, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static std::unique_ptr - generateStats(Stats::Scope& scope, const ClusterTrafficStatNames& cluster_stat_names, + static std::unique_ptr + generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& cluster_stat_names, bool lazyinit = false); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); @@ -797,7 +797,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - LazyableClusterTrafficStats& trafficStats() const override { + LazyCompatibleClusterTrafficStats& trafficStats() const override { ASSERT(traffic_stats_ != nullptr); return *traffic_stats_; } @@ -924,7 +924,7 @@ class ClusterInfoImpl : public ClusterInfo, const uint32_t per_connection_buffer_limit_bytes_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; - const std::unique_ptr traffic_stats_; + const std::unique_ptr traffic_stats_; mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 81176c50b7ea3..5953c9628eecd 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -33,7 +33,8 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin public: AggregateClusterTest() : stat_names_(stats_store_.symbolTable()), - traffic_stats_(Upstream::ClusterInfoImpl::generateStats(stats_store_, stat_names_)) { + traffic_stats_( + Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), stat_names_)) { ON_CALL(*primary_info_, name()).WillByDefault(ReturnRef(primary_name)); ON_CALL(*secondary_info_, name()).WillByDefault(ReturnRef(secondary_name)); } @@ -139,7 +140,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterTrafficStatNames stat_names_; - std::unique_ptr traffic_stats_; + std::unique_ptr traffic_stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/integration/buffer_accounting_integration_test.cc b/test/integration/buffer_accounting_integration_test.cc index de5bc872ebb04..abc9cc2e1bb6a 100644 --- a/test/integration/buffer_accounting_integration_test.cc +++ b/test/integration/buffer_accounting_integration_test.cc @@ -47,6 +47,34 @@ std::string protocolTestParamsAndBoolToString( : "without_per_stream_buffer_accounting"); } +void runOnWorkerThreadsAndWaitforCompletion(Server::Instance& server, std::function func) { + absl::Notification done_notification; + ThreadLocal::TypedSlotPtr<> slot; + Envoy::Thread::ThreadId main_tid; + server.dispatcher().post([&] { + slot = ThreadLocal::TypedSlot<>::makeUnique(server.threadLocal()); + slot->set( + [](Envoy::Event::Dispatcher&) -> std::shared_ptr { + return nullptr; + }); + + main_tid = server.api().threadFactory().currentThreadId(); + + slot->runOnAllThreads( + [main_tid, &server, &func](OptRef) { + // Run on the worker thread. + if (server.api().threadFactory().currentThreadId() != main_tid) { + func(); + } + }, + [&slot, &done_notification] { + slot.reset(nullptr); + done_notification.Notify(); + }); + }); + done_notification.WaitForNotification(); +} + void waitForNumTurns(std::vector& turns, absl::Mutex& mu, uint32_t expected_size) { absl::MutexLock l(&mu); diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index b3586f027f0db..92638dd3cbcd4 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -201,10 +201,12 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { // This line ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + Stats::GaugeSharedPtr cluster_1_trafficstats_inited = + test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"); + EXPECT_EQ(cluster_1_trafficstats_inited->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + EXPECT_EQ(cluster_1_trafficstats_inited->value(), 1); } else { EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); } @@ -239,7 +241,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { this->use_real_stats_ = true; initialize(); - // This line ensures that the ClusterInfoImpl is created already. + // Ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); if (this->enableLazyInitStats()) { EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); @@ -286,7 +288,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {ClusterName1}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); - EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // +1, +1, +2 + EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); if (this->enableLazyInitStats()) { // Now the cluster_1 stats are gone, as well as the lazy init wrapper. @@ -301,6 +303,9 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // cluster_2 stats created. EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); + // No lazy init gauges. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); } } diff --git a/test/integration/http_integration.cc b/test/integration/http_integration.cc index 4fa73cced88cc..71a29fd4f18e6 100644 --- a/test/integration/http_integration.cc +++ b/test/integration/http_integration.cc @@ -74,35 +74,6 @@ typeToCodecType(Http::CodecType type) { } // namespace -void runOnWorkerThreadsAndWaitforCompletion(Server::Instance& server, std::function func) { - absl::Notification done_notification; - ThreadLocal::TypedSlotPtr<> slot; - Envoy::Thread::ThreadId main_tid; - server.dispatcher().post([&] { - slot = ThreadLocal::TypedSlot<>::makeUnique(server.threadLocal()); - slot->set( - [](Envoy::Event::Dispatcher&) -> std::shared_ptr { - return nullptr; - }); - - main_tid = server.api().threadFactory().currentThreadId(); - - slot->runOnAllThreads( - [main_tid, &server, &func](OptRef) { - // Run on the worker thread. - if (server.api().threadFactory().currentThreadId() != main_tid) { - func(); - } - }, - [&slot, &done_notification] { - slot.reset(nullptr); - done_notification.Notify(); - }); - }); - done_notification.WaitForNotification(); -} - - IntegrationCodecClient::IntegrationCodecClient( Event::Dispatcher& dispatcher, Random::RandomGenerator& random, Network::ClientConnectionPtr&& conn, Upstream::HostDescriptionConstSharedPtr host_description, diff --git a/test/integration/http_integration.h b/test/integration/http_integration.h index 53300a532612c..9b71dfa6e4f08 100644 --- a/test/integration/http_integration.h +++ b/test/integration/http_integration.h @@ -26,8 +26,6 @@ enum class Http2Impl { Oghttp2, }; -// Runs 'func' on all worker threads. -void runOnWorkerThreadsAndWaitforCompletion(Server::Instance& server, std::function func); /** * HTTP codec client used during integration testing. */ diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index aa5226275bd7d..3a10da018c4fd 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -61,7 +61,7 @@ MockClusterInfo::MockClusterInfo() cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - traffic_stats_(ClusterInfoImpl::generateStats(stats_store_, traffic_stat_names_)), + traffic_stats_(ClusterInfoImpl::generateStats(stats_store_.rootScope(), traffic_stat_names_)), config_update_stats_(config_update_stats_names_, stats_store_), lb_stats_(lb_stat_names_, stats_store_), endpoint_stats_(endpoint_stat_names_, stats_store_), transport_socket_matcher_(new NiceMock()), diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index e94d94de979cf..f1992fadd6be1 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -152,7 +152,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); - MOCK_METHOD(LazyableClusterTrafficStats&, trafficStats, (), (const)); + MOCK_METHOD(LazyCompatibleClusterTrafficStats&, trafficStats, (), (const)); MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); @@ -210,7 +210,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; - std::unique_ptr traffic_stats_; + std::unique_ptr traffic_stats_; ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; From b2a7b12d83a237a9612d04f89f6fd45d856a05f8 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 9 Jan 2023 14:13:16 -0500 Subject: [PATCH 060/122] demonstrate that cluster update lose current stats if not checking the inited in lazyinit mode Signed-off-by: Xin Zhuang --- source/common/common/assert.h | 2 +- source/common/stats/lazy_init.h | 3 ++- test/integration/cds_integration_test.cc | 20 +++++++++++++------- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/source/common/common/assert.h b/source/common/common/assert.h index 5f2541a940b74..21d03248910fd 100644 --- a/source/common/common/assert.h +++ b/source/common/common/assert.h @@ -48,7 +48,7 @@ class EnvoyBugStackTrace : private Logger::Loggable { } private: - static const int kMaxStackDepth = 16; + static const int kMaxStackDepth = 30; void* stack_trace_[kMaxStackDepth]; int stack_depth_{0}; }; diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 9340526f7e256..dbfb560058632 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -42,7 +42,7 @@ class LazyInit : public LazyCompatibleInterface { return new StatsStructType(stat_names, *scope); }) { if (inited_.value() > 0) { - instantiate(); + // instantiate(); } } // Helper operators to get-or-create and return the StatsStructType object. @@ -56,6 +56,7 @@ class LazyInit : public LazyCompatibleInterface { private: inline StatsStructType* instantiate() { return internal_stats_.get(ctor_); } + // For Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 92638dd3cbcd4..3c356cd5ef080 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -259,25 +259,31 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); ASSERT_TRUE(response->complete()); cleanupUpstreamAndDownstream(); + if (this->enableLazyInitStats()) { EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Now update cluster1. envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster1_}, {cluster1_}, {}, "42"); + sendDiscoveryResponse( + Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); // Now the ClusterTrafficStats.inited gauge is still 1. + // if (this->enableLazyInitStats()) { + // EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + // } + absl::SleepFor(absl::Seconds(3)); if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + // Cluster 1 traffic stats lost. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + } else { + // Cluster 1 traffic stats not lost. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } - // Cluster traffic stats not lost. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, @@ -305,7 +311,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); // No lazy init gauges. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); } } From c46e22f6523329c007265268deba8bd2dff48d75 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 9 Jan 2023 14:25:34 -0500 Subject: [PATCH 061/122] revert the demonstration Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 7 +++++-- test/integration/cds_integration_test.cc | 12 +++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index dbfb560058632..b22ebaa776651 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -42,7 +42,7 @@ class LazyInit : public LazyCompatibleInterface { return new StatsStructType(stat_names, *scope); }) { if (inited_.value() > 0) { - // instantiate(); + instantiate(); } } // Helper operators to get-or-create and return the StatsStructType object. @@ -56,7 +56,10 @@ class LazyInit : public LazyCompatibleInterface { private: inline StatsStructType* instantiate() { return internal_stats_.get(ctor_); } - // For + // If the 'internal_stats_' is already instantiated, i.e. inited_>0, we need to instantiated again + // to keep the corresponding stats around. E.g. when ClusterManager updates a cluster, if its + // ClusterTrafficStats is instantiated, the new version ClusterTrafficStats need to point to the + // same set of stats before the old version is deleted by ClusterManager. Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 3c356cd5ef080..cf83e21dd049d 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -273,17 +273,11 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); // Now the ClusterTrafficStats.inited gauge is still 1. - // if (this->enableLazyInitStats()) { - // EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - // } - absl::SleepFor(absl::Seconds(3)); if (this->enableLazyInitStats()) { - // Cluster 1 traffic stats lost. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - } else { - // Cluster 1 traffic stats not lost. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } + // Cluster 1 traffic stats not lost. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, From 4e9c10257e8249a672237eb34607df2df80ff3e5 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 9 Jan 2023 15:01:54 -0500 Subject: [PATCH 062/122] add another test on cluster stats for cluster create-destroy-recreate Signed-off-by: Xin Zhuang --- test/integration/cds_integration_test.cc | 87 +++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index cf83e21dd049d..bc05b98946400 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -237,7 +237,7 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { } // Test that TrafficStats lazyinit when configured. -TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { +TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { this->use_real_stats_ = true; initialize(); @@ -309,6 +309,91 @@ TEST_P(CdsIntegrationTest, TrafficStatsLazyInit) { } } +// Test that TrafficStats lazyinit when configured. +TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { + this->use_real_stats_ = true; + + initialize(); + // Ensures that the ClusterInfoImpl is created already. + test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); + if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + } else { + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); + } + auto send_http_request_to_cluster_1_and_wait_for_response = [&]() { + Http::TestRequestHeaderMapImpl request_headers{ + {":method", "GET"}, + {":path", "/cluster1"}, + {":scheme", "http"}, + {":authority", "host"}, + }; + BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( + lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); + ASSERT_TRUE(response->complete()); + cleanupUpstreamAndDownstream(); + }; + + send_http_request_to_cluster_1_and_wait_for_response(); + if (this->enableLazyInitStats()) { + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + } + // Cluster_1 trafficStats updated. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + // Remove "cluster_1". + sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, + {ClusterName1}, "42"); + // Add "cluster_2". + sendDiscoveryResponse( + Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {ClusterName1}, "43"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); + EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); + + if (this->enableLazyInitStats()) { + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // No cluster_2 stats yet. + EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); + } else { + // cluster_1 stats are gone. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // cluster_2 stats created. + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); + // No lazy init gauges. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); + } + + // Now readd cluster1. + envoy::config::cluster::v3::Cluster cluster1_updated = + cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), + Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); + sendDiscoveryResponse( + Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + if (this->enableLazyInitStats()) { + // Now the ClusterTrafficStats.inited gauge is 0, since it didn't see previous http request. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + } else { + // No traffic yet. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); + } + + send_http_request_to_cluster_1_and_wait_for_response(); + + if (this->enableLazyInitStats()) { + // Now the ClusterTrafficStats.inited gauge is 0, since it didn't see previous http request. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + } + // cluster_1 traffic stats updated. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); +} + // Test the fast addition and removal of clusters when they use ThreadAwareLb. TEST_P(CdsIntegrationTest, CdsClusterWithThreadAwareLbCycleUpDownUp) { // Calls our initialize(), which includes establishing a listener, route, and cluster. From 11c7b4400ceb5662045b7d21e756eda610c0fc2a Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 9 Jan 2023 17:03:40 -0500 Subject: [PATCH 063/122] add one more tests around stats update Signed-off-by: Xin Zhuang --- test/integration/BUILD | 2 +- test/integration/cds_integration_test.cc | 54 +++++++++++++----------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/test/integration/BUILD b/test/integration/BUILD index 3e0bb7df91c0e..51de92d12b1c2 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -117,7 +117,7 @@ envoy_cc_test( data = [ "//test/config/integration/certs", ], - shard_count = 8, + shard_count = 12, deps = [ ":http_integration_lib", "//source/common/config:protobuf_link_hacks", diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index bc05b98946400..ffaf776bde45d 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -236,12 +236,12 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { EXPECT_LE(cx_counter->value(), 1); } -// Test that TrafficStats lazyinit when configured. +// Test that TrafficStats gets created and updated correctly. TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { this->use_real_stats_ = true; initialize(); - // Ensures that the ClusterInfoImpl is created already. + // Ensure that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); if (this->enableLazyInitStats()) { EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); @@ -272,11 +272,13 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - // Now the ClusterTrafficStats.inited gauge is still 1. if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + // Now the ClusterTrafficStats.inited gauge >= 1, since there is a small race window between the + // testing thread fetching the value before the old version ClusterTrafficStats gets deleted + // from main thread and worker thread. + EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } - // Cluster 1 traffic stats not lost. + // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". @@ -285,8 +287,8 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); // Add "cluster_2". - sendDiscoveryResponse( - Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {ClusterName1}, "43"); + sendDiscoveryResponse(Config::TypeUrl::get().Cluster, + {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); @@ -309,7 +311,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { } } -// Test that TrafficStats lazyinit when configured. +// Test that TrafficStats with cluster_1 create-remove-create sequence. TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { this->use_real_stats_ = true; @@ -322,10 +324,10 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { } else { EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); } - auto send_http_request_to_cluster_1_and_wait_for_response = [&]() { + auto send_http_request_to_cluster_and_wait_for_response = [&](std::string cluster_name) { Http::TestRequestHeaderMapImpl request_headers{ {":method", "GET"}, - {":path", "/cluster1"}, + {":path", absl::StrCat("/", cluster_name)}, {":scheme", "http"}, {":authority", "host"}, }; @@ -334,8 +336,8 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { ASSERT_TRUE(response->complete()); cleanupUpstreamAndDownstream(); }; + send_http_request_to_cluster_and_wait_for_response("cluster_1"); - send_http_request_to_cluster_1_and_wait_for_response(); if (this->enableLazyInitStats()) { EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } @@ -344,37 +346,40 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); + test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); // Add "cluster_2". - sendDiscoveryResponse( - Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {ClusterName1}, "43"); - test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); + sendDiscoveryResponse(Config::TypeUrl::get().Cluster, + {cluster2_}, {cluster2_}, {}, "43"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); - if (this->enableLazyInitStats()) { - // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // No cluster_2 stats yet. EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); - } else { - // cluster_1 stats are gone. + + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + } else { // cluster_2 stats created. EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); + // cluster_1 stats are gone. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // No lazy init gauges. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); } - // Now readd cluster1. + // Now add cluster1 again. envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); - test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); if (this->enableLazyInitStats()) { // Now the ClusterTrafficStats.inited gauge is 0, since it didn't see previous http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); @@ -384,14 +389,13 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); } - send_http_request_to_cluster_1_and_wait_for_response(); - + send_http_request_to_cluster_and_wait_for_response("cluster_1"); if (this->enableLazyInitStats()) { // Now the ClusterTrafficStats.inited gauge is 0, since it didn't see previous http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } // cluster_1 traffic stats updated. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } // Test the fast addition and removal of clusters when they use ThreadAwareLb. From de935dc51b518101e180c6c8ac92598b0fe609b9 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 10 Jan 2023 10:06:57 -0500 Subject: [PATCH 064/122] fix sync issues Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 3 +-- test/common/tcp/conn_pool_test.cc | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 0756f6011bcd3..aa25b389518b3 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -32,8 +32,7 @@ class LazyInitStatsBenchmarkBase { auto scope = stat_store_.createScope(new_cluster_name); scopes_.push_back(scope); if (lazy_init_) { - auto lazy_stat = - std::make_shared>(stat_names_, *scope); + auto lazy_stat = std::make_shared>(stat_names_, scope); lazy_stats_.push_back(lazy_stat); if (!defer_init) { *(*lazy_stat); diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index 819e76e6f4982..cbf292ba47161 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -458,7 +458,7 @@ TEST_F(TcpConnPoolImplTest, IdleTimerCloseConnections) { // Note that this is pool level idle instead of client/connection level. EXPECT_TRUE(conn_pool_->isIdle()); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_idle_timeout_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_idle_timeout_.value()); } /** From b23b659458b1794367be5d4edfd96db80a3adae3 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 10 Jan 2023 11:20:42 -0500 Subject: [PATCH 065/122] spelling errors fix Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 8 ++++---- source/server/configuration_impl.cc | 2 +- test/common/stats/real_thread_test_base.h | 4 ++-- test/integration/cds_integration_test.cc | 8 ++++---- tools/spelling/spelling_dictionary.txt | 1 + 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index b22ebaa776651..6d09707ba8353 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -56,10 +56,10 @@ class LazyInit : public LazyCompatibleInterface { private: inline StatsStructType* instantiate() { return internal_stats_.get(ctor_); } - // If the 'internal_stats_' is already instantiated, i.e. inited_>0, we need to instantiated again - // to keep the corresponding stats around. E.g. when ClusterManager updates a cluster, if its - // ClusterTrafficStats is instantiated, the new version ClusterTrafficStats need to point to the - // same set of stats before the old version is deleted by ClusterManager. + // If the 'internal_stats_' is already instantiated, i.e. 'inited_'>0, we need to instantiated + // again to keep the corresponding stats around. E.g. when ClusterManager updates a cluster, if + // its ClusterTrafficStats is instantiated, the new version ClusterTrafficStats need to point to + // the same set of stats before the old version is deleted by ClusterManager. Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index dcef0b098fd08..d9a918bb51a08 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -109,7 +109,7 @@ void MainImpl::initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstr server.listenerManager().addOrUpdateListener(listeners[i], "", false); } initializeWatchdogs(bootstrap, server); - // This has to happen after ClusterManager initilization, as it depends on config from + // This has to happen after ClusterManager initialization, as it depends on config from // ClusterManager. loadSinksIntoStatsConfig(bootstrap, server); } diff --git a/test/common/stats/real_thread_test_base.h b/test/common/stats/real_thread_test_base.h index 30982e39148f7..fc7b4ed29d18c 100644 --- a/test/common/stats/real_thread_test_base.h +++ b/test/common/stats/real_thread_test_base.h @@ -23,8 +23,8 @@ class ThreadLocalStoreNoMocksTestBase { StatNamePool pool_; }; -// Helper base class for threadlocal stats testing in multiple-workers setup. -// This is used in threadlocal store tests. +// Helper base class for thread local stats testing in multiple-workers setup. +// This is used in thread local store tests. class ThreadLocalRealThreadsTestBase : public Thread::RealThreadsTestHelper, public ThreadLocalStoreNoMocksTestBase { protected: diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index ffaf776bde45d..cc1b012e35f4a 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -273,8 +273,8 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); if (this->enableLazyInitStats()) { - // Now the ClusterTrafficStats.inited gauge >= 1, since there is a small race window between the - // testing thread fetching the value before the old version ClusterTrafficStats gets deleted + // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between + // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted // from main thread and worker thread. EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } @@ -381,7 +381,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); if (this->enableLazyInitStats()) { - // Now the ClusterTrafficStats.inited gauge is 0, since it didn't see previous http request. + // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); } else { @@ -391,7 +391,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { send_http_request_to_cluster_and_wait_for_response("cluster_1"); if (this->enableLazyInitStats()) { - // Now the ClusterTrafficStats.inited gauge is 0, since it didn't see previous http request. + // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); } // cluster_1 traffic stats updated. diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index e73fcaf46d15b..ec49a68777eae 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -52,6 +52,7 @@ DSR DSS EBADF ECH +enable_lazyinit_stats ENDIF ENOTCONN ENQ From c503108439769c67197b544e88c6bf716bfa0531 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 11 Jan 2023 14:53:57 -0500 Subject: [PATCH 066/122] fix comments Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 22 ++++++++++++++----- source/common/upstream/upstream_impl.h | 2 +- source/server/configuration_impl.cc | 3 ++- source/server/configuration_impl.h | 2 +- .../common/stats/lazyinit_stats_speed_test.cc | 3 +-- .../clusters/aggregate/cluster_test.cc | 2 +- test/mocks/upstream/cluster_info.cc | 3 ++- tools/spelling/spelling_dictionary.txt | 1 - 8 files changed, 25 insertions(+), 13 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 6d09707ba8353..14bb542283b83 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -43,6 +43,7 @@ class LazyInit : public LazyCompatibleInterface { }) { if (inited_.value() > 0) { instantiate(); + ctor_ = nullptr; } } // Helper operators to get-or-create and return the StatsStructType object. @@ -56,11 +57,22 @@ class LazyInit : public LazyCompatibleInterface { private: inline StatsStructType* instantiate() { return internal_stats_.get(ctor_); } - // If the 'internal_stats_' is already instantiated, i.e. 'inited_'>0, we need to instantiated - // again to keep the corresponding stats around. E.g. when ClusterManager updates a cluster, if - // its ClusterTrafficStats is instantiated, the new version ClusterTrafficStats need to point to - // the same set of stats before the old version is deleted by ClusterManager. - Gauge& inited_; + + // In order to preserve stat value continuity across a config reload, we need to automatically + // re-instantiate lazy stats when they are constructed, if there is already a live instantiation + // to the same stats. Consider the following alternate scenarios: + + // Scenario 1: a cluster is instantiated but receives no requests, so its traffic-related stats + // are never instantiated. When this cluster gets reloaded on a config update, a new lazy-init + // block is created, but the stats should again not be instaniated. + + // Scenario 2: a cluster is instantiated and receives traffic, so its traffic-related stats are + // instantiated. We must ensure that a new instance for the same cluster gets its lazy-stats + // instantiated before the previous cluster of the same name is destructed. + + // To do that we keep an "inited" stat in the cluster's scope, which will be associated by name to + // the previous generation's cluster's lazy-init block. We use the value in this shared gauge to + // determine whether to instantiate the lazy block on construction. Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. std::function ctor_; diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 752282d5c94ef..22f064eb01290 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -707,7 +707,7 @@ class ClusterInfoImpl : public ClusterInfo, static std::unique_ptr generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& cluster_stat_names, - bool lazyinit = false); + bool lazyinit); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); static ClusterCircuitBreakersStats diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index d9a918bb51a08..15953959488b2 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -89,7 +89,8 @@ void MainImpl::initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstr initializeTracers(bootstrap.tracing(), server); // stats_config_ should be set before creating the ClusterManagers so that it is available - // from the ServerFactoryContext when creating the static clusters and stats sinks. + // from the ServerFactoryContext when creating the static clusters and stats sinks, where + // stats lazy-init setting is read. stats_config_ = std::make_unique(bootstrap); const auto& secrets = bootstrap.static_resources().secrets(); diff --git a/source/server/configuration_impl.h b/source/server/configuration_impl.h index b2cbb9b0c47bb..eef6e5f5ad331 100644 --- a/source/server/configuration_impl.h +++ b/source/server/configuration_impl.h @@ -62,7 +62,7 @@ class StatsConfigImpl : public StatsConfig { std::list sinks_; std::chrono::milliseconds flush_interval_; bool flush_on_admin_{false}; - bool enable_lazyinit_stats_ = false; + bool enable_lazyinit_stats_{false}; }; /** diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index aa25b389518b3..0f9a58a45a562 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -15,7 +15,6 @@ #include "benchmark/benchmark.h" namespace Envoy { - namespace Stats { using Upstream::ClusterTrafficStats; @@ -29,7 +28,7 @@ class LazyInitStatsBenchmarkBase { void createStats(bool defer_init) { for (uint64_t i = 0; i < num_clusters_; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); - auto scope = stat_store_.createScope(new_cluster_name); + Stats::ScopeSharedPtr scope = stat_store_.createScope(new_cluster_name); scopes_.push_back(scope); if (lazy_init_) { auto lazy_stat = std::make_shared>(stat_names_, scope); diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 5953c9628eecd..cb17edf04c77c 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -34,7 +34,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin AggregateClusterTest() : stat_names_(stats_store_.symbolTable()), traffic_stats_( - Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), stat_names_)) { + Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), stat_names_, false)) { ON_CALL(*primary_info_, name()).WillByDefault(ReturnRef(primary_name)); ON_CALL(*secondary_info_, name()).WillByDefault(ReturnRef(secondary_name)); } diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 1361246acf1f9..af360237b6562 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -61,7 +61,8 @@ MockClusterInfo::MockClusterInfo() cluster_circuit_breakers_stat_names_(stats_store_.symbolTable()), cluster_request_response_size_stat_names_(stats_store_.symbolTable()), cluster_timeout_budget_stat_names_(stats_store_.symbolTable()), - traffic_stats_(ClusterInfoImpl::generateStats(stats_store_.rootScope(), traffic_stat_names_)), + traffic_stats_( + ClusterInfoImpl::generateStats(stats_store_.rootScope(), traffic_stat_names_, false)), config_update_stats_(config_update_stats_names_, *stats_store_.rootScope()), lb_stats_(lb_stat_names_, *stats_store_.rootScope()), endpoint_stats_(endpoint_stat_names_, *stats_store_.rootScope()), diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index ec49a68777eae..e73fcaf46d15b 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -52,7 +52,6 @@ DSR DSS EBADF ECH -enable_lazyinit_stats ENDIF ENOTCONN ENQ From f210a7489d57b7f0c5ba15656ce06541869870e0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 11 Jan 2023 14:55:52 -0500 Subject: [PATCH 067/122] fix comments Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 14bb542283b83..e55cef12023ee 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -72,7 +72,8 @@ class LazyInit : public LazyCompatibleInterface { // To do that we keep an "inited" stat in the cluster's scope, which will be associated by name to // the previous generation's cluster's lazy-init block. We use the value in this shared gauge to - // determine whether to instantiate the lazy block on construction. Gauge& inited_; + // determine whether to instantiate the lazy block on construction. + Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. std::function ctor_; From 2830373aa89b0ad1a9564b7094af738c6239cf97 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 11 Jan 2023 15:22:50 -0500 Subject: [PATCH 068/122] update doc. Signed-off-by: Xin Zhuang --- changelogs/current.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelogs/current.yaml b/changelogs/current.yaml index 8b873442e34b8..5de6521114ca3 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -320,5 +320,8 @@ new_features: change: | added an api configuration :ref:`xds_config_tracker_extension ` in the bootstrap to allow tracking xDS responses in external components, and provided the extension interface. +- area: stats + change: | + added config :ref:`enable_lazyinit_stats `. When set to true, enable lazy-init on stats structures like ClusterTrafficStats. deprecated: From 4416b0e600e151872a13098793744556caac0be6 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 13 Jan 2023 16:04:33 -0500 Subject: [PATCH 069/122] fix sync Signed-off-by: Xin Zhuang --- test/extensions/clusters/aggregate/cluster_test.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index ec46c4bc36e85..3faae3164df41 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -33,7 +33,8 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin public: AggregateClusterTest() : stat_names_(stats_store_.symbolTable()), - stats_(Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), stat_names_)) { + stats_(Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), stat_names_, + false)) { ON_CALL(*primary_info_, name()).WillByDefault(ReturnRef(primary_name)); ON_CALL(*secondary_info_, name()).WillByDefault(ReturnRef(secondary_name)); } From a2454c1f6b951ec861a95550f2e8b9ae68464ef0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 13 Jan 2023 16:07:38 -0500 Subject: [PATCH 070/122] fix sync 2 Signed-off-by: Xin Zhuang --- test/extensions/clusters/aggregate/cluster_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 3faae3164df41..74bae9965eb19 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -33,8 +33,8 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin public: AggregateClusterTest() : stat_names_(stats_store_.symbolTable()), - stats_(Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), stat_names_, - false)) { + traffic_stats_(Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), + stat_names_, false)) { ON_CALL(*primary_info_, name()).WillByDefault(ReturnRef(primary_name)); ON_CALL(*secondary_info_, name()).WillByDefault(ReturnRef(secondary_name)); } From 895d8c5c5426005b234dcf04ecea2bcb9366148a Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 13 Jan 2023 16:35:09 -0500 Subject: [PATCH 071/122] remove the Stats:: Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 16 ++++++++-------- test/common/tcp/conn_pool_test.cc | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 0d0f47b2c8fb7..0f0d0f7d6d7f9 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -21,17 +21,17 @@ using Upstream::ClusterTrafficStats; class LazyInitStatsBenchmarkBase { public: - LazyInitStatsBenchmarkBase(bool lazy, const uint64_t n_clusters, Stats::Store& s) + LazyInitStatsBenchmarkBase(bool lazy, const uint64_t n_clusters, Store& s) : lazy_init_(lazy), num_clusters_(n_clusters), stat_store_(s), stat_names_(stat_store_.symbolTable()) {} void createStats(bool defer_init) { for (uint64_t i = 0; i < num_clusters_; ++i) { std::string new_cluster_name = absl::StrCat("cluster_", i); - Stats::ScopeSharedPtr scope = stat_store_.createScope(new_cluster_name); + ScopeSharedPtr scope = stat_store_.createScope(new_cluster_name); scopes_.push_back(scope); if (lazy_init_) { - auto lazy_stat = std::make_shared>(stat_names_, scope); + auto lazy_stat = std::make_shared>(stat_names_, scope); lazy_stats_.push_back(lazy_stat); if (!defer_init) { *(*lazy_stat); @@ -44,16 +44,16 @@ class LazyInitStatsBenchmarkBase { const bool lazy_init_; const uint64_t num_clusters_; - Stats::Store& stat_store_; - std::vector scopes_; - std::vector>> lazy_stats_; + Store& stat_store_; + std::vector scopes_; + std::vector>> lazy_stats_; std::vector> normal_stats_; Upstream::ClusterTrafficStatNames stat_names_; }; // Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. void benchmarkLazyInitCreation(::benchmark::State& state) { - Stats::IsolatedStoreImpl stats_store; + IsolatedStoreImpl stats_store; LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); for (auto _ : state) { // NOLINT: Silences warning about dead store @@ -67,7 +67,7 @@ BENCHMARK(benchmarkLazyInitCreation) // Benchmark lazy-init of stats in same thread, mimics main thread creation. void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { - Stats::IsolatedStoreImpl stats_store; + IsolatedStoreImpl stats_store; LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); for (auto _ : state) { // NOLINT: Silences warning about dead store diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index cbf292ba47161..5ce4c9329b50a 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -769,7 +769,7 @@ TEST_F(TcpConnPoolImplTest, LocalConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::LocalConnectionFailure, callbacks.reason_); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); } From 9097fbe0f030be5d10199b9c695671667eaa69b0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 13 Jan 2023 16:36:14 -0500 Subject: [PATCH 072/122] revert the unintended code change Signed-off-by: Xin Zhuang --- test/common/tcp/conn_pool_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index 5ce4c9329b50a..cbf292ba47161 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -769,7 +769,7 @@ TEST_F(TcpConnPoolImplTest, LocalConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::LocalConnectionFailure, callbacks.reason_); - EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); } From 98fa391d0e63cb76ac1d6b461c077b2299ead1f1 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 20 Jan 2023 17:39:01 -0500 Subject: [PATCH 073/122] fix josh comments Signed-off-by: Xin Zhuang --- changelogs/current.yaml | 2 +- .../observability/statistics.rst | 6 + source/common/common/assert.h | 2 +- source/common/stats/lazy_init.h | 15 +- source/common/upstream/upstream_impl.cc | 7 +- test/common/grpc/grpc_client_integration.h | 25 ---- test/integration/base_integration_test.h | 26 ---- test/integration/cds_integration_test.cc | 136 ++++++------------ 8 files changed, 68 insertions(+), 151 deletions(-) diff --git a/changelogs/current.yaml b/changelogs/current.yaml index ae58287a795b2..1b82d77281a35 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -328,6 +328,6 @@ new_features: to allow tracking xDS responses in external components, and provided the extension interface. - area: stats change: | - added config :ref:`enable_lazyinit_stats `. When set to true, enable lazy-init on stats structures like ClusterTrafficStats. + added config :ref:`enable_lazyinit_stats `. When set to true, enables lazy-init on stats structures like ClusterTrafficStats. deprecated: diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 1ff0d8957811a..09b742cc8e213 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -37,4 +37,10 @@ Internally, counters and gauges are batched and periodically flushed to improve Histograms are written as they are received. Note: what were previously referred to as timers have become histograms as the only difference between the two representations was the units. +Lazy Init of Stats +================= + +When :ref:`enable_lazyinit_stats ` is enabled in Bootstrap, for stats that supports the LazyCompatibleInterface, +the actual stats struct creation is deferred to first access of any member of that stats. E.g. when enabled, A ClusterTrafficStats structure is only created when any member of ClusterInfoImpl::trafficStats() is accessed. + * :ref:`v3 API reference `. diff --git a/source/common/common/assert.h b/source/common/common/assert.h index 21d03248910fd..5f2541a940b74 100644 --- a/source/common/common/assert.h +++ b/source/common/common/assert.h @@ -48,7 +48,7 @@ class EnvoyBugStackTrace : private Logger::Loggable { } private: - static const int kMaxStackDepth = 30; + static const int kMaxStackDepth = 16; void* stack_trace_[kMaxStackDepth]; int stack_depth_{0}; }; diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index e55cef12023ee..d3985ba418a6a 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -5,6 +5,9 @@ namespace Envoy { namespace Stats { +template class DirectStats; +template class LazyInit; + /** * Interface for stats lazy initialization. * To reduce memory and CPU consumption, Envoy can enable the bootstrap config @@ -15,6 +18,16 @@ namespace Stats { */ template class LazyCompatibleInterface { public: + static std::unique_ptr + create(Stats::ScopeSharedPtr scope, const typename StatsStructType::StatNameType& stat_names, + bool lazyinit) { + if (lazyinit) { + return std::make_unique>(stat_names, scope); + } else { + return std::make_unique>(stat_names, *scope); + } + } + // Helper operators to get-or-create and return the StatsStructType object. virtual StatsStructType* operator->() PURE; virtual StatsStructType& operator*() PURE; @@ -73,7 +86,7 @@ class LazyInit : public LazyCompatibleInterface { // To do that we keep an "inited" stat in the cluster's scope, which will be associated by name to // the previous generation's cluster's lazy-init block. We use the value in this shared gauge to // determine whether to instantiate the lazy block on construction. - Gauge& inited_; + Gauge& inited_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it // when the nested object is created. std::function ctor_; diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 805ac74796b0d..e7aa794f2e7ad 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -48,6 +48,7 @@ #include "source/common/router/config_utility.h" #include "source/common/runtime/runtime_features.h" #include "source/common/runtime/runtime_impl.h" +#include "source/common/stats/lazy_init.h" #include "source/common/upstream/cluster_factory_impl.h" #include "source/common/upstream/health_checker_impl.h" #include "source/extensions/filters/network/http_connection_manager/config.h" @@ -849,11 +850,7 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add std::unique_ptr ClusterInfoImpl::generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& stat_names, bool lazyinit) { - if (lazyinit) { - return std::make_unique(stat_names, scope); - } else { - return std::make_unique(stat_names, *scope); - } + return Stats::LazyCompatibleInterface::create(scope, stat_names, lazyinit); } ClusterRequestResponseSizeStats ClusterInfoImpl::generateRequestResponseSizeStats( diff --git a/test/common/grpc/grpc_client_integration.h b/test/common/grpc/grpc_client_integration.h index cbf37d37f6ea2..84abeda51cf35 100644 --- a/test/common/grpc/grpc_client_integration.h +++ b/test/common/grpc/grpc_client_integration.h @@ -120,25 +120,6 @@ class DeltaSotwIntegrationParamTest ClientType clientType() const override { return std::get<1>(GetParam()); } SotwOrDelta sotwOrDelta() const { return std::get<2>(GetParam()); } }; -class DeltaSotwStatsLazyInitIntegrationParamTest - : public BaseGrpcClientIntegrationParamTest, - public testing::TestWithParam< - std::tuple> { -public: - ~DeltaSotwStatsLazyInitIntegrationParamTest() override = default; - static std::string protocolTestParamsToString( - const ::testing::TestParamInfo< - std::tuple>& p) { - return fmt::format("{}_{}_{}_{}", TestUtility::ipVersionToString(std::get<0>(p.param)), - std::get<1>(p.param) == ClientType::GoogleGrpc ? "GoogleGrpc" : "EnvoyGrpc", - std::get<2>(p.param) == SotwOrDelta::Delta ? "Delta" : "StateOfTheWorld", - std::get<3>(p.param) ? "_LazyInitStats" : ""); - } - Network::Address::IpVersion ipVersion() const override { return std::get<0>(GetParam()); } - ClientType clientType() const override { return std::get<1>(GetParam()); } - SotwOrDelta sotwOrDelta() const { return std::get<2>(GetParam()); } - bool enableLazyInitStats() const { return std::get<3>(GetParam()); } -}; // Skip tests based on gRPC client type. #define SKIP_IF_GRPC_CLIENT(client_type) \ @@ -161,12 +142,6 @@ class DeltaSotwStatsLazyInitIntegrationParamTest testing::Combine(testing::ValuesIn(TestEnvironment::getIpVersionsForTest()), \ testing::ValuesIn(TestEnvironment::getsGrpcVersionsForTest()), \ testing::Values(Grpc::SotwOrDelta::Sotw, Grpc::SotwOrDelta::Delta)) -#define DELTA_SOTW_GRPC_CLIENT_LAZYINITSTATS_INTEGRATION_PARAMS \ - testing::Combine(testing::ValuesIn(TestEnvironment::getIpVersionsForTest()), \ - testing::ValuesIn(TestEnvironment::getsGrpcVersionsForTest()), \ - testing::Values(Grpc::SotwOrDelta::Sotw, Grpc::SotwOrDelta::Delta), \ - testing::Bool()) - #define UNIFIED_LEGACY_GRPC_CLIENT_INTEGRATION_PARAMS \ testing::Combine(testing::ValuesIn(TestEnvironment::getIpVersionsForTest()), \ testing::ValuesIn(TestEnvironment::getsGrpcVersionsForTest()), \ diff --git a/test/integration/base_integration_test.h b/test/integration/base_integration_test.h index e768335e38996..e099358f8dfaa 100644 --- a/test/integration/base_integration_test.h +++ b/test/integration/base_integration_test.h @@ -118,32 +118,6 @@ class BaseIntegrationTest : protected Logger::Loggable { void registerPort(const std::string& key, uint32_t port); uint32_t lookupPort(const std::string& key); - /** - * @brief Schedule a callback on main thread to force create the traffic stats for the given - * cluster. - * - * @param cluster_name name of the cluster. - * @return whether cluster is found. - */ - bool forceCreationOfClusterTrafficStats(absl::string_view cluster_name) { - // With https://github.com/envoyproxy/envoy/pull/23921 ClusterInfo::trafficStats is lazy init. - // We need to trigger creation of ClusterInfo::trafficStats() by calling the * operator. - absl::Notification notifier; - - bool cluster_found = false; - test_server_->server().dispatcher().post([&]() { - const Upstream::ClusterConstOptRef& cluster_ref = - test_server_->server().clusterManager().clusters().getCluster(cluster_name); - if (cluster_ref.has_value()) { - *cluster_ref->get().info()->trafficStats(); - cluster_found = true; - } - notifier.Notify(); - }); - notifier.WaitForNotification(); - return cluster_found; - } - // Set the endpoint's socket address to point at upstream at given index. void setUpstreamAddress(uint32_t upstream_index, envoy::config::endpoint::v3::LbEndpoint& endpoint) const; diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index cc1b012e35f4a..1ba2c4c78d46e 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -29,8 +29,7 @@ const char ClusterName2[] = "cluster_2"; const int UpstreamIndex1 = 1; const int UpstreamIndex2 = 2; -class CdsIntegrationTest : public Grpc::DeltaSotwStatsLazyInitIntegrationParamTest, - public HttpIntegrationTest { +class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public HttpIntegrationTest { public: CdsIntegrationTest() : HttpIntegrationTest(Http::CodecType::HTTP2, ipVersion(), @@ -45,9 +44,6 @@ class CdsIntegrationTest : public Grpc::DeltaSotwStatsLazyInitIntegrationParamTe sotwOrDelta() == Grpc::SotwOrDelta::UnifiedDelta) ? "true" : "false"); - config_helper_.addConfigModifier([this](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats(this->enableLazyInitStats()); - }); use_lds_ = false; sotw_or_delta_ = sotwOrDelta(); } @@ -146,7 +142,7 @@ class CdsIntegrationTest : public Grpc::DeltaSotwStatsLazyInitIntegrationParamTe }; INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, CdsIntegrationTest, - DELTA_SOTW_GRPC_CLIENT_LAZYINITSTATS_INTEGRATION_PARAMS); + DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); // 1) Envoy starts up with no static clusters (other than the CDS-over-gRPC server). // 2) Envoy is told of a cluster via CDS. @@ -200,16 +196,7 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); // This line ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - if (this->enableLazyInitStats()) { - Stats::GaugeSharedPtr cluster_1_trafficstats_inited = - test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"); - EXPECT_EQ(cluster_1_trafficstats_inited->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - ASSERT_TRUE(forceCreationOfClusterTrafficStats("cluster_1")); - EXPECT_EQ(cluster_1_trafficstats_inited->value(), 1); - } else { - EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - } + EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); Stats::CounterSharedPtr cx_counter = test_server_->counter("cluster.cluster_1.upstream_cx_total"); // Confirm no upstream connection is attempted so far. EXPECT_EQ(0, cx_counter->value()); @@ -236,19 +223,18 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { EXPECT_LE(cx_counter->value(), 1); } -// Test that TrafficStats gets created and updated correctly. -TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { +// Test that LazyInitTrafficStats gets created and updated correctly. +TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { this->use_real_stats_ = true; + config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_lazyinit_stats(true); + }); initialize(); // Ensure that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - } else { - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); - } + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); Http::TestRequestHeaderMapImpl request_headers{ {":method", "GET"}, {":path", "/cluster1"}, @@ -260,9 +246,7 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { ASSERT_TRUE(response->complete()); cleanupUpstreamAndDownstream(); - if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - } + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Now update cluster1. @@ -272,12 +256,10 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - if (this->enableLazyInitStats()) { - // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between - // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted - // from main thread and worker thread. - EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - } + // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between + // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted + // from main thread and worker thread. + EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); @@ -292,38 +274,27 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateUpdateDelete) { test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); - if (this->enableLazyInitStats()) { - // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - // No cluster_2 stats yet. - EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); - } else { - // cluster_1 stats are gone. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - // cluster_2 stats created. - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); - // No lazy init gauges. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); - } + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // No cluster_2 stats yet. + EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); } -// Test that TrafficStats with cluster_1 create-remove-create sequence. -TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { +// Test that LazyInitTrafficStats with cluster_1 create-remove-create sequence. +TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { this->use_real_stats_ = true; + config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_lazyinit_stats(true); + }); initialize(); // Ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - } else { - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); - } + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); auto send_http_request_to_cluster_and_wait_for_response = [&](std::string cluster_name) { Http::TestRequestHeaderMapImpl request_headers{ {":method", "GET"}, @@ -338,9 +309,8 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { }; send_http_request_to_cluster_and_wait_for_response("cluster_1"); - if (this->enableLazyInitStats()) { - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - } + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". @@ -353,25 +323,14 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); - if (this->enableLazyInitStats()) { - // No cluster_2 stats yet. - EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); - - // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - } else { - // cluster_2 stats created. - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); - // cluster_1 stats are gone. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - - // No lazy init gauges. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); - } + // No cluster_2 stats yet. + EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); + + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // Now add cluster1 again. envoy::config::cluster::v3::Cluster cluster1_updated = @@ -380,20 +339,13 @@ TEST_P(CdsIntegrationTest, TrafficStatsWithClusterCreateDeleteRecrete) { sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); - if (this->enableLazyInitStats()) { - // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - } else { - // No traffic yet. - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); - } + // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); send_http_request_to_cluster_and_wait_for_response("cluster_1"); - if (this->enableLazyInitStats()) { - // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - } + // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); // cluster_1 traffic stats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } From f004644cb61f7d2ba9e9bc230a2a1d7bd6646249 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 7 Feb 2023 12:57:35 -0500 Subject: [PATCH 074/122] fix merge issues Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 4 +- envoy/upstream/upstream.h | 2 - source/common/network/BUILD | 2 + .../network/happy_eyeballs_connection_impl.cc | 45 ++++++++++--------- test/integration/BUILD | 2 +- 5 files changed, 28 insertions(+), 27 deletions(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index 28fb4553d5743..c2342174d26cf 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -41,7 +41,7 @@ option (udpa.annotations.file_status).package_version_status = ACTIVE; // ` for more detail. // Bootstrap :ref:`configuration overview `. -// [#next-free-field: 38] +// [#next-free-field: 39] message Bootstrap { option (udpa.annotations.versioning).previous_message_type = "envoy.config.bootstrap.v2.Bootstrap"; @@ -166,7 +166,7 @@ message Bootstrap { // When true, enable lazy init feature for stats that's of Stats::LazyInit type. // List of lazy init compatible stats: // * ClusterTrafficStats - bool enable_lazyinit_stats = 37; + bool enable_lazyinit_stats = 38; // Configuration for internal processing of stats. metrics.v3.StatsConfig stats_config = 13; diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 9621b928388e6..f6d9754bca139 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -771,8 +771,6 @@ MAKE_STATS_STRUCT(ClusterLbStats, ClusterLbStatNames, ALL_CLUSTER_LB_STATS); */ MAKE_STAT_NAMES_STRUCT(ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); MAKE_STATS_STRUCT(ClusterTrafficStats, ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); -using LazyInitClusterTrafficStats = Stats::LazyInit; -using DirectInitClusterTrafficStats = Stats::DirectStats; using LazyCompatibleClusterTrafficStats = Stats::LazyCompatibleInterface; MAKE_STAT_NAMES_STRUCT(ClusterLoadReportStatNames, ALL_CLUSTER_LOAD_REPORT_STATS); diff --git a/source/common/network/BUILD b/source/common/network/BUILD index e76f6fca90afc..8a0f90b18f53a 100644 --- a/source/common/network/BUILD +++ b/source/common/network/BUILD @@ -128,6 +128,8 @@ envoy_cc_library( hdrs = ["happy_eyeballs_connection_impl.h"], deps = [ ":connection_base_lib", + "//source/common/stats:lazy_init", + ":connection_lib", ":multi_connection_base_impl_lib", "//envoy/upstream:upstream_interface", diff --git a/source/common/network/happy_eyeballs_connection_impl.cc b/source/common/network/happy_eyeballs_connection_impl.cc index 67cf720343a65..0a7c7551dcc76 100644 --- a/source/common/network/happy_eyeballs_connection_impl.cc +++ b/source/common/network/happy_eyeballs_connection_impl.cc @@ -1,6 +1,7 @@ #include "source/common/network/happy_eyeballs_connection_impl.h" #include "source/common/network/connection_impl.h" +#include "source/common/stats/lazy_init.h" namespace Envoy { namespace Network { @@ -41,29 +42,29 @@ ClientConnectionPtr HappyEyeballsConnectionProvider::createNextConnection(const upstream_local_address.socket_options_, transport_socket_options_); } -size_t HappyEyeballsConnectionProvider::nextConnection() { return next_address_; } + size_t HappyEyeballsConnectionProvider::nextConnection() { return next_address_; } -size_t HappyEyeballsConnectionProvider::totalConnections() { return address_list_.size(); } + size_t HappyEyeballsConnectionProvider::totalConnections() { return address_list_.size(); } -namespace { -bool hasMatchingAddressFamily(const Address::InstanceConstSharedPtr& a, - const Address::InstanceConstSharedPtr& b) { + namespace { + bool hasMatchingAddressFamily(const Address::InstanceConstSharedPtr& a, + const Address::InstanceConstSharedPtr& b) { return (a->type() == Address::Type::Ip && b->type() == Address::Type::Ip && a->ip()->version() == b->ip()->version()); -} + } -} // namespace + } // namespace -std::vector HappyEyeballsConnectionProvider::sortAddresses( - const std::vector& in) { - std::vector address_list; - address_list.reserve(in.size()); - // Iterator which will advance through all addresses matching the first family. - auto first = in.begin(); - // Iterator which will advance through all addresses not matching the first family. - // This initial value is ignored and will be overwritten in the loop below. - auto other = in.begin(); - while (first != in.end() || other != in.end()) { + std::vector HappyEyeballsConnectionProvider::sortAddresses( + const std::vector& in) { + std::vector address_list; + address_list.reserve(in.size()); + // Iterator which will advance through all addresses matching the first family. + auto first = in.begin(); + // Iterator which will advance through all addresses not matching the first family. + // This initial value is ignored and will be overwritten in the loop below. + auto other = in.begin(); + while (first != in.end() || other != in.end()) { if (first != in.end()) { address_list.push_back(*first); first = std::find_if(first + 1, in.end(), @@ -78,10 +79,10 @@ std::vector HappyEyeballsConnectionProvider::so address_list.push_back(*other); } } + } + ASSERT(address_list.size() == in.size()); + return address_list; } - ASSERT(address_list.size() == in.size()); - return address_list; -} -} // namespace Network -} // namespace Envoy + } // namespace Network + } // namespace Envoy diff --git a/test/integration/BUILD b/test/integration/BUILD index d953220840769..2d4983ff46742 100644 --- a/test/integration/BUILD +++ b/test/integration/BUILD @@ -117,7 +117,7 @@ envoy_cc_test( data = [ "//test/config/integration/certs", ], - shard_count = 12, + shard_count = 4, deps = [ ":http_integration_lib", "//source/common/config:protobuf_link_hacks", From 43e292fb07bcc288dcb2a1c131af23fc09342f7c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 7 Feb 2023 13:00:07 -0500 Subject: [PATCH 075/122] of course need to fix formatting in another commit Signed-off-by: Xin Zhuang --- source/common/network/BUILD | 3 +- .../network/happy_eyeballs_connection_impl.cc | 44 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/source/common/network/BUILD b/source/common/network/BUILD index 8a0f90b18f53a..7db1fffe3c496 100644 --- a/source/common/network/BUILD +++ b/source/common/network/BUILD @@ -128,11 +128,10 @@ envoy_cc_library( hdrs = ["happy_eyeballs_connection_impl.h"], deps = [ ":connection_base_lib", - "//source/common/stats:lazy_init", - ":connection_lib", ":multi_connection_base_impl_lib", "//envoy/upstream:upstream_interface", + "//source/common/stats:lazy_init", ], ) diff --git a/source/common/network/happy_eyeballs_connection_impl.cc b/source/common/network/happy_eyeballs_connection_impl.cc index 0a7c7551dcc76..19f614f6a5afe 100644 --- a/source/common/network/happy_eyeballs_connection_impl.cc +++ b/source/common/network/happy_eyeballs_connection_impl.cc @@ -42,29 +42,29 @@ ClientConnectionPtr HappyEyeballsConnectionProvider::createNextConnection(const upstream_local_address.socket_options_, transport_socket_options_); } - size_t HappyEyeballsConnectionProvider::nextConnection() { return next_address_; } +size_t HappyEyeballsConnectionProvider::nextConnection() { return next_address_; } - size_t HappyEyeballsConnectionProvider::totalConnections() { return address_list_.size(); } +size_t HappyEyeballsConnectionProvider::totalConnections() { return address_list_.size(); } - namespace { - bool hasMatchingAddressFamily(const Address::InstanceConstSharedPtr& a, - const Address::InstanceConstSharedPtr& b) { +namespace { +bool hasMatchingAddressFamily(const Address::InstanceConstSharedPtr& a, + const Address::InstanceConstSharedPtr& b) { return (a->type() == Address::Type::Ip && b->type() == Address::Type::Ip && a->ip()->version() == b->ip()->version()); - } +} - } // namespace +} // namespace - std::vector HappyEyeballsConnectionProvider::sortAddresses( - const std::vector& in) { - std::vector address_list; - address_list.reserve(in.size()); - // Iterator which will advance through all addresses matching the first family. - auto first = in.begin(); - // Iterator which will advance through all addresses not matching the first family. - // This initial value is ignored and will be overwritten in the loop below. - auto other = in.begin(); - while (first != in.end() || other != in.end()) { +std::vector HappyEyeballsConnectionProvider::sortAddresses( + const std::vector& in) { + std::vector address_list; + address_list.reserve(in.size()); + // Iterator which will advance through all addresses matching the first family. + auto first = in.begin(); + // Iterator which will advance through all addresses not matching the first family. + // This initial value is ignored and will be overwritten in the loop below. + auto other = in.begin(); + while (first != in.end() || other != in.end()) { if (first != in.end()) { address_list.push_back(*first); first = std::find_if(first + 1, in.end(), @@ -79,10 +79,10 @@ ClientConnectionPtr HappyEyeballsConnectionProvider::createNextConnection(const address_list.push_back(*other); } } - } - ASSERT(address_list.size() == in.size()); - return address_list; } + ASSERT(address_list.size() == in.size()); + return address_list; +} - } // namespace Network - } // namespace Envoy +} // namespace Network +} // namespace Envoy From 7570a6a5478943c6cc6d6fe5538b640b2843c949 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 14 Feb 2023 23:46:45 +0000 Subject: [PATCH 076/122] save Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index d3985ba418a6a..1b46deb600a6a 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -87,7 +87,7 @@ class LazyInit : public LazyCompatibleInterface { // the previous generation's cluster's lazy-init block. We use the value in this shared gauge to // determine whether to instantiate the lazy block on construction. Gauge& inited_; - // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving ownership to AtomicPtr, and drop it + // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop the setter lambda // when the nested object is created. std::function ctor_; Thread::AtomicPtr From bbc8544342aee4c6fb941881721fde089aae74fc Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 23 Feb 2023 17:55:31 +0000 Subject: [PATCH 077/122] add a sugar wrapper to resolve the two-layered indrection for LazyCompatibleInterface stats Signed-off-by: Xin Zhuang --- envoy/upstream/upstream.h | 4 +- source/common/stats/lazy_init.h | 42 +++++-- source/common/upstream/upstream_impl.cc | 4 +- source/common/upstream/upstream_impl.h | 7 +- test/common/http/codec_client_test.cc | 6 +- test/common/http/http1/conn_pool_test.cc | 48 ++++---- test/common/http/http2/conn_pool_test.cc | 82 +++++++------- test/common/tcp/conn_pool_test.cc | 22 ++-- .../upstream/conn_pool_map_impl_test.cc | 6 +- .../clusters/aggregate/cluster_test.cc | 2 +- .../network/common/redis/client_impl_test.cc | 104 +++++++++--------- .../udp/udp_proxy/udp_proxy_filter_test.cc | 50 ++++----- test/mocks/upstream/cluster_info.cc | 2 +- test/mocks/upstream/cluster_info.h | 2 +- 14 files changed, 194 insertions(+), 187 deletions(-) diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 46e8a1fc1ab5f..877e5415d42cb 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -36,7 +36,7 @@ namespace Envoy { namespace Stats { -template class LazyCompatibleInterface; +template class LazyCompatibleStats; } namespace Http { @@ -772,7 +772,7 @@ MAKE_STATS_STRUCT(ClusterLbStats, ClusterLbStatNames, ALL_CLUSTER_LB_STATS); */ MAKE_STAT_NAMES_STRUCT(ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); MAKE_STATS_STRUCT(ClusterTrafficStats, ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); -using LazyCompatibleClusterTrafficStats = Stats::LazyCompatibleInterface; +using LazyCompatibleClusterTrafficStats = Stats::LazyCompatibleStats; MAKE_STAT_NAMES_STRUCT(ClusterLoadReportStatNames, ALL_CLUSTER_LOAD_REPORT_STATS); MAKE_STATS_STRUCT(ClusterLoadReportStats, ClusterLoadReportStatNames, diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 1b46deb600a6a..98945dd8a278b 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -18,16 +18,6 @@ template class LazyInit; */ template class LazyCompatibleInterface { public: - static std::unique_ptr - create(Stats::ScopeSharedPtr scope, const typename StatsStructType::StatNameType& stat_names, - bool lazyinit) { - if (lazyinit) { - return std::make_unique>(stat_names, scope); - } else { - return std::make_unique>(stat_names, *scope); - } - } - // Helper operators to get-or-create and return the StatsStructType object. virtual StatsStructType* operator->() PURE; virtual StatsStructType& operator*() PURE; @@ -87,8 +77,8 @@ class LazyInit : public LazyCompatibleInterface { // the previous generation's cluster's lazy-init block. We use the value in this shared gauge to // determine whether to instantiate the lazy block on construction. Gauge& inited_; - // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop the setter lambda - // when the nested object is created. + // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop + // the setter lambda when the nested object is created. std::function ctor_; Thread::AtomicPtr internal_stats_{}; @@ -109,5 +99,33 @@ class DirectStats : public LazyCompatibleInterface { StatsStructType stats_; }; +// A helper class to remove the double indirections on "operator ->/&" for a lazy compatible stats +// struct. +template class LazyCompatibleStats { +public: + static LazyCompatibleStats create(Stats::ScopeSharedPtr scope, + const typename StatsStructType::StatNameType& stat_names, + bool lazyinit) { + if (lazyinit) { + return {std::make_unique>(stat_names, scope)}; + } else { + return {std::make_unique>(stat_names, *scope)}; + } + } + + // Allows move construct and assign. + LazyCompatibleStats& operator=(LazyCompatibleStats&&) = default; + LazyCompatibleStats(LazyCompatibleStats&&) = default; + + inline StatsStructType* operator->() { return data_->operator->(); }; + inline StatsStructType& operator*() { return data_->operator*(); }; + +private: + LazyCompatibleStats(std::unique_ptr> d) + : data_(std::move(d)) {} + + std::unique_ptr> data_; +}; + } // namespace Stats } // namespace Envoy diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 7cdf9987c3e0a..ef511fbabe304 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -847,10 +847,10 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add } } -std::unique_ptr +LazyCompatibleClusterTrafficStats ClusterInfoImpl::generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& stat_names, bool lazyinit) { - return Stats::LazyCompatibleInterface::create(scope, stat_names, lazyinit); + return LazyCompatibleClusterTrafficStats::create(scope, stat_names, lazyinit); } ClusterRequestResponseSizeStats ClusterInfoImpl::generateRequestResponseSizeStats( diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 30a160eefda25..c74165eb0f275 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -756,7 +756,7 @@ class ClusterInfoImpl : public ClusterInfo, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static std::unique_ptr + static LazyCompatibleClusterTrafficStats generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& cluster_stat_names, bool lazyinit); static ClusterLoadReportStats @@ -870,8 +870,7 @@ class ClusterInfoImpl : public ClusterInfo, ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } LazyCompatibleClusterTrafficStats& trafficStats() const override { - ASSERT(traffic_stats_ != nullptr); - return *traffic_stats_; + return traffic_stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } @@ -999,7 +998,7 @@ class ClusterInfoImpl : public ClusterInfo, const float peekahead_ratio_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; - const std::unique_ptr traffic_stats_; + mutable LazyCompatibleClusterTrafficStats traffic_stats_; mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/test/common/http/codec_client_test.cc b/test/common/http/codec_client_test.cc index 5c90f678bfa95..4c46a755c8d00 100644 --- a/test/common/http/codec_client_test.cc +++ b/test/common/http/codec_client_test.cc @@ -258,7 +258,7 @@ TEST_F(CodecClientTest, ProtocolError) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, 408Response) { @@ -270,7 +270,7 @@ TEST_F(CodecClientTest, 408Response) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_protocol_error_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, PrematureResponse) { @@ -281,7 +281,7 @@ TEST_F(CodecClientTest, PrematureResponse) { Buffer::OwnedImpl data; filter_->onData(data, false); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_protocol_error_.value()); } TEST_F(CodecClientTest, WatermarkPassthrough) { diff --git a/test/common/http/http1/conn_pool_test.cc b/test/common/http/http1/conn_pool_test.cc index dc4110ec13557..30a13e46dce90 100644 --- a/test/common/http/http1/conn_pool_test.cc +++ b/test/common/http/http1/conn_pool_test.cc @@ -175,7 +175,7 @@ struct ActiveTestRequest { : parent_(parent), client_index_(client_index) { uint64_t active_rq_observed = parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default).requests().count(); - uint64_t current_rq_total = parent_.cluster_->trafficStats()->upstream_rq_total_.value(); + uint64_t current_rq_total = parent_.cluster_->traffic_stats_->upstream_rq_total_.value(); if (type == Type::CreateConnection) { parent.conn_pool_->expectClientCreate(); } @@ -199,7 +199,7 @@ struct ActiveTestRequest { Network::ConnectionEvent::Connected); } if (type != Type::Pending) { - EXPECT_EQ(current_rq_total + 1, parent_.cluster_->trafficStats()->upstream_rq_total_.value()); + EXPECT_EQ(current_rq_total + 1, parent_.cluster_->traffic_stats_->upstream_rq_total_.value()); EXPECT_EQ(active_rq_observed + 1, parent_.cluster_->resourceManager(Upstream::ResourcePriority::Default) .requests() @@ -440,7 +440,7 @@ TEST_F(Http1ConnPoolImplTest, MaxPendingRequests) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_overflow_.value()); } /** @@ -464,8 +464,8 @@ TEST_F(Http1ConnPoolImplTest, ConnectFailure) { EXPECT_CALL(*conn_pool_, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -553,9 +553,9 @@ TEST_F(Http1ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*conn_pool_, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); } /** @@ -655,7 +655,7 @@ TEST_F(Http1ConnPoolImplTest, MaxConnections) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_EQ(1U, cluster_->circuit_breakers_stats_.cx_open_.value()); EXPECT_NE(nullptr, handle); @@ -719,7 +719,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseWithoutHeader) { NiceMock outer_decoder2; ConnPoolCallbacks callbacks2; handle = conn_pool_->newStream(outer_decoder2, callbacks2, {false, true}); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -803,7 +803,7 @@ TEST_F(Http1ConnPoolImplTest, ConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -841,7 +841,7 @@ TEST_F(Http1ConnPoolImplTest, ProxyConnectionCloseHeader) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -878,7 +878,7 @@ TEST_F(Http1ConnPoolImplTest, Http10NoConnectionKeepAlive) { inner_decoder->decodeHeaders(std::move(response_headers), true); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); } /** @@ -920,8 +920,8 @@ TEST_F(Http1ConnPoolImplTest, MaxRequestsPerConnection) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_max_requests_.value()); } TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { @@ -943,7 +943,7 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { r1.completeResponse(false); conn_pool_->expectAndRunUpstreamReady(); r3.startRequest(); - EXPECT_EQ(3U, cluster_->trafficStats()->upstream_rq_total_.value()); + EXPECT_EQ(3U, cluster_->traffic_stats_->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); r2.completeResponse(false); @@ -956,8 +956,8 @@ TEST_F(Http1ConnPoolImplTest, ConcurrentConnections) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, DrainCallback) { @@ -971,7 +971,7 @@ TEST_F(Http1ConnPoolImplTest, DrainCallback) { conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainAndDelete); r2.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_total_.value()); conn_pool_->expectEnableUpstreamReady(); EXPECT_CALL(drained, ready()).Times(AtLeast(1)); @@ -1048,8 +1048,8 @@ TEST_F(Http1ConnPoolImplTest, RemoteCloseToCompleteResponse) { conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http1ConnPoolImplTest, NoActiveConnectionsByDefault) { @@ -1093,13 +1093,13 @@ TEST_F(Http1ConnPoolImplTest, PendingRequestIsConsideredActive) { EXPECT_CALL(*conn_pool_, onClientDestroy()); r1.handle_->cancel(Envoy::ConnectionPool::CancelPolicy::Default); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_rq_total_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_rq_total_.value()); conn_pool_->drainConnections(Envoy::ConnectionPool::DrainBehavior::DrainExistingConnections); conn_pool_->test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_local_.value()); } // Schedulable callback that can track it's destruction. diff --git a/test/common/http/http2/conn_pool_test.cc b/test/common/http/http2/conn_pool_test.cc index 63ed21b994b1e..a3702a4f80304 100644 --- a/test/common/http/http2/conn_pool_test.cc +++ b/test/common/http/http2/conn_pool_test.cc @@ -634,8 +634,8 @@ TEST_F(Http2ConnPoolImplTest, DrainConnections) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Test that cluster.http2_protocol_options.max_concurrent_streams limits @@ -688,7 +688,7 @@ TEST_F(Http2ConnPoolImplTest, MaxConcurrentRequestsPerStream) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_total_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_total_.value()); } // Verifies that requests are queued up in the conn pool until the connection becomes ready. @@ -732,8 +732,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreams) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Verifies that the correct number of CONNECTING connections are created for @@ -853,8 +853,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsFailure) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Verifies resets due to local connection closes are tracked correctly. @@ -909,8 +909,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsRequestOverflow) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } // Verifies that we honor the max pending requests circuit breaker. @@ -947,8 +947,8 @@ TEST_F(Http2ConnPoolImplTest, PendingStreamsMaxPendingCircuitBreaker) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { @@ -973,8 +973,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyConnectionTimingStats) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } /** @@ -1004,8 +1004,8 @@ TEST_F(Http2ConnPoolImplTest, VerifyBufferLimits) { dispatcher_.clearDeferredDeleteList(); CHECK_STATE(0 /*active*/, 0 /*pending*/, 0 /*capacity*/); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { @@ -1019,7 +1019,7 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { r1.callbacks_.outer_encoder_ ->encodeHeaders(TestRequestHeaderMapImpl{{":path", "/"}, {":method", "GET"}}, true) .ok()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_active_.value()); EXPECT_CALL(r1.decoder_, decodeHeaders_(_, true)); r1.inner_decoder_->decodeHeaders( ResponseHeaderMapPtr{new TestResponseHeaderMapImpl{{":status", "200"}}}, true); @@ -1038,9 +1038,9 @@ TEST_F(Http2ConnPoolImplTest, RequestAndResponse) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_active_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, LocalReset) { @@ -1059,11 +1059,11 @@ TEST_F(Http2ConnPoolImplTest, LocalReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_tx_reset_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_tx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, RemoteReset) { @@ -1082,11 +1082,11 @@ TEST_F(Http2ConnPoolImplTest, RemoteReset) { test_clients_[0].connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_rx_reset_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_rx_reset_.value()); EXPECT_EQ(0U, cluster_->circuit_breakers_stats_.rq_open_.value()); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_active_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_active_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { @@ -1111,8 +1111,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { @@ -1155,8 +1155,8 @@ TEST_F(Http2ConnPoolImplTest, DrainDisconnectDrainingWithActiveRequest) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, DrainPrimary) { @@ -1278,13 +1278,13 @@ TEST_F(Http2ConnPoolImplTest, ConnectTimeout) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_timeout_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_local_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_local_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { @@ -1310,8 +1310,8 @@ TEST_F(Http2ConnPoolImplTest, MaxGlobalRequests) { EXPECT_CALL(*this, onClientDestroy()); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_destroy_remote_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_destroy_remote_.value()); } TEST_F(Http2ConnPoolImplTest, GoAway) { @@ -1348,7 +1348,7 @@ TEST_F(Http2ConnPoolImplTest, GoAway) { EXPECT_CALL(*this, onClientDestroy()).Times(2); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_close_notify_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_close_notify_.value()); } TEST_F(Http2ConnPoolImplTest, NoActiveConnectionsByDefault) { diff --git a/test/common/tcp/conn_pool_test.cc b/test/common/tcp/conn_pool_test.cc index cbf292ba47161..44e89aef134ba 100644 --- a/test/common/tcp/conn_pool_test.cc +++ b/test/common/tcp/conn_pool_test.cc @@ -458,7 +458,7 @@ TEST_F(TcpConnPoolImplTest, IdleTimerCloseConnections) { // Note that this is pool level idle instead of client/connection level. EXPECT_TRUE(conn_pool_->isIdle()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_idle_timeout_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_idle_timeout_.value()); } /** @@ -715,7 +715,7 @@ TEST_F(TcpConnPoolImplTest, MaxPendingRequests) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Overflow, callbacks2.reason_); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_overflow_.value()); } /** @@ -743,8 +743,8 @@ TEST_F(TcpConnPoolImplTest, RemoteConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::RemoteConnectionFailure, callbacks.reason_); EXPECT_EQ("foo", callbacks.failure_reason_string_); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -769,8 +769,8 @@ TEST_F(TcpConnPoolImplTest, LocalConnectFailure) { EXPECT_EQ(ConnectionPool::PoolFailureReason::LocalConnectionFailure, callbacks.reason_); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_rq_pending_failure_eject_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_rq_pending_failure_eject_.value()); } /** @@ -801,8 +801,8 @@ TEST_F(TcpConnPoolImplTest, ConnectTimeout) { EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks1.reason_); EXPECT_EQ(ConnectionPool::PoolFailureReason::Timeout, callbacks2.reason_); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_fail_.value()); - EXPECT_EQ(2U, cluster_->trafficStats()->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_fail_.value()); + EXPECT_EQ(2U, cluster_->traffic_stats_->upstream_cx_connect_timeout_.value()); } /** @@ -927,7 +927,7 @@ TEST_F(TcpConnPoolImplTest, MaxConnections) { // Request 2 should not kick off a new connection. ConnPoolCallbacks callbacks2; handle = conn_pool_->newConnection(callbacks2); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_overflow_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_NE(nullptr, handle); @@ -974,8 +974,8 @@ TEST_F(TcpConnPoolImplTest, MaxRequestsPerConnection) { callbacks.conn_data_.reset(); dispatcher_.clearDeferredDeleteList(); - EXPECT_EQ(0U, cluster_->trafficStats()->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1U, cluster_->trafficStats()->upstream_cx_max_requests_.value()); + EXPECT_EQ(0U, cluster_->traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1U, cluster_->traffic_stats_->upstream_cx_max_requests_.value()); } /* diff --git a/test/common/upstream/conn_pool_map_impl_test.cc b/test/common/upstream/conn_pool_map_impl_test.cc index f62ec3523d14e..e51a0de702f10 100644 --- a/test/common/upstream/conn_pool_map_impl_test.cc +++ b/test/common/upstream/conn_pool_map_impl_test.cc @@ -235,7 +235,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureCounter) { ON_CALL(*mock_pools_[0], hasActiveConnections()).WillByDefault(Return(true)); test_map->getPool(2, getNeverCalledFactory()); - EXPECT_EQ(host_->cluster_.trafficStats()->upstream_cx_pool_overflow_.value(), 1); + EXPECT_EQ(host_->cluster_.traffic_stats_->upstream_cx_pool_overflow_.value(), 1); } TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureMultiple) { @@ -247,7 +247,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitIncrementsFailureMultiple) { test_map->getPool(2, getNeverCalledFactory()); test_map->getPool(2, getNeverCalledFactory()); - EXPECT_EQ(host_->cluster_.trafficStats()->upstream_cx_pool_overflow_.value(), 3); + EXPECT_EQ(host_->cluster_.traffic_stats_->upstream_cx_pool_overflow_.value(), 3); } TEST_F(ConnPoolMapImplTest, GetPoolHittingLimitGreaterThan1Fails) { @@ -284,7 +284,7 @@ TEST_F(ConnPoolMapImplTest, GetPoolLimitHitFollowedBySuccessDoesNotClearFailure) ON_CALL(*mock_pools_[0], hasActiveConnections()).WillByDefault(Return(false)); test_map->getPool(2, getBasicFactory()); - EXPECT_EQ(host_->cluster_.trafficStats()->upstream_cx_pool_overflow_.value(), 1); + EXPECT_EQ(host_->cluster_.traffic_stats_->upstream_cx_pool_overflow_.value(), 1); } // Test that only the pool which are idle are actually cleared diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 74bae9965eb19..2d61e083b76c0 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -140,7 +140,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterTrafficStatNames stat_names_; - std::unique_ptr traffic_stats_; + LazyCompatibleClusterTrafficStats traffic_stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/extensions/filters/network/common/redis/client_impl_test.cc b/test/extensions/filters/network/common/redis/client_impl_test.cc index 6b5e97a426aad..b95d9bfe14af8 100644 --- a/test/extensions/filters/network/common/redis/client_impl_test.cc +++ b/test/extensions/filters/network/common/redis/client_impl_test.cc @@ -81,7 +81,7 @@ class RedisClientImplTest : public testing::Test, client_ = ClientImpl::create(host_, dispatcher_, Common::Redis::EncoderPtr{encoder_}, *this, *config_, redis_command_stats_, *stats_.rootScope(), false); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_total_.value()); EXPECT_EQ(1UL, host_->stats_.cx_total_.value()); EXPECT_EQ(false, client_->active()); @@ -117,8 +117,8 @@ class RedisClientImplTest : public testing::Test, EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -308,8 +308,8 @@ TEST_F(RedisClientImplTest, Basic) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -385,8 +385,8 @@ TEST_F(RedisClientImplTest, CommandStatsDisabledSingleRequest) { onConnected(); // Regular Envoy stats function as normal - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -449,8 +449,8 @@ TEST_F(RedisClientImplTest, CommandStatsEnabledTwoRequests) { EXPECT_NE(nullptr, handle2); // Regular Envoy stats function as normal - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -513,8 +513,8 @@ TEST_F(RedisClientImplTest, InitializedWithAuthPassword) { EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -535,8 +535,8 @@ TEST_F(RedisClientImplTest, InitializedWithAuthAcl) { EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); client_->initialize(auth_username_, auth_password_); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(1UL, host_->stats_.rq_total_.value()); EXPECT_EQ(1UL, host_->stats_.rq_active_.value()); @@ -612,7 +612,7 @@ TEST_F(RedisClientImplTest, Cancel) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); client_->close(); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_cancelled_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_cancelled_.value()); } TEST_F(RedisClientImplTest, FailAll) { @@ -639,9 +639,9 @@ TEST_F(RedisClientImplTest, FailAll) { EXPECT_CALL(connection_callbacks, onEvent(Network::ConnectionEvent::RemoteClose)); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); EXPECT_EQ(1UL, - host_->cluster_.trafficStats()->upstream_cx_destroy_remote_with_active_rq_.value()); + host_->cluster_.traffic_stats_->upstream_cx_destroy_remote_with_active_rq_.value()); } TEST_F(RedisClientImplTest, FailAllWithCancel) { @@ -667,9 +667,9 @@ TEST_F(RedisClientImplTest, FailAllWithCancel) { EXPECT_CALL(connection_callbacks, onEvent(Network::ConnectionEvent::LocalClose)); upstream_connection_->raiseEvent(Network::ConnectionEvent::LocalClose); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_destroy_with_active_rq_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_destroy_local_with_active_rq_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_cancelled_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_destroy_local_with_active_rq_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_cancelled_.value()); } TEST_F(RedisClientImplTest, ProtocolError) { @@ -697,7 +697,7 @@ TEST_F(RedisClientImplTest, ProtocolError) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_read_filter_->onData(fake_data, false); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_protocol_error_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_protocol_error_.value()); EXPECT_EQ(1UL, host_->stats_.rq_error_.value()); } @@ -719,7 +719,7 @@ TEST_F(RedisClientImplTest, ConnectFail) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -754,7 +754,7 @@ TEST_F(RedisClientImplTest, OutlierDisabled) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); upstream_connection_->raiseEvent(Network::ConnectionEvent::RemoteClose); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_connect_fail_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_connect_fail_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -777,7 +777,7 @@ TEST_F(RedisClientImplTest, ConnectTimeout) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); connect_or_op_timer_->invokeCallback(); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_cx_connect_timeout_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_cx_connect_timeout_.value()); EXPECT_EQ(1UL, host_->stats_.cx_connect_fail_.value()); } @@ -795,8 +795,8 @@ TEST_F(RedisClientImplTest, OpTimeout) { onConnected(); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_CALL(callbacks1, onResponse_(_)); EXPECT_CALL(*connect_or_op_timer_, disableTimer()); @@ -804,8 +804,8 @@ TEST_F(RedisClientImplTest, OpTimeout) { putResult(Upstream::Outlier::Result::ExtOriginRequestSuccess, _)); respond(); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_CALL(*encoder_, encode(Ref(request1), _)); EXPECT_CALL(*flush_timer_, enabled()).WillOnce(Return(false)); @@ -820,10 +820,10 @@ TEST_F(RedisClientImplTest, OpTimeout) { EXPECT_CALL(*connect_or_op_timer_, disableTimer()); connect_or_op_timer_->invokeCallback(); - EXPECT_EQ(1UL, host_->cluster_.trafficStats()->upstream_rq_timeout_.value()); + EXPECT_EQ(1UL, host_->cluster_.traffic_stats_->upstream_rq_timeout_.value()); EXPECT_EQ(1UL, host_->stats_.rq_timeout_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(0UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(0UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); } TEST_F(RedisClientImplTest, AskRedirection) { @@ -847,8 +847,8 @@ TEST_F(RedisClientImplTest, AskRedirection) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -904,8 +904,8 @@ TEST_F(RedisClientImplTest, MovedRedirection) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -961,8 +961,8 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -983,9 +983,9 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { callbacks_->onRespValue(std::move(response1)); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); // Test a truncated MOVED error response that cannot be parsed properly. Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); @@ -998,9 +998,9 @@ TEST_F(RedisClientImplTest, RedirectionFailure) { callbacks_->onRespValue(std::move(response2)); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); })); upstream_read_filter_->onData(fake_data, false); @@ -1030,8 +1030,8 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -1050,9 +1050,9 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response1)); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); response2->type(Common::Redis::RespType::Error); @@ -1065,9 +1065,9 @@ TEST_F(RedisClientImplTest, AskRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response2)); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); })); upstream_read_filter_->onData(fake_data, false); @@ -1097,8 +1097,8 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { PoolRequest* handle2 = client_->makeRequest(request2, callbacks2); EXPECT_NE(nullptr, handle2); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_total_.value()); - EXPECT_EQ(2UL, host_->cluster_.trafficStats()->upstream_rq_active_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_total_.value()); + EXPECT_EQ(2UL, host_->cluster_.traffic_stats_->upstream_rq_active_.value()); EXPECT_EQ(2UL, host_->stats_.rq_total_.value()); EXPECT_EQ(2UL, host_->stats_.rq_active_.value()); @@ -1116,9 +1116,9 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response1)); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); Common::Redis::RespValuePtr response2(new Common::Redis::RespValue()); response2->type(Common::Redis::RespType::Error); @@ -1131,9 +1131,9 @@ TEST_F(RedisClientImplTest, MovedRedirectionNotEnabled) { callbacks_->onRespValue(std::move(response2)); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_succeeded_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_succeeded_total_.value()); EXPECT_EQ(0UL, - host_->cluster_.trafficStats()->upstream_internal_redirect_failed_total_.value()); + host_->cluster_.traffic_stats_->upstream_internal_redirect_failed_total_.value()); })); upstream_read_filter_->onData(fake_data, false); diff --git a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc index 11102f0c45c18..78014ad92105b 100644 --- a/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc +++ b/test/extensions/filters/udp/udp_proxy/udp_proxy_filter_test.cc @@ -593,22 +593,19 @@ stat_prefix: foo test_sessions_[0].expectWriteToUpstream("hello", 0, nullptr, true); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(5, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_tx_bytes_total_.value()); + EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_tx_bytes_total_.value()); test_sessions_[0].recvDataFromUpstream("world2", 0, SOCKET_ERROR_MSG_SIZE); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(6, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_rx_bytes_total_.value()); + EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_tx_errors_.value()); test_sessions_[0].recvDataFromUpstream("world2", SOCKET_ERROR_MSG_SIZE, 0); checkTransferStats(5 /*rx_bytes*/, 1 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(6, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_rx_bytes_total_.value()); + EXPECT_EQ(6, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_rx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -618,9 +615,8 @@ stat_prefix: foo test_sessions_[0].expectWriteToUpstream("hello", SOCKET_ERROR_MSG_SIZE); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); checkTransferStats(10 /*rx_bytes*/, 2 /*rx_datagrams*/, 0 /*tx_bytes*/, 0 /*tx_datagrams*/); - EXPECT_EQ(5, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_tx_bytes_total_.value()); + EXPECT_EQ(5, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_tx_bytes_total_.value()); EXPECT_EQ( 1, TestUtility::findCounter( factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->stats_store_, @@ -695,9 +691,8 @@ stat_prefix: foo EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_none_healthy_.value()); } // No cluster at filter creation. @@ -804,9 +799,8 @@ stat_prefix: foo // This should hit the session circuit breaker. recvDataFromDownstream("10.0.0.2:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_overflow_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_overflow_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); @@ -1001,9 +995,8 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(0, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(0, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(1, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_none_healthy_.value()); } // Verify that when on second packet no host is available, message is dropped. @@ -1027,18 +1020,16 @@ use_per_packet_load_balancing: true recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(0, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_none_healthy_.value()); + EXPECT_EQ(0, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_none_healthy_.value()); EXPECT_CALL(factory_context_.cluster_manager_.thread_local_cluster_.lb_, chooseHost(_)) .WillOnce(Return(nullptr)); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello2"); EXPECT_EQ(1, config_->stats().downstream_sess_total_.value()); EXPECT_EQ(1, config_->stats().downstream_sess_active_.value()); - EXPECT_EQ(1, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_none_healthy_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_none_healthy_.value()); } // Verify that all sessions for a host are removed when a host is removed. @@ -1141,9 +1132,8 @@ use_per_packet_load_balancing: true 0, 0, 0, 0, 0); recvDataFromDownstream("10.0.0.1:1000", "10.0.0.2:80", "hello"); - EXPECT_EQ(1, - factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_->trafficStats() - ->upstream_cx_overflow_.value()); + EXPECT_EQ(1, factory_context_.cluster_manager_.thread_local_cluster_.cluster_.info_ + ->traffic_stats_->upstream_cx_overflow_.value()); } // Make sure socket option is set correctly if use_original_src_ip is set in case of ipv6. diff --git a/test/mocks/upstream/cluster_info.cc b/test/mocks/upstream/cluster_info.cc index 5a8497a4b2ddb..374f3e22232b1 100644 --- a/test/mocks/upstream/cluster_info.cc +++ b/test/mocks/upstream/cluster_info.cc @@ -103,7 +103,7 @@ MockClusterInfo::MockClusterInfo() .WillByDefault(ReturnPointee(&max_response_headers_count_)); ON_CALL(*this, maxRequestsPerConnection()) .WillByDefault(ReturnPointee(&max_requests_per_connection_)); - ON_CALL(*this, trafficStats()).WillByDefault(ReturnRef(*traffic_stats_)); + ON_CALL(*this, trafficStats()).WillByDefault(ReturnRef(traffic_stats_)); ON_CALL(*this, lbStats()).WillByDefault(ReturnRef(lb_stats_)); ON_CALL(*this, configUpdateStats()).WillByDefault(ReturnRef(config_update_stats_)); ON_CALL(*this, endpointStats()).WillByDefault(ReturnRef(endpoint_stats_)); diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index f0549593f52b8..78b71ea437d29 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -211,7 +211,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; - std::unique_ptr traffic_stats_; + mutable LazyCompatibleClusterTrafficStats traffic_stats_; ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; From 350ac3539d31c7cc121c17737fbaf9fe4c940d84 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 23 Feb 2023 18:01:58 +0000 Subject: [PATCH 078/122] fix_format on source/common/upstream/upstream_impl.h Signed-off-by: Xin Zhuang --- source/common/upstream/upstream_impl.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index c74165eb0f275..e5e61828c1e45 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -869,9 +869,7 @@ class ClusterInfoImpl : public ClusterInfo, const std::string& observabilityName() const override { return observability_name_; } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - LazyCompatibleClusterTrafficStats& trafficStats() const override { - return traffic_stats_; - } + LazyCompatibleClusterTrafficStats& trafficStats() const override { return traffic_stats_; } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } From b1a497b72bb651cc69291f2b3ce299b3afdfc8fb Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 23 Feb 2023 18:05:33 +0000 Subject: [PATCH 079/122] merge with upstream main Signed-off-by: Xin Zhuang --- test/extensions/clusters/aggregate/cluster_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 2d61e083b76c0..c09eb9bb55246 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -140,7 +140,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterTrafficStatNames stat_names_; - LazyCompatibleClusterTrafficStats traffic_stats_; + Upstream::LazyCompatibleClusterTrafficStats traffic_stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ From c624ab9428906ead9013dc50077df6738f9f278f Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 23 Feb 2023 20:03:56 +0000 Subject: [PATCH 080/122] make a copy of ClusterTrafficStats definition in lazyinit_stats_speed_test.cc Signed-off-by: Xin Zhuang --- .../common/stats/lazyinit_stats_speed_test.cc | 101 +++++++++++++----- test/integration/cds_integration_test.cc | 24 ----- 2 files changed, 77 insertions(+), 48 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 0f0d0f7d6d7f9..ac608c7deb8d1 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -1,5 +1,3 @@ -#include "envoy/upstream/upstream.h" - #include "source/common/common/random_generator.h" #include "source/common/stats/isolated_store_impl.h" #include "source/common/stats/lazy_init.h" @@ -17,7 +15,73 @@ namespace Envoy { namespace Stats { -using Upstream::ClusterTrafficStats; +// Creates a copy of Upstream::ALL_CLUSTER_TRAFFIC_STATS, such that per Joshua, we have a "a stable +// set of stats for performance" test. +#define AWESOME_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ + COUNTER(bind_errors) \ + COUNTER(original_dst_host_invalid) \ + COUNTER(retry_or_shadow_abandoned) \ + COUNTER(upstream_cx_close_notify) \ + COUNTER(upstream_cx_connect_attempts_exceeded) \ + COUNTER(upstream_cx_connect_fail) \ + COUNTER(upstream_cx_connect_timeout) \ + COUNTER(upstream_cx_connect_with_0_rtt) \ + COUNTER(upstream_cx_destroy) \ + COUNTER(upstream_cx_destroy_local) \ + COUNTER(upstream_cx_destroy_local_with_active_rq) \ + COUNTER(upstream_cx_destroy_remote) \ + COUNTER(upstream_cx_destroy_remote_with_active_rq) \ + COUNTER(upstream_cx_destroy_with_active_rq) \ + COUNTER(upstream_cx_http1_total) \ + COUNTER(upstream_cx_http2_total) \ + COUNTER(upstream_cx_http3_total) \ + COUNTER(upstream_cx_idle_timeout) \ + COUNTER(upstream_cx_max_duration_reached) \ + COUNTER(upstream_cx_max_requests) \ + COUNTER(upstream_cx_none_healthy) \ + COUNTER(upstream_cx_overflow) \ + COUNTER(upstream_cx_pool_overflow) \ + COUNTER(upstream_cx_protocol_error) \ + COUNTER(upstream_cx_rx_bytes_total) \ + COUNTER(upstream_cx_total) \ + COUNTER(upstream_cx_tx_bytes_total) \ + COUNTER(upstream_flow_control_backed_up_total) \ + COUNTER(upstream_flow_control_drained_total) \ + COUNTER(upstream_flow_control_paused_reading_total) \ + COUNTER(upstream_flow_control_resumed_reading_total) \ + COUNTER(upstream_internal_redirect_failed_total) \ + COUNTER(upstream_internal_redirect_succeeded_total) \ + COUNTER(upstream_rq_cancelled) \ + COUNTER(upstream_rq_completed) \ + COUNTER(upstream_rq_maintenance_mode) \ + COUNTER(upstream_rq_max_duration_reached) \ + COUNTER(upstream_rq_pending_failure_eject) \ + COUNTER(upstream_rq_pending_overflow) \ + COUNTER(upstream_rq_pending_total) \ + COUNTER(upstream_rq_0rtt) \ + COUNTER(upstream_rq_per_try_timeout) \ + COUNTER(upstream_rq_per_try_idle_timeout) \ + COUNTER(upstream_rq_retry) \ + COUNTER(upstream_rq_retry_backoff_exponential) \ + COUNTER(upstream_rq_retry_backoff_ratelimited) \ + COUNTER(upstream_rq_retry_limit_exceeded) \ + COUNTER(upstream_rq_retry_overflow) \ + COUNTER(upstream_rq_retry_success) \ + COUNTER(upstream_rq_rx_reset) \ + COUNTER(upstream_rq_timeout) \ + COUNTER(upstream_rq_total) \ + COUNTER(upstream_rq_tx_reset) \ + COUNTER(upstream_http3_broken) \ + GAUGE(upstream_cx_active, Accumulate) \ + GAUGE(upstream_cx_rx_bytes_buffered, Accumulate) \ + GAUGE(upstream_cx_tx_bytes_buffered, Accumulate) \ + GAUGE(upstream_rq_active, Accumulate) \ + GAUGE(upstream_rq_pending_active, Accumulate) \ + HISTOGRAM(upstream_cx_connect_ms, Milliseconds) \ + HISTOGRAM(upstream_cx_length_ms, Milliseconds) + +MAKE_STAT_NAMES_STRUCT(AwesomeStatNames, AWESOME_STATS); +MAKE_STATS_STRUCT(AwesomeStats, AwesomeStatNames, AWESOME_STATS); class LazyInitStatsBenchmarkBase { public: @@ -30,14 +94,11 @@ class LazyInitStatsBenchmarkBase { std::string new_cluster_name = absl::StrCat("cluster_", i); ScopeSharedPtr scope = stat_store_.createScope(new_cluster_name); scopes_.push_back(scope); - if (lazy_init_) { - auto lazy_stat = std::make_shared>(stat_names_, scope); - lazy_stats_.push_back(lazy_stat); - if (!defer_init) { - *(*lazy_stat); - } - } else { - normal_stats_.push_back(std::make_shared(stat_names_, *scope)); + auto lazy_stat = std::make_shared>( + LazyCompatibleStats::create(scope, stat_names_, lazy_init_)); + lazy_stats_.push_back(lazy_stat); + if (!defer_init) { + *(*lazy_stat); } } } @@ -46,9 +107,8 @@ class LazyInitStatsBenchmarkBase { const uint64_t num_clusters_; Store& stat_store_; std::vector scopes_; - std::vector>> lazy_stats_; - std::vector> normal_stats_; - Upstream::ClusterTrafficStatNames stat_names_; + std::vector>> lazy_stats_; + AwesomeStatNames stat_names_; }; // Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. @@ -116,13 +176,11 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta uint64_t begin = t_idx * batch_size; uint64_t end = std::min(begin + batch_size, test.num_clusters_); for (uint64_t idx = begin; idx < end; ++idx) { - // Instantiate the actual ClusterTrafficStats objects in worker threads, in batches to avoid + // Instantiate the actual AwesomeStats objects in worker threads, in batches to avoid // possible contention. if (test.lazy_init_) { // Lazy-init on workers happen when the "index"-th stat instance is not created. *(*test.lazy_stats_[idx]); - } else { - *test.normal_stats_[idx]; } } }); @@ -145,13 +203,8 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { test.runOnAllWorkersBlocking([&]() { // 50 x num_clusters_ inc() calls. for (uint64_t idx = 0; idx < 10 * test.num_clusters_; ++idx) { - if (test.lazy_init_) { - ClusterTrafficStats& stats = *(*test.lazy_stats_[idx % test.num_clusters_]); - stats.upstream_cx_active_.inc(); - } else { - ClusterTrafficStats& stats = *test.normal_stats_[idx % test.num_clusters_]; - stats.upstream_cx_active_.inc(); - } + AwesomeStats& stats = *(*test.lazy_stats_[idx % test.num_clusters_]); + stats.upstream_cx_active_.inc(); } }); } diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 1ba2c4c78d46e..17a8cdb6fae40 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -194,7 +194,6 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { // Make sure that clusters won't create new connections on teardown. TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); - // This line ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); Stats::CounterSharedPtr cx_counter = test_server_->counter("cluster.cluster_1.upstream_cx_total"); @@ -231,7 +230,6 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { }); initialize(); - // Ensure that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); @@ -247,37 +245,26 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { cleanupUpstreamAndDownstream(); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Now update cluster1. envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between - // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted - // from main thread and worker thread. EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); - // Add "cluster_2". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); - - // Now the cluster_1 stats are gone, as well as the lazy init wrapper. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - // No cluster_2 stats yet. EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); @@ -291,7 +278,6 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { }); initialize(); - // Ensures that the ClusterInfoImpl is created already. test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); @@ -310,43 +296,33 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { send_http_request_to_cluster_and_wait_for_response("cluster_1"); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - - // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - // Add "cluster_2". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); - // No cluster_2 stats yet. EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); - // Now the cluster_1 stats are gone, as well as the lazy init wrapper. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - // Now add cluster1 again. envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); - // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); send_http_request_to_cluster_and_wait_for_response("cluster_1"); - // Now the ClusterTrafficStats 'inited_' gauge is 0, since it didn't see previous http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - // cluster_1 traffic stats updated. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } From 0a96db967a9137f839b618aef291f5bfc8e0f3c2 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 24 Feb 2023 23:19:03 +0000 Subject: [PATCH 081/122] joshua comments Signed-off-by: Xin Zhuang --- .../observability/statistics.rst | 17 ++++++++---- source/common/stats/lazy_init.h | 27 +++++++++---------- .../common/stats/lazyinit_stats_speed_test.cc | 4 +-- test/integration/cds_integration_test.cc | 20 +++++++++++--- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 09b742cc8e213..cf504e94fddb3 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -37,10 +37,17 @@ Internally, counters and gauges are batched and periodically flushed to improve Histograms are written as they are received. Note: what were previously referred to as timers have become histograms as the only difference between the two representations was the units. -Lazy Init of Stats -================= +* :ref:`v3 API reference `. -When :ref:`enable_lazyinit_stats ` is enabled in Bootstrap, for stats that supports the LazyCompatibleInterface, -the actual stats struct creation is deferred to first access of any member of that stats. E.g. when enabled, A ClusterTrafficStats structure is only created when any member of ClusterInfoImpl::trafficStats() is accessed. +Lazy Initialization of Stats +============================ + +When :ref:`enable_lazyinit_stats ` +is enabled in Bootstrap, for stats that are created using the LazyCompatibleInterface, the actual stats struct creation +is deferred to first access of any member of that stats. E.g. when enabled, A ClusterTrafficStats structure is only +created when any member of ClusterInfoImpl::trafficStats() is accessed. + +Current LazyCompatibleStats stats: + +* ClusterInfoImpl::trafficStats() -* :ref:`v3 API reference `. diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 98945dd8a278b..c29269f96fe32 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -18,9 +18,9 @@ template class LazyInit; */ template class LazyCompatibleInterface { public: - // Helper operators to get-or-create and return the StatsStructType object. - virtual StatsStructType* operator->() PURE; - virtual StatsStructType& operator*() PURE; + // Helper function to get-or-create and return the StatsStructType object. + virtual StatsStructType* instantiate() = 0; + virtual ~LazyCompatibleInterface() = default; }; @@ -29,6 +29,9 @@ template class LazyCompatibleInterface { * of stats that might not be needed in a given Envoy process. * * This class is thread-safe -- instantiations can occur on multiple concurrent threads. + * This is used when + * :ref:`enable_lazyinit_stats + * ` is enabled. */ template class LazyInit : public LazyCompatibleInterface { @@ -49,9 +52,6 @@ class LazyInit : public LazyCompatibleInterface { ctor_ = nullptr; } } - // Helper operators to get-or-create and return the StatsStructType object. - inline StatsStructType* operator->() override { return instantiate(); } - inline StatsStructType& operator*() override { return *instantiate(); } ~LazyInit() { if (inited_.value() > 0) { inited_.dec(); @@ -59,7 +59,7 @@ class LazyInit : public LazyCompatibleInterface { } private: - inline StatsStructType* instantiate() { return internal_stats_.get(ctor_); } + inline StatsStructType* instantiate() override { return internal_stats_.get(ctor_); } // In order to preserve stat value continuity across a config reload, we need to automatically // re-instantiate lazy stats when they are constructed, if there is already a live instantiation @@ -84,18 +84,17 @@ class LazyInit : public LazyCompatibleInterface { internal_stats_{}; }; -// Non-LazyInit wrapper over StatsStructType. +// Non-LazyInit wrapper over StatsStructType. This is used when +// :ref:`enable_lazyinit_stats +// ` is not enabled. template class DirectStats : public LazyCompatibleInterface { public: DirectStats(const typename StatsStructType::StatNameType& stat_names, Stats::Scope& scope) : stats_(stat_names, scope) {} - // Helper operators to get-or-create and return the StatsStructType object. - inline StatsStructType* operator->() override { return &stats_; }; - inline StatsStructType& operator*() override { return stats_; }; - private: + inline StatsStructType* instantiate() override { return &stats_; } StatsStructType stats_; }; @@ -117,8 +116,8 @@ template class LazyCompatibleStats { LazyCompatibleStats& operator=(LazyCompatibleStats&&) = default; LazyCompatibleStats(LazyCompatibleStats&&) = default; - inline StatsStructType* operator->() { return data_->operator->(); }; - inline StatsStructType& operator*() { return data_->operator*(); }; + inline StatsStructType* operator->() { return data_->instantiate(); }; + inline StatsStructType& operator*() { return *data_->instantiate(); }; private: LazyCompatibleStats(std::unique_ptr> d) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index ac608c7deb8d1..c34f64ac2f98c 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -15,8 +15,8 @@ namespace Envoy { namespace Stats { -// Creates a copy of Upstream::ALL_CLUSTER_TRAFFIC_STATS, such that per Joshua, we have a "a stable -// set of stats for performance" test. +// Creates a copy of Upstream::ALL_CLUSTER_TRAFFIC_STATS, such that we have a stable +// set of stats for performance test. #define AWESOME_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) \ COUNTER(bind_errors) \ COUNTER(original_dst_host_invalid) \ diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 17a8cdb6fae40..a09abfb0a37c8 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -195,7 +195,7 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - EXPECT_NE(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + test_server_->waitForCounterExists("cluster.cluster_1.upstream_cx_total"); Stats::CounterSharedPtr cx_counter = test_server_->counter("cluster.cluster_1.upstream_cx_total"); // Confirm no upstream connection is attempted so far. EXPECT_EQ(0, cx_counter->value()); @@ -244,6 +244,7 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { ASSERT_TRUE(response->complete()); cleanupUpstreamAndDownstream(); + // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); envoy::config::cluster::v3::Cluster cluster1_updated = @@ -252,9 +253,14 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between + // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted + // from main thread and worker thread. EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -263,8 +269,10 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // No cluster_2 stats yet. EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); @@ -294,9 +302,10 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { cleanupUpstreamAndDownstream(); }; send_http_request_to_cluster_and_wait_for_response("cluster_1"); - + // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -305,23 +314,26 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); + // No cluster_2 stats yet. EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); - + // Now the cluster_1 stats are gone, as well as the lazy init wrapper. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - + // Now add cluster1 again. envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); + // Now the cluster_1.ClusterTrafficStats.inited gauge is 0, since it didn't see previous stats. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); send_http_request_to_cluster_and_wait_for_response("cluster_1"); + // cluster_1 traffic stats created, due to the above http request. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } From a0e7f35ce3271340dda6ba8f29be51ef87e9efd3 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 24 Feb 2023 23:24:37 +0000 Subject: [PATCH 082/122] spellings Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 5 ++--- tools/spelling/spelling_dictionary.txt | 3 ++- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index c29269f96fe32..958a552a4967d 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -67,7 +67,7 @@ class LazyInit : public LazyCompatibleInterface { // Scenario 1: a cluster is instantiated but receives no requests, so its traffic-related stats // are never instantiated. When this cluster gets reloaded on a config update, a new lazy-init - // block is created, but the stats should again not be instaniated. + // block is created, but the stats should again not be instantiated. // Scenario 2: a cluster is instantiated and receives traffic, so its traffic-related stats are // instantiated. We must ensure that a new instance for the same cluster gets its lazy-stats @@ -98,8 +98,7 @@ class DirectStats : public LazyCompatibleInterface { StatsStructType stats_; }; -// A helper class to remove the double indirections on "operator ->/&" for a lazy compatible stats -// struct. +// A helper class for a lazy compatible stats struct type. template class LazyCompatibleStats { public: static LazyCompatibleStats create(Stats::ScopeSharedPtr scope, diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index 7ff6d6f4f1c14..863dc5352b1ed 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -690,6 +690,7 @@ emplaced emscripten emsdk enablement +enable_lazyinit_stats encodings endian endianness @@ -1433,4 +1434,4 @@ NSS SSLKEYLOGFILE DLB PCIE -EDNS +EDNS \ No newline at end of file From 10f48ebb50ce3ef03c92b3f9e8c1c33c6d674a7c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 27 Feb 2023 23:52:47 +0000 Subject: [PATCH 083/122] fix Joshua comments Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 25 ++-- test/integration/cds_integration_test.cc | 151 ++++++++++++----------- tools/spelling/spelling_dictionary.txt | 1 - 3 files changed, 90 insertions(+), 87 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 958a552a4967d..9190b52d8d485 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -40,21 +40,24 @@ class LazyInit : public LazyCompatibleInterface { // StatsStructType object later. // Caller should make sure scope and stat_names outlive this object. LazyInit(const typename StatsStructType::StatNameType& stat_names, Stats::ScopeSharedPtr scope) - : inited_(Stats::Utility::gaugeFromElements( - *scope, {Stats::DynamicName(StatsStructType::typeName()), Stats::DynamicName("inited")}, - Stats::Gauge::ImportMode::Accumulate)), + : initialized_([&scope]() -> Gauge& { + Stats::StatNamePool pool(scope->symbolTable()); + return Stats::Utility::gaugeFromElements( + *scope, {pool.add(StatsStructType::typeName()), pool.add("initialized")}, + Stats::Gauge::ImportMode::Accumulate); + }()), ctor_([scope = std::move(scope), &stat_names, this]() -> StatsStructType* { - inited_.inc(); + initialized_.inc(); return new StatsStructType(stat_names, *scope); }) { - if (inited_.value() > 0) { + if (initialized_.value() > 0) { instantiate(); ctor_ = nullptr; } } ~LazyInit() { - if (inited_.value() > 0) { - inited_.dec(); + if (initialized_.value() > 0) { + initialized_.dec(); } } @@ -73,10 +76,10 @@ class LazyInit : public LazyCompatibleInterface { // instantiated. We must ensure that a new instance for the same cluster gets its lazy-stats // instantiated before the previous cluster of the same name is destructed. - // To do that we keep an "inited" stat in the cluster's scope, which will be associated by name to - // the previous generation's cluster's lazy-init block. We use the value in this shared gauge to - // determine whether to instantiate the lazy block on construction. - Gauge& inited_; + // To do that we keep an "initialized" gauge in the cluster's scope, which will be associated by + // name to the previous generation's cluster's lazy-init block. We use the value in this shared + // gauge to determine whether to instantiate the lazy block on construction. + Gauge& initialized_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop // the setter lambda when the nested object is created. std::function ctor_; diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index a09abfb0a37c8..dd2a2ef7a9bde 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -222,44 +222,76 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { EXPECT_LE(cx_counter->value(), 1); } -// Test that LazyInitTrafficStats gets created and updated correctly. -TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { - this->use_real_stats_ = true; - config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats(true); - }); +class LazyInitClusterStatsTest : public CdsIntegrationTest { - initialize(); - test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - Http::TestRequestHeaderMapImpl request_headers{ - {":method", "GET"}, - {":path", "/cluster1"}, - {":scheme", "http"}, - {":authority", "host"}, +public: + void initialize() { + this->use_real_stats_ = true; + config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_lazyinit_stats(true); + }); + CdsIntegrationTest::initialize(); + test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); + } + + void SendRequestToCluster1AndWaitForResponse() { + BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( + lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); + ASSERT_TRUE(response->complete()); + cleanupUpstreamAndDownstream(); }; - BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( - lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); - ASSERT_TRUE(response->complete()); - cleanupUpstreamAndDownstream(); + void ExpectStats(absl::string_view cluster, bool initialized_gauge_exists, int initialized_gauge, + bool cx_active_exists, int upstream_cx_active) { + if (initialized_gauge_exists) { + EXPECT_EQ( + test_server_->gauge(absl::StrCat("cluster.", cluster, ".ClusterTrafficStats.initialized")) + ->value(), + initialized_gauge); + } else { + EXPECT_EQ(test_server_->gauge( + absl::StrCat("cluster.", cluster, ".ClusterTrafficStats.initialized")), + nullptr); + } + if (cx_active_exists) { + EXPECT_EQ( + test_server_->counter(absl::StrCat("cluster.", cluster, ".upstream_cx_total"))->value(), + upstream_cx_active); + } else { + EXPECT_EQ(test_server_->counter(absl::StrCat("cluster.", cluster, ".upstream_cx_total")), + nullptr); + } + } + void UpdateCluster1() { + envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_( + ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), + Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); + sendDiscoveryResponse( + Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); + } +}; +INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, + DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); + +// Test that LazyInitTrafficStats gets created and updated correctly. +TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { + initialize(); + + ExpectStats("cluster_1", true, 0, false, 0); + + SendRequestToCluster1AndWaitForResponse(); // Cluster_1 trafficStats updated. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - envoy::config::cluster::v3::Cluster cluster1_updated = - cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), - Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); - sendDiscoveryResponse( - Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); + ExpectStats("cluster_1", true, 1, true, 1); + + UpdateCluster1(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted // from main thread and worker thread. - EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); + EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); @@ -270,44 +302,21 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + ExpectStats("cluster_1", false, 0, false, 0); // No cluster_2 stats yet. - EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); + ExpectStats("cluster_2", true, 0, false, 0); } // Test that LazyInitTrafficStats with cluster_1 create-remove-create sequence. -TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { - this->use_real_stats_ = true; - config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats(true); - }); - +TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { initialize(); - test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - auto send_http_request_to_cluster_and_wait_for_response = [&](std::string cluster_name) { - Http::TestRequestHeaderMapImpl request_headers{ - {":method", "GET"}, - {":path", absl::StrCat("/", cluster_name)}, - {":scheme", "http"}, - {":authority", "host"}, - }; - BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( - lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); - ASSERT_TRUE(response->complete()); - cleanupUpstreamAndDownstream(); - }; - send_http_request_to_cluster_and_wait_for_response("cluster_1"); + ExpectStats("cluster_1", true, 0, false, 0); + SendRequestToCluster1AndWaitForResponse(); // Cluster_1 trafficStats updated. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + ExpectStats("cluster_1", true, 1, true, 1); // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); + {ClusterName1}, "49"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, @@ -315,27 +324,19 @@ TEST_P(CdsIntegrationTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // No cluster_2 stats yet. - EXPECT_NE(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); + ExpectStats("cluster_2", true, 0, false, 0); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited"), nullptr); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - // Now add cluster1 again. - envoy::config::cluster::v3::Cluster cluster1_updated = - cluster_creator_(ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), - Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); - sendDiscoveryResponse( - Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); + ExpectStats("cluster_1", false, 0, false, 0); + // Now add cluster1 back. + UpdateCluster1(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); - // Now the cluster_1.ClusterTrafficStats.inited gauge is 0, since it didn't see previous stats. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // Now the cluster_1.ClusterTrafficStats.initialized gauge is 0, since it didn't see previous + // stats. + ExpectStats("cluster_1", true, 0, false, 0); - send_http_request_to_cluster_and_wait_for_response("cluster_1"); // cluster_1 traffic stats created, due to the above http request. - EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.inited")->value(), 1); - EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + SendRequestToCluster1AndWaitForResponse(); + ExpectStats("cluster_1", true, 1, true, 1); } // Test the fast addition and removal of clusters when they use ThreadAwareLb. diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index 863dc5352b1ed..f13c1953f401d 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -1434,4 +1434,3 @@ NSS SSLKEYLOGFILE DLB PCIE -EDNS \ No newline at end of file From 91de71c8607b4bd595bc20c770079af36e2371f4 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 28 Feb 2023 00:22:18 +0000 Subject: [PATCH 084/122] revert unintentional deletion in dict.txt Signed-off-by: Xin Zhuang --- tools/spelling/spelling_dictionary.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index f13c1953f401d..9988b7ef92f0f 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -1434,3 +1434,4 @@ NSS SSLKEYLOGFILE DLB PCIE +EDNS From 9d72f38283cc5ab8dce88f425d9556a601c5d14d Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 28 Feb 2023 01:12:42 +0000 Subject: [PATCH 085/122] fix format errors Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 2 +- test/integration/cds_integration_test.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index c2342174d26cf..691d86bb8c26b 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -165,7 +165,7 @@ message Bootstrap { // When true, enable lazy init feature for stats that's of Stats::LazyInit type. // List of lazy init compatible stats: - // * ClusterTrafficStats + // - ClusterTrafficStats bool enable_lazyinit_stats = 38; // Configuration for internal processing of stats. diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index dd2a2ef7a9bde..72374a1379775 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -286,7 +286,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele UpdateCluster1(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - // Now the ClusterTrafficStats 'inited_' gauge >= 1, since there is a small race window between + // Now the ClusterTrafficStats 'initialized' gauge >= 1, since there is a small race window between // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted // from main thread and worker thread. EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); From 672ab39140b6bcd63a660dd52c1751f54eb16c80 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 1 Mar 2023 00:04:57 +0000 Subject: [PATCH 086/122] fixes for Joshua comments Signed-off-by: Xin Zhuang --- test/integration/cds_integration_test.cc | 78 +++++++++++------------- 1 file changed, 36 insertions(+), 42 deletions(-) diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 72374a1379775..4d75e48429ee2 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -226,7 +226,7 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { public: void initialize() { - this->use_real_stats_ = true; + use_real_stats_ = true; config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { bootstrap.set_enable_lazyinit_stats(true); }); @@ -234,42 +234,23 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); } - void SendRequestToCluster1AndWaitForResponse() { + void sendRequestToCluster1AndWaitForResponse() { BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); ASSERT_TRUE(response->complete()); cleanupUpstreamAndDownstream(); }; - void ExpectStats(absl::string_view cluster, bool initialized_gauge_exists, int initialized_gauge, - bool cx_active_exists, int upstream_cx_active) { - if (initialized_gauge_exists) { - EXPECT_EQ( - test_server_->gauge(absl::StrCat("cluster.", cluster, ".ClusterTrafficStats.initialized")) - ->value(), - initialized_gauge); - } else { - EXPECT_EQ(test_server_->gauge( - absl::StrCat("cluster.", cluster, ".ClusterTrafficStats.initialized")), - nullptr); - } - if (cx_active_exists) { - EXPECT_EQ( - test_server_->counter(absl::StrCat("cluster.", cluster, ".upstream_cx_total"))->value(), - upstream_cx_active); - } else { - EXPECT_EQ(test_server_->counter(absl::StrCat("cluster.", cluster, ".upstream_cx_total")), - nullptr); - } - } - void UpdateCluster1() { + void updateCluster1() { envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_( ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); + sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); } }; + INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); @@ -277,18 +258,20 @@ INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { initialize(); - ExpectStats("cluster_1", true, 0, false, 0); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - SendRequestToCluster1AndWaitForResponse(); + sendRequestToCluster1AndWaitForResponse(); // Cluster_1 trafficStats updated. - ExpectStats("cluster_1", true, 1, true, 1); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - UpdateCluster1(); + updateCluster1(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - // Now the ClusterTrafficStats 'initialized' gauge >= 1, since there is a small race window between - // the testing thread fetching the value before the old version ClusterTrafficStats gets deleted - // from main thread and worker thread. + // Now the ClusterTrafficStats 'initialized' gauge >= 1, since there is a small race window + // between the testing thread fetching the value before the old version ClusterTrafficStats gets + // deleted from main thread and worker thread. EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); @@ -296,24 +279,31 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + // update_success is 3: initialize(), update cluster1. and remove cluster1. test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - ExpectStats("cluster_1", false, 0, false, 0); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // No cluster_2 stats yet. - ExpectStats("cluster_2", true, 0, false, 0); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.initialized")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); } // Test that LazyInitTrafficStats with cluster_1 create-remove-create sequence. TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { initialize(); - ExpectStats("cluster_1", true, 0, false, 0); - SendRequestToCluster1AndWaitForResponse(); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + + sendRequestToCluster1AndWaitForResponse(); // Cluster_1 trafficStats updated. - ExpectStats("cluster_1", true, 1, true, 1); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, {ClusterName1}, "49"); @@ -324,19 +314,23 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // No cluster_2 stats yet. - ExpectStats("cluster_2", true, 0, false, 0); + EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.initialized")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), null); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. - ExpectStats("cluster_1", false, 0, false, 0); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized"), nullptr); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // Now add cluster1 back. - UpdateCluster1(); + updateCluster1(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); // Now the cluster_1.ClusterTrafficStats.initialized gauge is 0, since it didn't see previous // stats. - ExpectStats("cluster_1", true, 0, false, 0); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // cluster_1 traffic stats created, due to the above http request. - SendRequestToCluster1AndWaitForResponse(); - ExpectStats("cluster_1", true, 1, true, 1); + sendRequestToCluster1AndWaitForResponse(); + EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } // Test the fast addition and removal of clusters when they use ThreadAwareLb. From afeda1b609be8dbb4c070a0aec7a31e8bbead22a Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 1 Mar 2023 00:10:19 +0000 Subject: [PATCH 087/122] vscode remote repo is slower than git-terminal on saving Signed-off-by: Xin Zhuang --- test/integration/cds_integration_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 4d75e48429ee2..d19d37233ece0 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -315,7 +315,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // No cluster_2 stats yet. EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.initialized")->value(), 0); - EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), null); + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); From 0b38e5cb05f1111269442c441b452b2fd5500739 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 9 Mar 2023 21:08:27 +0000 Subject: [PATCH 088/122] fix josh comments Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 3 +++ test/integration/cds_integration_test.cc | 21 ++++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 9190b52d8d485..f8a3fd45987a1 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -79,6 +79,9 @@ class LazyInit : public LazyCompatibleInterface { // To do that we keep an "initialized" gauge in the cluster's scope, which will be associated by // name to the previous generation's cluster's lazy-init block. We use the value in this shared // gauge to determine whether to instantiate the lazy block on construction. + // TODO(stevenzzzz,jmarantz): See #14610. The initialized_ gauge could be disabled in a corner + // case where a user disables stats with suffix "initialized". + // In which case, the initialized_ will be a NullGauge, which breaks the above scenaio 2. Gauge& initialized_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop // the setter lambda when the nested object is created. diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index d19d37233ece0..9f1ed6815836a 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -223,7 +223,6 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { } class LazyInitClusterStatsTest : public CdsIntegrationTest { - public: void initialize() { use_real_stats_ = true; @@ -249,6 +248,14 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); } + + void removeClusters(const std::vector& removed) { + auto cluster_removed = test_server_->counter("cluster_manager.cluster_removed")->value(); + sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, + {}, removed, "42"); + test_server_->waitForCounterGe("cluster_manager.cluster_removed", + cluster_removed + removed.size()); + } }; INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, @@ -276,9 +283,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); - test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + removeClusters({ClusterName1}); // update_success is 3: initialize(), update cluster1. and remove cluster1. test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, @@ -289,7 +294,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - // No cluster_2 stats yet. + // No cluster_2 traffic stats. EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); } @@ -305,15 +310,13 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); // Remove "cluster_1". - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "49"); - test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); + removeClusters({ClusterName1}); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); - // No cluster_2 stats yet. + // No cluster_2 traffic stats. EXPECT_EQ(test_server_->gauge("cluster.cluster_2.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. From ac3d92729ef7e73407611a15ef239f339d1ef902 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 10 Mar 2023 01:48:26 +0000 Subject: [PATCH 089/122] add unit test, and adjust how ctor_ in LazyInit is deleted Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 4 +- test/common/stats/BUILD | 12 +++ test/common/stats/lazyinit_stats_test.cc | 126 +++++++++++++++++++++++ 3 files changed, 140 insertions(+), 2 deletions(-) create mode 100644 test/common/stats/lazyinit_stats_test.cc diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index f8a3fd45987a1..115ace6d633aa 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -48,15 +48,15 @@ class LazyInit : public LazyCompatibleInterface { }()), ctor_([scope = std::move(scope), &stat_names, this]() -> StatsStructType* { initialized_.inc(); + ctor_ = nullptr; return new StatsStructType(stat_names, *scope); }) { if (initialized_.value() > 0) { instantiate(); - ctor_ = nullptr; } } ~LazyInit() { - if (initialized_.value() > 0) { + if (ctor_ == nullptr) { initialized_.dec(); } } diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 2b519ba16e97e..3bcf1c0ca3a21 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -226,6 +226,18 @@ envoy_cc_benchmark_binary( ], ) +envoy_cc_test( + name = "lazyinit_stats_test", + srcs = ["lazyinit_stats_test.cc"], + deps = [ + "//envoy/stats:stats_interface", + "//source/common/memory:stats_lib", + "//source/common/stats:lazy_init", + "//source/common/stats:thread_local_store_lib", + "//test/test_common:utility_lib", + ], +) + envoy_cc_benchmark_binary( name = "lazyinit_stats_benchmark", srcs = ["lazyinit_stats_speed_test.cc"], diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/lazyinit_stats_test.cc new file mode 100644 index 0000000000000..768e54bd44887 --- /dev/null +++ b/test/common/stats/lazyinit_stats_test.cc @@ -0,0 +1,126 @@ +#include "envoy/stats/scope.h" +#include "envoy/stats/stats_macros.h" + +#include "source/common/common/thread.h" +#include "source/common/stats/lazy_init.h" +#include "source/common/stats/thread_local_store.h" + +#include "test/test_common/utility.h" + +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +namespace Envoy { +namespace Stats { +namespace Test { + +#define AWESOME_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) COUNTER(foo) + +MAKE_STAT_NAMES_STRUCT(AwesomeStatNames, AWESOME_STATS); +MAKE_STATS_STRUCT(AwesomeStats, AwesomeStatNames, AWESOME_STATS); + +class LazyInitStatsTest : public testing::Test { +public: + SymbolTableImpl symbol_table_; + AllocatorImpl allocator_{symbol_table_}; + ThreadLocalStoreImpl store_{allocator_}; + AwesomeStatNames stats_names_{symbol_table_}; +}; + +using LazyAwesomeStats = LazyCompatibleStats; + +TEST_F(LazyInitStatsTest, StatsGoneWithScope) { + { + ScopeSharedPtr scope = store_.createScope("bluh"); + LazyAwesomeStats x = LazyAwesomeStats::create(scope, stats_names_, true); + LazyAwesomeStats y = LazyAwesomeStats::create(scope, stats_names_, true); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + x->foo_.inc(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + EXPECT_EQ(x->foo_.value(), 1); + EXPECT_EQ(y->foo_.value(), 1); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); + } + // Deleted as scope deleted. + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); + { + ScopeSharedPtr scope = store_.createScope("bluh"); + LazyAwesomeStats x = LazyAwesomeStats::create(scope, stats_names_, true); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + EXPECT_EQ(x->foo_.value(), 0); + // Initialized now. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + } +} + +TEST_F(LazyInitStatsTest, StatsMutlipleInstancesDynamicallyDestructed) { + { + ScopeSharedPtr scope_1 = store_.createScope("bluh"); + auto x = + std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + auto y = + std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + (*x)->foo_.inc(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + EXPECT_EQ((*x)->foo_.value(), 1); + EXPECT_EQ((*y)->foo_.value(), 1); + // x,y instantiated. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); + // Only x instantiated. + y.reset(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + EXPECT_EQ((*x)->foo_.value(), 1); + } + // Deleted as scope deleted. + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); + { + ScopeSharedPtr scope_2 = store_.createScope("bluh"); + LazyAwesomeStats x = LazyAwesomeStats::create(scope_2, stats_names_, true); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + // Previous data is gone, as scope_2 and scope_1's lifecycle do not overlap. + EXPECT_EQ(x->foo_.value(), 0); + // Initialized now. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + } +} + +TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { + ScopeSharedPtr scope_1 = store_.createScope("bluh"); + { + auto x = + std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + auto y = + std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + (*x)->foo_.inc(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + EXPECT_EQ((*x)->foo_.value(), 1); + EXPECT_EQ((*y)->foo_.value(), 1); + // x,y instantiated. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); + // Only x instantiated. + y.reset(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + EXPECT_EQ((*x)->foo_.value(), 1); + } + // Both LazyAwesomeStats deleted. + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + + { + // scope_1 overlaps with scope_2. + ScopeSharedPtr scope_2 = store_.createScope("bluh"); + LazyAwesomeStats x = LazyAwesomeStats::create(scope_2, stats_names_, true); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + // Previous data is NOT gone, as scope_2 and scope_1's lifecycles overlap. + EXPECT_EQ(x->foo_.value(), 1); + // Initialized now. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + } +} + +} +} +} From f2b1a9b486b971e7335c02031cce5301f48e77c9 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 10 Mar 2023 14:40:10 +0000 Subject: [PATCH 090/122] fix for josh Signed-off-by: Xin Zhuang --- test/integration/cds_integration_test.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 9f1ed6815836a..af0e294cf2a47 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -250,7 +250,7 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { } void removeClusters(const std::vector& removed) { - auto cluster_removed = test_server_->counter("cluster_manager.cluster_removed")->value(); + uint64_t cluster_removed = test_server_->counter("cluster_manager.cluster_removed")->value(); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, removed, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", @@ -282,7 +282,6 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Remove "cluster_1". removeClusters({ClusterName1}); // update_success is 3: initialize(), update cluster1. and remove cluster1. test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); @@ -309,7 +308,6 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr // Cluster_1 trafficStats updated. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - // Remove "cluster_1". removeClusters({ClusterName1}); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); sendDiscoveryResponse(Config::TypeUrl::get().Cluster, From e2da82f69082ec69895637d86c05ec01d360824f Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 31 Mar 2023 01:03:49 +0000 Subject: [PATCH 091/122] add more unit tests Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 2 +- test/common/stats/lazyinit_stats_test.cc | 40 +++++++++++++++++------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 115ace6d633aa..b5fad632d9cde 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -79,7 +79,7 @@ class LazyInit : public LazyCompatibleInterface { // To do that we keep an "initialized" gauge in the cluster's scope, which will be associated by // name to the previous generation's cluster's lazy-init block. We use the value in this shared // gauge to determine whether to instantiate the lazy block on construction. - // TODO(stevenzzzz,jmarantz): See #14610. The initialized_ gauge could be disabled in a corner + // TODO(stevenzzzz,jmarantz, #26106): See #14610. The initialized_ gauge could be disabled in a corner // case where a user disables stats with suffix "initialized". // In which case, the initialized_ will be a NullGauge, which breaks the above scenaio 2. Gauge& initialized_; diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/lazyinit_stats_test.cc index 768e54bd44887..9478dcd784b4d 100644 --- a/test/common/stats/lazyinit_stats_test.cc +++ b/test/common/stats/lazyinit_stats_test.cc @@ -12,7 +12,7 @@ namespace Envoy { namespace Stats { -namespace Test { +namespace { #define AWESOME_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) COUNTER(foo) @@ -27,13 +27,29 @@ class LazyInitStatsTest : public testing::Test { AwesomeStatNames stats_names_{symbol_table_}; }; -using LazyAwesomeStats = LazyCompatibleStats; +using MyStats = LazyCompatibleStats; + +TEST_F(LazyInitStatsTest, NonLazyNoInitializedGauge) { + { + ScopeSharedPtr scope = store_.createScope("bluh"); + MyStats non_lazy_y = MyStats::create(scope, stats_names_, false); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); + non_lazy_y->foo_.inc(); + MyStats lazy_x = MyStats::create(scope, stats_names_, true); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + x->foo_.inc(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + EXPECT_EQ(x->foo_.value(), 1); + EXPECT_EQ(y->foo_.value(), 1); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); +} + } TEST_F(LazyInitStatsTest, StatsGoneWithScope) { { ScopeSharedPtr scope = store_.createScope("bluh"); - LazyAwesomeStats x = LazyAwesomeStats::create(scope, stats_names_, true); - LazyAwesomeStats y = LazyAwesomeStats::create(scope, stats_names_, true); + MyStats x = MyStats::create(scope, stats_names_, true); + MyStats y = MyStats::create(scope, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); x->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -45,7 +61,7 @@ TEST_F(LazyInitStatsTest, StatsGoneWithScope) { EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); { ScopeSharedPtr scope = store_.createScope("bluh"); - LazyAwesomeStats x = LazyAwesomeStats::create(scope, stats_names_, true); + MyStats x = MyStats::create(scope, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); EXPECT_EQ(x->foo_.value(), 0); // Initialized now. @@ -57,9 +73,9 @@ TEST_F(LazyInitStatsTest, StatsMutlipleInstancesDynamicallyDestructed) { { ScopeSharedPtr scope_1 = store_.createScope("bluh"); auto x = - std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + std::make_unique(MyStats::create(scope_1, stats_names_, true)); auto y = - std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + std::make_unique(MyStats::create(scope_1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); (*x)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -77,7 +93,7 @@ TEST_F(LazyInitStatsTest, StatsMutlipleInstancesDynamicallyDestructed) { EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); { ScopeSharedPtr scope_2 = store_.createScope("bluh"); - LazyAwesomeStats x = LazyAwesomeStats::create(scope_2, stats_names_, true); + MyStats x = MyStats::create(scope_2, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); // Previous data is gone, as scope_2 and scope_1's lifecycle do not overlap. EXPECT_EQ(x->foo_.value(), 0); @@ -90,9 +106,9 @@ TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { ScopeSharedPtr scope_1 = store_.createScope("bluh"); { auto x = - std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + std::make_unique(MyStats::create(scope_1, stats_names_, true)); auto y = - std::make_unique(LazyAwesomeStats::create(scope_1, stats_names_, true)); + std::make_unique(MyStats::create(scope_1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); (*x)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -105,14 +121,14 @@ TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); EXPECT_EQ((*x)->foo_.value(), 1); } - // Both LazyAwesomeStats deleted. + // Both MyStats deleted. EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); { // scope_1 overlaps with scope_2. ScopeSharedPtr scope_2 = store_.createScope("bluh"); - LazyAwesomeStats x = LazyAwesomeStats::create(scope_2, stats_names_, true); + MyStats x = MyStats::create(scope_2, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); // Previous data is NOT gone, as scope_2 and scope_1's lifecycles overlap. EXPECT_EQ(x->foo_.value(), 1); From 51a0a7f92577edcc0fb34ae38d629fe91c003294 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 31 Mar 2023 20:29:52 +0000 Subject: [PATCH 092/122] adjust tests and add comments in lazyinit_stats_test Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 8 +- test/common/stats/lazyinit_stats_test.cc | 96 ++++++++++++------------ test/integration/cds_integration_test.cc | 46 ++++++------ 3 files changed, 76 insertions(+), 74 deletions(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index b5fad632d9cde..c7bfe52cb0de4 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -79,9 +79,11 @@ class LazyInit : public LazyCompatibleInterface { // To do that we keep an "initialized" gauge in the cluster's scope, which will be associated by // name to the previous generation's cluster's lazy-init block. We use the value in this shared // gauge to determine whether to instantiate the lazy block on construction. - // TODO(stevenzzzz,jmarantz, #26106): See #14610. The initialized_ gauge could be disabled in a corner - // case where a user disables stats with suffix "initialized". - // In which case, the initialized_ will be a NullGauge, which breaks the above scenaio 2. + // TODO(stevenzzzz,jmarantz, #26106): See #14610. The initialized_ gauge could be disabled in a + // corner case where a user disables stats with suffix "initialized". In which case, the + // initialized_ will be a NullGauge, which breaks the above scenaio 2. + // TODO(stevenzzzz, jmarantz): Consider hiding this Gauge from being exported, through using the + // stats flags mask. Gauge& initialized_; // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop // the setter lambda when the nested object is created. diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/lazyinit_stats_test.cc index 9478dcd784b4d..35d373e6ff26e 100644 --- a/test/common/stats/lazyinit_stats_test.cc +++ b/test/common/stats/lazyinit_stats_test.cc @@ -12,7 +12,7 @@ namespace Envoy { namespace Stats { -namespace { +namespace { #define AWESOME_STATS(COUNTER, GAUGE, HISTOGRAM, TEXT_READOUT, STATNAME) COUNTER(foo) @@ -29,25 +29,12 @@ class LazyInitStatsTest : public testing::Test { using MyStats = LazyCompatibleStats; -TEST_F(LazyInitStatsTest, NonLazyNoInitializedGauge) { - { - ScopeSharedPtr scope = store_.createScope("bluh"); - MyStats non_lazy_y = MyStats::create(scope, stats_names_, false); - EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); - non_lazy_y->foo_.inc(); - MyStats lazy_x = MyStats::create(scope, stats_names_, true); - EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); - x->foo_.inc(); - EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); - EXPECT_EQ(x->foo_.value(), 1); - EXPECT_EQ(y->foo_.value(), 1); - EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); -} - } - +// Tests that "AwesomeStats.initialized" gauge equals the number of initiated MyStats instances. TEST_F(LazyInitStatsTest, StatsGoneWithScope) { { ScopeSharedPtr scope = store_.createScope("bluh"); + // No such gauge when there is no lazy init stats instances. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); MyStats x = MyStats::create(scope, stats_names_, true); MyStats y = MyStats::create(scope, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); @@ -59,56 +46,65 @@ TEST_F(LazyInitStatsTest, StatsGoneWithScope) { } // Deleted as scope deleted. EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); { + // Recreate scope "bluh". ScopeSharedPtr scope = store_.createScope("bluh"); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); MyStats x = MyStats::create(scope, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + // Previous data is gone, as scope_v2 and scope_1's lifecycle do not overlap. EXPECT_EQ(x->foo_.value(), 0); // Initialized now. EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); } } -TEST_F(LazyInitStatsTest, StatsMutlipleInstancesDynamicallyDestructed) { +// Tests that multiple stats struct instances within the same scope has no issue to keep the stats, +// with removals. +TEST_F(LazyInitStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { { ScopeSharedPtr scope_1 = store_.createScope("bluh"); - auto x = - std::make_unique(MyStats::create(scope_1, stats_names_, true)); - auto y = - std::make_unique(MyStats::create(scope_1, stats_names_, true)); + auto x = std::make_unique(MyStats::create(scope_1, stats_names_, true)); + auto y = std::make_unique(MyStats::create(scope_1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + // Only instantiate x, and then delete it. (*x)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); EXPECT_EQ((*x)->foo_.value(), 1); + x.reset(); + // y is not instantiated before x was deleted, no AwesomeStats instance, but stats are not lost. + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + // Instantiate y now. EXPECT_EQ((*y)->foo_.value(), 1); - // x,y instantiated. - EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); - // Only x instantiated. - y.reset(); + (*y)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); - EXPECT_EQ((*x)->foo_.value(), 1); + EXPECT_EQ((*y)->foo_.value(), 2); } // Deleted as scope deleted. EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); { - ScopeSharedPtr scope_2 = store_.createScope("bluh"); - MyStats x = MyStats::create(scope_2, stats_names_, true); + ScopeSharedPtr scope_v2 = store_.createScope("bluh"); + MyStats x = MyStats::create(scope_v2, stats_names_, true); + // Previous data is gone, as scope_v2 and scope_1's lifecycle do not overlap. EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); - // Previous data is gone, as scope_2 and scope_1's lifecycle do not overlap. EXPECT_EQ(x->foo_.value(), 0); // Initialized now. EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); } + // Deleted as scope deleted. + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); } +// Tests that as long as scope lives, stats under the scope won't be lost. TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { - ScopeSharedPtr scope_1 = store_.createScope("bluh"); + ScopeSharedPtr scope_1 = store_.createScope("bluh"); { - auto x = - std::make_unique(MyStats::create(scope_1, stats_names_, true)); - auto y = - std::make_unique(MyStats::create(scope_1, stats_names_, true)); + auto x = std::make_unique(MyStats::create(scope_1, stats_names_, true)); + auto y = std::make_unique(MyStats::create(scope_1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); (*x)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -119,24 +115,30 @@ TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { // Only x instantiated. y.reset(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); - EXPECT_EQ((*x)->foo_.value(), 1); + (*x)->foo_.inc(); + EXPECT_EQ((*x)->foo_.value(), 2); } // Both MyStats deleted. - EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 2); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); - { - // scope_1 overlaps with scope_2. - ScopeSharedPtr scope_2 = store_.createScope("bluh"); - MyStats x = MyStats::create(scope_2, stats_names_, true); + // scope_1 overlaps with scope_v2. + ScopeSharedPtr scope_v2 = store_.createScope("bluh"); + + MyStats x_v2 = MyStats::create(scope_v2, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); - // Previous data is NOT gone, as scope_2 and scope_1's lifecycles overlap. - EXPECT_EQ(x->foo_.value(), 1); - // Initialized now. + // Previous data is NOT gone, as scope_v2 and scope_1's lifecycles overlap. + EXPECT_EQ(x_v2->foo_.value(), 2); + + x_v2->foo_.inc(); + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 3); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); } + // scope_v2 is gone, but stat value kept since scope_1 is alive. + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 3); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); } -} -} -} +} // namespace +} // namespace Stats +} // namespace Envoy diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index af0e294cf2a47..b62dbab0cc781 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -95,8 +95,7 @@ class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public Ht // Do the initial compareDiscoveryRequest / sendDiscoveryResponse for cluster_1. EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "", {}, {}, {}, true)); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster1_}, {cluster1_}, {}, "55"); + sendClusterDiscoveryResponse({cluster1_}, {cluster1_}, {}, "55"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse describing cluster_1 that we sent. @@ -109,6 +108,14 @@ class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public Ht registerTestServerPorts({"http"}); } + void sendClusterDiscoveryResponse( + const std::vector& state_of_the_world, + const std::vector& added_or_updated, + const std::vector& removed, const std::string& version) { + sendDiscoveryResponse( + Config::TypeUrl::get().Cluster, state_of_the_world, added_or_updated, removed, version); + } + // Regression test to catch the code declaring a gRPC service method for {SotW,delta} // when the user's bootstrap config asks for the other type. void verifyGrpcServiceMethod() { @@ -159,8 +166,7 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { // Tell Envoy that cluster_1 is gone. EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "55", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); + sendClusterDiscoveryResponse({}, {}, {ClusterName1}, "42"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse that says cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -178,8 +184,7 @@ TEST_P(CdsIntegrationTest, CdsClusterUpDownUp) { // Tell Envoy that cluster_1 is back. EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "42", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster1_}, {cluster1_}, {}, "413"); + sendClusterDiscoveryResponse({cluster1_}, {cluster1_}, {}, "413"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse describing cluster_1 that we sent. Again, 2 includes CDS server. @@ -210,8 +215,7 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { // Tell Envoy that cluster_1 is gone. EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "55", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); + sendClusterDiscoveryResponse({}, {}, {ClusterName1}, "42"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse that says cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -233,6 +237,8 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); } + bool using_lazyi_init() { return get<1>(GetParam()); } + void sendRequestToCluster1AndWaitForResponse() { BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); @@ -251,8 +257,7 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { void removeClusters(const std::vector& removed) { uint64_t cluster_removed = test_server_->counter("cluster_manager.cluster_removed")->value(); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, - {}, removed, "42"); + sendClusterDiscoveryResponse({}, {}, removed, "42"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", cluster_removed + removed.size()); } @@ -285,8 +290,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele removeClusters({ClusterName1}); // update_success is 3: initialize(), update cluster1. and remove cluster1. test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster2_}, {cluster2_}, {}, "43"); + sendClusterDiscoveryResponse({cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // Now the cluster_1 stats are gone, as well as the lazy init wrapper. @@ -310,8 +314,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); removeClusters({ClusterName1}); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster2_}, {cluster2_}, {}, "43"); + sendClusterDiscoveryResponse({cluster2_}, {cluster2_}, {}, "43"); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); // No cluster_2 traffic stats. @@ -342,8 +345,7 @@ TEST_P(CdsIntegrationTest, CdsClusterWithThreadAwareLbCycleUpDownUp) { // Tell Envoy that cluster_1 is gone. EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "55", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); + sendClusterDiscoveryResponse({}, {}, {ClusterName1}, "42"); // Make sure that Envoy's ClusterManager has made use of the DiscoveryResponse that says // cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -390,8 +392,7 @@ TEST_P(CdsIntegrationTest, TwoClusters) { // Tell Envoy that cluster_1 is gone. EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "42", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster2_}, {}, {ClusterName1}, "43"); + sendClusterDiscoveryResponse({cluster2_}, {}, {ClusterName1}, "43"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse that says cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -436,8 +437,7 @@ TEST_P(CdsIntegrationTest, TwoClustersAndRedirects) { // The '3' includes the fake CDS server. test_server_->waitForGaugeGe("cluster_manager.active_clusters", 3); // Tell Envoy that cluster_1 is gone. - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, - {cluster2_}, {}, {ClusterName1}, "43"); + sendClusterDiscoveryResponse({cluster2_}, {}, {ClusterName1}, "43"); test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); codec_client_ = makeHttpConnection(makeClientConnection((lookupPort("http")))); @@ -579,8 +579,7 @@ TEST_P(CdsIntegrationTest, CdsClusterDownWithLotsOfIdleConnections) { // Tell Envoy that cluster_1 is gone. Envoy will try to close all idle connections EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "55", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); + sendClusterDiscoveryResponse({}, {}, {ClusterName1}, "42"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse that says cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); @@ -651,8 +650,7 @@ TEST_P(CdsIntegrationTest, DISABLED_CdsClusterDownWithLotsOfConnectingConnection // Tell Envoy that cluster_1 is gone. Envoy will try to close all pending connections EXPECT_TRUE(compareDiscoveryRequest(Config::TypeUrl::get().Cluster, "55", {}, {}, {})); - sendDiscoveryResponse(Config::TypeUrl::get().Cluster, {}, {}, - {ClusterName1}, "42"); + sendClusterDiscoveryResponse({}, {}, {ClusterName1}, "42"); // We can continue the test once we're sure that Envoy's ClusterManager has made use of // the DiscoveryResponse that says cluster_1 is gone. test_server_->waitForCounterGe("cluster_manager.cluster_removed", 1); From 0e84bee55f29a2f17d4e99d8f1ba764d0ddcbc96 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 31 Mar 2023 20:45:28 +0000 Subject: [PATCH 093/122] add one more test Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_test.cc | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/lazyinit_stats_test.cc index 35d373e6ff26e..b10459b0b0403 100644 --- a/test/common/stats/lazyinit_stats_test.cc +++ b/test/common/stats/lazyinit_stats_test.cc @@ -139,6 +139,39 @@ TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); } +// Tests that as two AwesomeStats instances of different scope, as long as the scope life-cycle +// overlaps, still got data kept when the earlier scope got deleted. +TEST_F(LazyInitStatsTest, WhenScopesOverlapStatsAreAliveAsLongAsThereAre) { + + ScopeSharedPtr scope_v1 = store_.createScope("bluh"); + auto x = std::make_unique(MyStats::create(scope_v1, stats_names_, true)); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); + (*x)->foo_.inc(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + + // Now scope_v2 gets created, but no action on any stats. + ScopeSharedPtr scope_v2 = store_.createScope("bluh"); + auto y = std::make_unique(MyStats::create(scope_v2, stats_names_, true)); + // NOTE: since x was instantiated, y is instantiated on creation. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); + + // Now remove scope_v1, stats won't be lost. + x.reset(); + scope_v1.reset(); + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); + + // remove scope_v2, stats will be gone. + y.reset(); + scope_v2.reset(); + + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); +} + } // namespace } // namespace Stats } // namespace Envoy From 015efb5cdbc6c92bf5309e40d10f97121b181624 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Sat, 1 Apr 2023 03:23:26 +0000 Subject: [PATCH 094/122] save Signed-off-by: Xin Zhuang --- test/common/grpc/grpc_client_integration.h | 9 +++++++-- test/integration/cds_integration_test.cc | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/test/common/grpc/grpc_client_integration.h b/test/common/grpc/grpc_client_integration.h index 84abeda51cf35..9f26ca2d329aa 100644 --- a/test/common/grpc/grpc_client_integration.h +++ b/test/common/grpc/grpc_client_integration.h @@ -103,8 +103,13 @@ class UnifiedOrLegacyMuxIntegrationParamTest bool isUnified() const { return std::get<2>(GetParam()) == LegacyOrUnified::Unified; } }; +class BaseDeltaSotwIntegrationParamTest:public BaseGrpcClientIntegrationParamTest{ + public: + SotwOrDelta sotwOrDelta() const PURE; +}; + class DeltaSotwIntegrationParamTest - : public BaseGrpcClientIntegrationParamTest, + : public BaseDeltaSotwIntegrationParamTest, public testing::TestWithParam< std::tuple> { public: @@ -118,7 +123,7 @@ class DeltaSotwIntegrationParamTest } Network::Address::IpVersion ipVersion() const override { return std::get<0>(GetParam()); } ClientType clientType() const override { return std::get<1>(GetParam()); } - SotwOrDelta sotwOrDelta() const { return std::get<2>(GetParam()); } + SotwOrDelta sotwOrDelta() const override{ return std::get<2>(GetParam()); } }; // Skip tests based on gRPC client type. diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index b62dbab0cc781..8cfc5a6676806 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -29,7 +29,7 @@ const char ClusterName2[] = "cluster_2"; const int UpstreamIndex1 = 1; const int UpstreamIndex2 = 2; -class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public HttpIntegrationTest { +class CdsIntegrationTestBase : public Grpc::BaseDeltaSotwIntegrationParamTest, public HttpIntegrationTest { public: CdsIntegrationTest() : HttpIntegrationTest(Http::CodecType::HTTP2, ipVersion(), @@ -148,6 +148,9 @@ class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public Ht cluster_creator_; }; +class CdsIntegrationTest : public CdsIntegrationTestBase, public Grpc::DeltaSotwIntegrationParamTest {}; + + INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, CdsIntegrationTest, DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); From c644062d68da430026572dbee5c0de55c9da14a8 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Sat, 1 Apr 2023 04:34:54 +0000 Subject: [PATCH 095/122] add non-lazy tests in cds_integration_test Signed-off-by: Xin Zhuang --- test/common/grpc/grpc_client_integration.h | 9 +-- test/integration/cds_integration_test.cc | 94 ++++++++++++++++------ 2 files changed, 71 insertions(+), 32 deletions(-) diff --git a/test/common/grpc/grpc_client_integration.h b/test/common/grpc/grpc_client_integration.h index 9f26ca2d329aa..84abeda51cf35 100644 --- a/test/common/grpc/grpc_client_integration.h +++ b/test/common/grpc/grpc_client_integration.h @@ -103,13 +103,8 @@ class UnifiedOrLegacyMuxIntegrationParamTest bool isUnified() const { return std::get<2>(GetParam()) == LegacyOrUnified::Unified; } }; -class BaseDeltaSotwIntegrationParamTest:public BaseGrpcClientIntegrationParamTest{ - public: - SotwOrDelta sotwOrDelta() const PURE; -}; - class DeltaSotwIntegrationParamTest - : public BaseDeltaSotwIntegrationParamTest, + : public BaseGrpcClientIntegrationParamTest, public testing::TestWithParam< std::tuple> { public: @@ -123,7 +118,7 @@ class DeltaSotwIntegrationParamTest } Network::Address::IpVersion ipVersion() const override { return std::get<0>(GetParam()); } ClientType clientType() const override { return std::get<1>(GetParam()); } - SotwOrDelta sotwOrDelta() const override{ return std::get<2>(GetParam()); } + SotwOrDelta sotwOrDelta() const { return std::get<2>(GetParam()); } }; // Skip tests based on gRPC client type. diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 8cfc5a6676806..b2459f94503e0 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -29,7 +29,7 @@ const char ClusterName2[] = "cluster_2"; const int UpstreamIndex1 = 1; const int UpstreamIndex2 = 2; -class CdsIntegrationTestBase : public Grpc::BaseDeltaSotwIntegrationParamTest, public HttpIntegrationTest { +class CdsIntegrationTest : public Grpc::DeltaSotwIntegrationParamTest, public HttpIntegrationTest { public: CdsIntegrationTest() : HttpIntegrationTest(Http::CodecType::HTTP2, ipVersion(), @@ -148,9 +148,6 @@ class CdsIntegrationTestBase : public Grpc::BaseDeltaSotwIntegrationParamTest, p cluster_creator_; }; -class CdsIntegrationTest : public CdsIntegrationTestBase, public Grpc::DeltaSotwIntegrationParamTest {}; - - INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, CdsIntegrationTest, DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); @@ -231,25 +228,24 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { class LazyInitClusterStatsTest : public CdsIntegrationTest { public: - void initialize() { + void initializeLazyTest(bool enable_lazyinit) { use_real_stats_ = true; - config_helper_.addConfigModifier([](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats(true); - }); + config_helper_.addConfigModifier( + [enable_lazyinit](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_lazyinit_stats(enable_lazyinit); + }); CdsIntegrationTest::initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); } - bool using_lazyi_init() { return get<1>(GetParam()); } - - void sendRequestToCluster1AndWaitForResponse() { + void sendRequestToClusterAndWaitForResponse() { BufferingStreamDecoderPtr response = IntegrationUtil::makeSingleRequest( lookupPort("http"), "GET", "/cluster1", "", downstream_protocol_, version_, "foo.com"); ASSERT_TRUE(response->complete()); cleanupUpstreamAndDownstream(); }; - void updateCluster1() { + void updateCluster() { envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_( ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); @@ -271,23 +267,19 @@ INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, // Test that LazyInitTrafficStats gets created and updated correctly. TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { - initialize(); + initializeLazyTest(/*enable_lazyinit=*/true); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - sendRequestToCluster1AndWaitForResponse(); - // Cluster_1 trafficStats updated. + sendRequestToClusterAndWaitForResponse(); + // cluster_1 trafficStats updated. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); - updateCluster1(); + updateCluster(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); - // Now the ClusterTrafficStats 'initialized' gauge >= 1, since there is a small race window - // between the testing thread fetching the value before the old version ClusterTrafficStats gets - // deleted from main thread and worker thread. - EXPECT_GE(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); // cluster_1 traffic stats not lost. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); removeClusters({ClusterName1}); @@ -305,14 +297,41 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); } +// Test that Non-LazyInitTrafficStats gets created and updated correctly. +TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateUpdateDelete) { + initializeLazyTest(/*enable_lazyinit=*/false); + // cluster_1 trafficStats created by CDS push. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); + + sendRequestToClusterAndWaitForResponse(); + // cluster_1 trafficStats updated. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + + updateCluster(); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + + // cluster_1 traffic stats not lost. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + removeClusters({ClusterName1}); + // update_success is 3: initialize(), update cluster1. and remove cluster1. + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); + sendClusterDiscoveryResponse({cluster2_}, {cluster2_}, {}, "43"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); + EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); + // Now the cluster_1 stats are gone. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // cluster_2 traffic stats stays. + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); +} + // Test that LazyInitTrafficStats with cluster_1 create-remove-create sequence. TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { - initialize(); + initializeLazyTest(/*enable_lazyinit=*/true); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); - sendRequestToCluster1AndWaitForResponse(); - // Cluster_1 trafficStats updated. + sendRequestToClusterAndWaitForResponse(); + // cluster_1 trafficStats updated. EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); removeClusters({ClusterName1}); @@ -327,7 +346,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized"), nullptr); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // Now add cluster1 back. - updateCluster1(); + updateCluster(); test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); // Now the cluster_1.ClusterTrafficStats.initialized gauge is 0, since it didn't see previous // stats. @@ -335,11 +354,36 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); // cluster_1 traffic stats created, due to the above http request. - sendRequestToCluster1AndWaitForResponse(); + sendRequestToClusterAndWaitForResponse(); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 1); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } +// Test that Non-LazyInitTrafficStats with cluster_1 create-remove-create sequence. +TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateDeleteRecrete) { + initializeLazyTest(/*enable_lazyinit=*/false); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); + + sendRequestToClusterAndWaitForResponse(); + // cluster_1 trafficStats updated. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); + removeClusters({ClusterName1}); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 2); + sendClusterDiscoveryResponse({cluster2_}, {cluster2_}, {}, "43"); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 3); + EXPECT_EQ(test_server_->counter("cluster_manager.cluster_added")->value(), 3); + // cluster_2 traffic stats created. + EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); + // Now the cluster_1 stats are gone. + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); + // Now add cluster1 back. + updateCluster(); + test_server_->waitForCounterGe("cluster_manager.cds.update_success", 4); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); + sendRequestToClusterAndWaitForResponse(); + EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); +} + // Test the fast addition and removal of clusters when they use ThreadAwareLb. TEST_P(CdsIntegrationTest, CdsClusterWithThreadAwareLbCycleUpDownUp) { // Calls our initialize(), which includes establishing a listener, route, and cluster. From 5734d86432017738cd87ebb97e36a7f81e21a499 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 5 Apr 2023 03:42:39 +0000 Subject: [PATCH 096/122] fix comments from josh Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_test.cc | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/lazyinit_stats_test.cc index b10459b0b0403..4e921603bb76a 100644 --- a/test/common/stats/lazyinit_stats_test.cc +++ b/test/common/stats/lazyinit_stats_test.cc @@ -29,6 +29,22 @@ class LazyInitStatsTest : public testing::Test { using MyStats = LazyCompatibleStats; +// Tests that non-lazy stats has no "AwesomeStats.initialized" gauge. +TEST_F(LazyInitStatsTest, NonLazyNoInitializedGauge) { + { + ScopeSharedPtr scope = store_.createScope("bluh"); + MyStats non_lazy_y = MyStats::create(scope, stats_names_, false); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 0); + non_lazy_y->foo_.inc(); + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); + } + // Scope gone, stats deleted. + EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); + EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo"), nullptr); +} + // Tests that "AwesomeStats.initialized" gauge equals the number of initiated MyStats instances. TEST_F(LazyInitStatsTest, StatsGoneWithScope) { { @@ -60,8 +76,8 @@ TEST_F(LazyInitStatsTest, StatsGoneWithScope) { } } -// Tests that multiple stats struct instances within the same scope has no issue to keep the stats, -// with removals. +// Tests that multiple stats struct instances within the same scope has no issue to keep the +// stats, with removals. TEST_F(LazyInitStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { { ScopeSharedPtr scope_1 = store_.createScope("bluh"); @@ -73,7 +89,8 @@ TEST_F(LazyInitStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); EXPECT_EQ((*x)->foo_.value(), 1); x.reset(); - // y is not instantiated before x was deleted, no AwesomeStats instance, but stats are not lost. + // y is not instantiated before x was deleted, no AwesomeStats instance, but stats are not + // lost. EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 1); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); // Instantiate y now. From fe40f03e30915a21347746ecfc61a9a0190f40b8 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 5 Apr 2023 16:25:09 +0000 Subject: [PATCH 097/122] fix CI errors Signed-off-by: Xin Zhuang --- changelogs/current.yaml | 4 ++-- .../arch_overview/observability/statistics.rst | 3 +-- test/common/stats/lazyinit_stats_test.cc | 2 +- test/integration/cds_integration_test.cc | 14 +++++++------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/changelogs/current.yaml b/changelogs/current.yaml index b1a2b08c90711..01cf72fc0f33c 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -257,8 +257,8 @@ new_features: the :ref:`load balancer policy `. - area: stats change: | - added config :ref:`enable_lazyinit_stats `. When set to true, enables lazy-init on stats structures like ClusterTrafficStats. - added :ref:`maglev extension ` to suppport the :ref:`load balancer policy `. + added config :ref:`enable_lazyinit_stats `. + When set to true, enables lazy-init on stats structures like ClusterTrafficStats. - area: upstream change: | added :ref:`maglev extension ` to suppport the diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index cf504e94fddb3..7c755a7d136c4 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -47,7 +47,6 @@ is enabled in Bootstrap, for stats that are created using the LazyCompatibleInte is deferred to first access of any member of that stats. E.g. when enabled, A ClusterTrafficStats structure is only created when any member of ClusterInfoImpl::trafficStats() is accessed. -Current LazyCompatibleStats stats: +Current LazyCompatibleStats stats: * ClusterInfoImpl::trafficStats() - diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/lazyinit_stats_test.cc index 4e921603bb76a..c48b697a95688 100644 --- a/test/common/stats/lazyinit_stats_test.cc +++ b/test/common/stats/lazyinit_stats_test.cc @@ -144,7 +144,7 @@ TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { MyStats x_v2 = MyStats::create(scope_v2, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); - // Previous data is NOT gone, as scope_v2 and scope_1's lifecycles overlap. + // Previous data is NOT gone, as scope_v2 and scope_1's lifecycle overlap. EXPECT_EQ(x_v2->foo_.value(), 2); x_v2->foo_.inc(); diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index b2459f94503e0..51f73a7602999 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -228,11 +228,11 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { class LazyInitClusterStatsTest : public CdsIntegrationTest { public: - void initializeLazyTest(bool enable_lazyinit) { + void initializeLazyTest(bool enable_lazyinit_stats) { use_real_stats_ = true; config_helper_.addConfigModifier( - [enable_lazyinit](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats(enable_lazyinit); + [enable_lazyinit_stats](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_lazyinit_stats_stats(enable_lazyinit_stats); }); CdsIntegrationTest::initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); @@ -267,7 +267,7 @@ INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, // Test that LazyInitTrafficStats gets created and updated correctly. TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { - initializeLazyTest(/*enable_lazyinit=*/true); + initializeLazyTest(/*enable_lazyinit_stats=*/true); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); @@ -299,7 +299,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele // Test that Non-LazyInitTrafficStats gets created and updated correctly. TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateUpdateDelete) { - initializeLazyTest(/*enable_lazyinit=*/false); + initializeLazyTest(/*enable_lazyinit_stats=*/false); // cluster_1 trafficStats created by CDS push. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); @@ -326,7 +326,7 @@ TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateUpdateD // Test that LazyInitTrafficStats with cluster_1 create-remove-create sequence. TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { - initializeLazyTest(/*enable_lazyinit=*/true); + initializeLazyTest(/*enable_lazyinit_stats=*/true); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); @@ -361,7 +361,7 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr // Test that Non-LazyInitTrafficStats with cluster_1 create-remove-create sequence. TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateDeleteRecrete) { - initializeLazyTest(/*enable_lazyinit=*/false); + initializeLazyTest(/*enable_lazyinit_stats=*/false); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); sendRequestToClusterAndWaitForResponse(); From 5ae7ade8c80d6bd642aea2471d78c27bcbcaf433 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 5 Apr 2023 19:17:28 +0000 Subject: [PATCH 098/122] fix CI again: typo Signed-off-by: Xin Zhuang --- docs/root/intro/arch_overview/observability/statistics.rst | 2 +- source/common/stats/lazy_init.h | 2 +- test/integration/cds_integration_test.cc | 2 +- tools/spelling/spelling_dictionary.txt | 3 +++ 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 7c755a7d136c4..860d1dc28af2b 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -42,7 +42,7 @@ become histograms as the only difference between the two representations was the Lazy Initialization of Stats ============================ -When :ref:`enable_lazyinit_stats ` +When :ref:`enable_lazyinit_stats ` is enabled in Bootstrap, for stats that are created using the LazyCompatibleInterface, the actual stats struct creation is deferred to first access of any member of that stats. E.g. when enabled, A ClusterTrafficStats structure is only created when any member of ClusterInfoImpl::trafficStats() is accessed. diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index c7bfe52cb0de4..265566050a632 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -81,7 +81,7 @@ class LazyInit : public LazyCompatibleInterface { // gauge to determine whether to instantiate the lazy block on construction. // TODO(stevenzzzz,jmarantz, #26106): See #14610. The initialized_ gauge could be disabled in a // corner case where a user disables stats with suffix "initialized". In which case, the - // initialized_ will be a NullGauge, which breaks the above scenaio 2. + // initialized_ will be a NullGauge, which breaks the above scenario 2. // TODO(stevenzzzz, jmarantz): Consider hiding this Gauge from being exported, through using the // stats flags mask. Gauge& initialized_; diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 51f73a7602999..0ab4e7a973718 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -232,7 +232,7 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { use_real_stats_ = true; config_helper_.addConfigModifier( [enable_lazyinit_stats](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats_stats(enable_lazyinit_stats); + bootstrap.set_enable_lazyinit_stats(enable_lazyinit_stats); }); CdsIntegrationTest::initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index 8b8579277b075..90d8497452f96 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -248,7 +248,9 @@ iframe ingressed integrations jkl +jmarantz lang +lazyinit libsxg LLVM LPT @@ -1234,6 +1236,7 @@ stderr stdev stdin stdout +stevenzzzz stmt str streambuf From 96aac8741826339de59e13ff433c9ed69093718e Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 5 Apr 2023 19:56:57 +0000 Subject: [PATCH 099/122] fix doc CI error around indentation Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index 691d86bb8c26b..8db18f146b327 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -165,7 +165,7 @@ message Bootstrap { // When true, enable lazy init feature for stats that's of Stats::LazyInit type. // List of lazy init compatible stats: - // - ClusterTrafficStats + // * ClusterTrafficStats bool enable_lazyinit_stats = 38; // Configuration for internal processing of stats. From 09c254831970cc029d1edb8ed7728d6bc6d76a42 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 7 Apr 2023 16:02:33 +0000 Subject: [PATCH 100/122] ahh, fix tsan error Signed-off-by: Xin Zhuang --- source/common/stats/BUILD | 1 + source/common/stats/lazy_init.h | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/common/stats/BUILD b/source/common/stats/BUILD index d5a13935c74d0..8a53c9d5029e5 100644 --- a/source/common/stats/BUILD +++ b/source/common/stats/BUILD @@ -40,6 +40,7 @@ envoy_cc_library( name = "lazy_init", hdrs = ["lazy_init.h"], deps = [ + "//source/common/common:cleanup_lib", "//source/common/common:thread_lib", ], ) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 265566050a632..0ca4091eb2578 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -1,5 +1,6 @@ #pragma once +#include "source/common/common/cleanup.h" #include "source/common/common/thread.h" namespace Envoy { @@ -46,10 +47,11 @@ class LazyInit : public LazyCompatibleInterface { *scope, {pool.add(StatsStructType::typeName()), pool.add("initialized")}, Stats::Gauge::ImportMode::Accumulate); }()), - ctor_([scope = std::move(scope), &stat_names, this]() -> StatsStructType* { + ctor_([stats_scope = std::move(scope), &stat_names, this]() -> StatsStructType* { initialized_.inc(); - ctor_ = nullptr; - return new StatsStructType(stat_names, *scope); + // Reset ctor_ to save some RAM. + Envoy::Cleanup reset_ctor([&] { ctor_ = nullptr; }); + return new StatsStructType(stat_names, *stats_scope); }) { if (initialized_.value() > 0) { instantiate(); From 702cddfb544aaf9c00d9567c063bdd4ccc723cff Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 7 Apr 2023 16:18:16 +0000 Subject: [PATCH 101/122] remove Envoy:: from Envoy::Cleanup Signed-off-by: Xin Zhuang --- source/common/stats/lazy_init.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/lazy_init.h index 0ca4091eb2578..da524d0355826 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/lazy_init.h @@ -50,7 +50,7 @@ class LazyInit : public LazyCompatibleInterface { ctor_([stats_scope = std::move(scope), &stat_names, this]() -> StatsStructType* { initialized_.inc(); // Reset ctor_ to save some RAM. - Envoy::Cleanup reset_ctor([&] { ctor_ = nullptr; }); + Cleanup reset_ctor([&] { ctor_ = nullptr; }); return new StatsStructType(stat_names, *stats_scope); }) { if (initialized_.value() > 0) { From f6d768bb95a94e9a02fa7be91275cda320a84442 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Mon, 10 Apr 2023 20:43:27 +0000 Subject: [PATCH 102/122] fix case pointed out by Yury Signed-off-by: Xin Zhuang --- docs/root/intro/arch_overview/observability/statistics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 860d1dc28af2b..d078e203bcc2d 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -44,7 +44,7 @@ Lazy Initialization of Stats When :ref:`enable_lazyinit_stats ` is enabled in Bootstrap, for stats that are created using the LazyCompatibleInterface, the actual stats struct creation -is deferred to first access of any member of that stats. E.g. when enabled, A ClusterTrafficStats structure is only +is deferred to first access of any member of that stats. E.g. when enabled, a ClusterTrafficStats structure is only created when any member of ClusterInfoImpl::trafficStats() is accessed. Current LazyCompatibleStats stats: From bece44a09b72b8e81b312cc5ed9a56aa27a94a66 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 11 Apr 2023 14:12:19 +0000 Subject: [PATCH 103/122] adjust the scales in stats/lazyinit_stats_speed_test Signed-off-by: Xin Zhuang --- test/common/stats/lazyinit_stats_speed_test.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index c34f64ac2f98c..9c19eef4efed5 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -122,7 +122,7 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimics main thread creation. @@ -136,7 +136,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) ->Unit(::benchmark::kMillisecond); class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsMixin, @@ -188,7 +188,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimics that worker threads inc the stats. @@ -211,7 +211,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 10000, 20000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) ->Unit(::benchmark::kMillisecond); } // namespace Stats From 599b80b39f3db4ffdb4def3a745627e8b8db586c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 12 Apr 2023 22:35:55 +0000 Subject: [PATCH 104/122] skip expensive benchmark in lazyinit_stats_speed_test Signed-off-by: Xin Zhuang --- .../common/stats/lazyinit_stats_speed_test.cc | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/lazyinit_stats_speed_test.cc index 9c19eef4efed5..84780b182aa13 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/lazyinit_stats_speed_test.cc @@ -113,6 +113,11 @@ class LazyInitStatsBenchmarkBase { // Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. void benchmarkLazyInitCreation(::benchmark::State& state) { + if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { + state.SkipWithError("Skipping expensive benchmark"); + return; + } + IsolatedStoreImpl stats_store; LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); @@ -122,11 +127,16 @@ void benchmarkLazyInitCreation(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreation) - ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimics main thread creation. void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { + if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { + state.SkipWithError("Skipping expensive benchmark"); + return; + } + IsolatedStoreImpl stats_store; LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); @@ -136,7 +146,7 @@ void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) - ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsMixin, @@ -161,6 +171,11 @@ class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsMixin, // Benchmark lazy-init stats in different worker threads, mimics worker threads creation. void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { + if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { + state.SkipWithError("Skipping expensive benchmark"); + return; + } + ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); @@ -188,11 +203,16 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) - ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimics that worker threads inc the stats. void benchmarkLazyInitStatsAccess(::benchmark::State& state) { + if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { + state.SkipWithError("Skipping expensive benchmark"); + return; + } + ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); @@ -211,7 +231,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } BENCHMARK(benchmarkLazyInitStatsAccess) - ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000}}) + ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); } // namespace Stats From 6b2e242c7fe9eb94024577ba679b8b2f438ff5e9 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Sun, 23 Apr 2023 02:47:36 +0000 Subject: [PATCH 105/122] fix format error in sections not added by me Signed-off-by: Xin Zhuang --- changelogs/current.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/changelogs/current.yaml b/changelogs/current.yaml index 7a311167aceec..bf17a8f5150a6 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -206,7 +206,8 @@ bug_fixes: not also before sending to upstream server. - area: grpc change: | - the :ref:`connect_grpc_bridge filter ` filter now works correctly when the request payload is compressed on a unary buf connect request. + the :ref:`connect_grpc_bridge filter ` filter now works correctly when the + request payload is compressed on a unary buf connect request. removed_config_or_runtime: - area: config @@ -415,8 +416,8 @@ new_features: reset idle timer on metadata actions. - area: grpc change: | - added support for buf connect HTTP GET requests in the :ref:`connect_grpc_bridge filter ` - + added support for buf connect HTTP GET requests in the + :ref:`connect_grpc_bridge filter `. deprecated: - area: tcp_proxy change: | From 13b857f60216200a8e5a0787b3565a5670e35ed0 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 25 Apr 2023 20:16:06 +0000 Subject: [PATCH 106/122] fixes for Greg comments Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 9 ++- .../observability/statistics.rst | 12 +-- envoy/server/configuration.h | 2 +- envoy/stats/stats.h | 8 +- envoy/upstream/upstream.h | 7 +- source/common/http/BUILD | 4 +- source/common/http/codec_client.h | 2 +- source/common/http/conn_pool_base.h | 2 +- source/common/http/http1/BUILD | 2 +- source/common/http/http1/conn_pool.cc | 2 +- source/common/network/BUILD | 2 +- .../network/happy_eyeballs_connection_impl.cc | 2 +- source/common/router/BUILD | 4 +- source/common/router/retry_state_impl.h | 2 +- source/common/router/upstream_codec_filter.cc | 2 +- source/common/stats/BUILD | 7 +- .../{lazy_init.h => deferred_creation.h} | 73 +++++++++++-------- source/common/upstream/BUILD | 16 ++-- source/common/upstream/conn_pool_map_impl.h | 2 +- source/common/upstream/load_balancer_impl.h | 2 +- source/common/upstream/upstream_impl.cc | 11 +-- source/common/upstream/upstream_impl.h | 12 +-- .../extensions/stat_sinks/common/statsd/BUILD | 2 +- .../stat_sinks/common/statsd/statsd.cc | 2 +- source/extensions/stat_sinks/hystrix/BUILD | 2 +- .../extensions/stat_sinks/hystrix/hystrix.cc | 2 +- source/server/configuration_impl.cc | 2 +- source/server/configuration_impl.h | 4 +- test/common/stats/BUILD | 16 ++-- ... => deferred_creation_stats_speed_test.cc} | 54 +++++++------- ...est.cc => deferred_creation_stats_test.cc} | 16 ++-- test/extensions/clusters/aggregate/BUILD | 2 +- .../clusters/aggregate/cluster_test.cc | 2 +- test/integration/cds_integration_test.cc | 38 +++++----- test/mocks/server/instance.h | 4 +- test/mocks/upstream/BUILD | 2 +- test/mocks/upstream/cluster_info.h | 4 +- tools/spelling/spelling_dictionary.txt | 3 - 38 files changed, 178 insertions(+), 162 deletions(-) rename source/common/stats/{lazy_init.h => deferred_creation.h} (60%) rename test/common/stats/{lazyinit_stats_speed_test.cc => deferred_creation_stats_speed_test.cc} (84%) rename test/common/stats/{lazyinit_stats_test.cc => deferred_creation_stats_test.cc} (94%) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index 8db18f146b327..37ca1c6e54738 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -163,10 +163,11 @@ message Bootstrap { // Optional set of stats sinks. repeated metrics.v3.StatsSink stats_sinks = 6; - // When true, enable lazy init feature for stats that's of Stats::LazyInit type. - // List of lazy init compatible stats: - // * ClusterTrafficStats - bool enable_lazyinit_stats = 38; + // When true, enable deferred creation feature for compatabile stats types. + // NOTE: see https://github.com/envoyproxy/envoy/issues/26106, a visible + // internal gauge will be created for every stats struct that's used to track + // life cycle between config updates. + bool enable_deferred_creation_stats = 38; // Configuration for internal processing of stats. metrics.v3.StatsConfig stats_config = 13; diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index d078e203bcc2d..2149220e54f6c 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -42,11 +42,7 @@ become histograms as the only difference between the two representations was the Lazy Initialization of Stats ============================ -When :ref:`enable_lazyinit_stats ` -is enabled in Bootstrap, for stats that are created using the LazyCompatibleInterface, the actual stats struct creation -is deferred to first access of any member of that stats. E.g. when enabled, a ClusterTrafficStats structure is only -created when any member of ClusterInfoImpl::trafficStats() is accessed. - -Current LazyCompatibleStats stats: - -* ClusterInfoImpl::trafficStats() +When :ref:`enable_deferred_creation_stats ` +is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation +is deferred to first access of any member of that stats, i.e., instantiation only happens when an invocation on +operator "*" or "->" happens. \ No newline at end of file diff --git a/envoy/server/configuration.h b/envoy/server/configuration.h index ba604601b5a27..0c660e028b820 100644 --- a/envoy/server/configuration.h +++ b/envoy/server/configuration.h @@ -88,7 +88,7 @@ class StatsConfig { /** * When true, enable lazy-init of stats. */ - virtual bool enableLazyInitStats() const PURE; + virtual bool enableDeferredCreationStats() const PURE; }; /** diff --git a/envoy/stats/stats.h b/envoy/stats/stats.h index 3bed8c48d610c..1675cfc3f7dd8 100644 --- a/envoy/stats/stats.h +++ b/envoy/stats/stats.h @@ -210,10 +210,10 @@ using SizeFn = std::function; template using StatFn = std::function; // Template that lazily initializes a StatsStruct. -// The bootstrap config :ref:`enable_lazyinit_stats -// ` decides if stats lazy -// initialzation is enabled or not. -template class LazyInit; +// The bootstrap config :ref:`enable_deferred_creation_stats +// ` decides if +// stats lazy initialzation is enabled or not. +template class DeferredCreation; template class DirectStats; } // namespace Stats diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 811f580e54d94..32408916e9dc9 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -36,7 +36,7 @@ namespace Envoy { namespace Stats { -template class LazyCompatibleStats; +template class DeferredCreationCompatibleStats; } namespace Http { @@ -772,7 +772,8 @@ MAKE_STATS_STRUCT(ClusterLbStats, ClusterLbStatNames, ALL_CLUSTER_LB_STATS); */ MAKE_STAT_NAMES_STRUCT(ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); MAKE_STATS_STRUCT(ClusterTrafficStats, ClusterTrafficStatNames, ALL_CLUSTER_TRAFFIC_STATS); -using LazyCompatibleClusterTrafficStats = Stats::LazyCompatibleStats; +using DeferredCreationCompatibleClusterTrafficStats = + Stats::DeferredCreationCompatibleStats; MAKE_STAT_NAMES_STRUCT(ClusterLoadReportStatNames, ALL_CLUSTER_LOAD_REPORT_STATS); MAKE_STATS_STRUCT(ClusterLoadReportStats, ClusterLoadReportStatNames, @@ -1074,7 +1075,7 @@ class ClusterInfo : public Http::FilterChainFactory { /** * @return all traffic related stats for this cluster. */ - virtual LazyCompatibleClusterTrafficStats& trafficStats() const PURE; + virtual DeferredCreationCompatibleClusterTrafficStats& trafficStats() const PURE; /** * @return the stats scope that contains all cluster stats. This can be used to produce dynamic * stats that will be freed when the cluster is removed. diff --git a/source/common/http/BUILD b/source/common/http/BUILD index df79cc88d2e8e..849b3015530f7 100644 --- a/source/common/http/BUILD +++ b/source/common/http/BUILD @@ -44,7 +44,7 @@ envoy_cc_library( hdrs = ["async_client_utility.h"], deps = [ "//envoy/http:async_client_interface", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", ], ) @@ -61,7 +61,6 @@ envoy_cc_library( ":codec_wrappers_lib", ":exception_lib", ":status_lib", - "//source/common/stats:lazy_init", ":utility_lib", "//envoy/event:deferred_deletable", "//envoy/http:codec_interface", @@ -77,6 +76,7 @@ envoy_cc_library( "//source/common/http/http2:codec_lib", "//source/common/network:filter_lib", "//source/common/runtime:runtime_features_lib", + "//source/common/stats:deferred_creation", ] + envoy_select_enable_http3([ "//source/common/quic:client_codec_lib", ]), diff --git a/source/common/http/codec_client.h b/source/common/http/codec_client.h index 159440811b422..89f5a03fb8221 100644 --- a/source/common/http/codec_client.h +++ b/source/common/http/codec_client.h @@ -19,7 +19,7 @@ #include "source/common/http/codec_wrappers.h" #include "source/common/network/filter_impl.h" #include "source/common/runtime/runtime_features.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" namespace Envoy { namespace Http { diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index a4b35b1eb1f83..e4457d87298c2 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -10,7 +10,7 @@ #include "source/common/http/codec_client.h" #include "source/common/http/http_server_properties_cache_impl.h" #include "source/common/http/utility.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "absl/strings/string_view.h" diff --git a/source/common/http/http1/BUILD b/source/common/http/http1/BUILD index 5e8cd1affd9e1..87786a0059cfd 100644 --- a/source/common/http/http1/BUILD +++ b/source/common/http/http1/BUILD @@ -82,7 +82,7 @@ envoy_cc_library( "//source/common/http:conn_pool_base_lib", "//source/common/http:headers_lib", "//source/common/runtime:runtime_features_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "//source/common/upstream:upstream_lib", ], ) diff --git a/source/common/http/http1/conn_pool.cc b/source/common/http/http1/conn_pool.cc index b28cf58715996..775263f58cb91 100644 --- a/source/common/http/http1/conn_pool.cc +++ b/source/common/http/http1/conn_pool.cc @@ -16,7 +16,7 @@ #include "source/common/http/header_utility.h" #include "source/common/http/headers.h" #include "source/common/runtime/runtime_features.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "absl/strings/match.h" diff --git a/source/common/network/BUILD b/source/common/network/BUILD index d56c943dbdc34..68612f4479add 100644 --- a/source/common/network/BUILD +++ b/source/common/network/BUILD @@ -131,7 +131,7 @@ envoy_cc_library( ":connection_lib", ":multi_connection_base_impl_lib", "//envoy/upstream:upstream_interface", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", ], ) diff --git a/source/common/network/happy_eyeballs_connection_impl.cc b/source/common/network/happy_eyeballs_connection_impl.cc index 19f614f6a5afe..d35727cfb094d 100644 --- a/source/common/network/happy_eyeballs_connection_impl.cc +++ b/source/common/network/happy_eyeballs_connection_impl.cc @@ -1,7 +1,7 @@ #include "source/common/network/happy_eyeballs_connection_impl.h" #include "source/common/network/connection_impl.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" namespace Envoy { namespace Network { diff --git a/source/common/router/BUILD b/source/common/router/BUILD index 7052c31c092ab..f12430b480310 100644 --- a/source/common/router/BUILD +++ b/source/common/router/BUILD @@ -266,7 +266,7 @@ envoy_cc_library( "//source/common/http:header_utility_lib", "//source/common/http:headers_lib", "//source/common/http:utility_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "@envoy_api//envoy/config/route/v3:pkg_cc_proto", ], ) @@ -370,7 +370,7 @@ envoy_cc_library( "//source/common/http:headers_lib", "//source/common/http:message_lib", "//source/common/http:utility_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "//source/extensions/filters/http/common:factory_base_lib", "@envoy_api//envoy/extensions/filters/http/upstream_codec/v3:pkg_cc_proto", ], diff --git a/source/common/router/retry_state_impl.h b/source/common/router/retry_state_impl.h index 6182f7ef6413e..638f22e4399f9 100644 --- a/source/common/router/retry_state_impl.h +++ b/source/common/router/retry_state_impl.h @@ -14,7 +14,7 @@ #include "source/common/common/backoff_strategy.h" #include "source/common/http/header_utility.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index c5b59da66eb54..80e627bea9801 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -23,7 +23,7 @@ #include "source/common/http/headers.h" #include "source/common/http/message_impl.h" #include "source/common/http/utility.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" namespace Envoy { namespace Router { diff --git a/source/common/stats/BUILD b/source/common/stats/BUILD index 8a53c9d5029e5..b795283f77185 100644 --- a/source/common/stats/BUILD +++ b/source/common/stats/BUILD @@ -37,11 +37,14 @@ envoy_cc_library( ) envoy_cc_library( - name = "lazy_init", - hdrs = ["lazy_init.h"], + name = "deferred_creation", + hdrs = ["deferred_creation.h"], deps = [ + "//envoy/stats:stats_interface", "//source/common/common:cleanup_lib", "//source/common/common:thread_lib", + "//source/common/stats:symbol_table_lib", + "//source/common/stats:utility_lib", ], ) diff --git a/source/common/stats/lazy_init.h b/source/common/stats/deferred_creation.h similarity index 60% rename from source/common/stats/lazy_init.h rename to source/common/stats/deferred_creation.h index da524d0355826..f0c3be881a48e 100644 --- a/source/common/stats/lazy_init.h +++ b/source/common/stats/deferred_creation.h @@ -1,28 +1,34 @@ #pragma once +#include "envoy/common/pure.h" +#include "envoy/stats/scope.h" +#include "envoy/stats/stats.h" + #include "source/common/common/cleanup.h" #include "source/common/common/thread.h" +#include "source/common/stats/symbol_table.h" +#include "source/common/stats/utility.h" namespace Envoy { namespace Stats { template class DirectStats; -template class LazyInit; +template class DeferredCreation; /** * Interface for stats lazy initialization. * To reduce memory and CPU consumption, Envoy can enable the bootstrap config - * :ref:`enable_lazyinit_stats - * `. + * :ref:`enable_deferred_creation_stats + * `. * A 'StatsStructType' is only created when any of its field is referenced. * See more context: https://github.com/envoyproxy/envoy/issues/23575 */ -template class LazyCompatibleInterface { +template class DeferredCreationCompatibleInterface { public: // Helper function to get-or-create and return the StatsStructType object. - virtual StatsStructType* instantiate() = 0; + virtual StatsStructType& instantiate() PURE; - virtual ~LazyCompatibleInterface() = default; + virtual ~DeferredCreationCompatibleInterface() = default; }; /** @@ -31,16 +37,17 @@ template class LazyCompatibleInterface { * * This class is thread-safe -- instantiations can occur on multiple concurrent threads. * This is used when - * :ref:`enable_lazyinit_stats - * ` is enabled. + * :ref:`enable_deferred_creation_stats + * ` is enabled. */ template -class LazyInit : public LazyCompatibleInterface { +class DeferredCreation : public DeferredCreationCompatibleInterface { public: // Capture the stat names object and the scope with a ctor, that can be used to instantiate a // StatsStructType object later. // Caller should make sure scope and stat_names outlive this object. - LazyInit(const typename StatsStructType::StatNameType& stat_names, Stats::ScopeSharedPtr scope) + DeferredCreation(const typename StatsStructType::StatNameType& stat_names, + Stats::ScopeSharedPtr scope) : initialized_([&scope]() -> Gauge& { Stats::StatNamePool pool(scope->symbolTable()); return Stats::Utility::gaugeFromElements( @@ -57,14 +64,14 @@ class LazyInit : public LazyCompatibleInterface { instantiate(); } } - ~LazyInit() { + ~DeferredCreation() { if (ctor_ == nullptr) { initialized_.dec(); } } private: - inline StatsStructType* instantiate() override { return internal_stats_.get(ctor_); } + inline StatsStructType& instantiate() override { return *internal_stats_.get(ctor_); } // In order to preserve stat value continuity across a config reload, we need to automatically // re-instantiate lazy stats when they are constructed, if there is already a live instantiation @@ -81,58 +88,60 @@ class LazyInit : public LazyCompatibleInterface { // To do that we keep an "initialized" gauge in the cluster's scope, which will be associated by // name to the previous generation's cluster's lazy-init block. We use the value in this shared // gauge to determine whether to instantiate the lazy block on construction. - // TODO(stevenzzzz,jmarantz, #26106): See #14610. The initialized_ gauge could be disabled in a + // TODO(#26106): See #14610. The initialized_ gauge could be disabled in a // corner case where a user disables stats with suffix "initialized". In which case, the // initialized_ will be a NullGauge, which breaks the above scenario 2. - // TODO(stevenzzzz, jmarantz): Consider hiding this Gauge from being exported, through using the + // TODO(#26106): Consider hiding this Gauge from being exported, through using the // stats flags mask. Gauge& initialized_; - // TODO(stevenzzzz, jmarantz): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop + // TODO(#26957): Clean up this ctor_ by moving its ownership to AtomicPtr, and drop // the setter lambda when the nested object is created. std::function ctor_; Thread::AtomicPtr internal_stats_{}; }; -// Non-LazyInit wrapper over StatsStructType. This is used when -// :ref:`enable_lazyinit_stats -// ` is not enabled. +// Non-DeferredCreation wrapper over StatsStructType. This is used when +// :ref:`enable_deferred_creation_stats +// ` is not +// enabled. template -class DirectStats : public LazyCompatibleInterface { +class DirectStats : public DeferredCreationCompatibleInterface { public: DirectStats(const typename StatsStructType::StatNameType& stat_names, Stats::Scope& scope) : stats_(stat_names, scope) {} private: - inline StatsStructType* instantiate() override { return &stats_; } + inline StatsStructType& instantiate() override { return stats_; } StatsStructType stats_; }; // A helper class for a lazy compatible stats struct type. -template class LazyCompatibleStats { +template class DeferredCreationCompatibleStats { public: - static LazyCompatibleStats create(Stats::ScopeSharedPtr scope, - const typename StatsStructType::StatNameType& stat_names, - bool lazyinit) { - if (lazyinit) { - return {std::make_unique>(stat_names, scope)}; + static DeferredCreationCompatibleStats + create(Stats::ScopeSharedPtr scope, const typename StatsStructType::StatNameType& stat_names, + bool deferred_creation) { + if (deferred_creation) { + return {std::make_unique>(stat_names, scope)}; } else { return {std::make_unique>(stat_names, *scope)}; } } // Allows move construct and assign. - LazyCompatibleStats& operator=(LazyCompatibleStats&&) = default; - LazyCompatibleStats(LazyCompatibleStats&&) = default; + DeferredCreationCompatibleStats& operator=(DeferredCreationCompatibleStats&&) = default; + DeferredCreationCompatibleStats(DeferredCreationCompatibleStats&&) = default; - inline StatsStructType* operator->() { return data_->instantiate(); }; - inline StatsStructType& operator*() { return *data_->instantiate(); }; + inline StatsStructType* operator->() { return &data_->instantiate(); }; + inline StatsStructType& operator*() { return data_->instantiate(); }; private: - LazyCompatibleStats(std::unique_ptr> d) + DeferredCreationCompatibleStats( + std::unique_ptr> d) : data_(std::move(d)) {} - std::unique_ptr> data_; + std::unique_ptr> data_; }; } // namespace Stats diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index 5087fc777cbfb..09785f9967cc1 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -79,15 +79,14 @@ envoy_cc_library( srcs = ["cluster_manager_impl.cc"], hdrs = ["cluster_manager_impl.h"], deps = [ - "//source/extensions/filters/network/http_connection_manager:config", ":cds_api_lib", ":cluster_discovery_manager_lib", + ":host_utility_lib", ":load_balancer_lib", ":load_stats_reporter_lib", ":od_cds_api_lib", ":ring_hash_lb_lib", ":subset_lb_lib", - ":host_utility_lib", "//envoy/api:api_interface", "//envoy/config:xds_resources_delegate_interface", "//envoy/event:dispatcher_interface", @@ -104,10 +103,10 @@ envoy_cc_library( "//source/common/common:utility_lib", "//source/common/config:custom_config_validators_lib", "//source/common/config:grpc_mux_lib", - "//source/common/config/xds_mux:grpc_mux_lib", "//source/common/config:subscription_factory_lib", "//source/common/config:utility_lib", "//source/common/config:xds_resource_lib", + "//source/common/config/xds_mux:grpc_mux_lib", "//source/common/grpc:async_client_manager_lib", "//source/common/http:async_client_lib", "//source/common/http:http_server_properties_cache", @@ -117,14 +116,15 @@ envoy_cc_library( "//source/common/network:resolver_lib", "//source/common/network:utility_lib", "//source/common/protobuf:utility_lib", + "//source/common/quic:quic_stat_names_lib", "//source/common/router:context_lib", "//source/common/router:shadow_writer_lib", "//source/common/shared_pool:shared_pool_lib", - "//source/common/tcp:conn_pool_lib", "//source/common/tcp:async_tcp_client_lib", + "//source/common/tcp:conn_pool_lib", "//source/common/upstream:priority_conn_pool_map_impl_lib", "//source/common/upstream:upstream_lib", - "//source/common/quic:quic_stat_names_lib", + "//source/extensions/filters/network/http_connection_manager:config", "//source/server:factory_context_base_impl_lib", "@envoy_api//envoy/admin/v3:pkg_cc_proto", "@envoy_api//envoy/config/bootstrap/v3:pkg_cc_proto", @@ -169,7 +169,7 @@ envoy_cc_library( hdrs = ["conn_pool_map_impl.h"], deps = [ ":conn_pool_map", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", ], ) @@ -267,7 +267,7 @@ envoy_cc_library( "//source/common/common:assert_lib", "//source/common/protobuf:utility_lib", "//source/common/runtime:runtime_protos_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/load_balancing_policies/common/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/load_balancing_policies/least_request/v3:pkg_cc_proto", @@ -525,8 +525,8 @@ envoy_cc_library( "//source/common/http/http3:codec_stats_lib", "//source/common/init:manager_lib", "//source/common/shared_pool:shared_pool_lib", + "//source/common/stats:deferred_creation", "//source/common/stats:isolated_store_lib", - "//source/common/stats:lazy_init", "//source/common/stats:stats_lib", "//source/extensions/filters/network/http_connection_manager:config", "//source/extensions/upstreams/http:config", diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index 25436cb6bfdc5..c16827b6a0ff2 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -1,6 +1,6 @@ #pragma once -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/conn_pool_map.h" namespace Envoy { diff --git a/source/common/upstream/load_balancer_impl.h b/source/common/upstream/load_balancer_impl.h index b839e4b3553aa..1b18fd1c254be 100644 --- a/source/common/upstream/load_balancer_impl.h +++ b/source/common/upstream/load_balancer_impl.h @@ -24,7 +24,7 @@ #include "source/common/protobuf/utility.h" #include "source/common/runtime/runtime_protos.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/edf_scheduler.h" namespace Envoy { diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 9ea123941e4ce..cebf02ff6dc7a 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -48,7 +48,7 @@ #include "source/common/router/config_utility.h" #include "source/common/runtime/runtime_features.h" #include "source/common/runtime/runtime_impl.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/cluster_factory_impl.h" #include "source/common/upstream/health_checker_impl.h" #include "source/extensions/filters/network/http_connection_manager/config.h" @@ -854,10 +854,11 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add } } -LazyCompatibleClusterTrafficStats +DeferredCreationCompatibleClusterTrafficStats ClusterInfoImpl::generateStats(Stats::ScopeSharedPtr scope, - const ClusterTrafficStatNames& stat_names, bool lazyinit) { - return LazyCompatibleClusterTrafficStats::create(scope, stat_names, lazyinit); + const ClusterTrafficStatNames& stat_names, bool deferred_creation) { + return DeferredCreationCompatibleClusterTrafficStats::create(scope, stat_names, + deferred_creation); } ClusterRequestResponseSizeStats ClusterInfoImpl::generateRequestResponseSizeStats( @@ -1033,7 +1034,7 @@ ClusterInfoImpl::ClusterInfoImpl( socket_matcher_(std::move(socket_matcher)), stats_scope_(std::move(stats_scope)), traffic_stats_(generateStats(stats_scope_, factory_context.clusterManager().clusterStatNames(), - server_context.statsConfig().enableLazyInitStats())), + server_context.statsConfig().enableDeferredCreationStats())), config_update_stats_(factory_context.clusterManager().clusterConfigUpdateStatNames(), *stats_scope_), lb_stats_(factory_context.clusterManager().clusterLbStatNames(), *stats_scope_), diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 11216759f71fd..0932e9e464795 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -56,8 +56,8 @@ #include "source/common/init/manager_impl.h" #include "source/common/network/utility.h" #include "source/common/shared_pool/shared_pool.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/stats/isolated_store_impl.h" -#include "source/common/stats/lazy_init.h" #include "source/common/upstream/load_balancer_impl.h" #include "source/common/upstream/resource_manager_impl.h" #include "source/common/upstream/transport_socket_match_impl.h" @@ -776,9 +776,9 @@ class ClusterInfoImpl : public ClusterInfo, Stats::ScopeSharedPtr&& stats_scope, bool added_via_api, Server::Configuration::TransportSocketFactoryContext&); - static LazyCompatibleClusterTrafficStats + static DeferredCreationCompatibleClusterTrafficStats generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& cluster_stat_names, - bool lazyinit); + bool deferred_creation); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); static ClusterCircuitBreakersStats @@ -899,7 +899,9 @@ class ClusterInfoImpl : public ClusterInfo, } ResourceManager& resourceManager(ResourcePriority priority) const override; TransportSocketMatcher& transportSocketMatcher() const override { return *socket_matcher_; } - LazyCompatibleClusterTrafficStats& trafficStats() const override { return traffic_stats_; } + DeferredCreationCompatibleClusterTrafficStats& trafficStats() const override { + return traffic_stats_; + } ClusterConfigUpdateStats& configUpdateStats() const override { return config_update_stats_; } ClusterLbStats& lbStats() const override { return lb_stats_; } ClusterEndpointStats& endpointStats() const override { return endpoint_stats_; } @@ -1043,7 +1045,7 @@ class ClusterInfoImpl : public ClusterInfo, const float peekahead_ratio_; TransportSocketMatcherPtr socket_matcher_; Stats::ScopeSharedPtr stats_scope_; - mutable LazyCompatibleClusterTrafficStats traffic_stats_; + mutable DeferredCreationCompatibleClusterTrafficStats traffic_stats_; mutable ClusterConfigUpdateStats config_update_stats_; mutable ClusterLbStats lb_stats_; mutable ClusterEndpointStats endpoint_stats_; diff --git a/source/extensions/stat_sinks/common/statsd/BUILD b/source/extensions/stat_sinks/common/statsd/BUILD index 784eede2d9db9..e8b616ce8a40f 100644 --- a/source/extensions/stat_sinks/common/statsd/BUILD +++ b/source/extensions/stat_sinks/common/statsd/BUILD @@ -30,6 +30,6 @@ envoy_cc_library( "//source/common/common:utility_lib", "//source/common/config:utility_lib", "//source/common/network:address_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", ], ) diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index f89637c69cf88..0e06c9fd9522f 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -19,7 +19,7 @@ #include "source/common/config/utility.h" #include "source/common/network/socket_interface.h" #include "source/common/network/utility.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/stats/symbol_table.h" #include "absl/strings/str_join.h" diff --git a/source/extensions/stat_sinks/hystrix/BUILD b/source/extensions/stat_sinks/hystrix/BUILD index eda767079e127..854f6500094be 100644 --- a/source/extensions/stat_sinks/hystrix/BUILD +++ b/source/extensions/stat_sinks/hystrix/BUILD @@ -37,7 +37,7 @@ envoy_cc_library( "//source/common/common:logger_lib", "//source/common/config:well_known_names", "//source/common/http:headers_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "//source/common/stats:symbol_table_lib", "//source/common/stats:utility_lib", ], diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index 15f030c1e2d19..c6092f68f90dc 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -11,7 +11,7 @@ #include "source/common/common/logger.h" #include "source/common/config/well_known_names.h" #include "source/common/http/headers.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/stats/utility.h" #include "absl/strings/str_cat.h" diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index 15953959488b2..e6d2adf6dd752 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -61,7 +61,7 @@ void FilterChainUtility::buildUdpFilterChain( } StatsConfigImpl::StatsConfigImpl(const envoy::config::bootstrap::v3::Bootstrap& bootstrap) - : enable_lazyinit_stats_(bootstrap.enable_lazyinit_stats()) { + : enable_deferred_creation_stats_(bootstrap.enable_deferred_creation_stats()) { if (bootstrap.has_stats_flush_interval() && bootstrap.stats_flush_case() != envoy::config::bootstrap::v3::Bootstrap::STATS_FLUSH_NOT_SET) { diff --git a/source/server/configuration_impl.h b/source/server/configuration_impl.h index eef6e5f5ad331..1d1f4555af434 100644 --- a/source/server/configuration_impl.h +++ b/source/server/configuration_impl.h @@ -56,13 +56,13 @@ class StatsConfigImpl : public StatsConfig { bool flushOnAdmin() const override { return flush_on_admin_; } void addSink(Stats::SinkPtr sink) { sinks_.emplace_back(std::move(sink)); } - bool enableLazyInitStats() const override { return enable_lazyinit_stats_; } + bool enableDeferredCreationStats() const override { return enable_deferred_creation_stats_; } private: std::list sinks_; std::chrono::milliseconds flush_interval_; bool flush_on_admin_{false}; - bool enable_lazyinit_stats_{false}; + bool enable_deferred_creation_stats_{false}; }; /** diff --git a/test/common/stats/BUILD b/test/common/stats/BUILD index 3bcf1c0ca3a21..ef95493fb3ef2 100644 --- a/test/common/stats/BUILD +++ b/test/common/stats/BUILD @@ -227,20 +227,20 @@ envoy_cc_benchmark_binary( ) envoy_cc_test( - name = "lazyinit_stats_test", - srcs = ["lazyinit_stats_test.cc"], + name = "deferred_creation_stats_test", + srcs = ["deferred_creation_stats_test.cc"], deps = [ "//envoy/stats:stats_interface", "//source/common/memory:stats_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "//source/common/stats:thread_local_store_lib", "//test/test_common:utility_lib", ], ) envoy_cc_benchmark_binary( - name = "lazyinit_stats_benchmark", - srcs = ["lazyinit_stats_speed_test.cc"], + name = "deferred_creation_stats_benchmark", + srcs = ["deferred_creation_stats_speed_test.cc"], external_deps = [ "benchmark", ], @@ -249,17 +249,17 @@ envoy_cc_benchmark_binary( "//source/common/common:random_generator_lib", "//source/common/common:utility_lib", "//source/common/runtime:runtime_lib", + "//source/common/stats:deferred_creation", "//source/common/stats:isolated_store_lib", - "//source/common/stats:lazy_init", "//source/common/stats:symbol_table_lib", "//source/exe:process_wide_lib", ], ) envoy_benchmark_test( - name = "lazyinit_stats_benchmark_test", + name = "deferred_creation_stats_benchmark_test", size = "large", - benchmark_binary = "lazyinit_stats_benchmark", + benchmark_binary = "deferred_creation_stats_benchmark", ) envoy_benchmark_test( diff --git a/test/common/stats/lazyinit_stats_speed_test.cc b/test/common/stats/deferred_creation_stats_speed_test.cc similarity index 84% rename from test/common/stats/lazyinit_stats_speed_test.cc rename to test/common/stats/deferred_creation_stats_speed_test.cc index 84780b182aa13..2d2c7e406d28e 100644 --- a/test/common/stats/lazyinit_stats_speed_test.cc +++ b/test/common/stats/deferred_creation_stats_speed_test.cc @@ -1,6 +1,6 @@ #include "source/common/common/random_generator.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/stats/isolated_store_impl.h" -#include "source/common/stats/lazy_init.h" #include "source/common/stats/symbol_table.h" #include "source/common/stats/thread_local_store.h" #include "source/common/thread_local/thread_local_impl.h" @@ -83,10 +83,10 @@ namespace Stats { MAKE_STAT_NAMES_STRUCT(AwesomeStatNames, AWESOME_STATS); MAKE_STATS_STRUCT(AwesomeStats, AwesomeStatNames, AWESOME_STATS); -class LazyInitStatsBenchmarkBase { +class DeferredCreationStatsBenchmarkBase { public: - LazyInitStatsBenchmarkBase(bool lazy, const uint64_t n_clusters, Store& s) - : lazy_init_(lazy), num_clusters_(n_clusters), stat_store_(s), + DeferredCreationStatsBenchmarkBase(bool lazy, const uint64_t n_clusters, Store& s) + : deferred_creation_(lazy), num_clusters_(n_clusters), stat_store_(s), stat_names_(stat_store_.symbolTable()) {} void createStats(bool defer_init) { @@ -94,8 +94,9 @@ class LazyInitStatsBenchmarkBase { std::string new_cluster_name = absl::StrCat("cluster_", i); ScopeSharedPtr scope = stat_store_.createScope(new_cluster_name); scopes_.push_back(scope); - auto lazy_stat = std::make_shared>( - LazyCompatibleStats::create(scope, stat_names_, lazy_init_)); + auto lazy_stat = std::make_shared>( + DeferredCreationCompatibleStats::create(scope, stat_names_, + deferred_creation_)); lazy_stats_.push_back(lazy_stat); if (!defer_init) { *(*lazy_stat); @@ -103,60 +104,61 @@ class LazyInitStatsBenchmarkBase { } } - const bool lazy_init_; + const bool deferred_creation_; const uint64_t num_clusters_; Store& stat_store_; std::vector scopes_; - std::vector>> lazy_stats_; + std::vector>> lazy_stats_; AwesomeStatNames stat_names_; }; // Benchmark no-lazy-init on stats, the lazy init version is much faster since no allocation. -void benchmarkLazyInitCreation(::benchmark::State& state) { +void benchmarkDeferredCreationCreation(::benchmark::State& state) { if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { state.SkipWithError("Skipping expensive benchmark"); return; } IsolatedStoreImpl stats_store; - LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); + DeferredCreationStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); for (auto _ : state) { // NOLINT: Silences warning about dead store base.createStats(/*defer_init=*/true); } } -BENCHMARK(benchmarkLazyInitCreation) +BENCHMARK(benchmarkDeferredCreationCreation) ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark lazy-init of stats in same thread, mimics main thread creation. -void benchmarkLazyInitCreationInstantiateSameThread(::benchmark::State& state) { +void benchmarkDeferredCreationCreationInstantiateSameThread(::benchmark::State& state) { if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { state.SkipWithError("Skipping expensive benchmark"); return; } IsolatedStoreImpl stats_store; - LazyInitStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); + DeferredCreationStatsBenchmarkBase base(state.range(0) == 1, state.range(1), stats_store); for (auto _ : state) { // NOLINT: Silences warning about dead store base.createStats(/*defer_init=*/false); } } -BENCHMARK(benchmarkLazyInitCreationInstantiateSameThread) +BENCHMARK(benchmarkDeferredCreationCreationInstantiateSameThread) ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); -class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsMixin, - public LazyInitStatsBenchmarkBase { +class MultiThreadDeferredCreationStatsTest : public ThreadLocalRealThreadsMixin, + public DeferredCreationStatsBenchmarkBase { public: - MultiThreadLazyinitStatsTest(bool lazy, const uint64_t n_clusters) + MultiThreadDeferredCreationStatsTest(bool lazy, const uint64_t n_clusters) : ThreadLocalRealThreadsMixin(5), - LazyInitStatsBenchmarkBase(lazy, n_clusters, *ThreadLocalRealThreadsMixin::store_) {} + DeferredCreationStatsBenchmarkBase(lazy, n_clusters, *ThreadLocalRealThreadsMixin::store_) { + } - ~MultiThreadLazyinitStatsTest() { + ~MultiThreadDeferredCreationStatsTest() { shutdownThreading(); // First, wait for the main-dispatcher to initiate the cross-thread TLS cleanup. mainDispatchBlock(); @@ -170,14 +172,14 @@ class MultiThreadLazyinitStatsTest : public ThreadLocalRealThreadsMixin, }; // Benchmark lazy-init stats in different worker threads, mimics worker threads creation. -void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& state) { +void benchmarkDeferredCreationCreationInstantiateOnWorkerThreads(::benchmark::State& state) { if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { state.SkipWithError("Skipping expensive benchmark"); return; } ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). - MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); + MultiThreadDeferredCreationStatsTest test(state.range(0) == 1, state.range(1)); for (auto _ : state) { // NOLINT: Silences warning about dead store test.runOnMainBlocking([&]() { // Create stats on main-thread. @@ -193,7 +195,7 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta for (uint64_t idx = begin; idx < end; ++idx) { // Instantiate the actual AwesomeStats objects in worker threads, in batches to avoid // possible contention. - if (test.lazy_init_) { + if (test.deferred_creation_) { // Lazy-init on workers happen when the "index"-th stat instance is not created. *(*test.lazy_stats_[idx]); } @@ -202,19 +204,19 @@ void benchmarkLazyInitCreationInstantiateOnWorkerThreads(::benchmark::State& sta } } -BENCHMARK(benchmarkLazyInitCreationInstantiateOnWorkerThreads) +BENCHMARK(benchmarkDeferredCreationCreationInstantiateOnWorkerThreads) ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); // Benchmark mimics that worker threads inc the stats. -void benchmarkLazyInitStatsAccess(::benchmark::State& state) { +void benchmarkDeferredCreationStatsAccess(::benchmark::State& state) { if (benchmark::skipExpensiveBenchmarks() && state.range(1) > 2000) { state.SkipWithError("Skipping expensive benchmark"); return; } ProcessWide process_wide_; // Process-wide state setup/teardown (excluding grpc). - MultiThreadLazyinitStatsTest test(state.range(0) == 1, state.range(1)); + MultiThreadDeferredCreationStatsTest test(state.range(0) == 1, state.range(1)); for (auto _ : state) { // NOLINT: Silences warning about dead store test.runOnMainBlocking([&]() { // Create stats on main-thread. @@ -230,7 +232,7 @@ void benchmarkLazyInitStatsAccess(::benchmark::State& state) { } } -BENCHMARK(benchmarkLazyInitStatsAccess) +BENCHMARK(benchmarkDeferredCreationStatsAccess) ->ArgsProduct({{0, 1}, {1000, 2000, 5000, 10000, 20000}}) ->Unit(::benchmark::kMillisecond); diff --git a/test/common/stats/lazyinit_stats_test.cc b/test/common/stats/deferred_creation_stats_test.cc similarity index 94% rename from test/common/stats/lazyinit_stats_test.cc rename to test/common/stats/deferred_creation_stats_test.cc index c48b697a95688..16b28f3eaecda 100644 --- a/test/common/stats/lazyinit_stats_test.cc +++ b/test/common/stats/deferred_creation_stats_test.cc @@ -2,7 +2,7 @@ #include "envoy/stats/stats_macros.h" #include "source/common/common/thread.h" -#include "source/common/stats/lazy_init.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/stats/thread_local_store.h" #include "test/test_common/utility.h" @@ -19,7 +19,7 @@ namespace { MAKE_STAT_NAMES_STRUCT(AwesomeStatNames, AWESOME_STATS); MAKE_STATS_STRUCT(AwesomeStats, AwesomeStatNames, AWESOME_STATS); -class LazyInitStatsTest : public testing::Test { +class DeferredCreationStatsTest : public testing::Test { public: SymbolTableImpl symbol_table_; AllocatorImpl allocator_{symbol_table_}; @@ -27,10 +27,10 @@ class LazyInitStatsTest : public testing::Test { AwesomeStatNames stats_names_{symbol_table_}; }; -using MyStats = LazyCompatibleStats; +using MyStats = DeferredCreationCompatibleStats; // Tests that non-lazy stats has no "AwesomeStats.initialized" gauge. -TEST_F(LazyInitStatsTest, NonLazyNoInitializedGauge) { +TEST_F(DeferredCreationStatsTest, NonLazyNoInitializedGauge) { { ScopeSharedPtr scope = store_.createScope("bluh"); MyStats non_lazy_y = MyStats::create(scope, stats_names_, false); @@ -46,7 +46,7 @@ TEST_F(LazyInitStatsTest, NonLazyNoInitializedGauge) { } // Tests that "AwesomeStats.initialized" gauge equals the number of initiated MyStats instances. -TEST_F(LazyInitStatsTest, StatsGoneWithScope) { +TEST_F(DeferredCreationStatsTest, StatsGoneWithScope) { { ScopeSharedPtr scope = store_.createScope("bluh"); // No such gauge when there is no lazy init stats instances. @@ -78,7 +78,7 @@ TEST_F(LazyInitStatsTest, StatsGoneWithScope) { // Tests that multiple stats struct instances within the same scope has no issue to keep the // stats, with removals. -TEST_F(LazyInitStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { +TEST_F(DeferredCreationStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { { ScopeSharedPtr scope_1 = store_.createScope("bluh"); auto x = std::make_unique(MyStats::create(scope_1, stats_names_, true)); @@ -117,7 +117,7 @@ TEST_F(LazyInitStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { } // Tests that as long as scope lives, stats under the scope won't be lost. -TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { +TEST_F(DeferredCreationStatsTest, ScopeOutlivesLazyStats) { ScopeSharedPtr scope_1 = store_.createScope("bluh"); { auto x = std::make_unique(MyStats::create(scope_1, stats_names_, true)); @@ -158,7 +158,7 @@ TEST_F(LazyInitStatsTest, ScopeOutlivesLazyStats) { // Tests that as two AwesomeStats instances of different scope, as long as the scope life-cycle // overlaps, still got data kept when the earlier scope got deleted. -TEST_F(LazyInitStatsTest, WhenScopesOverlapStatsAreAliveAsLongAsThereAre) { +TEST_F(DeferredCreationStatsTest, WhenScopesOverlapStatsAreAliveAsLongAsThereAre) { ScopeSharedPtr scope_v1 = store_.createScope("bluh"); auto x = std::make_unique(MyStats::create(scope_v1, stats_names_, true)); diff --git a/test/extensions/clusters/aggregate/BUILD b/test/extensions/clusters/aggregate/BUILD index d9af9272ee6b6..4233767c7d576 100644 --- a/test/extensions/clusters/aggregate/BUILD +++ b/test/extensions/clusters/aggregate/BUILD @@ -16,7 +16,7 @@ envoy_extension_cc_test( srcs = ["cluster_test.cc"], extension_names = ["envoy.clusters.aggregate"], deps = [ - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "//source/extensions/clusters/aggregate:cluster", "//source/extensions/transport_sockets/raw_buffer:config", "//test/common/upstream:utility_lib", diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 72285f90c6740..d6340a1369c45 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -140,7 +140,7 @@ class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testin Upstream::LoadBalancerFactorySharedPtr lb_factory_; Upstream::LoadBalancerPtr lb_; Upstream::ClusterTrafficStatNames stat_names_; - Upstream::LazyCompatibleClusterTrafficStats traffic_stats_; + Upstream::DeferredCreationCompatibleClusterTrafficStats traffic_stats_; std::shared_ptr primary_info_{ new NiceMock()}; std::shared_ptr secondary_info_{ diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 0ab4e7a973718..99e740ba6f882 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -226,13 +226,13 @@ TEST_P(CdsIntegrationTest, CdsClusterTeardownWhileConnecting) { EXPECT_LE(cx_counter->value(), 1); } -class LazyInitClusterStatsTest : public CdsIntegrationTest { +class DeferredCreationClusterStatsTest : public CdsIntegrationTest { public: - void initializeLazyTest(bool enable_lazyinit_stats) { + void initializeDeferredCreationTest(bool enable_deferred_creation_stats) { use_real_stats_ = true; config_helper_.addConfigModifier( - [enable_lazyinit_stats](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_lazyinit_stats(enable_lazyinit_stats); + [enable_deferred_creation_stats](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { + bootstrap.set_enable_deferred_creation_stats(enable_deferred_creation_stats); }); CdsIntegrationTest::initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); @@ -262,12 +262,13 @@ class LazyInitClusterStatsTest : public CdsIntegrationTest { } }; -INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, LazyInitClusterStatsTest, +INSTANTIATE_TEST_SUITE_P(IpVersionsClientTypeDelta, DeferredCreationClusterStatsTest, DELTA_SOTW_GRPC_CLIENT_INTEGRATION_PARAMS); -// Test that LazyInitTrafficStats gets created and updated correctly. -TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDelete) { - initializeLazyTest(/*enable_lazyinit_stats=*/true); +// Test that DeferredCreationTrafficStats gets created and updated correctly. +TEST_P(DeferredCreationClusterStatsTest, + DeferredCreationTrafficStatsWithClusterCreateUpdateDelete) { + initializeDeferredCreationTest(/*enable_deferred_creation_stats=*/true); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); @@ -297,9 +298,10 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateUpdateDele EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total"), nullptr); } -// Test that Non-LazyInitTrafficStats gets created and updated correctly. -TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateUpdateDelete) { - initializeLazyTest(/*enable_lazyinit_stats=*/false); +// Test that Non-DeferredCreationTrafficStats gets created and updated correctly. +TEST_P(DeferredCreationClusterStatsTest, + NonDeferredCreationTrafficStatsWithClusterCreateUpdateDelete) { + initializeDeferredCreationTest(/*enable_deferred_creation_stats=*/false); // cluster_1 trafficStats created by CDS push. EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); @@ -324,9 +326,10 @@ TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateUpdateD EXPECT_EQ(test_server_->counter("cluster.cluster_2.upstream_cx_total")->value(), 0); } -// Test that LazyInitTrafficStats with cluster_1 create-remove-create sequence. -TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecrete) { - initializeLazyTest(/*enable_lazyinit_stats=*/true); +// Test that DeferredCreationTrafficStats with cluster_1 create-remove-create sequence. +TEST_P(DeferredCreationClusterStatsTest, + DeferredCreationTrafficStatsWithClusterCreateDeleteRecrete) { + initializeDeferredCreationTest(/*enable_deferred_creation_stats=*/true); EXPECT_EQ(test_server_->gauge("cluster.cluster_1.ClusterTrafficStats.initialized")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total"), nullptr); @@ -359,9 +362,10 @@ TEST_P(LazyInitClusterStatsTest, LazyInitTrafficStatsWithClusterCreateDeleteRecr EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 1); } -// Test that Non-LazyInitTrafficStats with cluster_1 create-remove-create sequence. -TEST_P(LazyInitClusterStatsTest, NonLazyInitTrafficStatsWithClusterCreateDeleteRecrete) { - initializeLazyTest(/*enable_lazyinit_stats=*/false); +// Test that Non-DeferredCreationTrafficStats with cluster_1 create-remove-create sequence. +TEST_P(DeferredCreationClusterStatsTest, + NonDeferredCreationTrafficStatsWithClusterCreateDeleteRecrete) { + initializeDeferredCreationTest(/*enable_deferred_creation_stats=*/false); EXPECT_EQ(test_server_->counter("cluster.cluster_1.upstream_cx_total")->value(), 0); sendRequestToClusterAndWaitForResponse(); diff --git a/test/mocks/server/instance.h b/test/mocks/server/instance.h index 2c8175a259f49..8a5c8eec4a04e 100644 --- a/test/mocks/server/instance.h +++ b/test/mocks/server/instance.h @@ -87,7 +87,7 @@ class MockInstance : public Instance { MOCK_METHOD(Configuration::ServerFactoryContext&, serverFactoryContext, ()); MOCK_METHOD(Configuration::TransportSocketFactoryContext&, transportSocketFactoryContext, ()); MOCK_METHOD(bool, enableReusePortDefault, ()); - MOCK_METHOD(void, setSinkPredicates, (std::unique_ptr &&)); + MOCK_METHOD(void, setSinkPredicates, (std::unique_ptr&&)); void setDefaultTracingConfig(const envoy::config::trace::v3::Tracing& tracing_config) override { http_context_.setDefaultTracingConfig(tracing_config); @@ -143,7 +143,7 @@ class MockStatsConfig : public virtual StatsConfig { MOCK_METHOD(std::chrono::milliseconds, flushInterval, (), (const)); MOCK_METHOD(bool, flushOnAdmin, (), (const)); MOCK_METHOD(const Stats::SinkPredicates*, sinkPredicates, (), (const)); - MOCK_METHOD(bool, enableLazyInitStats, (), (const)); + MOCK_METHOD(bool, enableDeferredCreationStats, (), (const)); }; class MockServerFactoryContext : public virtual ServerFactoryContext { diff --git a/test/mocks/upstream/BUILD b/test/mocks/upstream/BUILD index 71c79ca8b9698..81de590c6cf1a 100644 --- a/test/mocks/upstream/BUILD +++ b/test/mocks/upstream/BUILD @@ -23,7 +23,7 @@ envoy_cc_mock( "//source/common/http/http2:codec_stats_lib", "//source/common/network:raw_buffer_socket_lib", "//source/common/router:upstream_codec_filter_lib", - "//source/common/stats:lazy_init", + "//source/common/stats:deferred_creation", "//source/common/upstream:upstream_includes", "//source/common/upstream:upstream_lib", "//test/mocks/runtime:runtime_mocks", diff --git a/test/mocks/upstream/cluster_info.h b/test/mocks/upstream/cluster_info.h index 4e9fe258bb699..ff2d71baa2e72 100644 --- a/test/mocks/upstream/cluster_info.h +++ b/test/mocks/upstream/cluster_info.h @@ -152,7 +152,7 @@ class MockClusterInfo : public ClusterInfo { MOCK_METHOD(const std::string&, observabilityName, (), (const)); MOCK_METHOD(ResourceManager&, resourceManager, (ResourcePriority priority), (const)); MOCK_METHOD(TransportSocketMatcher&, transportSocketMatcher, (), (const)); - MOCK_METHOD(LazyCompatibleClusterTrafficStats&, trafficStats, (), (const)); + MOCK_METHOD(DeferredCreationCompatibleClusterTrafficStats&, trafficStats, (), (const)); MOCK_METHOD(ClusterLbStats&, lbStats, (), (const)); MOCK_METHOD(ClusterEndpointStats&, endpointStats, (), (const)); MOCK_METHOD(ClusterConfigUpdateStats&, configUpdateStats, (), (const)); @@ -211,7 +211,7 @@ class MockClusterInfo : public ClusterInfo { ClusterCircuitBreakersStatNames cluster_circuit_breakers_stat_names_; ClusterRequestResponseSizeStatNames cluster_request_response_size_stat_names_; ClusterTimeoutBudgetStatNames cluster_timeout_budget_stat_names_; - mutable LazyCompatibleClusterTrafficStats traffic_stats_; + mutable DeferredCreationCompatibleClusterTrafficStats traffic_stats_; ClusterConfigUpdateStats config_update_stats_; ClusterLbStats lb_stats_; ClusterEndpointStats endpoint_stats_; diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index ee394becab8df..00de73d8a280d 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -249,7 +249,6 @@ iframe ingressed integrations jkl -jmarantz lang lazyinit libsxg @@ -702,7 +701,6 @@ emplaced emscripten emsdk enablement -enable_lazyinit_stats encodings endian endianness @@ -1243,7 +1241,6 @@ stderr stdev stdin stdout -stevenzzzz stmt str streambuf From c292a7c1c57ccc3f7eb69455e68c07997453ab65 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 25 Apr 2023 20:35:42 +0000 Subject: [PATCH 107/122] remove unwanted dict item Signed-off-by: Xin Zhuang --- tools/spelling/spelling_dictionary.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index 00de73d8a280d..9b8d3ca3a4c3a 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -250,7 +250,6 @@ ingressed integrations jkl lang -lazyinit libsxg LLVM LPT From 0aa105c4b5edf19deabf70abf2277f43d28b3206 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 7 Jun 2023 20:35:36 +0000 Subject: [PATCH 108/122] typos, fix-format Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 2 +- changelogs/current.yaml | 4 ++-- docs/root/intro/arch_overview/observability/statistics.rst | 2 +- source/common/stats/deferred_creation.h | 2 +- test/extensions/clusters/aggregate/cluster_test.cc | 4 ++-- test/integration/cds_integration_test.cc | 3 ++- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index 729e02c0384a7..0c657abc1ad86 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -181,7 +181,7 @@ message Bootstrap { // Optional set of stats sinks. repeated metrics.v3.StatsSink stats_sinks = 6; - // When true, enable deferred creation feature for compatabile stats types. + // When true, enable deferred creation feature for compatible stats types. // NOTE: see https://github.com/envoyproxy/envoy/issues/26106, a visible // internal gauge will be created for every stats struct that's used to track // life cycle between config updates. diff --git a/changelogs/current.yaml b/changelogs/current.yaml index 7be682ceec0ee..5602a9cce10f2 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -234,8 +234,8 @@ new_features: The field supports using %KEY% as a formatter command for substituting the redis key as part of the substitution formatter expression. - area: stats change: | - added config :ref:`enable_lazyinit_stats `. - When set to true, enables lazy-init on stats structures like ClusterTrafficStats. + added config :ref:`enable_deferred_creation_stats `. + When set to true, enables deferred instantiation on supported stats structures. - area: ratelimit change: | added new configuration field :ref:`domain diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 2149220e54f6c..84075d9bdced3 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -44,5 +44,5 @@ Lazy Initialization of Stats When :ref:`enable_deferred_creation_stats ` is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation -is deferred to first access of any member of that stats, i.e., instantiation only happens when an invocation on +is deferred to first access of any member of that stats, i.e. instantiation only happens when an invocation on operator "*" or "->" happens. \ No newline at end of file diff --git a/source/common/stats/deferred_creation.h b/source/common/stats/deferred_creation.h index f0c3be881a48e..8f4e632f501ab 100644 --- a/source/common/stats/deferred_creation.h +++ b/source/common/stats/deferred_creation.h @@ -52,7 +52,7 @@ class DeferredCreation : public DeferredCreationCompatibleInterfacesymbolTable()); return Stats::Utility::gaugeFromElements( *scope, {pool.add(StatsStructType::typeName()), pool.add("initialized")}, - Stats::Gauge::ImportMode::Accumulate); + Stats::Gauge::ImportMode::HiddenAccumulate); }()), ctor_([stats_scope = std::move(scope), &stat_names, this]() -> StatsStructType* { initialized_.inc(); diff --git a/test/extensions/clusters/aggregate/cluster_test.cc b/test/extensions/clusters/aggregate/cluster_test.cc index 7c8449fbfaac1..fbf9c59a302ae 100644 --- a/test/extensions/clusters/aggregate/cluster_test.cc +++ b/test/extensions/clusters/aggregate/cluster_test.cc @@ -32,8 +32,8 @@ const std::string secondary_name("secondary"); class AggregateClusterTest : public Event::TestUsingSimulatedTime, public testing::Test { public: AggregateClusterTest() - : stat_names_(stats_store_.symbolTable()), - traffic_stats_(Upstream::ClusterInfoImpl::generateStats(stats_store_.rootScope(), + : stat_names_(server_context_.store_.symbolTable()), + traffic_stats_(Upstream::ClusterInfoImpl::generateStats(server_context_.store_.rootScope(), stat_names_, false)) { ON_CALL(*primary_info_, name()).WillByDefault(ReturnRef(primary_name)); ON_CALL(*secondary_info_, name()).WillByDefault(ReturnRef(secondary_name)); diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 82cd45792d9a4..680f4a1c0e281 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -251,7 +251,8 @@ class DeferredCreationClusterStatsTest : public CdsIntegrationTest { void updateCluster() { envoy::config::cluster::v3::Cluster cluster1_updated = cluster_creator_( ClusterName1, fake_upstreams_[UpstreamIndex2]->localAddress()->ip()->port(), - Network::Test::getLoopbackAddressString(ipVersion()), "ROUND_ROBIN"); + Network::Test::getLoopbackAddressString(ipVersion()), + envoy::config::cluster::v3::Cluster::ROUND_ROBIN); sendDiscoveryResponse( Config::TypeUrl::get().Cluster, {cluster1_updated}, {cluster1_updated}, {}, "42"); From d4233bd4b6032598f2eb417f23a2fcf9d78d3e34 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 13:50:46 +0000 Subject: [PATCH 109/122] fix josh comments Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 3 --- .../root/intro/arch_overview/observability/statistics.rst | 2 +- envoy/server/configuration.h | 2 +- source/docs/stats.md | 8 ++++++++ source/server/configuration_impl.cc | 2 +- test/mocks/server/instance.h | 2 +- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index 0c657abc1ad86..fe26b823f0988 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -182,9 +182,6 @@ message Bootstrap { repeated metrics.v3.StatsSink stats_sinks = 6; // When true, enable deferred creation feature for compatible stats types. - // NOTE: see https://github.com/envoyproxy/envoy/issues/26106, a visible - // internal gauge will be created for every stats struct that's used to track - // life cycle between config updates. bool enable_deferred_creation_stats = 39; // Configuration for internal processing of stats. diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 84075d9bdced3..60cffd9404b22 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -39,7 +39,7 @@ become histograms as the only difference between the two representations was the * :ref:`v3 API reference `. -Lazy Initialization of Stats +Deferred Initialization of Stats ============================ When :ref:`enable_deferred_creation_stats ` diff --git a/envoy/server/configuration.h b/envoy/server/configuration.h index 0c660e028b820..97d163f2fb2a6 100644 --- a/envoy/server/configuration.h +++ b/envoy/server/configuration.h @@ -86,7 +86,7 @@ class StatsConfig { virtual bool flushOnAdmin() const PURE; /** - * When true, enable lazy-init of stats. + * When true, enable deferred creation of stats. */ virtual bool enableDeferredCreationStats() const PURE; }; diff --git a/source/docs/stats.md b/source/docs/stats.md index 97e42e5bcd4c7..6badfcc1e3763 100644 --- a/source/docs/stats.md +++ b/source/docs/stats.md @@ -295,3 +295,11 @@ from the same symbol table. To facilitate this, a test-only global singleton can be instantiated, via either `Stats::TestUtil::TestSymbolTable` or `Stats::TestUtil::TestStore`. All such structures use a singleton symbol-table whose lifetime is a single test method. This should resolve the assertion. + + +Deferred Initialization of Stats +============================ + +When :ref:`enable_deferred_creation_stats ` +is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation +is deferred to first access of any member of that stats, i.e. instantiation only happens when an invocation on operator "*" or "->" happens. diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index a51fe4382562a..68ddf9e8d603b 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -90,7 +90,7 @@ void MainImpl::initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstr // stats_config_ should be set before creating the ClusterManagers so that it is available // from the ServerFactoryContext when creating the static clusters and stats sinks, where - // stats lazy-init setting is read. + // stats deferred instantiation setting is read. stats_config_ = std::make_unique(bootstrap); const auto& secrets = bootstrap.static_resources().secrets(); diff --git a/test/mocks/server/instance.h b/test/mocks/server/instance.h index 7201e3def7ee3..93b5d4fe43d4d 100644 --- a/test/mocks/server/instance.h +++ b/test/mocks/server/instance.h @@ -56,7 +56,7 @@ class MockInstance : public Instance { MOCK_METHOD(Configuration::ServerFactoryContext&, serverFactoryContext, ()); MOCK_METHOD(Configuration::TransportSocketFactoryContext&, transportSocketFactoryContext, ()); MOCK_METHOD(bool, enableReusePortDefault, ()); - MOCK_METHOD(void, setSinkPredicates, (std::unique_ptr&&)); + MOCK_METHOD(void, setSinkPredicates, (std::unique_ptr &&)); void setDefaultTracingConfig(const envoy::config::trace::v3::Tracing& tracing_config) override { http_context_.setDefaultTracingConfig(tracing_config); From a705e5e0949075ef863c7c03530293d8ebddfc0f Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 14:10:40 +0000 Subject: [PATCH 110/122] add newline at end of file Signed-off-by: Xin Zhuang --- docs/root/intro/arch_overview/observability/statistics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 60cffd9404b22..2286c2678eebf 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -45,4 +45,4 @@ Deferred Initialization of Stats When :ref:`enable_deferred_creation_stats ` is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation is deferred to first access of any member of that stats, i.e. instantiation only happens when an invocation on -operator "*" or "->" happens. \ No newline at end of file +operator "*" or "->" happens. From cb35d0b13d065aa78014b02a322373f9cc1bf741 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 14:23:42 +0000 Subject: [PATCH 111/122] more == Signed-off-by: Xin Zhuang --- docs/root/intro/arch_overview/observability/statistics.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 2286c2678eebf..1e1a11bad66b7 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -40,7 +40,7 @@ become histograms as the only difference between the two representations was the * :ref:`v3 API reference `. Deferred Initialization of Stats -============================ +================================ When :ref:`enable_deferred_creation_stats ` is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation From a1c27f61ecce410f32380fec355a9abee2ebba8c Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 20:19:11 +0000 Subject: [PATCH 112/122] refactor deferred_creation.h to remove the header Signed-off-by: Xin Zhuang --- envoy/stats/stats.h | 32 +++++++++++ source/common/http/codec_client.h | 1 - .../network/happy_eyeballs_connection_impl.cc | 1 - source/common/router/retry_state_impl.h | 1 - source/common/router/upstream_codec_filter.cc | 1 - source/common/stats/deferred_creation.h | 55 ++++--------------- source/common/upstream/conn_pool_map_impl.h | 1 - source/common/upstream/upstream_impl.cc | 5 +- source/common/upstream/upstream_impl.h | 1 - .../stat_sinks/common/statsd/statsd.cc | 1 - .../extensions/stat_sinks/hystrix/hystrix.cc | 1 - .../deferred_creation_stats_speed_test.cc | 3 +- .../stats/deferred_creation_stats_test.cc | 30 ++++++---- 13 files changed, 63 insertions(+), 70 deletions(-) diff --git a/envoy/stats/stats.h b/envoy/stats/stats.h index 46b15d4a20ab1..6d8dd1a25b0ef 100644 --- a/envoy/stats/stats.h +++ b/envoy/stats/stats.h @@ -218,6 +218,22 @@ using SizeFn = std::function; */ template using StatFn = std::function; +/** + * Interface for stats lazy initialization. + * To reduce memory and CPU consumption, Envoy can enable the bootstrap config + * :ref:`enable_deferred_creation_stats + * `. + * A 'StatsStructType' is only created when any of its field is referenced. + * See more context: https://github.com/envoyproxy/envoy/issues/23575 + */ +template class DeferredCreationCompatibleInterface { +public: + // Helper function to get-or-create and return the StatsStructType object. + virtual StatsStructType& instantiate() PURE; + + virtual ~DeferredCreationCompatibleInterface() = default; +}; + // Template that lazily initializes a StatsStruct. // The bootstrap config :ref:`enable_deferred_creation_stats // ` decides if @@ -225,5 +241,21 @@ template using StatFn = std::function; template class DeferredCreation; template class DirectStats; +// A helper class for a lazy compatible stats struct type. +template class DeferredCreationCompatibleStats { +public: + DeferredCreationCompatibleStats( + std::unique_ptr> d) + : data_(std::move(d)) {} + // Allows move construct and assign. + DeferredCreationCompatibleStats& operator=(DeferredCreationCompatibleStats&&) = default; + DeferredCreationCompatibleStats(DeferredCreationCompatibleStats&&) = default; + + inline StatsStructType* operator->() { return &data_->instantiate(); }; + inline StatsStructType& operator*() { return data_->instantiate(); }; + +private: + std::unique_ptr> data_; +}; } // namespace Stats } // namespace Envoy diff --git a/source/common/http/codec_client.h b/source/common/http/codec_client.h index 8b890c2c3cb2f..56cb24dbe6568 100644 --- a/source/common/http/codec_client.h +++ b/source/common/http/codec_client.h @@ -19,7 +19,6 @@ #include "source/common/http/codec_wrappers.h" #include "source/common/network/filter_impl.h" #include "source/common/runtime/runtime_features.h" -#include "source/common/stats/deferred_creation.h" namespace Envoy { namespace Http { diff --git a/source/common/network/happy_eyeballs_connection_impl.cc b/source/common/network/happy_eyeballs_connection_impl.cc index d35727cfb094d..67cf720343a65 100644 --- a/source/common/network/happy_eyeballs_connection_impl.cc +++ b/source/common/network/happy_eyeballs_connection_impl.cc @@ -1,7 +1,6 @@ #include "source/common/network/happy_eyeballs_connection_impl.h" #include "source/common/network/connection_impl.h" -#include "source/common/stats/deferred_creation.h" namespace Envoy { namespace Network { diff --git a/source/common/router/retry_state_impl.h b/source/common/router/retry_state_impl.h index 638f22e4399f9..0118c8577bc71 100644 --- a/source/common/router/retry_state_impl.h +++ b/source/common/router/retry_state_impl.h @@ -14,7 +14,6 @@ #include "source/common/common/backoff_strategy.h" #include "source/common/http/header_utility.h" -#include "source/common/stats/deferred_creation.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" diff --git a/source/common/router/upstream_codec_filter.cc b/source/common/router/upstream_codec_filter.cc index 80e627bea9801..df00ef8813da6 100644 --- a/source/common/router/upstream_codec_filter.cc +++ b/source/common/router/upstream_codec_filter.cc @@ -23,7 +23,6 @@ #include "source/common/http/headers.h" #include "source/common/http/message_impl.h" #include "source/common/http/utility.h" -#include "source/common/stats/deferred_creation.h" namespace Envoy { namespace Router { diff --git a/source/common/stats/deferred_creation.h b/source/common/stats/deferred_creation.h index 8f4e632f501ab..ee3f64746d42a 100644 --- a/source/common/stats/deferred_creation.h +++ b/source/common/stats/deferred_creation.h @@ -12,25 +12,6 @@ namespace Envoy { namespace Stats { -template class DirectStats; -template class DeferredCreation; - -/** - * Interface for stats lazy initialization. - * To reduce memory and CPU consumption, Envoy can enable the bootstrap config - * :ref:`enable_deferred_creation_stats - * `. - * A 'StatsStructType' is only created when any of its field is referenced. - * See more context: https://github.com/envoyproxy/envoy/issues/23575 - */ -template class DeferredCreationCompatibleInterface { -public: - // Helper function to get-or-create and return the StatsStructType object. - virtual StatsStructType& instantiate() PURE; - - virtual ~DeferredCreationCompatibleInterface() = default; -}; - /** * Lazy-initialization wrapper for StatsStructType, intended for deferred instantiation of a block * of stats that might not be needed in a given Envoy process. @@ -116,33 +97,17 @@ class DirectStats : public DeferredCreationCompatibleInterface StatsStructType stats_; }; -// A helper class for a lazy compatible stats struct type. -template class DeferredCreationCompatibleStats { -public: - static DeferredCreationCompatibleStats - create(Stats::ScopeSharedPtr scope, const typename StatsStructType::StatNameType& stat_names, - bool deferred_creation) { - if (deferred_creation) { - return {std::make_unique>(stat_names, scope)}; - } else { - return {std::make_unique>(stat_names, *scope)}; - } +template +DeferredCreationCompatibleStats +createDeferredCompatibleStats(Stats::ScopeSharedPtr scope, + const typename StatsStructType::StatNameType& stat_names, + bool deferred_creation) { + if (deferred_creation) { + return {std::make_unique>(stat_names, scope)}; + } else { + return {std::make_unique>(stat_names, *scope)}; } - - // Allows move construct and assign. - DeferredCreationCompatibleStats& operator=(DeferredCreationCompatibleStats&&) = default; - DeferredCreationCompatibleStats(DeferredCreationCompatibleStats&&) = default; - - inline StatsStructType* operator->() { return &data_->instantiate(); }; - inline StatsStructType& operator*() { return data_->instantiate(); }; - -private: - DeferredCreationCompatibleStats( - std::unique_ptr> d) - : data_(std::move(d)) {} - - std::unique_ptr> data_; -}; +} } // namespace Stats } // namespace Envoy diff --git a/source/common/upstream/conn_pool_map_impl.h b/source/common/upstream/conn_pool_map_impl.h index c16827b6a0ff2..d4360858b58d1 100644 --- a/source/common/upstream/conn_pool_map_impl.h +++ b/source/common/upstream/conn_pool_map_impl.h @@ -1,6 +1,5 @@ #pragma once -#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/conn_pool_map.h" namespace Envoy { diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 9f2929b7aa71e..1362b45cc09b9 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -48,7 +48,6 @@ #include "source/common/router/config_utility.h" #include "source/common/runtime/runtime_features.h" #include "source/common/runtime/runtime_impl.h" -#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/cluster_factory_impl.h" #include "source/common/upstream/health_checker_impl.h" #include "source/extensions/filters/network/http_connection_manager/config.h" @@ -857,8 +856,8 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add DeferredCreationCompatibleClusterTrafficStats ClusterInfoImpl::generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& stat_names, bool deferred_creation) { - return DeferredCreationCompatibleClusterTrafficStats::create(scope, stat_names, - deferred_creation); + return Stats::createDeferredCompatibleStats(scope, stat_names, + deferred_creation); } ClusterRequestResponseSizeStats ClusterInfoImpl::generateRequestResponseSizeStats( diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index bd2b2d8b3ff77..8d6bf028cea1e 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -56,7 +56,6 @@ #include "source/common/init/manager_impl.h" #include "source/common/network/utility.h" #include "source/common/shared_pool/shared_pool.h" -#include "source/common/stats/deferred_creation.h" #include "source/common/stats/isolated_store_impl.h" #include "source/common/upstream/load_balancer_impl.h" #include "source/common/upstream/resource_manager_impl.h" diff --git a/source/extensions/stat_sinks/common/statsd/statsd.cc b/source/extensions/stat_sinks/common/statsd/statsd.cc index 0e06c9fd9522f..062fdfd01fca9 100644 --- a/source/extensions/stat_sinks/common/statsd/statsd.cc +++ b/source/extensions/stat_sinks/common/statsd/statsd.cc @@ -19,7 +19,6 @@ #include "source/common/config/utility.h" #include "source/common/network/socket_interface.h" #include "source/common/network/utility.h" -#include "source/common/stats/deferred_creation.h" #include "source/common/stats/symbol_table.h" #include "absl/strings/str_join.h" diff --git a/source/extensions/stat_sinks/hystrix/hystrix.cc b/source/extensions/stat_sinks/hystrix/hystrix.cc index c6092f68f90dc..25e81763ca6f6 100644 --- a/source/extensions/stat_sinks/hystrix/hystrix.cc +++ b/source/extensions/stat_sinks/hystrix/hystrix.cc @@ -11,7 +11,6 @@ #include "source/common/common/logger.h" #include "source/common/config/well_known_names.h" #include "source/common/http/headers.h" -#include "source/common/stats/deferred_creation.h" #include "source/common/stats/utility.h" #include "absl/strings/str_cat.h" diff --git a/test/common/stats/deferred_creation_stats_speed_test.cc b/test/common/stats/deferred_creation_stats_speed_test.cc index 2d2c7e406d28e..e3358254e7441 100644 --- a/test/common/stats/deferred_creation_stats_speed_test.cc +++ b/test/common/stats/deferred_creation_stats_speed_test.cc @@ -95,8 +95,7 @@ class DeferredCreationStatsBenchmarkBase { ScopeSharedPtr scope = stat_store_.createScope(new_cluster_name); scopes_.push_back(scope); auto lazy_stat = std::make_shared>( - DeferredCreationCompatibleStats::create(scope, stat_names_, - deferred_creation_)); + createDeferredCompatibleStats(scope, stat_names_, deferred_creation_)); lazy_stats_.push_back(lazy_stat); if (!defer_init) { *(*lazy_stat); diff --git a/test/common/stats/deferred_creation_stats_test.cc b/test/common/stats/deferred_creation_stats_test.cc index 16b28f3eaecda..f067f0ebbb5a7 100644 --- a/test/common/stats/deferred_creation_stats_test.cc +++ b/test/common/stats/deferred_creation_stats_test.cc @@ -33,7 +33,7 @@ using MyStats = DeferredCreationCompatibleStats; TEST_F(DeferredCreationStatsTest, NonLazyNoInitializedGauge) { { ScopeSharedPtr scope = store_.createScope("bluh"); - MyStats non_lazy_y = MyStats::create(scope, stats_names_, false); + MyStats non_lazy_y = createDeferredCompatibleStats(scope, stats_names_, false); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); EXPECT_EQ(TestUtility::findCounter(store_, "bluh.foo")->value(), 0); non_lazy_y->foo_.inc(); @@ -51,8 +51,8 @@ TEST_F(DeferredCreationStatsTest, StatsGoneWithScope) { ScopeSharedPtr scope = store_.createScope("bluh"); // No such gauge when there is no lazy init stats instances. EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); - MyStats x = MyStats::create(scope, stats_names_, true); - MyStats y = MyStats::create(scope, stats_names_, true); + MyStats x = createDeferredCompatibleStats(scope, stats_names_, true); + MyStats y = createDeferredCompatibleStats(scope, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); x->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -67,7 +67,7 @@ TEST_F(DeferredCreationStatsTest, StatsGoneWithScope) { // Recreate scope "bluh". ScopeSharedPtr scope = store_.createScope("bluh"); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); - MyStats x = MyStats::create(scope, stats_names_, true); + MyStats x = createDeferredCompatibleStats(scope, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); // Previous data is gone, as scope_v2 and scope_1's lifecycle do not overlap. EXPECT_EQ(x->foo_.value(), 0); @@ -81,8 +81,10 @@ TEST_F(DeferredCreationStatsTest, StatsGoneWithScope) { TEST_F(DeferredCreationStatsTest, MultipleInstancesSameScopeDynamicallyDestructed) { { ScopeSharedPtr scope_1 = store_.createScope("bluh"); - auto x = std::make_unique(MyStats::create(scope_1, stats_names_, true)); - auto y = std::make_unique(MyStats::create(scope_1, stats_names_, true)); + auto x = std::make_unique( + createDeferredCompatibleStats(scope_1, stats_names_, true)); + auto y = std::make_unique( + createDeferredCompatibleStats(scope_1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); // Only instantiate x, and then delete it. (*x)->foo_.inc(); @@ -104,7 +106,7 @@ TEST_F(DeferredCreationStatsTest, MultipleInstancesSameScopeDynamicallyDestructe EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized"), nullptr); { ScopeSharedPtr scope_v2 = store_.createScope("bluh"); - MyStats x = MyStats::create(scope_v2, stats_names_, true); + MyStats x = createDeferredCompatibleStats(scope_v2, stats_names_, true); // Previous data is gone, as scope_v2 and scope_1's lifecycle do not overlap. EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); EXPECT_EQ(x->foo_.value(), 0); @@ -120,8 +122,10 @@ TEST_F(DeferredCreationStatsTest, MultipleInstancesSameScopeDynamicallyDestructe TEST_F(DeferredCreationStatsTest, ScopeOutlivesLazyStats) { ScopeSharedPtr scope_1 = store_.createScope("bluh"); { - auto x = std::make_unique(MyStats::create(scope_1, stats_names_, true)); - auto y = std::make_unique(MyStats::create(scope_1, stats_names_, true)); + auto x = std::make_unique( + createDeferredCompatibleStats(scope_1, stats_names_, true)); + auto y = std::make_unique( + createDeferredCompatibleStats(scope_1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); (*x)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -142,7 +146,7 @@ TEST_F(DeferredCreationStatsTest, ScopeOutlivesLazyStats) { // scope_1 overlaps with scope_v2. ScopeSharedPtr scope_v2 = store_.createScope("bluh"); - MyStats x_v2 = MyStats::create(scope_v2, stats_names_, true); + MyStats x_v2 = createDeferredCompatibleStats(scope_v2, stats_names_, true); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); // Previous data is NOT gone, as scope_v2 and scope_1's lifecycle overlap. EXPECT_EQ(x_v2->foo_.value(), 2); @@ -161,7 +165,8 @@ TEST_F(DeferredCreationStatsTest, ScopeOutlivesLazyStats) { TEST_F(DeferredCreationStatsTest, WhenScopesOverlapStatsAreAliveAsLongAsThereAre) { ScopeSharedPtr scope_v1 = store_.createScope("bluh"); - auto x = std::make_unique(MyStats::create(scope_v1, stats_names_, true)); + auto x = std::make_unique( + createDeferredCompatibleStats(scope_v1, stats_names_, true)); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 0); (*x)->foo_.inc(); EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 1); @@ -171,7 +176,8 @@ TEST_F(DeferredCreationStatsTest, WhenScopesOverlapStatsAreAliveAsLongAsThereAre // Now scope_v2 gets created, but no action on any stats. ScopeSharedPtr scope_v2 = store_.createScope("bluh"); - auto y = std::make_unique(MyStats::create(scope_v2, stats_names_, true)); + auto y = std::make_unique( + createDeferredCompatibleStats(scope_v2, stats_names_, true)); // NOTE: since x was instantiated, y is instantiated on creation. EXPECT_EQ(TestUtility::findGauge(store_, "bluh.AwesomeStats.initialized")->value(), 2); From 0cd5310bd68bad15bb89066ed9fa1533ca4b5caf Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 21:00:14 +0000 Subject: [PATCH 113/122] revert more dep changes Signed-off-by: Xin Zhuang --- source/common/http/BUILD | 2 -- source/common/http/http1/BUILD | 1 - source/common/network/BUILD | 1 - source/common/upstream/BUILD | 2 -- source/common/upstream/load_balancer_impl.h | 1 - .../filters/http/grpc_stats/grpc_stats_filter.cc | 8 ++++---- source/extensions/stat_sinks/common/statsd/BUILD | 1 - source/extensions/stat_sinks/hystrix/BUILD | 1 - 8 files changed, 4 insertions(+), 13 deletions(-) diff --git a/source/common/http/BUILD b/source/common/http/BUILD index 28491e92e1cd6..6177bd4d8a59c 100644 --- a/source/common/http/BUILD +++ b/source/common/http/BUILD @@ -45,7 +45,6 @@ envoy_cc_library( hdrs = ["async_client_utility.h"], deps = [ "//envoy/http:async_client_interface", - "//source/common/stats:deferred_creation", ], ) @@ -77,7 +76,6 @@ envoy_cc_library( "//source/common/http/http2:codec_lib", "//source/common/network:filter_lib", "//source/common/runtime:runtime_features_lib", - "//source/common/stats:deferred_creation", ] + envoy_select_enable_http3([ "//source/common/quic:client_codec_lib", ]), diff --git a/source/common/http/http1/BUILD b/source/common/http/http1/BUILD index 2317e4bbdadd3..bdd794dc0723d 100644 --- a/source/common/http/http1/BUILD +++ b/source/common/http/http1/BUILD @@ -83,7 +83,6 @@ envoy_cc_library( "//source/common/http:conn_pool_base_lib", "//source/common/http:headers_lib", "//source/common/runtime:runtime_features_lib", - "//source/common/stats:deferred_creation", "//source/common/upstream:upstream_lib", ], ) diff --git a/source/common/network/BUILD b/source/common/network/BUILD index 68612f4479add..bbe92972ec02b 100644 --- a/source/common/network/BUILD +++ b/source/common/network/BUILD @@ -131,7 +131,6 @@ envoy_cc_library( ":connection_lib", ":multi_connection_base_impl_lib", "//envoy/upstream:upstream_interface", - "//source/common/stats:deferred_creation", ], ) diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index 91059986f7be9..0b43a116dc490 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -166,7 +166,6 @@ envoy_cc_library( hdrs = ["conn_pool_map_impl.h"], deps = [ ":conn_pool_map", - "//source/common/stats:deferred_creation", ], ) @@ -271,7 +270,6 @@ envoy_cc_library( "//source/common/common:assert_lib", "//source/common/protobuf:utility_lib", "//source/common/runtime:runtime_protos_lib", - "//source/common/stats:deferred_creation", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/load_balancing_policies/common/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/load_balancing_policies/least_request/v3:pkg_cc_proto", diff --git a/source/common/upstream/load_balancer_impl.h b/source/common/upstream/load_balancer_impl.h index 1b18fd1c254be..48b45a7ac4cad 100644 --- a/source/common/upstream/load_balancer_impl.h +++ b/source/common/upstream/load_balancer_impl.h @@ -24,7 +24,6 @@ #include "source/common/protobuf/utility.h" #include "source/common/runtime/runtime_protos.h" -#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/edf_scheduler.h" namespace Envoy { diff --git a/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc b/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc index f75780f3e1ad3..1e2b949f2a7f3 100644 --- a/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc +++ b/source/extensions/filters/http/grpc_stats/grpc_stats_filter.cc @@ -94,7 +94,7 @@ struct Config { Config(const envoy::extensions::filters::http::grpc_stats::v3::FilterConfig& proto_config, Server::Configuration::FactoryContext& context) : context_(context.grpcContext()), emit_filter_state_(proto_config.emit_filter_state()), - enable_traffic_stats_(proto_config.enable_upstream_stats()), + enable_upstream_stats_(proto_config.enable_upstream_stats()), replace_dots_in_grpc_service_name_(proto_config.replace_dots_in_grpc_service_name()) { switch (proto_config.per_method_stat_specifier_case()) { @@ -138,7 +138,7 @@ struct Config { } Grpc::Context& context_; const bool emit_filter_state_; - const bool enable_traffic_stats_; + const bool enable_upstream_stats_; const bool replace_dots_in_grpc_service_name_; bool stats_for_all_methods_{false}; absl::optional allowlist_; @@ -303,11 +303,11 @@ class GrpcStatsFilter : public Http::PassThroughFilter { } void maybeChargeUpstreamStat() { - if (!config_->enable_traffic_stats_) { + if (!config_->enable_upstream_stats_) { return; } StreamInfo::TimingUtility timing(decoder_callbacks_->streamInfo()); - if (config_->enable_traffic_stats_ && timing.lastUpstreamTxByteSent().has_value() && + if (config_->enable_upstream_stats_ && timing.lastUpstreamTxByteSent().has_value() && timing.lastUpstreamRxByteReceived().has_value()) { std::chrono::milliseconds chrono_duration = std::chrono::duration_cast( diff --git a/source/extensions/stat_sinks/common/statsd/BUILD b/source/extensions/stat_sinks/common/statsd/BUILD index e8b616ce8a40f..2d74e42869e9e 100644 --- a/source/extensions/stat_sinks/common/statsd/BUILD +++ b/source/extensions/stat_sinks/common/statsd/BUILD @@ -30,6 +30,5 @@ envoy_cc_library( "//source/common/common:utility_lib", "//source/common/config:utility_lib", "//source/common/network:address_lib", - "//source/common/stats:deferred_creation", ], ) diff --git a/source/extensions/stat_sinks/hystrix/BUILD b/source/extensions/stat_sinks/hystrix/BUILD index 854f6500094be..25a1ffa4a49f1 100644 --- a/source/extensions/stat_sinks/hystrix/BUILD +++ b/source/extensions/stat_sinks/hystrix/BUILD @@ -37,7 +37,6 @@ envoy_cc_library( "//source/common/common:logger_lib", "//source/common/config:well_known_names", "//source/common/http:headers_lib", - "//source/common/stats:deferred_creation", "//source/common/stats:symbol_table_lib", "//source/common/stats:utility_lib", ], From f92b25ceb3c9d97bfc631c686461d46a7233bc9f Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 21:10:36 +0000 Subject: [PATCH 114/122] revert some of the reverts Signed-off-by: Xin Zhuang --- source/common/upstream/BUILD | 3 ++- source/common/upstream/upstream_impl.cc | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/source/common/upstream/BUILD b/source/common/upstream/BUILD index 0b43a116dc490..60ba2173cb7f3 100644 --- a/source/common/upstream/BUILD +++ b/source/common/upstream/BUILD @@ -79,7 +79,6 @@ envoy_cc_library( srcs = ["cluster_manager_impl.cc"], hdrs = ["cluster_manager_impl.h"], deps = [ - "//source/common/config:null_grpc_mux_lib", ":cds_api_lib", ":cluster_discovery_manager_lib", ":host_utility_lib", @@ -101,6 +100,7 @@ envoy_cc_library( "//source/common/common:enum_to_int", "//source/common/common:utility_lib", "//source/common/config:custom_config_validators_lib", + "//source/common/config:null_grpc_mux_lib", "//source/common/config:subscription_factory_lib", "//source/common/config:utility_lib", "//source/common/config:xds_resource_lib", @@ -399,6 +399,7 @@ envoy_cc_library( ":transport_socket_match_lib", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/core/v3:pkg_cc_proto", + "//source/common/stats:deferred_creation", "@envoy_api//envoy/config/endpoint/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/filters/http/upstream_codec/v3:pkg_cc_proto", "@envoy_api//envoy/extensions/transport_sockets/raw_buffer/v3:pkg_cc_proto", diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 1362b45cc09b9..5ac8376fa3e68 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -48,6 +48,7 @@ #include "source/common/router/config_utility.h" #include "source/common/runtime/runtime_features.h" #include "source/common/runtime/runtime_impl.h" +#include "source/common/stats/deferred_creation.h" #include "source/common/upstream/cluster_factory_impl.h" #include "source/common/upstream/health_checker_impl.h" #include "source/extensions/filters/network/http_connection_manager/config.h" From 0f6fa2cf170e85a3461387bb46ad1c5752ac0127 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 8 Jun 2023 21:36:49 +0000 Subject: [PATCH 115/122] more header removal Signed-off-by: Xin Zhuang --- source/common/http/conn_pool_base.h | 1 - source/common/http/http1/conn_pool.cc | 1 - test/integration/integration_test.cc | 1 - 3 files changed, 3 deletions(-) diff --git a/source/common/http/conn_pool_base.h b/source/common/http/conn_pool_base.h index e4457d87298c2..4facd3c82d5d1 100644 --- a/source/common/http/conn_pool_base.h +++ b/source/common/http/conn_pool_base.h @@ -10,7 +10,6 @@ #include "source/common/http/codec_client.h" #include "source/common/http/http_server_properties_cache_impl.h" #include "source/common/http/utility.h" -#include "source/common/stats/deferred_creation.h" #include "absl/strings/string_view.h" diff --git a/source/common/http/http1/conn_pool.cc b/source/common/http/http1/conn_pool.cc index 775263f58cb91..0439641c472f2 100644 --- a/source/common/http/http1/conn_pool.cc +++ b/source/common/http/http1/conn_pool.cc @@ -16,7 +16,6 @@ #include "source/common/http/header_utility.h" #include "source/common/http/headers.h" #include "source/common/runtime/runtime_features.h" -#include "source/common/stats/deferred_creation.h" #include "absl/strings/match.h" diff --git a/test/integration/integration_test.cc b/test/integration/integration_test.cc index 8f55a428dc65f..7c30ed707159b 100644 --- a/test/integration/integration_test.cc +++ b/test/integration/integration_test.cc @@ -2572,7 +2572,6 @@ TEST_P(IntegrationTest, SetRouteToDelegatingRouteWithClusterOverride) { // Even though headers specify cluster_0, set_route_filter modifies cached route cluster of // current request to cluster_override. - // cluster_0 trafficStats() not created yet. EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_cx_total")->value(), 0); EXPECT_EQ(test_server_->counter("cluster.cluster_0.upstream_rq_total")->value(), 0); From d4607791748e5acdab305c871e6dd529293831e7 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 9 Jun 2023 13:08:05 +0000 Subject: [PATCH 116/122] revert b/source/common/router/BUILD Signed-off-by: Xin Zhuang --- source/common/router/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/common/router/BUILD b/source/common/router/BUILD index b0e9c71c726d0..d881a5d1ab000 100644 --- a/source/common/router/BUILD +++ b/source/common/router/BUILD @@ -267,7 +267,6 @@ envoy_cc_library( "//source/common/http:header_utility_lib", "//source/common/http:headers_lib", "//source/common/http:utility_lib", - "//source/common/stats:deferred_creation", "@envoy_api//envoy/config/route/v3:pkg_cc_proto", ], ) @@ -371,7 +370,6 @@ envoy_cc_library( "//source/common/http:headers_lib", "//source/common/http:message_lib", "//source/common/http:utility_lib", - "//source/common/stats:deferred_creation", "//source/extensions/filters/http/common:factory_base_lib", "@envoy_api//envoy/extensions/filters/http/upstream_codec/v3:pkg_cc_proto", ], From b1dd7910aa55f559aedce6b0530b38997ae08711 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 9 Jun 2023 13:23:27 +0000 Subject: [PATCH 117/122] fix josh comments Signed-off-by: Xin Zhuang --- .../root/intro/arch_overview/observability/statistics.rst | 8 -------- envoy/server/configuration.h | 2 +- envoy/stats/stats.h | 2 +- source/common/stats/deferred_creation.h | 5 ++--- source/docs/stats.md | 2 +- source/server/configuration_impl.cc | 6 +++--- source/server/configuration_impl.h | 4 ++-- 7 files changed, 10 insertions(+), 19 deletions(-) diff --git a/docs/root/intro/arch_overview/observability/statistics.rst b/docs/root/intro/arch_overview/observability/statistics.rst index 1e1a11bad66b7..1ff0d8957811a 100644 --- a/docs/root/intro/arch_overview/observability/statistics.rst +++ b/docs/root/intro/arch_overview/observability/statistics.rst @@ -38,11 +38,3 @@ Histograms are written as they are received. Note: what were previously referred become histograms as the only difference between the two representations was the units. * :ref:`v3 API reference `. - -Deferred Initialization of Stats -================================ - -When :ref:`enable_deferred_creation_stats ` -is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation -is deferred to first access of any member of that stats, i.e. instantiation only happens when an invocation on -operator "*" or "->" happens. diff --git a/envoy/server/configuration.h b/envoy/server/configuration.h index 97d163f2fb2a6..945a175f66509 100644 --- a/envoy/server/configuration.h +++ b/envoy/server/configuration.h @@ -86,7 +86,7 @@ class StatsConfig { virtual bool flushOnAdmin() const PURE; /** - * When true, enable deferred creation of stats. + * @return true if deferred creation of stats is enabled. */ virtual bool enableDeferredCreationStats() const PURE; }; diff --git a/envoy/stats/stats.h b/envoy/stats/stats.h index 6d8dd1a25b0ef..c723a58df70a5 100644 --- a/envoy/stats/stats.h +++ b/envoy/stats/stats.h @@ -220,7 +220,7 @@ template using StatFn = std::function; /** * Interface for stats lazy initialization. - * To reduce memory and CPU consumption, Envoy can enable the bootstrap config + * To save memory and CPU consumption from unused stats, Envoy can enable the bootstrap config * :ref:`enable_deferred_creation_stats * `. * A 'StatsStructType' is only created when any of its field is referenced. diff --git a/source/common/stats/deferred_creation.h b/source/common/stats/deferred_creation.h index ee3f64746d42a..a5af4babb1328 100644 --- a/source/common/stats/deferred_creation.h +++ b/source/common/stats/deferred_creation.h @@ -35,7 +35,7 @@ class DeferredCreation : public DeferredCreationCompatibleInterface StatsStructType* { + ctor_([&, stats_scope = std::move(scope)]() -> StatsStructType* { initialized_.inc(); // Reset ctor_ to save some RAM. Cleanup reset_ctor([&] { ctor_ = nullptr; }); @@ -78,8 +78,7 @@ class DeferredCreation : public DeferredCreationCompatibleInterface ctor_; - Thread::AtomicPtr - internal_stats_{}; + Thread::AtomicPtr internal_stats_; }; // Non-DeferredCreation wrapper over StatsStructType. This is used when diff --git a/source/docs/stats.md b/source/docs/stats.md index 6badfcc1e3763..19119cc42f011 100644 --- a/source/docs/stats.md +++ b/source/docs/stats.md @@ -298,7 +298,7 @@ whose lifetime is a single test method. This should resolve the assertion. Deferred Initialization of Stats -============================ +================================ When :ref:`enable_deferred_creation_stats ` is enabled in Bootstrap, for stats that are deferred creation compatible, the actual stats struct creation diff --git a/source/server/configuration_impl.cc b/source/server/configuration_impl.cc index 68ddf9e8d603b..47506caa89925 100644 --- a/source/server/configuration_impl.cc +++ b/source/server/configuration_impl.cc @@ -112,11 +112,11 @@ void MainImpl::initialize(const envoy::config::bootstrap::v3::Bootstrap& bootstr initializeWatchdogs(bootstrap, server); // This has to happen after ClusterManager initialization, as it depends on config from // ClusterManager. - loadSinksIntoStatsConfig(bootstrap, server); + initializeStatsConfig(bootstrap, server); } -void MainImpl::loadSinksIntoStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, - Instance& server) { +void MainImpl::initializeStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, + Instance& server) { ENVOY_LOG(info, "loading stats sinks configuration"); for (const envoy::config::metrics::v3::StatsSink& sink_object : bootstrap.stats_sinks()) { diff --git a/source/server/configuration_impl.h b/source/server/configuration_impl.h index 1d1f4555af434..0cff207730d0f 100644 --- a/source/server/configuration_impl.h +++ b/source/server/configuration_impl.h @@ -131,8 +131,8 @@ class MainImpl : Logger::Loggable, public Main { /** * Initialize stats configuration. */ - void loadSinksIntoStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, - Instance& server); + void initializeStatsConfig(const envoy::config::bootstrap::v3::Bootstrap& bootstrap, + Instance& server); /** * Initialize watchdog(s). Call before accessing any watchdog configuration. From a6488671ecedb843f71ffe8e82bbedf338da30e7 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Fri, 9 Jun 2023 13:30:09 +0000 Subject: [PATCH 118/122] remove the supposedly deleted dep not synced to repo Signed-off-by: Xin Zhuang --- test/extensions/clusters/aggregate/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/test/extensions/clusters/aggregate/BUILD b/test/extensions/clusters/aggregate/BUILD index 4233767c7d576..5697246cd78aa 100644 --- a/test/extensions/clusters/aggregate/BUILD +++ b/test/extensions/clusters/aggregate/BUILD @@ -16,7 +16,6 @@ envoy_extension_cc_test( srcs = ["cluster_test.cc"], extension_names = ["envoy.clusters.aggregate"], deps = [ - "//source/common/stats:deferred_creation", "//source/extensions/clusters/aggregate:cluster", "//source/extensions/transport_sockets/raw_buffer:config", "//test/common/upstream:utility_lib", From 35165b02814dd892b7895f626c64696d0eee3d3f Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 21 Jun 2023 02:05:48 +0000 Subject: [PATCH 119/122] fix format and nits Signed-off-by: Xin Zhuang --- api/envoy/config/bootstrap/v3/bootstrap.proto | 1 - envoy/upstream/upstream.h | 4 ---- test/integration/cds_integration_test.cc | 3 ++- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/api/envoy/config/bootstrap/v3/bootstrap.proto b/api/envoy/config/bootstrap/v3/bootstrap.proto index 30d05dac50c8e..a5fcbef104b3a 100644 --- a/api/envoy/config/bootstrap/v3/bootstrap.proto +++ b/api/envoy/config/bootstrap/v3/bootstrap.proto @@ -199,7 +199,6 @@ message Bootstrap { repeated metrics.v3.StatsSink stats_sinks = 6; // Options to control behaviors of deferred creation compatible stats. - // [#not-implemented-hide:] DeferredStatOptions deferred_stat_options = 39; // Configuration for internal processing of stats. diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 0e9ce220ee5e6..7ad15cda92c5e 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -35,10 +35,6 @@ namespace Envoy { -namespace Stats { -template class DeferredCreationCompatibleStats; -} - namespace Http { class FilterChainManager; } diff --git a/test/integration/cds_integration_test.cc b/test/integration/cds_integration_test.cc index 680f4a1c0e281..3da6ca2b3c080 100644 --- a/test/integration/cds_integration_test.cc +++ b/test/integration/cds_integration_test.cc @@ -235,7 +235,8 @@ class DeferredCreationClusterStatsTest : public CdsIntegrationTest { use_real_stats_ = true; config_helper_.addConfigModifier( [enable_deferred_creation_stats](::envoy::config::bootstrap::v3::Bootstrap& bootstrap) { - bootstrap.set_enable_deferred_creation_stats(enable_deferred_creation_stats); + bootstrap.mutable_deferred_stat_options()->set_enable_deferred_creation_stats( + enable_deferred_creation_stats); }); CdsIntegrationTest::initialize(); test_server_->waitForCounterGe("cluster_manager.cluster_added", 1); From 0745231278bf9dcb8fba400389394effae73012d Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Wed, 21 Jun 2023 14:17:58 +0000 Subject: [PATCH 120/122] remove blank line Signed-off-by: Xin Zhuang --- envoy/upstream/upstream.h | 1 - 1 file changed, 1 deletion(-) diff --git a/envoy/upstream/upstream.h b/envoy/upstream/upstream.h index 7ad15cda92c5e..16ed189e4bff8 100644 --- a/envoy/upstream/upstream.h +++ b/envoy/upstream/upstream.h @@ -34,7 +34,6 @@ #include "fmt/format.h" namespace Envoy { - namespace Http { class FilterChainManager; } From b52578b4435c230580ce82f80d9bd5f2031607c3 Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Thu, 22 Jun 2023 17:55:39 +0000 Subject: [PATCH 121/122] fix the naming s/deferred_creation/defer_creation/ Signed-off-by: Xin Zhuang --- source/common/stats/deferred_creation.h | 4 ++-- source/common/upstream/upstream_impl.cc | 4 ++-- source/common/upstream/upstream_impl.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/common/stats/deferred_creation.h b/source/common/stats/deferred_creation.h index 4e2732728355d..b2999666e7a07 100644 --- a/source/common/stats/deferred_creation.h +++ b/source/common/stats/deferred_creation.h @@ -105,8 +105,8 @@ template DeferredCreationCompatibleStats createDeferredCompatibleStats(Stats::ScopeSharedPtr scope, const typename StatsStructType::StatNameType& stat_names, - bool deferred_creation) { - if (deferred_creation) { + bool defer_creation) { + if (defer_creation) { return DeferredCreationCompatibleStats( std::make_unique>(stat_names, scope)); } else { diff --git a/source/common/upstream/upstream_impl.cc b/source/common/upstream/upstream_impl.cc index 19e1e5cffa5e0..03aefb911b667 100644 --- a/source/common/upstream/upstream_impl.cc +++ b/source/common/upstream/upstream_impl.cc @@ -856,9 +856,9 @@ void MainPrioritySetImpl::updateCrossPriorityHostMap(const HostVector& hosts_add DeferredCreationCompatibleClusterTrafficStats ClusterInfoImpl::generateStats(Stats::ScopeSharedPtr scope, - const ClusterTrafficStatNames& stat_names, bool deferred_creation) { + const ClusterTrafficStatNames& stat_names, bool defer_creation) { return Stats::createDeferredCompatibleStats(scope, stat_names, - deferred_creation); + defer_creation); } ClusterRequestResponseSizeStats ClusterInfoImpl::generateRequestResponseSizeStats( diff --git a/source/common/upstream/upstream_impl.h b/source/common/upstream/upstream_impl.h index 01ecdc7ef243a..b3fa47f39026f 100644 --- a/source/common/upstream/upstream_impl.h +++ b/source/common/upstream/upstream_impl.h @@ -779,7 +779,7 @@ class ClusterInfoImpl : public ClusterInfo, static DeferredCreationCompatibleClusterTrafficStats generateStats(Stats::ScopeSharedPtr scope, const ClusterTrafficStatNames& cluster_stat_names, - bool deferred_creation); + bool defer_creation); static ClusterLoadReportStats generateLoadReportStats(Stats::Scope& scope, const ClusterLoadReportStatNames& stat_names); static ClusterCircuitBreakersStats From 505bb18a936729aa129482577ca20c702297a77d Mon Sep 17 00:00:00 2001 From: Xin Zhuang Date: Tue, 27 Jun 2023 14:23:50 +0000 Subject: [PATCH 122/122] add change log Signed-off-by: Xin Zhuang --- changelogs/current.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/changelogs/current.yaml b/changelogs/current.yaml index c3451e461f290..03e2fcfdcb385 100644 --- a/changelogs/current.yaml +++ b/changelogs/current.yaml @@ -459,3 +459,8 @@ deprecated: change: | deprecated the :ref:`HealthCheck event_log_path ` in favor of :ref:`HealthCheck event_logger extension `. +- area: stats + change: | + added :ref:`enable_deferred_creation_stats + `. + support for ClusterTrafficStats.