下面列出了怎么用io.grpc.health.v1.HealthCheckRequest的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void checkValidStatus() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.NOT_SERVING);
manager.setStatus(SERVICE2, ServingStatus.SERVING);
HealthCheckRequest request = HealthCheckRequest.newBuilder().setService(SERVICE1).build();
HealthCheckResponse response =
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
assertThat(response).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.NOT_SERVING).build());
request = HealthCheckRequest.newBuilder().setService(SERVICE2).build();
response = blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
assertThat(response).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVING).build());
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(0);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(0);
}
@Override
public void check(HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
try {
if (healthCheck.check().get().isHealthy()) {
responseObserver.onNext(
HealthCheckResponse.newBuilder().setStatus(HealthCheckResponse.ServingStatus.SERVING).build()
);
} else {
responseObserver.onNext(
HealthCheckResponse.newBuilder().setStatus(HealthCheckResponse.ServingStatus.NOT_SERVING).build()
);
}
} catch (Exception ex) {
GRPC_HELPER.onError(responseObserver, ex);
} finally {
responseObserver.onCompleted();
}
}
@Test
public void healthServing() throws Exception {
// Generate a unique in-process server name.
String serverName = InProcessServerBuilder.generateName();
HealthCheckAggregator hca = mock(HealthCheckAggregator.class);
CompletableFuture<HealthCheckStatus> hcsf = mock(CompletableFuture.class);
HealthCheckStatus hcs = mock(HealthCheckStatus.class);
when(hcs.isHealthy()).thenReturn(true);
when(hcsf.get()).thenReturn(hcs);
when(hca.check()).thenReturn(hcsf);
HealthServiceImpl healthyService = new HealthServiceImpl(hca);
addService(serverName, healthyService);
HealthGrpc.HealthBlockingStub blockingStub = HealthGrpc.newBlockingStub(
// Create a client channel and register for automatic graceful shutdown.
grpcCleanup.register(InProcessChannelBuilder.forName(serverName).directExecutor().build()));
HealthCheckResponse reply = blockingStub.check(HealthCheckRequest.newBuilder().build());
assertEquals(HealthCheckResponse.ServingStatus.SERVING, reply.getStatus());
}
@Test
public void healthNotServing() throws Exception {
// Generate a unique in-process server name.
String serverName = InProcessServerBuilder.generateName();
HealthCheckAggregator hca = mock(HealthCheckAggregator.class);
CompletableFuture<HealthCheckStatus> hcsf = mock(CompletableFuture.class);
HealthCheckStatus hcs = mock(HealthCheckStatus.class);
when(hcs.isHealthy()).thenReturn(false);
when(hcsf.get()).thenReturn(hcs);
when(hca.check()).thenReturn(hcsf);
HealthServiceImpl healthyService = new HealthServiceImpl(hca);
addService(serverName, healthyService);
HealthGrpc.HealthBlockingStub blockingStub = HealthGrpc.newBlockingStub(
// Create a client channel and register for automatic graceful shutdown.
grpcCleanup.register(InProcessChannelBuilder.forName(serverName).directExecutor().build()));
HealthCheckResponse reply = blockingStub.check(HealthCheckRequest.newBuilder().build());
assertEquals(HealthCheckResponse.ServingStatus.NOT_SERVING, reply.getStatus());
}
@Test
public void healthException() throws Exception {
// Generate a unique in-process server name.
String serverName = InProcessServerBuilder.generateName();
HealthCheckAggregator hca = mock(HealthCheckAggregator.class);
CompletableFuture<HealthCheckStatus> hcsf = mock(CompletableFuture.class);
when(hcsf.get()).thenThrow(InterruptedException.class);
when(hca.check()).thenReturn(hcsf);
HealthServiceImpl healthyService = new HealthServiceImpl(hca);
addService(serverName, healthyService);
HealthGrpc.HealthBlockingStub blockingStub = HealthGrpc.newBlockingStub(
// Create a client channel and register for automatic graceful shutdown.
grpcCleanup.register(InProcessChannelBuilder.forName(serverName).directExecutor().build()));
thrown.expect(StatusRuntimeException.class);
thrown.expect(hasProperty("status", is(Status.INTERNAL)));
blockingStub.check(HealthCheckRequest.newBuilder().build());
}
@Override
public void check(
HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
ServingStatus globalStatus;
if (!request.getService().equals("")) {
globalStatus = getStatus("");
if (request.getService().equals("ready")) {
if (globalStatus == ServingStatus.SERVING) {
setStatus("ready", ModelDBHibernateUtil.checkReady());
}
} else if (request.getService().equals("live")) {
setStatus("live", ModelDBHibernateUtil.checkLive());
}
}
ServingStatus status = getStatus(request.getService());
if (status == null) {
responseObserver.onError(
new StatusException(
Status.NOT_FOUND.withDescription("unknown service " + request.getService())));
} else {
HealthCheckResponse response = HealthCheckResponse.newBuilder().setStatus(status).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@Test
public void checkValidStatus() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.NOT_SERVING);
manager.setStatus(SERVICE2, ServingStatus.SERVING);
HealthCheckRequest request = HealthCheckRequest.newBuilder().setService(SERVICE1).build();
HealthCheckResponse response =
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
assertThat(response).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.NOT_SERVING).build());
request = HealthCheckRequest.newBuilder().setService(SERVICE2).build();
response = blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
assertThat(response).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVING).build());
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(0);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(0);
}
public void check() {
HealthCheckRequest request = HealthCheckRequest.newBuilder().setService(GreeterGrpc.SERVICE_NAME).build();
HealthCheckResponse response;
try {
response = blockingStub.check(request);
} catch (Exception e) {
logger.error("RPC failed:", e);
return;
}
logger.info("Greeting response: " + response.getStatus());
}
@Override
public void check(HealthCheckRequest request,
StreamObserver<HealthCheckResponse> responseObserver) {
ServingStatus status = statusMap.get(request.getService());
if (status == null) {
responseObserver.onError(new StatusException(
Status.NOT_FOUND.withDescription("unknown service " + request.getService())));
} else {
HealthCheckResponse response = HealthCheckResponse.newBuilder().setStatus(status).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@Override
public void watch(HealthCheckRequest request,
StreamObserver<HealthCheckResponse> responseObserver) {
final ServerSideCall call = new ServerSideCall(request, responseObserver);
Context.current().addListener(
new CancellationListener() {
@Override
public void cancelled(Context ctx) {
call.cancelled = true;
}
}, MoreExecutors.directExecutor());
calls.add(call);
}
@Test
public void checkStatusNotFound() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.SERVING);
// SERVICE2's status is not set
HealthCheckRequest request
= HealthCheckRequest.newBuilder().setService(SERVICE2).build();
try {
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
fail("Should've failed");
} catch (StatusRuntimeException e) {
assertThat(e.getStatus().getCode()).isEqualTo(Status.Code.NOT_FOUND);
}
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(0);
}
@Test
public void notFoundForClearedStatus() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.SERVING);
manager.clearStatus(SERVICE1);
HealthCheckRequest request
= HealthCheckRequest.newBuilder().setService(SERVICE1).build();
try {
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
fail("Should've failed");
} catch (StatusRuntimeException e) {
assertThat(e.getStatus().getCode()).isEqualTo(Status.Code.NOT_FOUND);
}
}
@Test
public void watchRemovedWhenClientCloses() throws Exception {
CancellableContext withCancellation = Context.current().withCancellation();
Context prevCtx = withCancellation.attach();
RespObserver respObs1 = new RespObserver();
try {
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(0);
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE1).build(), respObs1);
} finally {
withCancellation.detach(prevCtx);
}
RespObserver respObs1b = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE1).build(), respObs1b);
RespObserver respObs2 = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE2).build(), respObs2);
assertThat(respObs1.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(respObs1b.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(respObs2.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(2);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(1);
assertThat(respObs1.responses).isEmpty();
assertThat(respObs1b.responses).isEmpty();
assertThat(respObs2.responses).isEmpty();
// This will cancel the RPC with respObs1
withCancellation.close();
assertThat(respObs1.responses.poll()).isInstanceOf(Throwable.class);
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(1);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(1);
assertThat(respObs1.responses).isEmpty();
assertThat(respObs1b.responses).isEmpty();
assertThat(respObs2.responses).isEmpty();
}
@Override
public Health health() {
HealthGrpc.HealthImplBase healthService = (HealthGrpc.HealthImplBase) healthStatusManager
.getHealthService();
HealthCheckRequest healthcheckRequest = HealthCheckRequest.newBuilder().setService(serviceName).build();
HealthStreamObserver healthStreamObserver = new HealthStreamObserver();
healthService.check(healthcheckRequest, healthStreamObserver);
return healthStreamObserver.getHealth();
}
@Test
public void testHealthCheck() throws ExecutionException, InterruptedException {
final HealthCheckRequest healthCheckRequest = HealthCheckRequest.newBuilder().setService(GreeterGrpc.getServiceDescriptor().getName()).build();
final HealthGrpc.HealthFutureStub healthFutureStub = HealthGrpc.newFutureStub(channel);
final HealthCheckResponse.ServingStatus servingStatus = healthFutureStub.check(healthCheckRequest).get().getStatus();
assertNotNull(servingStatus);
assertEquals(servingStatus, HealthCheckResponse.ServingStatus.SERVING);
}
@Override
public void check(HealthCheckRequest request,
StreamObserver<HealthCheckResponse> responseObserver) {
ServingStatus status = statusMap.get(request.getService());
if (status == null) {
responseObserver.onError(new StatusException(
Status.NOT_FOUND.withDescription("unknown service " + request.getService())));
} else {
HealthCheckResponse response = HealthCheckResponse.newBuilder().setStatus(status).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
@Override
public void watch(HealthCheckRequest request,
StreamObserver<HealthCheckResponse> responseObserver) {
final ServerSideCall call = new ServerSideCall(request, responseObserver);
Context.current().addListener(
new CancellationListener() {
@Override
public void cancelled(Context ctx) {
call.cancelled = true;
}
}, MoreExecutors.directExecutor());
calls.add(call);
}
@Test
public void defaultIsServing() throws Exception {
HealthCheckRequest request =
HealthCheckRequest.newBuilder().setService(HealthStatusManager.SERVICE_NAME_ALL_SERVICES)
.build();
HealthCheckResponse response =
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
assertThat(response).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVING).build());
}
@Test
public void checkStatusNotFound() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.SERVING);
// SERVICE2's status is not set
HealthCheckRequest request
= HealthCheckRequest.newBuilder().setService(SERVICE2).build();
try {
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
fail("Should've failed");
} catch (StatusRuntimeException e) {
assertThat(e.getStatus().getCode()).isEqualTo(Status.Code.NOT_FOUND);
}
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(0);
}
@Test
public void notFoundForClearedStatus() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.SERVING);
manager.clearStatus(SERVICE1);
HealthCheckRequest request
= HealthCheckRequest.newBuilder().setService(SERVICE1).build();
try {
blockingStub.withDeadlineAfter(5, TimeUnit.SECONDS).check(request);
fail("Should've failed");
} catch (StatusRuntimeException e) {
assertThat(e.getStatus().getCode()).isEqualTo(Status.Code.NOT_FOUND);
}
}
@Test
public void watchRemovedWhenClientCloses() throws Exception {
CancellableContext withCancellation = Context.current().withCancellation();
Context prevCtx = withCancellation.attach();
RespObserver respObs1 = new RespObserver();
try {
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(0);
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE1).build(), respObs1);
} finally {
withCancellation.detach(prevCtx);
}
RespObserver respObs1b = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE1).build(), respObs1b);
RespObserver respObs2 = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE2).build(), respObs2);
assertThat(respObs1.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(respObs1b.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(respObs2.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(2);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(1);
assertThat(respObs1.responses).isEmpty();
assertThat(respObs1b.responses).isEmpty();
assertThat(respObs2.responses).isEmpty();
// This will cancel the RPC with respObs1
withCancellation.close();
assertThat(respObs1.responses.poll()).isInstanceOf(Throwable.class);
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(1);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(1);
assertThat(respObs1.responses).isEmpty();
assertThat(respObs1b.responses).isEmpty();
assertThat(respObs2.responses).isEmpty();
}
void start() {
call.start(this, new Metadata());
call.sendMessage(HealthCheckRequest.newBuilder().setService(serviceName).build());
call.halfClose();
call.request(1);
}
private HealthCheckRequest makeRequest(String service) {
return HealthCheckRequest.newBuilder().setService(service).build();
}
@Override
public void check(HealthCheckRequest request,
StreamObserver<HealthCheckResponse> responseObserver) {
responseObserver.onError(new UnsupportedOperationException("Should never be called"));
checkCalled = true;
}
ServerSideCall(
HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
this.request = request;
this.responseObserver = responseObserver;
}
@Test
public void watch() throws Exception {
manager.setStatus(SERVICE1, ServingStatus.UNKNOWN);
// Start a watch on SERVICE1
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(0);
RespObserver respObs1 = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE1).build(), respObs1);
// Will get the current status
assertThat(respObs1.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.UNKNOWN).build());
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(1);
// Status change is notified of to the RPC
manager.setStatus(SERVICE1, ServingStatus.SERVING);
assertThat(respObs1.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVING).build());
// Start another watch on SERVICE1
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(1);
RespObserver respObs1b = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE1).build(), respObs1b);
assertThat(service.numWatchersForTest(SERVICE1)).isEqualTo(2);
// Will get the current status
assertThat(respObs1b.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVING).build());
// Start a watch on SERVICE2, which is not known yet
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(0);
RespObserver respObs2 = new RespObserver();
stub.watch(HealthCheckRequest.newBuilder().setService(SERVICE2).build(), respObs2);
assertThat(service.numWatchersForTest(SERVICE2)).isEqualTo(1);
// Current status is SERVICE_UNKNOWN
assertThat(respObs2.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
// Set status for SERVICE2, which will be notified of
manager.setStatus(SERVICE2, ServingStatus.NOT_SERVING);
assertThat(respObs2.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.NOT_SERVING).build());
// Clear the status for SERVICE1, which will be notified of
manager.clearStatus(SERVICE1);
assertThat(respObs1.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
assertThat(respObs1b.responses.poll()).isEqualTo(
HealthCheckResponse.newBuilder().setStatus(ServingStatus.SERVICE_UNKNOWN).build());
// All responses have been accounted for
assertThat(respObs1.responses).isEmpty();
assertThat(respObs1b.responses).isEmpty();
assertThat(respObs2.responses).isEmpty();
}
@Override
public void check(HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
HealthCheckResponse response = HealthCheckResponse.newBuilder().setStatus(servingStatus).build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
@Override
public void check(HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
log.debug("Health check endpoint called");
performHealthCheck(responseObserver);
}
@Override
public void watch(HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
log.debug("Streaming heath endpoint called");
performHealthCheck(responseObserver);
}
@Override
public void check(HealthCheckRequest request, StreamObserver<HealthCheckResponse> responseObserver) {
responseObserver.onNext(HealthCheckResponse.newBuilder().setStatus(HealthCheckResponse.ServingStatus.SERVING).build());
responseObserver.onCompleted();
}