@@ -299,9 +299,9 @@ constexpr char proactiveResourceConfig[] = R"YAML(
299299 actions:
300300 - name: envoy.overload_actions.shrink_heap
301301 triggers:
302- - name: envoy.resource_monitors.fake_resource1
302+ - name: envoy.resource_monitors.global_downstream_max_connections
303303 threshold:
304- value: 0.9
304+ value: 0.5
305305)YAML" ;
306306
307307TEST_F (OverloadManagerImplTest, CallbackOnlyFiresWhenStateChanges) {
@@ -930,12 +930,21 @@ TEST_F(OverloadManagerImplTest, ProactiveResourceAllocateAndDeallocateResourceTe
930930 Stats::Counter& failed_updates =
931931 stats_.counter (" overload.envoy.resource_monitors.global_downstream_max_connections."
932932 " failed_updates" );
933+ Stats::Gauge& pressure =
934+ stats_.gauge (" overload.envoy.resource_monitors.global_downstream_max_connections.pressure" ,
935+ Stats::Gauge::ImportMode::NeverImport);
936+
933937 manager->start ();
934938 EXPECT_TRUE (manager->getThreadLocalOverloadState ().isResourceMonitorEnabled (
935939 OverloadProactiveResourceName::GlobalDownstreamMaxConnections));
936940 bool resource_allocated = manager->getThreadLocalOverloadState ().tryAllocateResource (
937941 Server::OverloadProactiveResourceName::GlobalDownstreamMaxConnections, 1 );
938942 EXPECT_TRUE (resource_allocated);
943+
944+ EXPECT_EQ (pressure.value (), 0 );
945+ timer_cb_ ();
946+ EXPECT_EQ (pressure.value (), 33 );
947+
939948 auto monitor = manager->getThreadLocalOverloadState ().getProactiveResourceMonitorForTest (
940949 Server::OverloadProactiveResourceName::GlobalDownstreamMaxConnections);
941950 EXPECT_NE (absl::nullopt , monitor);
@@ -954,6 +963,34 @@ TEST_F(OverloadManagerImplTest, ProactiveResourceAllocateAndDeallocateResourceTe
954963 manager->stop ();
955964}
956965
966+ // Test that proactive monitors trigger the configured actions when they reach the threshold.
967+ TEST_F (OverloadManagerImplTest, ProactiveResourceTriggers) {
968+ setDispatcherExpectation ();
969+
970+ auto manager (createOverloadManager (proactiveResourceConfig));
971+ bool is_active = false ;
972+ manager->registerForAction (" envoy.overload_actions.shrink_heap" , dispatcher_,
973+ [&](OverloadActionState state) { is_active = state.isSaturated (); });
974+
975+ manager->start ();
976+
977+ // Trigger threshold is 50%, max is 3.
978+
979+ ASSERT_TRUE (factory5_.monitor_ ->tryAllocateResource (1 ));
980+ timer_cb_ ();
981+ EXPECT_FALSE (is_active);
982+
983+ ASSERT_TRUE (factory5_.monitor_ ->tryAllocateResource (1 ));
984+ timer_cb_ ();
985+ EXPECT_TRUE (is_active);
986+
987+ ASSERT_TRUE (factory5_.monitor_ ->tryDeallocateResource (1 ));
988+ timer_cb_ ();
989+ EXPECT_FALSE (is_active);
990+
991+ manager->stop ();
992+ }
993+
957994class OverloadManagerSimulatedTimeTest : public OverloadManagerImplTest ,
958995 public Envoy::Event::TestUsingSimulatedTime {};
959996
0 commit comments