Skip to content

Commit ed855b8

Browse files
authored
[#4936] isolation event add instance total and isolation num (#4937)
1 parent 50c3c10 commit ed855b8

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ public class IsolationServerEvent extends AlarmEvent {
5050

5151
private final long singleTestTime;
5252

53+
private int instancesTotalNum;
54+
55+
private int isolationInstancesNum;
56+
5357
public IsolationServerEvent(Invocation invocation, MicroserviceInstance instance,
5458
ServiceCombServerStats serverStats,
5559
IsolationServerListFilterExt.Settings settings, Type type, Endpoint endpoint) {
@@ -110,4 +114,20 @@ public int getMinIsolationTime() {
110114
public Endpoint getEndpoint() {
111115
return endpoint;
112116
}
117+
118+
public int getInstancesTotalNum() {
119+
return instancesTotalNum;
120+
}
121+
122+
public void setInstancesTotalNum(int instancesTotalNum) {
123+
this.instancesTotalNum = instancesTotalNum;
124+
}
125+
126+
public int getIsolationInstancesNum() {
127+
return isolationInstancesNum;
128+
}
129+
130+
public void setIsolationInstancesNum(int isolationInstancesNum) {
131+
this.isolationInstancesNum = isolationInstancesNum;
132+
}
113133
}

handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filterext/IsolationServerListFilterExt.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,19 @@ public List<ServiceCombServer> getFilteredListOfServers(List<ServiceCombServer>
8888

8989
List<ServiceCombServer> filteredServers = new ArrayList<>();
9090
Settings settings = createSettings(invocation);
91+
92+
// record instance isolation event
93+
List<IsolationServerEvent> isolationEvents = new ArrayList<>();
9194
servers.forEach((server) -> {
92-
if (allowVisit(invocation, server, settings)) {
95+
if (allowVisit(invocation, server, settings, isolationEvents)) {
9396
filteredServers.add(server);
9497
}
9598
});
99+
isolationEvents.forEach((event) -> {
100+
event.setInstancesTotalNum(servers.size());
101+
event.setIsolationInstancesNum(servers.size() - filteredServers.size());
102+
eventBus.post(event);
103+
});
96104
if (filteredServers.isEmpty() && emptyProtection.get()) {
97105
LOGGER.warn("All servers have been isolated, allow one of them based on load balance rule.");
98106
return servers;
@@ -114,7 +122,8 @@ private Settings createSettings(Invocation invocation) {
114122
return settings;
115123
}
116124

117-
private boolean allowVisit(Invocation invocation, ServiceCombServer server, Settings settings) {
125+
private boolean allowVisit(Invocation invocation, ServiceCombServer server, Settings settings,
126+
List<IsolationServerEvent> isolationEvents) {
118127
ServiceCombServerStats serverStats = ServiceCombLoadBalancerStats.INSTANCE.getServiceCombServerStats(server);
119128
if (!checkThresholdAllowed(settings, serverStats)) {
120129
if (serverStats.isIsolated()
@@ -124,11 +133,9 @@ private boolean allowVisit(Invocation invocation, ServiceCombServer server, Sett
124133
if (!serverStats.isIsolated()) {
125134
// checkThresholdAllowed is not concurrent control, may print several logs/events in current access.
126135
serverStats.markIsolated(true);
127-
eventBus.post(
128-
new IsolationServerEvent(invocation, server.getInstance(), serverStats,
129-
settings, Type.OPEN, server.getEndpoint()));
130-
LOGGER.warn("Isolate service {}'s instance {}.",
131-
invocation.getMicroserviceName(),
136+
isolationEvents.add(new IsolationServerEvent(invocation, server.getInstance(), serverStats, settings,
137+
Type.OPEN, server.getEndpoint()));
138+
LOGGER.warn("Isolate service {}'s instance {}.", invocation.getMicroserviceName(),
132139
server.getInstance().getInstanceId());
133140
}
134141
return false;
@@ -140,10 +147,9 @@ private boolean allowVisit(Invocation invocation, ServiceCombServer server, Sett
140147
return false;
141148
}
142149
serverStats.markIsolated(false);
143-
eventBus.post(new IsolationServerEvent(invocation, server.getInstance(), serverStats,
144-
settings, Type.CLOSE, server.getEndpoint()));
145-
LOGGER.warn("Recover service {}'s instance {} from isolation.",
146-
invocation.getMicroserviceName(),
150+
isolationEvents.add(new IsolationServerEvent(invocation, server.getInstance(), serverStats, settings,
151+
Type.CLOSE, server.getEndpoint()));
152+
LOGGER.warn("Recover service {}'s instance {} from isolation.", invocation.getMicroserviceName(),
147153
server.getInstance().getInstanceId());
148154
}
149155
return true;

handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,9 @@ public void testZoneAwareAndIsolationFilterWorksEmptyInstanceProtectionEnabled()
474474
Assertions.assertEquals("rest://localhost:9090", server.getEndpoint().getEndpoint());
475475
ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2);
476476
ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2);
477+
ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2);
478+
ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2);
479+
ServiceCombLoadBalancerStats.INSTANCE.markFailure(server2);
477480
loadBalancer = handler.getOrCreateLoadBalancer(invocation);
478481
server = loadBalancer.chooseServer(invocation);
479482
Assertions.assertEquals("rest://localhost:9091", server.getEndpoint().getEndpoint());

0 commit comments

Comments
 (0)