20 #include <gmock/gmock.h>
21 #include <gtest/gtest.h>
24 #include "src/proto/grpc/testing/xds/v3/cluster.grpc.pb.h"
25 #include "src/proto/grpc/testing/xds/v3/fault.grpc.pb.h"
26 #include "src/proto/grpc/testing/xds/v3/outlier_detection.grpc.pb.h"
27 #include "src/proto/grpc/testing/xds/v3/router.grpc.pb.h"
35 class OutlierDetectionTest :
public XdsEnd2endTest {
58 TEST_P(OutlierDetectionTest, SuccessRateEjectionAndUnejection) {
59 ScopedExperimentalEnvVar
env_var(
60 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
61 CreateAndStartBackends(2);
62 auto cluster = default_cluster_;
63 cluster.set_lb_policy(Cluster::RING_HASH);
67 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
69 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
72 cluster.mutable_outlier_detection()
73 ->mutable_success_rate_stdev_factor()
75 cluster.mutable_outlier_detection()
76 ->mutable_enforcing_success_rate()
78 cluster.mutable_outlier_detection()
79 ->mutable_success_rate_minimum_hosts()
81 cluster.mutable_outlier_detection()
82 ->mutable_success_rate_request_volume()
84 balancer_->ads_service()->SetCdsResource(
cluster);
85 auto new_route_config = default_route_config_;
86 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
87 auto* hash_policy =
route->mutable_route()->add_hash_policy();
88 hash_policy->mutable_header()->set_header_name(
"address_hash");
89 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
91 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
92 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
96 std::vector<std::pair<std::string, std::string>>
metadata = {
97 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
98 std::vector<std::pair<std::string, std::string>> metadata1 = {
99 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
100 const auto rpc_options = RpcOptions().set_metadata(
metadata);
101 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
103 WaitForBackendOptions(), rpc_options);
105 WaitForBackendOptions(), rpc_options1);
112 ResetBackendCounters();
122 ResetBackendCounters();
131 TEST_P(OutlierDetectionTest, SuccessRateMaxPercent) {
132 ScopedExperimentalEnvVar
env_var(
133 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
134 CreateAndStartBackends(4);
135 auto cluster = default_cluster_;
136 cluster.set_lb_policy(Cluster::RING_HASH);
140 auto* duration =
cluster.mutable_outlier_detection()->mutable_interval();
142 cluster.mutable_outlier_detection()
143 ->mutable_success_rate_stdev_factor()
145 cluster.mutable_outlier_detection()
146 ->mutable_enforcing_success_rate()
148 cluster.mutable_outlier_detection()
149 ->mutable_success_rate_minimum_hosts()
151 cluster.mutable_outlier_detection()
152 ->mutable_success_rate_request_volume()
154 balancer_->ads_service()->SetCdsResource(
cluster);
155 auto new_route_config = default_route_config_;
156 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
157 auto* hash_policy =
route->mutable_route()->add_hash_policy();
158 hash_policy->mutable_header()->set_header_name(
"address_hash");
159 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
161 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
162 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
166 std::vector<std::pair<std::string, std::string>>
metadata = {
167 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
168 std::vector<std::pair<std::string, std::string>> metadata1 = {
169 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
170 std::vector<std::pair<std::string, std::string>> metadata2 = {
171 {
"address_hash", CreateMetadataValueThatHashesToBackend(2)}};
172 std::vector<std::pair<std::string, std::string>> metadata3 = {
173 {
"address_hash", CreateMetadataValueThatHashesToBackend(3)}};
174 const auto rpc_options = RpcOptions().set_metadata(
metadata);
175 const auto rpc_options1 = RpcOptions().set_metadata(metadata1);
176 const auto rpc_options2 = RpcOptions().set_metadata(metadata2);
177 const auto rpc_options3 = RpcOptions().set_metadata(metadata3);
179 WaitForBackendOptions(), rpc_options);
181 WaitForBackendOptions(), rpc_options1);
183 WaitForBackendOptions(), rpc_options2);
185 WaitForBackendOptions(), rpc_options3);
199 ResetBackendCounters();
206 size_t empty_load_backend_count = 0;
207 size_t double_load_backend_count = 0;
208 size_t regular_load_backend_count = 0;
211 ++empty_load_backend_count;
213 ++double_load_backend_count;
215 ++regular_load_backend_count;
222 EXPECT_EQ(2, regular_load_backend_count);
227 TEST_P(OutlierDetectionTest, SuccessRateStdevFactor) {
228 ScopedExperimentalEnvVar
env_var(
229 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
230 CreateAndStartBackends(2);
231 auto cluster = default_cluster_;
232 cluster.set_lb_policy(Cluster::RING_HASH);
236 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
238 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
247 cluster.mutable_outlier_detection()
248 ->mutable_success_rate_stdev_factor()
250 cluster.mutable_outlier_detection()
251 ->mutable_enforcing_success_rate()
253 cluster.mutable_outlier_detection()
254 ->mutable_success_rate_minimum_hosts()
256 cluster.mutable_outlier_detection()
257 ->mutable_success_rate_request_volume()
259 balancer_->ads_service()->SetCdsResource(
cluster);
260 auto new_route_config = default_route_config_;
261 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
262 auto* hash_policy =
route->mutable_route()->add_hash_policy();
263 hash_policy->mutable_header()->set_header_name(
"address_hash");
264 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
266 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
267 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
271 std::vector<std::pair<std::string, std::string>>
metadata = {
272 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
273 std::vector<std::pair<std::string, std::string>> metadata1 = {
274 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
275 const auto rpc_options = RpcOptions().set_metadata(
metadata);
276 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
278 WaitForBackendOptions(), rpc_options);
280 WaitForBackendOptions(), rpc_options1);
287 ResetBackendCounters();
300 TEST_P(OutlierDetectionTest, SuccessRateEnforcementPercentage) {
301 ScopedExperimentalEnvVar
env_var(
302 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
303 CreateAndStartBackends(2);
304 auto cluster = default_cluster_;
305 cluster.set_lb_policy(Cluster::RING_HASH);
306 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
308 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
311 cluster.mutable_outlier_detection()
312 ->mutable_success_rate_stdev_factor()
319 cluster.mutable_outlier_detection()
320 ->mutable_enforcing_success_rate()
322 cluster.mutable_outlier_detection()
323 ->mutable_success_rate_minimum_hosts()
325 cluster.mutable_outlier_detection()
326 ->mutable_success_rate_request_volume()
328 balancer_->ads_service()->SetCdsResource(
cluster);
329 auto new_route_config = default_route_config_;
330 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
331 auto* hash_policy =
route->mutable_route()->add_hash_policy();
332 hash_policy->mutable_header()->set_header_name(
"address_hash");
333 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
335 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
336 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
340 std::vector<std::pair<std::string, std::string>>
metadata = {
341 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
342 std::vector<std::pair<std::string, std::string>> metadata1 = {
343 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
344 const auto rpc_options = RpcOptions().set_metadata(
metadata);
345 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
347 WaitForBackendOptions(), rpc_options);
349 WaitForBackendOptions(), rpc_options1);
356 ResetBackendCounters();
368 TEST_P(OutlierDetectionTest, SuccessRateMinimumHosts) {
369 ScopedExperimentalEnvVar
env_var(
370 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
371 CreateAndStartBackends(2);
372 auto cluster = default_cluster_;
373 cluster.set_lb_policy(Cluster::RING_HASH);
377 auto* duration =
cluster.mutable_outlier_detection()->mutable_interval();
379 cluster.mutable_outlier_detection()
380 ->mutable_success_rate_stdev_factor()
382 cluster.mutable_outlier_detection()
383 ->mutable_enforcing_success_rate()
390 cluster.mutable_outlier_detection()
391 ->mutable_success_rate_minimum_hosts()
393 cluster.mutable_outlier_detection()
394 ->mutable_success_rate_request_volume()
396 balancer_->ads_service()->SetCdsResource(
cluster);
397 auto new_route_config = default_route_config_;
398 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
399 auto* hash_policy =
route->mutable_route()->add_hash_policy();
400 hash_policy->mutable_header()->set_header_name(
"address_hash");
401 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
403 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
404 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
408 std::vector<std::pair<std::string, std::string>>
metadata = {
409 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
410 std::vector<std::pair<std::string, std::string>> metadata1 = {
411 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
412 const auto rpc_options = RpcOptions().set_metadata(
metadata);
413 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
415 WaitForBackendOptions(), rpc_options);
417 WaitForBackendOptions(), rpc_options1);
424 ResetBackendCounters();
436 TEST_P(OutlierDetectionTest, SuccessRateRequestVolume) {
437 ScopedExperimentalEnvVar
env_var(
438 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
439 CreateAndStartBackends(2);
440 auto cluster = default_cluster_;
441 cluster.set_lb_policy(Cluster::RING_HASH);
445 auto* duration =
cluster.mutable_outlier_detection()->mutable_interval();
447 cluster.mutable_outlier_detection()
448 ->mutable_success_rate_stdev_factor()
450 cluster.mutable_outlier_detection()
451 ->mutable_enforcing_success_rate()
453 cluster.mutable_outlier_detection()
454 ->mutable_success_rate_minimum_hosts()
462 cluster.mutable_outlier_detection()
463 ->mutable_success_rate_request_volume()
465 balancer_->ads_service()->SetCdsResource(
cluster);
466 auto new_route_config = default_route_config_;
467 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
468 auto* hash_policy =
route->mutable_route()->add_hash_policy();
469 hash_policy->mutable_header()->set_header_name(
"address_hash");
470 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
472 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
473 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
477 std::vector<std::pair<std::string, std::string>>
metadata = {
478 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
479 std::vector<std::pair<std::string, std::string>> metadata1 = {
480 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
481 const auto rpc_options = RpcOptions().set_metadata(
metadata);
482 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
484 WaitForBackendOptions(), rpc_options);
486 WaitForBackendOptions(), rpc_options1);
493 ResetBackendCounters();
512 TEST_P(OutlierDetectionTest, FailurePercentageEjectionAndUnejection) {
513 ScopedExperimentalEnvVar
env_var(
514 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
515 CreateAndStartBackends(2);
516 auto cluster = default_cluster_;
517 cluster.set_lb_policy(Cluster::RING_HASH);
521 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
524 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
526 cluster.mutable_outlier_detection()
527 ->mutable_failure_percentage_threshold()
529 cluster.mutable_outlier_detection()
530 ->mutable_enforcing_failure_percentage()
532 cluster.mutable_outlier_detection()
533 ->mutable_failure_percentage_minimum_hosts()
535 cluster.mutable_outlier_detection()
536 ->mutable_failure_percentage_request_volume()
538 balancer_->ads_service()->SetCdsResource(
cluster);
539 auto new_route_config = default_route_config_;
540 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
541 auto* hash_policy =
route->mutable_route()->add_hash_policy();
542 hash_policy->mutable_header()->set_header_name(
"address_hash");
543 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
545 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
546 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
550 std::vector<std::pair<std::string, std::string>>
metadata = {
551 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
552 std::vector<std::pair<std::string, std::string>> metadata1 = {
553 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
554 const auto rpc_options = RpcOptions().set_metadata(
metadata);
555 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
557 WaitForBackendOptions(), rpc_options);
559 WaitForBackendOptions(), rpc_options1);
567 ResetBackendCounters();
577 ResetBackendCounters();
586 TEST_P(OutlierDetectionTest, FailurePercentageMaxPercentage) {
587 ScopedExperimentalEnvVar
env_var(
588 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
589 CreateAndStartBackends(4);
590 auto cluster = default_cluster_;
591 cluster.set_lb_policy(Cluster::RING_HASH);
595 auto* duration =
cluster.mutable_outlier_detection()->mutable_interval();
597 cluster.mutable_outlier_detection()
598 ->mutable_failure_percentage_threshold()
600 cluster.mutable_outlier_detection()
601 ->mutable_enforcing_failure_percentage()
603 cluster.mutable_outlier_detection()
604 ->mutable_failure_percentage_minimum_hosts()
606 cluster.mutable_outlier_detection()
607 ->mutable_failure_percentage_request_volume()
609 balancer_->ads_service()->SetCdsResource(
cluster);
610 auto new_route_config = default_route_config_;
611 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
612 auto* hash_policy =
route->mutable_route()->add_hash_policy();
613 hash_policy->mutable_header()->set_header_name(
"address_hash");
614 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
616 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
617 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
621 std::vector<std::pair<std::string, std::string>>
metadata = {
622 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
623 std::vector<std::pair<std::string, std::string>> metadata1 = {
624 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
625 std::vector<std::pair<std::string, std::string>> metadata2 = {
626 {
"address_hash", CreateMetadataValueThatHashesToBackend(2)}};
627 std::vector<std::pair<std::string, std::string>> metadata3 = {
628 {
"address_hash", CreateMetadataValueThatHashesToBackend(3)}};
629 const auto rpc_options = RpcOptions().set_metadata(
metadata);
630 const auto rpc_options1 = RpcOptions().set_metadata(metadata1);
631 const auto rpc_options2 = RpcOptions().set_metadata(metadata2);
632 const auto rpc_options3 = RpcOptions().set_metadata(metadata3);
634 WaitForBackendOptions(), rpc_options);
636 WaitForBackendOptions(), rpc_options1);
638 WaitForBackendOptions(), rpc_options2);
640 WaitForBackendOptions(), rpc_options3);
652 ResetBackendCounters();
659 size_t empty_load_backend_count = 0;
660 size_t double_load_backend_count = 0;
661 size_t regular_load_backend_count = 0;
664 ++empty_load_backend_count;
666 ++double_load_backend_count;
668 ++regular_load_backend_count;
675 EXPECT_EQ(2, regular_load_backend_count);
680 TEST_P(OutlierDetectionTest, FailurePercentageThreshold) {
681 ScopedExperimentalEnvVar
env_var(
682 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
683 CreateAndStartBackends(2);
684 auto cluster = default_cluster_;
685 cluster.set_lb_policy(Cluster::RING_HASH);
686 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
689 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
696 cluster.mutable_outlier_detection()
697 ->mutable_failure_percentage_threshold()
699 cluster.mutable_outlier_detection()
700 ->mutable_enforcing_failure_percentage()
702 cluster.mutable_outlier_detection()
703 ->mutable_failure_percentage_minimum_hosts()
705 cluster.mutable_outlier_detection()
706 ->mutable_failure_percentage_request_volume()
708 balancer_->ads_service()->SetCdsResource(
cluster);
709 auto new_route_config = default_route_config_;
710 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
711 auto* hash_policy =
route->mutable_route()->add_hash_policy();
712 hash_policy->mutable_header()->set_header_name(
"address_hash");
713 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
715 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
716 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
720 std::vector<std::pair<std::string, std::string>>
metadata = {
721 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
722 std::vector<std::pair<std::string, std::string>> metadata1 = {
723 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
724 const auto rpc_options = RpcOptions().set_metadata(
metadata);
725 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
727 WaitForBackendOptions(), rpc_options);
729 WaitForBackendOptions(), rpc_options1);
737 ResetBackendCounters();
750 TEST_P(OutlierDetectionTest, FailurePercentageEnforcementPercentage) {
751 ScopedExperimentalEnvVar
env_var(
752 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
753 CreateAndStartBackends(2);
754 auto cluster = default_cluster_;
755 cluster.set_lb_policy(Cluster::RING_HASH);
756 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
759 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
761 cluster.mutable_outlier_detection()
762 ->mutable_failure_percentage_threshold()
769 cluster.mutable_outlier_detection()
770 ->mutable_enforcing_failure_percentage()
772 cluster.mutable_outlier_detection()
773 ->mutable_failure_percentage_minimum_hosts()
775 cluster.mutable_outlier_detection()
776 ->mutable_failure_percentage_request_volume()
778 balancer_->ads_service()->SetCdsResource(
cluster);
779 auto new_route_config = default_route_config_;
780 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
781 auto* hash_policy =
route->mutable_route()->add_hash_policy();
782 hash_policy->mutable_header()->set_header_name(
"address_hash");
783 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
785 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
786 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
790 std::vector<std::pair<std::string, std::string>>
metadata = {
791 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
792 std::vector<std::pair<std::string, std::string>> metadata1 = {
793 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
794 const auto rpc_options = RpcOptions().set_metadata(
metadata);
795 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
797 WaitForBackendOptions(), rpc_options);
799 WaitForBackendOptions(), rpc_options1);
807 ResetBackendCounters();
819 TEST_P(OutlierDetectionTest, FailurePercentageMinimumHosts) {
820 ScopedExperimentalEnvVar
env_var(
821 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
822 CreateAndStartBackends(2);
823 auto cluster = default_cluster_;
824 cluster.set_lb_policy(Cluster::RING_HASH);
828 auto* duration =
cluster.mutable_outlier_detection()->mutable_interval();
830 cluster.mutable_outlier_detection()
831 ->mutable_failure_percentage_threshold()
833 cluster.mutable_outlier_detection()
834 ->mutable_enforcing_failure_percentage()
841 cluster.mutable_outlier_detection()
842 ->mutable_failure_percentage_minimum_hosts()
844 cluster.mutable_outlier_detection()
845 ->mutable_failure_percentage_request_volume()
847 balancer_->ads_service()->SetCdsResource(
cluster);
848 auto new_route_config = default_route_config_;
849 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
850 auto* hash_policy =
route->mutable_route()->add_hash_policy();
851 hash_policy->mutable_header()->set_header_name(
"address_hash");
852 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
854 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
855 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
859 std::vector<std::pair<std::string, std::string>>
metadata = {
860 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
861 std::vector<std::pair<std::string, std::string>> metadata1 = {
862 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
863 const auto rpc_options = RpcOptions().set_metadata(
metadata);
864 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
866 WaitForBackendOptions(), rpc_options);
868 WaitForBackendOptions(), rpc_options1);
876 ResetBackendCounters();
889 TEST_P(OutlierDetectionTest, FailurePercentageRequestVolume) {
890 ScopedExperimentalEnvVar
env_var(
891 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
892 CreateAndStartBackends(2);
893 auto cluster = default_cluster_;
894 cluster.set_lb_policy(Cluster::RING_HASH);
898 auto* duration =
cluster.mutable_outlier_detection()->mutable_interval();
900 cluster.mutable_outlier_detection()
901 ->mutable_failure_percentage_threshold()
903 cluster.mutable_outlier_detection()
904 ->mutable_enforcing_failure_percentage()
906 cluster.mutable_outlier_detection()
907 ->mutable_failure_percentage_minimum_hosts()
915 cluster.mutable_outlier_detection()
916 ->mutable_failure_percentage_request_volume()
918 balancer_->ads_service()->SetCdsResource(
cluster);
919 auto new_route_config = default_route_config_;
920 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
921 auto* hash_policy =
route->mutable_route()->add_hash_policy();
922 hash_policy->mutable_header()->set_header_name(
"address_hash");
923 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
925 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
926 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
930 std::vector<std::pair<std::string, std::string>>
metadata = {
931 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
932 std::vector<std::pair<std::string, std::string>> metadata1 = {
933 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
934 const auto rpc_options = RpcOptions().set_metadata(
metadata);
935 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
937 WaitForBackendOptions(), rpc_options);
939 WaitForBackendOptions(), rpc_options1);
947 ResetBackendCounters();
961 TEST_P(OutlierDetectionTest, SuccessRateAndFailurePercentage) {
962 ScopedExperimentalEnvVar
env_var(
963 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
964 CreateAndStartBackends(4);
965 auto cluster = default_cluster_;
966 cluster.set_lb_policy(Cluster::RING_HASH);
970 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
972 cluster.mutable_outlier_detection()
973 ->mutable_max_ejection_percent()
977 cluster.mutable_outlier_detection()
978 ->mutable_success_rate_stdev_factor()
980 cluster.mutable_outlier_detection()
981 ->mutable_enforcing_success_rate()
983 cluster.mutable_outlier_detection()
984 ->mutable_success_rate_minimum_hosts()
986 cluster.mutable_outlier_detection()
987 ->mutable_success_rate_request_volume()
989 cluster.mutable_outlier_detection()
990 ->mutable_failure_percentage_threshold()
992 cluster.mutable_outlier_detection()
993 ->mutable_enforcing_failure_percentage()
995 cluster.mutable_outlier_detection()
996 ->mutable_failure_percentage_minimum_hosts()
998 cluster.mutable_outlier_detection()
999 ->mutable_failure_percentage_request_volume()
1001 balancer_->ads_service()->SetCdsResource(
cluster);
1002 auto new_route_config = default_route_config_;
1003 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
1004 auto* hash_policy =
route->mutable_route()->add_hash_policy();
1005 hash_policy->mutable_header()->set_header_name(
"address_hash");
1006 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
1008 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
1009 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
1013 std::vector<std::pair<std::string, std::string>>
metadata = {
1014 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
1015 std::vector<std::pair<std::string, std::string>> metadata1 = {
1016 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
1017 std::vector<std::pair<std::string, std::string>> metadata2 = {
1018 {
"address_hash", CreateMetadataValueThatHashesToBackend(2)}};
1019 std::vector<std::pair<std::string, std::string>> metadata3 = {
1020 {
"address_hash", CreateMetadataValueThatHashesToBackend(3)}};
1021 const auto rpc_options = RpcOptions().set_metadata(
metadata);
1022 const auto rpc_options1 = RpcOptions().set_metadata(metadata1);
1023 const auto rpc_options2 = RpcOptions().set_metadata(metadata2);
1024 const auto rpc_options3 = RpcOptions().set_metadata(metadata3);
1026 WaitForBackendOptions(), rpc_options);
1028 WaitForBackendOptions(), rpc_options1);
1030 WaitForBackendOptions(), rpc_options2);
1032 WaitForBackendOptions(), rpc_options3);
1041 CheckRpcSendFailure(
1043 RpcOptions().set_metadata(
metadata).set_server_expected_error(
1045 CheckRpcSendFailure(
1047 RpcOptions().set_metadata(
metadata).set_server_expected_error(
1049 CheckRpcSendFailure(
1051 RpcOptions().set_metadata(metadata1).set_server_expected_error(
1053 CheckRpcSendFailure(
1055 RpcOptions().set_metadata(metadata2).set_server_expected_error(
1058 ResetBackendCounters();
1063 size_t empty_load_backend_count = 0;
1064 size_t double_load_backend_count = 0;
1067 ++empty_load_backend_count;
1070 ++double_load_backend_count;
1076 EXPECT_EQ(2, double_load_backend_count);
1084 TEST_P(OutlierDetectionTest, SuccessRateAndFailurePercentageBothDisabled) {
1085 ScopedExperimentalEnvVar
env_var(
1086 "GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");
1087 CreateAndStartBackends(2);
1088 auto cluster = default_cluster_;
1089 cluster.set_lb_policy(Cluster::RING_HASH);
1093 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
1095 cluster.mutable_outlier_detection()->mutable_base_ejection_time();
1098 balancer_->ads_service()->SetCdsResource(
cluster);
1099 auto new_route_config = default_route_config_;
1100 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
1101 auto* hash_policy =
route->mutable_route()->add_hash_policy();
1102 hash_policy->mutable_header()->set_header_name(
"address_hash");
1103 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
1105 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
1106 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
1110 std::vector<std::pair<std::string, std::string>>
metadata = {
1111 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
1112 std::vector<std::pair<std::string, std::string>> metadata1 = {
1113 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
1114 const auto rpc_options = RpcOptions().set_metadata(
metadata);
1115 const auto rpc_options1 = RpcOptions().set_metadata(
std::move(metadata1));
1117 WaitForBackendOptions(), rpc_options);
1119 WaitForBackendOptions(), rpc_options1);
1126 ResetBackendCounters();
1137 TEST_P(OutlierDetectionTest,
1138 SuccessRateAndFailurePercentageEjectionPolicyDisabled) {
1139 CreateAndStartBackends(4);
1140 auto cluster = default_cluster_;
1141 cluster.set_lb_policy(Cluster::RING_HASH);
1145 auto* interval =
cluster.mutable_outlier_detection()->mutable_interval();
1147 cluster.mutable_outlier_detection()
1148 ->mutable_max_ejection_percent()
1152 cluster.mutable_outlier_detection()
1153 ->mutable_success_rate_stdev_factor()
1155 cluster.mutable_outlier_detection()
1156 ->mutable_enforcing_success_rate()
1158 cluster.mutable_outlier_detection()
1159 ->mutable_success_rate_minimum_hosts()
1161 cluster.mutable_outlier_detection()
1162 ->mutable_success_rate_request_volume()
1164 cluster.mutable_outlier_detection()
1165 ->mutable_failure_percentage_threshold()
1167 cluster.mutable_outlier_detection()
1168 ->mutable_enforcing_failure_percentage()
1170 cluster.mutable_outlier_detection()
1171 ->mutable_failure_percentage_minimum_hosts()
1173 cluster.mutable_outlier_detection()
1174 ->mutable_failure_percentage_request_volume()
1176 balancer_->ads_service()->SetCdsResource(
cluster);
1177 auto new_route_config = default_route_config_;
1178 auto*
route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0);
1179 auto* hash_policy =
route->mutable_route()->add_hash_policy();
1180 hash_policy->mutable_header()->set_header_name(
"address_hash");
1181 SetListenerAndRouteConfiguration(balancer_.get(), default_listener_,
1183 EdsResourceArgs
args({{
"locality0", CreateEndpointsForBackends()}});
1184 balancer_->ads_service()->SetEdsResource(BuildEdsResource(
args));
1188 std::vector<std::pair<std::string, std::string>>
metadata = {
1189 {
"address_hash", CreateMetadataValueThatHashesToBackend(0)}};
1190 std::vector<std::pair<std::string, std::string>> metadata1 = {
1191 {
"address_hash", CreateMetadataValueThatHashesToBackend(1)}};
1192 std::vector<std::pair<std::string, std::string>> metadata2 = {
1193 {
"address_hash", CreateMetadataValueThatHashesToBackend(2)}};
1194 std::vector<std::pair<std::string, std::string>> metadata3 = {
1195 {
"address_hash", CreateMetadataValueThatHashesToBackend(3)}};
1196 const auto rpc_options = RpcOptions().set_metadata(
metadata);
1197 const auto rpc_options1 = RpcOptions().set_metadata(metadata1);
1198 const auto rpc_options2 = RpcOptions().set_metadata(metadata2);
1199 const auto rpc_options3 = RpcOptions().set_metadata(metadata3);
1201 WaitForBackendOptions(), rpc_options);
1203 WaitForBackendOptions(), rpc_options1);
1205 WaitForBackendOptions(), rpc_options2);
1207 WaitForBackendOptions(), rpc_options3);
1212 CheckRpcSendFailure(
1214 RpcOptions().set_metadata(
metadata).set_server_expected_error(
1216 CheckRpcSendFailure(
1218 RpcOptions().set_metadata(
metadata).set_server_expected_error(
1220 CheckRpcSendFailure(
1222 RpcOptions().set_metadata(metadata1).set_server_expected_error(
1224 CheckRpcSendFailure(
1226 RpcOptions().set_metadata(metadata2).set_server_expected_error(
1229 ResetBackendCounters();
1250 #if TARGET_OS_IPHONE
1258 gpr_setenv(
"GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION",
"true");
1260 gpr_unsetenv(
"GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION");