diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java index fa027e10fc6..e9559de0e96 100644 --- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java +++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java @@ -50,6 +50,10 @@ public class IsolationServerEvent extends AlarmEvent { private final long singleTestTime; + private int instancesTotalNum; + + private int isolationInstancesNum; + public IsolationServerEvent(Invocation invocation, MicroserviceInstance instance, ServiceCombServerStats serverStats, IsolationServerListFilterExt.Settings settings, Type type, Endpoint endpoint) { @@ -110,4 +114,20 @@ public int getMinIsolationTime() { public Endpoint getEndpoint() { return endpoint; } + + public int getInstancesTotalNum() { + return instancesTotalNum; + } + + public void setInstancesTotalNum(int instancesTotalNum) { + this.instancesTotalNum = instancesTotalNum; + } + + public int getIsolationInstancesNum() { + return isolationInstancesNum; + } + + public void setIsolationInstancesNum(int isolationInstancesNum) { + this.isolationInstancesNum = isolationInstancesNum; + } } diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filterext/IsolationServerListFilterExt.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filterext/IsolationServerListFilterExt.java index 78985aa2ee3..dab5e0b54b7 100644 --- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filterext/IsolationServerListFilterExt.java +++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filterext/IsolationServerListFilterExt.java @@ -88,11 +88,19 @@ public List getFilteredListOfServers(List List filteredServers = new ArrayList<>(); Settings settings = createSettings(invocation); + + // record instance isolation event + List isolationEvents = new ArrayList<>(); servers.forEach((server) -> { - if (allowVisit(invocation, server, settings)) { + if (allowVisit(invocation, server, settings, isolationEvents)) { filteredServers.add(server); } }); + isolationEvents.forEach((event) -> { + event.setInstancesTotalNum(servers.size()); + event.setIsolationInstancesNum(servers.size() - filteredServers.size()); + eventBus.post(event); + }); if (filteredServers.isEmpty() && emptyProtection.get()) { LOGGER.warn("All servers have been isolated, allow one of them based on load balance rule."); return servers; @@ -114,7 +122,8 @@ private Settings createSettings(Invocation invocation) { return settings; } - private boolean allowVisit(Invocation invocation, ServiceCombServer server, Settings settings) { + private boolean allowVisit(Invocation invocation, ServiceCombServer server, Settings settings, + List isolationEvents) { ServiceCombServerStats serverStats = ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(server); if (!checkThresholdAllowed(settings, serverStats)) { if (serverStats.isIsolated() @@ -124,11 +133,9 @@ private boolean allowVisit(Invocation invocation, ServiceCombServer server, Sett if (!serverStats.isIsolated()) { // checkThresholdAllowed is not concurrent control, may print several logs/events in current access. serverStats.markIsolated(true); - eventBus.post( - new IsolationServerEvent(invocation, server.getInstance(), serverStats, - settings, Type.OPEN, server.getEndpoint())); - LOGGER.warn("Isolate service {}'s instance {}.", - invocation.getMicroserviceName(), + isolationEvents.add(new IsolationServerEvent(invocation, server.getInstance(), serverStats, settings, + Type.OPEN, server.getEndpoint())); + LOGGER.warn("Isolate service {}'s instance {}.", invocation.getMicroserviceName(), server.getInstance().getInstanceId()); } return false; @@ -140,10 +147,9 @@ private boolean allowVisit(Invocation invocation, ServiceCombServer server, Sett return false; } serverStats.markIsolated(false); - eventBus.post(new IsolationServerEvent(invocation, server.getInstance(), serverStats, - settings, Type.CLOSE, server.getEndpoint())); - LOGGER.warn("Recover service {}'s instance {} from isolation.", - invocation.getMicroserviceName(), + isolationEvents.add(new IsolationServerEvent(invocation, server.getInstance(), serverStats, settings, + Type.CLOSE, server.getEndpoint())); + LOGGER.warn("Recover service {}'s instance {} from isolation.", invocation.getMicroserviceName(), server.getInstance().getInstanceId()); } return true; diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java index f83d0b86ba7..a422efe1252 100644 --- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java +++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java @@ -474,6 +474,9 @@ public void testZoneAwareAndIsolationFilterWorksEmptyInstanceProtectionEnabled() Assertions.assertEquals("rest://localhost:9090", server.getEndpoint().getEndpoint()); ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2); ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2); + ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2); + ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2); + ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2); loadBalancer = handler.getOrCreateLoadBalancer(invocation); server = loadBalancer.chooseServer(invocation); Assertions.assertEquals("rest://localhost:9091", server.getEndpoint().getEndpoint());