From d4d224e59c73490059cf2ec1a6d439402e1fefac Mon Sep 17 00:00:00 2001 From: Juan C Galvis <8420868+juancgalvis@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:39:14 -0500 Subject: [PATCH 1/2] fix(health): ignore health indicator when dependency not exists --- .../async/starter/broker/BrokerProvider.java | 4 +- .../async/starter/config/health/RCHealth.java | 46 +++++++++++++++++++ .../config/health/RCHealthIndicator.java | 12 +++++ .../health/ReactiveCommonsHealthConfig.java | 2 +- .../ReactiveCommonsHealthIndicator.java | 9 ++-- .../ReactiveCommonsHealthIndicatorTest.java | 8 ++-- .../starter/mybroker/MyBrokerProvider.java | 4 +- .../async/kafka/KafkaBrokerProvider.java | 4 +- .../health/KafkaReactiveHealthIndicator.java | 8 ++-- .../async/kafka/KafkaBrokerProviderTest.java | 8 ++-- .../async/rabbit/RabbitMQBrokerProvider.java | 4 +- .../health/RabbitReactiveHealthIndicator.java | 8 ++-- .../rabbit/RabbitMQBrokerProviderTest.java | 8 ++-- .../RabbitReactiveHealthIndicatorTest.java | 16 +++---- 14 files changed, 98 insertions(+), 43 deletions(-) create mode 100644 starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealth.java create mode 100644 starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java diff --git a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/broker/BrokerProvider.java b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/broker/BrokerProvider.java index 88d438d4..539f7330 100644 --- a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/broker/BrokerProvider.java +++ b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/broker/BrokerProvider.java @@ -3,8 +3,8 @@ import org.reactivecommons.api.domain.DomainEventBus; import org.reactivecommons.async.api.DirectAsyncGateway; import org.reactivecommons.async.commons.HandlerResolver; +import org.reactivecommons.async.starter.config.health.RCHealth; import org.reactivecommons.async.starter.props.GenericAsyncProps; -import org.springframework.boot.actuate.health.Health; import reactor.core.publisher.Mono; @SuppressWarnings("rawtypes") @@ -25,5 +25,5 @@ public interface BrokerProvider { void listenReplies(HandlerResolver resolver); - Mono healthCheck(); + Mono healthCheck(); } diff --git a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealth.java b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealth.java new file mode 100644 index 00000000..13972fc8 --- /dev/null +++ b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealth.java @@ -0,0 +1,46 @@ +package org.reactivecommons.async.starter.config.health; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@Builder +@AllArgsConstructor +public class RCHealth { + private final Status status; + private final Map details; + + public enum Status { + UP, + DOWN + } + + public static class RCHealthBuilder { + public RCHealthBuilder() { + this.details = new HashMap<>(); + } + + public RCHealthBuilder up() { + this.status = Status.UP; + return this; + } + + public RCHealthBuilder down() { + this.status = Status.DOWN; + return this; + } + + public RCHealthBuilder withDetail(String key, Object value) { + this.details.put(key, value); + return this; + } + + public RCHealth build() { + return new RCHealth(this.status, this.details); + } + } +} diff --git a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java new file mode 100644 index 00000000..6c0456b0 --- /dev/null +++ b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java @@ -0,0 +1,12 @@ +package org.reactivecommons.async.starter.config.health; + +import reactor.core.publisher.Mono; + +public abstract class RCHealthIndicator { + + public Mono health() { + return doHealthCheck(RCHealth.builder()); + } + + public abstract Mono doHealthCheck(RCHealth.RCHealthBuilder builder); +} diff --git a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthConfig.java b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthConfig.java index dd08bc0f..c649942d 100644 --- a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthConfig.java +++ b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthConfig.java @@ -8,12 +8,12 @@ import org.springframework.context.annotation.Configuration; @Configuration +@ConditionalOnClass(AbstractReactiveHealthIndicator.class) public class ReactiveCommonsHealthConfig { @Bean @ConditionalOnProperty(prefix = "management.health.reactive-commons", name = "enabled", havingValue = "true", matchIfMissing = true) - @ConditionalOnClass(AbstractReactiveHealthIndicator.class) public ReactiveCommonsHealthIndicator reactiveCommonsHealthIndicator(ConnectionManager manager) { return new ReactiveCommonsHealthIndicator(manager); } diff --git a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicator.java b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicator.java index 624f651b..6b316cc3 100644 --- a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicator.java +++ b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicator.java @@ -2,11 +2,10 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; -import org.reactivecommons.async.starter.config.ConnectionManager; import org.reactivecommons.async.starter.broker.BrokerProvider; +import org.reactivecommons.async.starter.config.ConnectionManager; import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator; import org.springframework.boot.actuate.health.Health; -import org.springframework.boot.actuate.health.Status; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -22,14 +21,14 @@ public class ReactiveCommonsHealthIndicator extends AbstractReactiveHealthIndica protected Mono doHealthCheck(Health.Builder builder) { return Flux.fromIterable(manager.getProviders().values()) .flatMap(BrokerProvider::healthCheck) - .reduceWith(Health::up, (health, status) -> reduceHealth((Health.Builder) health, (Health) status)) + .reduceWith(Health::up, (health, status) -> reduceHealth((Health.Builder) health, (RCHealth) status)) .map(b -> ((Health.Builder) b).build()); } - private Health.Builder reduceHealth(Health.Builder builder, Health status) { + private Health.Builder reduceHealth(Health.Builder builder, RCHealth status) { String domain = status.getDetails().get(DOMAIN).toString(); - if (status.getStatus().equals(Status.DOWN)) { + if (status.getStatus().equals(RCHealth.Status.DOWN)) { log.error("Broker of domain {} is down", domain); return builder.down().withDetail(domain, status.getDetails()); } diff --git a/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java b/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java index d2c9b014..534481ed 100644 --- a/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java +++ b/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java @@ -37,11 +37,11 @@ void setUp() { @Test void shouldBeUp() { // Arrange - when(brokerProvider.healthCheck()).thenReturn(Mono.just(Health.up() + when(brokerProvider.healthCheck()).thenReturn(Mono.just(RCHealth.builder() .withDetail(DOMAIN, DEFAULT_DOMAIN) .withDetail(VERSION, "123") .build())); - when(brokerProvider2.healthCheck()).thenReturn(Mono.just(Health.up() + when(brokerProvider2.healthCheck()).thenReturn(Mono.just(RCHealth.builder() .withDetail(DOMAIN, OTHER) .withDetail(VERSION, "1234") .build())); @@ -56,11 +56,11 @@ void shouldBeUp() { @Test void shouldBeDown() { // Arrange - when(brokerProvider.healthCheck()).thenReturn(Mono.just(Health.up() + when(brokerProvider.healthCheck()).thenReturn(Mono.just(RCHealth.builder() .withDetail(DOMAIN, DEFAULT_DOMAIN) .withDetail(VERSION, "123") .build())); - when(brokerProvider2.healthCheck()).thenReturn(Mono.just(Health.down() + when(brokerProvider2.healthCheck()).thenReturn(Mono.just(RCHealth.builder() .withDetail(DOMAIN, OTHER) .withDetail(VERSION, "1234") .build())); diff --git a/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/mybroker/MyBrokerProvider.java b/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/mybroker/MyBrokerProvider.java index 95f5e976..f9c0365a 100644 --- a/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/mybroker/MyBrokerProvider.java +++ b/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/mybroker/MyBrokerProvider.java @@ -6,8 +6,8 @@ import org.reactivecommons.async.commons.HandlerResolver; import org.reactivecommons.async.starter.broker.BrokerProvider; import org.reactivecommons.async.starter.broker.DiscardProvider; +import org.reactivecommons.async.starter.config.health.RCHealth; import org.reactivecommons.async.starter.mybroker.props.MyBrokerAsyncProps; -import org.springframework.boot.actuate.health.Health; import reactor.core.publisher.Mono; @AllArgsConstructor @@ -57,7 +57,7 @@ public void listenReplies(HandlerResolver resolver) { } @Override - public Mono healthCheck() { + public Mono healthCheck() { return null; } } \ No newline at end of file diff --git a/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/KafkaBrokerProvider.java b/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/KafkaBrokerProvider.java index b2ac1965..ea3b6732 100644 --- a/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/KafkaBrokerProvider.java +++ b/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/KafkaBrokerProvider.java @@ -19,7 +19,7 @@ import org.reactivecommons.async.kafka.listeners.ApplicationEventListener; import org.reactivecommons.async.kafka.listeners.ApplicationNotificationsListener; import org.reactivecommons.async.starter.broker.BrokerProvider; -import org.springframework.boot.actuate.health.Health; +import org.reactivecommons.async.starter.config.health.RCHealth; import org.springframework.boot.ssl.SslBundles; import reactor.core.publisher.Mono; @@ -100,7 +100,7 @@ public void listenReplies(HandlerResolver resolver) { } @Override - public Mono healthCheck() { + public Mono healthCheck() { return healthIndicator.health(); } } diff --git a/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicator.java b/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicator.java index 2e2e8c30..ed49de49 100644 --- a/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicator.java +++ b/starters/async-kafka-starter/src/main/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicator.java @@ -3,8 +3,8 @@ import lombok.AllArgsConstructor; import lombok.extern.log4j.Log4j2; import org.apache.kafka.clients.admin.AdminClient; -import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator; -import org.springframework.boot.actuate.health.Health; +import org.reactivecommons.async.starter.config.health.RCHealth; +import org.reactivecommons.async.starter.config.health.RCHealthIndicator; import reactor.core.publisher.Mono; import static org.reactivecommons.async.starter.config.health.ReactiveCommonsHealthIndicator.DOMAIN; @@ -12,12 +12,12 @@ @Log4j2 @AllArgsConstructor -public class KafkaReactiveHealthIndicator extends AbstractReactiveHealthIndicator { +public class KafkaReactiveHealthIndicator extends RCHealthIndicator { private final String domain; private final AdminClient adminClient; @Override - protected Mono doHealthCheck(Health.Builder builder) { + public Mono doHealthCheck(RCHealth.RCHealthBuilder builder) { builder.withDetail(DOMAIN, domain); return checkKafkaHealth() .map(clusterId -> builder.up().withDetail(VERSION, clusterId).build()) diff --git a/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/KafkaBrokerProviderTest.java b/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/KafkaBrokerProviderTest.java index c0f862a4..0db6bd4c 100644 --- a/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/KafkaBrokerProviderTest.java +++ b/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/KafkaBrokerProviderTest.java @@ -20,7 +20,7 @@ import org.reactivecommons.async.kafka.converters.json.KafkaJacksonMessageConverter; import org.reactivecommons.async.kafka.health.KafkaReactiveHealthIndicator; import org.reactivecommons.async.starter.broker.BrokerProvider; -import org.springframework.boot.actuate.health.Health; +import org.reactivecommons.async.starter.config.health.RCHealth; import org.springframework.boot.ssl.DefaultSslBundleRegistry; import org.springframework.boot.ssl.SslBundles; import reactor.core.publisher.Flux; @@ -136,12 +136,12 @@ void shouldListenNotificationEvents() { @Test void shouldProxyHealthCheck() { - when(healthIndicator.health()).thenReturn(Mono.fromSupplier(() -> Health.up().build())); + when(healthIndicator.health()).thenReturn(Mono.fromSupplier(() -> RCHealth.builder().up().build())); // Act - Mono flow = brokerProvider.healthCheck(); + Mono flow = brokerProvider.healthCheck(); // Assert StepVerifier.create(flow) - .expectNextMatches(health -> health.getStatus().getCode().equals("UP")) + .expectNextMatches(health -> health.getStatus().equals(RCHealth.Status.UP)) .verifyComplete(); } } diff --git a/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProvider.java b/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProvider.java index 5110e069..b116ced6 100644 --- a/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProvider.java +++ b/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProvider.java @@ -22,7 +22,7 @@ import org.reactivecommons.async.rabbit.listeners.ApplicationQueryListener; import org.reactivecommons.async.rabbit.listeners.ApplicationReplyListener; import org.reactivecommons.async.starter.broker.BrokerProvider; -import org.springframework.boot.actuate.health.Health; +import org.reactivecommons.async.starter.config.health.RCHealth; import reactor.core.publisher.Mono; import static reactor.rabbitmq.ExchangeSpecification.exchange; @@ -154,7 +154,7 @@ public void listenReplies(HandlerResolver resolver) { } @Override - public Mono healthCheck() { + public Mono healthCheck() { return healthIndicator.health(); } } diff --git a/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicator.java b/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicator.java index d8d0178e..a80d5f1a 100644 --- a/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicator.java +++ b/starters/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicator.java @@ -4,8 +4,8 @@ import com.rabbitmq.client.ConnectionFactory; import lombok.SneakyThrows; import lombok.extern.log4j.Log4j2; -import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator; -import org.springframework.boot.actuate.health.Health; +import org.reactivecommons.async.starter.config.health.RCHealth; +import org.reactivecommons.async.starter.config.health.RCHealthIndicator; import reactor.core.publisher.Mono; import java.net.SocketException; @@ -14,7 +14,7 @@ import static org.reactivecommons.async.starter.config.health.ReactiveCommonsHealthIndicator.VERSION; @Log4j2 -public class RabbitReactiveHealthIndicator extends AbstractReactiveHealthIndicator { +public class RabbitReactiveHealthIndicator extends RCHealthIndicator { private final String domain; private final ConnectionFactory connectionFactory; @@ -25,7 +25,7 @@ public RabbitReactiveHealthIndicator(String domain, ConnectionFactory connection } @Override - protected Mono doHealthCheck(Health.Builder builder) { + public Mono doHealthCheck(RCHealth.RCHealthBuilder builder) { builder.withDetail(DOMAIN, domain); return Mono.fromCallable(() -> getRawVersion(connectionFactory)) .map(status -> builder.up().withDetail(VERSION, status).build()); diff --git a/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProviderTest.java b/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProviderTest.java index 5fddb65e..cb25344f 100644 --- a/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProviderTest.java +++ b/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/RabbitMQBrokerProviderTest.java @@ -23,7 +23,7 @@ import org.reactivecommons.async.rabbit.converters.json.RabbitJacksonMessageConverter; import org.reactivecommons.async.rabbit.health.RabbitReactiveHealthIndicator; import org.reactivecommons.async.starter.broker.BrokerProvider; -import org.springframework.boot.actuate.health.Health; +import org.reactivecommons.async.starter.config.health.RCHealth; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.rabbitmq.BindingSpecification; @@ -181,12 +181,12 @@ void shouldListenQueries() { @Test void shouldProxyHealthCheck() { - when(healthIndicator.health()).thenReturn(Mono.fromSupplier(() -> Health.up().build())); + when(healthIndicator.health()).thenReturn(Mono.fromSupplier(() -> RCHealth.builder().up().build())); // Act - Mono flow = brokerProvider.healthCheck(); + Mono flow = brokerProvider.healthCheck(); // Assert StepVerifier.create(flow) - .expectNextMatches(health -> health.getStatus().getCode().equals("UP")) + .expectNextMatches(health -> health.getStatus().equals(RCHealth.Status.UP)) .verifyComplete(); } } diff --git a/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicatorTest.java b/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicatorTest.java index e2f2cc7e..3ebf2e22 100644 --- a/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicatorTest.java +++ b/starters/async-rabbit-starter/src/test/java/org/reactivecommons/async/rabbit/health/RabbitReactiveHealthIndicatorTest.java @@ -7,9 +7,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.actuate.health.Health; -import org.springframework.boot.actuate.health.Health.Builder; -import org.springframework.boot.actuate.health.Status; +import org.reactivecommons.async.starter.config.health.RCHealth; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -47,13 +45,13 @@ void shouldBeUp() throws IOException, TimeoutException { when(factory.newConnection()).thenReturn(connection); when(connection.getServerProperties()).thenReturn(properties); // Act - Mono result = indicator.doHealthCheck(new Builder()); + Mono result = indicator.doHealthCheck(RCHealth.builder()); // Assert StepVerifier.create(result) .assertNext(health -> { assertEquals(DEFAULT_DOMAIN, health.getDetails().get("domain")); assertEquals("1.2.3", health.getDetails().get("version")); - assertEquals(Status.UP, health.getStatus()); + assertEquals(RCHealth.Status.UP, health.getStatus()); }) .verifyComplete(); } @@ -67,13 +65,13 @@ void shouldBeUpAndIgnoreCloseError() throws IOException, TimeoutException { when(connection.getServerProperties()).thenReturn(properties); doThrow(new IOException("Error closing connection")).when(connection).close(); // Act - Mono result = indicator.doHealthCheck(new Builder()); + Mono result = indicator.doHealthCheck(RCHealth.builder()); // Assert StepVerifier.create(result) .assertNext(health -> { assertEquals(DEFAULT_DOMAIN, health.getDetails().get("domain")); assertEquals("1.2.3", health.getDetails().get("version")); - assertEquals(Status.UP, health.getStatus()); + assertEquals(RCHealth.Status.UP, health.getStatus()); }) .verifyComplete(); } @@ -83,7 +81,7 @@ void shouldBeDown() throws IOException, TimeoutException { // Arrange when(factory.newConnection()).thenThrow(new TimeoutException("Connection timeout")); // Act - Mono result = indicator.doHealthCheck(new Builder()); + Mono result = indicator.doHealthCheck(RCHealth.builder()); // Assert StepVerifier.create(result) .expectError(TimeoutException.class) @@ -95,7 +93,7 @@ void shouldBeDownWhenSocketException() throws IOException, TimeoutException { // Arrange when(factory.newConnection()).thenThrow(new SocketException("Connection timeout")); // Act - Mono result = indicator.doHealthCheck(new Builder()); + Mono result = indicator.doHealthCheck(RCHealth.builder()); // Assert StepVerifier.create(result) .expectError(RuntimeException.class) From 80fcf5f0fd2efef5ca68435ce8da138f7d35a0b7 Mon Sep 17 00:00:00 2001 From: Juan C Galvis <8420868+juancgalvis@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:55:40 -0500 Subject: [PATCH 2/2] fix(health): ignore health indicator when dependency not exists --- .../async/starter/config/health/RCHealthIndicator.java | 3 ++- .../health/ReactiveCommonsHealthIndicatorTest.java | 8 ++++---- .../kafka/health/KafkaReactiveHealthIndicatorTest.java | 9 +++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java index 6c0456b0..04cf1aec 100644 --- a/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java +++ b/starters/async-commons-starter/src/main/java/org/reactivecommons/async/starter/config/health/RCHealthIndicator.java @@ -5,7 +5,8 @@ public abstract class RCHealthIndicator { public Mono health() { - return doHealthCheck(RCHealth.builder()); + return doHealthCheck(RCHealth.builder()) + .onErrorResume(e -> Mono.just(RCHealth.builder().down().withDetail("error", e.getMessage()).build())); } public abstract Mono doHealthCheck(RCHealth.RCHealthBuilder builder); diff --git a/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java b/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java index 534481ed..b616dd74 100644 --- a/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java +++ b/starters/async-commons-starter/src/test/java/org/reactivecommons/async/starter/config/health/ReactiveCommonsHealthIndicatorTest.java @@ -37,11 +37,11 @@ void setUp() { @Test void shouldBeUp() { // Arrange - when(brokerProvider.healthCheck()).thenReturn(Mono.just(RCHealth.builder() + when(brokerProvider.healthCheck()).thenReturn(Mono.just(RCHealth.builder().up() .withDetail(DOMAIN, DEFAULT_DOMAIN) .withDetail(VERSION, "123") .build())); - when(brokerProvider2.healthCheck()).thenReturn(Mono.just(RCHealth.builder() + when(brokerProvider2.healthCheck()).thenReturn(Mono.just(RCHealth.builder().up() .withDetail(DOMAIN, OTHER) .withDetail(VERSION, "1234") .build())); @@ -56,11 +56,11 @@ void shouldBeUp() { @Test void shouldBeDown() { // Arrange - when(brokerProvider.healthCheck()).thenReturn(Mono.just(RCHealth.builder() + when(brokerProvider.healthCheck()).thenReturn(Mono.just(RCHealth.builder().down() .withDetail(DOMAIN, DEFAULT_DOMAIN) .withDetail(VERSION, "123") .build())); - when(brokerProvider2.healthCheck()).thenReturn(Mono.just(RCHealth.builder() + when(brokerProvider2.healthCheck()).thenReturn(Mono.just(RCHealth.builder().up() .withDetail(DOMAIN, OTHER) .withDetail(VERSION, "1234") .build())); diff --git a/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicatorTest.java b/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicatorTest.java index 0284ec4c..132bd660 100644 --- a/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicatorTest.java +++ b/starters/async-kafka-starter/src/test/java/org/reactivecommons/async/kafka/health/KafkaReactiveHealthIndicatorTest.java @@ -9,6 +9,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.reactivecommons.async.starter.config.health.RCHealth; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.Health.Builder; import org.springframework.boot.actuate.health.Status; @@ -39,13 +40,13 @@ void shouldBeUp() { when(adminClient.describeCluster()).thenReturn(describeClusterResult); when(describeClusterResult.clusterId()).thenReturn(KafkaFuture.completedFuture("cluster123")); // Act - Mono result = indicator.doHealthCheck(new Builder()); + Mono result = indicator.doHealthCheck(RCHealth.builder()); // Assert StepVerifier.create(result) .assertNext(health -> { assertEquals(DEFAULT_DOMAIN, health.getDetails().get("domain")); assertEquals("cluster123", health.getDetails().get("version")); - assertEquals(Status.UP, health.getStatus()); + assertEquals(RCHealth.Status.UP, health.getStatus()); }) .verifyComplete(); } @@ -58,12 +59,12 @@ void shouldBeDown() { future.completeExceptionally(new RuntimeException("simulate error")); when(describeClusterResult.clusterId()).thenReturn(future); // Act - Mono result = indicator.doHealthCheck(new Builder()); + Mono result = indicator.doHealthCheck(RCHealth.builder()); // Assert StepVerifier.create(result) .expectNextMatches(health -> { assertEquals(DEFAULT_DOMAIN, health.getDetails().get("domain")); - assertEquals(Status.DOWN, health.getStatus()); + assertEquals(RCHealth.Status.DOWN, health.getStatus()); return true; }) .verifyComplete();