Skip to content

Commit d9f375a

Browse files
loadbalancer-experimental: include reason DefaultHost is unhealthy (#3143)
Motivation: We store the reason that a host enters the unhealthy/healthchecking state but we never use it. Modifications: - Include that info when we're creating the DefaultHost.toString(). - Add a useful .toString() for XdsHealthIndicator
1 parent ad2bbbb commit d9f375a

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

servicetalk-loadbalancer-experimental/src/main/java/io/servicetalk/loadbalancer/DefaultHost.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -456,10 +456,13 @@ public int score() {
456456
@Override
457457
public String toString() {
458458
final ConnState connState = this.connState;
459-
return "Host{" +
459+
String stateString = connState.isUnhealthy() ? State.UNHEALTHY + "(" + connState.healthCheck + ")" :
460+
connState.state.toString();
461+
return "DefaultHost{" +
460462
"lbDescription=" + lbDescription +
461463
", address=" + address +
462-
", state=" + connState.state +
464+
", state=" + stateString +
465+
", healthIndicator=" + healthIndicator +
463466
", #connections=" + connState.connections.size() +
464467
'}';
465468
}
@@ -514,7 +517,7 @@ public void schedule(final Throwable originalCause) {
514517

515518
@Override
516519
public String toString() {
517-
return "UNHEALTHY(" + lastError + ')';
520+
return "HealthCheck(" + lastError + ')';
518521
}
519522
}
520523

servicetalk-loadbalancer-experimental/src/main/java/io/servicetalk/loadbalancer/XdsHealthIndicator.java

+10
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,16 @@ public final void cancel() {
257257
sequentialExecutor.execute(this::sequentialCancel);
258258
}
259259

260+
@Override
261+
public String toString() {
262+
return "XdsHealthIndicator{" +
263+
", consecutive5xx=" + consecutive5xx.get() +
264+
", successes=" + successes.get() +
265+
", failures=" + failures.get() +
266+
", evictedUntilNanos=" + evictedUntilNanos +
267+
'}';
268+
}
269+
260270
void sequentialCancel() {
261271
assert sequentialExecutor.isCurrentThreadDraining();
262272
if (cancelled) {

servicetalk-loadbalancer-experimental/src/test/java/io/servicetalk/loadbalancer/DefaultHostTest.java

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import static io.servicetalk.loadbalancer.HealthCheckConfig.DEFAULT_HEALTH_CHECK_FAILED_CONNECTIONS_THRESHOLD;
3636
import static io.servicetalk.loadbalancer.UnhealthyHostConnectionFactory.UNHEALTHY_HOST_EXCEPTION;
3737
import static org.hamcrest.MatcherAssert.assertThat;
38+
import static org.hamcrest.Matchers.containsString;
3839
import static org.hamcrest.Matchers.is;
3940
import static org.junit.jupiter.api.Assertions.assertEquals;
4041
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -182,6 +183,9 @@ void hostStatus() throws Exception {
182183
assertThrows(ExecutionException.class,
183184
() -> host.newConnection(any(), false, null).toFuture().get());
184185
}
186+
assertThat(host.toString(), containsString("UNHEALTHY"));
187+
assertThat(host.toString(), containsString("DeliberateException"));
188+
185189
verify(mockHostObserver, times(1)).onHostMarkedUnhealthy(UNHEALTHY_HOST_EXCEPTION);
186190
assertThat(host.isHealthy(), is(false));
187191
assertThat(host.canMakeNewConnections(), is(true));

0 commit comments

Comments
 (0)