Skip to content

Commit

Permalink
gRPC Dev UI - init service health statuses after hotdeploy
Browse files Browse the repository at this point in the history
- plus minor cleanup
- resolves quarkusio#17453
  • Loading branch information
mkouba committed May 27, 2021
1 parent 3ff1975 commit 18cd541
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@

@ApplicationScoped
public class GrpcClientInterceptorContainer {
// Cannot be empty, as we have the IO Thread client interceptor
@Any

@Inject
@Any
Instance<ClientInterceptor> interceptors;

public List<ClientInterceptor> getSortedInterceptors() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
import java.util.stream.Collectors;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.Prioritized;
import javax.inject.Inject;

import io.grpc.BindableService;
import io.grpc.ServerInterceptor;
import io.quarkus.grpc.GrpcService;
import io.quarkus.grpc.runtime.health.GrpcHealthStorage;

@ApplicationScoped
public class GrpcContainer {
Expand All @@ -23,11 +23,9 @@ public class GrpcContainer {
Instance<BindableService> services;

@Inject
@Any
Instance<ServerInterceptor> interceptors;

@Inject
Instance<GrpcHealthStorage> healthStorage;

List<ServerInterceptor> getSortedInterceptors() {
if (interceptors.isUnsatisfied()) {
return Collections.emptyList();
Expand All @@ -52,10 +50,6 @@ public int compare(ServerInterceptor si1, ServerInterceptor si2) {
}).collect(Collectors.toList());
}

public Instance<GrpcHealthStorage> getHealthStorage() {
return healthStorage;
}

public Instance<BindableService> getServices() {
return services;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ public void handle(AsyncResult<String> result) {
if (result.failed()) {
startResult.completeExceptionally(result.cause());
} else {
GrpcServerRecorder.this.postStartup(grpcContainer, configuration, launchMode == LaunchMode.TEST);
GrpcServerRecorder.this.postStartup(configuration, launchMode == LaunchMode.TEST);

startResult.complete(null);
}
Expand All @@ -142,27 +142,22 @@ public void handle(AsyncResult<String> result) {
}
}

private void postStartup(GrpcContainer grpcContainer, GrpcServerConfiguration configuration, boolean test) {
grpcContainer.getHealthStorage().stream().forEach(new Consumer<GrpcHealthStorage>() { //NOSONAR
@Override
public void accept(GrpcHealthStorage storage) {
storage.setStatus(GrpcHealthStorage.DEFAULT_SERVICE_NAME,
HealthOuterClass.HealthCheckResponse.ServingStatus.SERVING);
grpcContainer.getServices().forEach(
new Consumer<BindableService>() { // NOSONAR
@Override
public void accept(BindableService service) {
ServerServiceDefinition definition = service.bindService();
storage.setStatus(definition.getServiceDescriptor().getName(),
HealthOuterClass.HealthCheckResponse.ServingStatus.SERVING);
}
});
}
});
private void postStartup(GrpcServerConfiguration configuration, boolean test) {
initHealthStorage();
LOGGER.infof("gRPC Server started on %s:%d [SSL enabled: %s]",
configuration.host, test ? configuration.testPort : configuration.port, !configuration.plainText);
}

private void initHealthStorage() {
GrpcHealthStorage storage = Arc.container().instance(GrpcHealthStorage.class).get();
storage.setStatus(GrpcHealthStorage.DEFAULT_SERVICE_NAME,
HealthOuterClass.HealthCheckResponse.ServingStatus.SERVING);
for (GrpcServiceDefinition service : services) {
storage.setStatus(service.definition.getServiceDescriptor().getName(),
HealthOuterClass.HealthCheckResponse.ServingStatus.SERVING);
}
}

private void devModeStart(GrpcContainer grpcContainer, Vertx vertx, GrpcServerConfiguration configuration,
ShutdownContext shutdown, LaunchMode launchMode) {
CompletableFuture<Boolean> future = new CompletableFuture<>();
Expand All @@ -177,7 +172,7 @@ public void handle(AsyncResult<Void> ar) {
LOGGER.error("Unable to start the gRPC server", ar.cause());
future.completeExceptionally(ar.cause());
} else {
postStartup(grpcContainer, configuration, false);
postStartup(configuration, false);
future.complete(true);
grpcVerticleCount.incrementAndGet();
}
Expand Down Expand Up @@ -301,6 +296,8 @@ private void devModeReload(GrpcContainer grpcContainer, Vertx vertx, GrpcServerC
}
devModeWrapper = new DevModeWrapper(Thread.currentThread().getContextClassLoader());

initHealthStorage();

GrpcServerReloader.reinitialize(servicesWithInterceptors, methods, grpcContainer.getSortedInterceptors());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,13 @@ public class GrpcServices extends AbstractMap<String, ServiceDefinitionAndStatus
GrpcHealthStorage healthStorage;

public List<ServiceDefinitionAndStatus> getInfos() {
List<ServiceDefinitionAndStatus> services = new ArrayList<>(GrpcServerRecorder.getServices().size());
for (GrpcServiceDefinition definition : GrpcServerRecorder.getServices()) {
services.add(new ServiceDefinitionAndStatus(definition, healthStorage.getStatuses()
.getOrDefault(definition.definition.getServiceDescriptor().getName(), ServingStatus.UNKNOWN)));
List<GrpcServiceDefinition> services = GrpcServerRecorder.getServices();
List<ServiceDefinitionAndStatus> infos = new ArrayList<>(services.size());
for (GrpcServiceDefinition service : services) {
infos.add(new ServiceDefinitionAndStatus(service, healthStorage.getStatuses()
.getOrDefault(service.definition.getServiceDescriptor().getName(), ServingStatus.UNKNOWN)));
}
return services;
return infos;
}

@Override
Expand Down

0 comments on commit 18cd541

Please sign in to comment.