Skip to content

Commit

Permalink
Fix #4531
Browse files Browse the repository at this point in the history
As stated in the issue, the request scope must also be activated.
  • Loading branch information
cescoffier committed Oct 14, 2019
1 parent 4223d45 commit 63bd63d
Show file tree
Hide file tree
Showing 6 changed files with 155 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import io.quarkus.smallrye.health.runtime.SmallRyeLivenessHandler;
import io.quarkus.smallrye.health.runtime.SmallRyeReadinessHandler;
import io.quarkus.vertx.http.deployment.RouteBuildItem;
import io.quarkus.vertx.http.runtime.HandlerType;
import io.smallrye.health.SmallRyeHealthReporter;

class SmallRyeHealthProcessor {
Expand Down Expand Up @@ -91,11 +92,13 @@ void build(SmallRyeHealthRecorder recorder, RecorderContext recorderContext,
feature.produce(new FeatureBuildItem(FeatureBuildItem.SMALLRYE_HEALTH));

// Register the health handler
routes.produce(new RouteBuildItem(health.rootPath, new SmallRyeHealthHandler()));
routes.produce(new RouteBuildItem(health.rootPath, new SmallRyeHealthHandler(), HandlerType.BLOCKING));
routes.produce(
new RouteBuildItem(health.rootPath + health.livenessPath, new SmallRyeLivenessHandler()));
new RouteBuildItem(health.rootPath + health.livenessPath, new SmallRyeLivenessHandler(),
HandlerType.BLOCKING));
routes.produce(
new RouteBuildItem(health.rootPath + health.readinessPath, new SmallRyeReadinessHandler()));
new RouteBuildItem(health.rootPath + health.readinessPath, new SmallRyeReadinessHandler(),
HandlerType.BLOCKING));

// Make ArC discover the beans marked with the @Health qualifier
beanDefiningAnnotation.produce(new BeanDefiningAnnotationBuildItem(HEALTH));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package io.quarkus.smallrye.health.test;

import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.stringContainsInOrder;

import javax.enterprise.context.ApplicationScoped;

import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.Liveness;
import org.eclipse.microprofile.health.Readiness;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class DispatchedThreadTest {

@RegisterExtension
static final QuarkusUnitTest config = new QuarkusUnitTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(LivenessHealthCheckCapturingThread.class, ReadinessHealthCheckCapturingThread.class)
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));

@Test
public void check() {
RestAssured.when().get("/health/live").then()
.body("status", is("UP"),
"checks.status", contains("UP"),
"checks.name", contains("my-liveness-check"),
"checks.data.thread[0]", stringContainsInOrder("worker"),
"checks.data.thread[0]", not(stringContainsInOrder("loop")));

RestAssured.when().get("/health/ready").then()
.body("status", is("UP"),
"checks.status", contains("UP"),
"checks.name", contains("my-readiness-check"),
"checks.data.thread[0]", stringContainsInOrder("worker"),
"checks.data.thread[0]", not(stringContainsInOrder("loop")));
}

@ApplicationScoped
@Liveness
public static class LivenessHealthCheckCapturingThread implements HealthCheck {
@Override
public HealthCheckResponse call() {
return HealthCheckResponse.named("my-liveness-check")
.up()
.withData("thread", Thread.currentThread().getName()).build();
}
}

@ApplicationScoped
@Readiness
public static class ReadinessHealthCheckCapturingThread implements HealthCheck {
@Override
public HealthCheckResponse call() {
return HealthCheckResponse.named("my-readiness-check")
.up()
.withData("thread", Thread.currentThread().getName()).build();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package io.quarkus.smallrye.health.runtime;

public class RequestScopeHelper {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import java.io.ByteArrayOutputStream;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.spi.CDI;

import io.quarkus.arc.Arc;
import io.quarkus.arc.InjectableContext;
import io.smallrye.health.SmallRyeHealth;
import io.smallrye.health.SmallRyeHealthReporter;
import io.vertx.core.Handler;
Expand All @@ -17,17 +20,29 @@ public class SmallRyeHealthHandler implements Handler<RoutingContext> {

@Override
public void handle(RoutingContext event) {

SmallRyeHealthReporter reporter = CDI.current().select(SmallRyeHealthReporter.class).get();
SmallRyeHealth health = reporter.getHealth();
HttpServerResponse resp = event.response();
if (health.isDown()) {
resp.setStatusCode(503);
boolean activated = false;
InjectableContext context = Arc.container().getActiveContext(RequestScoped.class);
if (context == null || !context.isActive()) {
Arc.container().requestContext().activate();
activated = true;
}
resp.headers().set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

reporter.reportHealth(outputStream, health);
resp.end(Buffer.buffer(outputStream.toByteArray()));
try {
SmallRyeHealthReporter reporter = CDI.current().select(SmallRyeHealthReporter.class).get();
SmallRyeHealth health = reporter.getHealth();
HttpServerResponse resp = event.response();
if (health.isDown()) {
resp.setStatusCode(503);
}
resp.headers().set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

reporter.reportHealth(outputStream, health);
resp.end(Buffer.buffer(outputStream.toByteArray()));
} finally {
if (activated) {
Arc.container().requestContext().terminate();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@

import java.io.ByteArrayOutputStream;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.spi.CDI;

import io.quarkus.arc.Arc;
import io.quarkus.arc.InjectableContext;
import io.smallrye.health.SmallRyeHealth;
import io.smallrye.health.SmallRyeHealthReporter;
import io.vertx.core.Handler;
Expand All @@ -33,17 +36,29 @@ public class SmallRyeLivenessHandler implements Handler<RoutingContext> {

@Override
public void handle(RoutingContext event) {

SmallRyeHealthReporter reporter = CDI.current().select(SmallRyeHealthReporter.class).get();
SmallRyeHealth health = reporter.getLiveness();
HttpServerResponse resp = event.response();
if (health.isDown()) {
resp.setStatusCode(503);
boolean activated = false;
InjectableContext context = Arc.container().getActiveContext(RequestScoped.class);
if (context == null || !context.isActive()) {
Arc.container().requestContext().activate();
activated = true;
}
resp.headers().set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

reporter.reportHealth(outputStream, health);
resp.end(Buffer.buffer(outputStream.toByteArray()));
try {
SmallRyeHealthReporter reporter = CDI.current().select(SmallRyeHealthReporter.class).get();
SmallRyeHealth health = reporter.getLiveness();
HttpServerResponse resp = event.response();
if (health.isDown()) {
resp.setStatusCode(503);
}
resp.headers().set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

reporter.reportHealth(outputStream, health);
resp.end(Buffer.buffer(outputStream.toByteArray()));
} finally {
if (activated) {
Arc.container().requestContext().terminate();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@

import java.io.ByteArrayOutputStream;

import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.spi.CDI;

import io.quarkus.arc.Arc;
import io.quarkus.arc.InjectableContext;
import io.smallrye.health.SmallRyeHealth;
import io.smallrye.health.SmallRyeHealthReporter;
import io.vertx.core.Handler;
Expand All @@ -32,17 +35,29 @@ public class SmallRyeReadinessHandler implements Handler<RoutingContext> {

@Override
public void handle(RoutingContext event) {

SmallRyeHealthReporter reporter = CDI.current().select(SmallRyeHealthReporter.class).get();
SmallRyeHealth health = reporter.getReadiness();
HttpServerResponse resp = event.response();
if (health.isDown()) {
resp.setStatusCode(503);
boolean activated = false;
InjectableContext context = Arc.container().getActiveContext(RequestScoped.class);
if (context == null || !context.isActive()) {
Arc.container().requestContext().activate();
activated = true;
}
resp.headers().set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

reporter.reportHealth(outputStream, health);
resp.end(Buffer.buffer(outputStream.toByteArray()));
try {
SmallRyeHealthReporter reporter = CDI.current().select(SmallRyeHealthReporter.class).get();
SmallRyeHealth health = reporter.getReadiness();
HttpServerResponse resp = event.response();
if (health.isDown()) {
resp.setStatusCode(503);
}
resp.headers().set(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

reporter.reportHealth(outputStream, health);
resp.end(Buffer.buffer(outputStream.toByteArray()));
} finally {
if (activated) {
Arc.container().requestContext().terminate();
}
}
}
}

0 comments on commit 63bd63d

Please sign in to comment.