Skip to content

Commit fd94711

Browse files
author
Daniel Bustamante Ospina
authored
Merge pull request #64 from reactive-commons/feature/health-indicator
add health indicator
2 parents 628ab56 + 5f90a81 commit fd94711

File tree

8 files changed

+129
-3
lines changed

8 files changed

+129
-3
lines changed

async/async-rabbit-starter/async-commons-rabbit-starter.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ ext {
66
dependencies {
77
api project(':async-rabbit')
88
compileOnly 'org.springframework.boot:spring-boot-starter'
9+
compileOnly 'org.springframework.boot:spring-boot-starter-actuator'
910

1011
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
1112

1213
testImplementation 'io.projectreactor:reactor-test'
14+
testImplementation 'org.springframework.boot:spring-boot-starter-actuator'
1315
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.reactivecommons.async.rabbit.config;
2+
3+
import org.reactivecommons.async.rabbit.health.RabbitReactiveHealthIndicator;
4+
import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator;
5+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
@Configuration
10+
@ConditionalOnClass(AbstractReactiveHealthIndicator.class)
11+
public class RabbitHealthConfig {
12+
13+
@Bean
14+
public RabbitReactiveHealthIndicator rabbitHealthIndicator(ConnectionFactoryProvider provider) {
15+
return new RabbitReactiveHealthIndicator(provider);
16+
}
17+
}

async/async-rabbit-starter/src/main/java/org/reactivecommons/async/rabbit/config/RabbitMqConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
RabbitProperties.class,
5959
AsyncProps.class
6060
})
61-
@Import(BrokerConfigProps.class)
61+
@Import({BrokerConfigProps.class, RabbitHealthConfig.class})
6262
public class RabbitMqConfig {
6363

6464
private static final String LISTENER_TYPE = "listener";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package org.reactivecommons.async.rabbit.health;
2+
3+
import com.rabbitmq.client.Connection;
4+
import com.rabbitmq.client.ConnectionFactory;
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.SneakyThrows;
7+
import org.reactivecommons.async.rabbit.config.ConnectionFactoryProvider;
8+
import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator;
9+
import org.springframework.boot.actuate.health.Health;
10+
import reactor.core.publisher.Mono;
11+
12+
@RequiredArgsConstructor
13+
public class RabbitReactiveHealthIndicator extends AbstractReactiveHealthIndicator {
14+
private static final String VERSION = "version";
15+
private final ConnectionFactoryProvider provider;
16+
17+
@Override
18+
protected Mono<Health> doHealthCheck(Health.Builder builder) {
19+
return Mono.defer(this::getVersion)
20+
.map(version -> builder.up().withDetail(VERSION, version).build());
21+
}
22+
23+
private Mono<String> getVersion() {
24+
return Mono.just(provider)
25+
.map(ConnectionFactoryProvider::getConnectionFactory)
26+
.map(this::getRawVersion);
27+
}
28+
29+
@SneakyThrows
30+
private String getRawVersion(ConnectionFactory factory) {
31+
try (Connection connection = factory.newConnection()) {
32+
return connection.getServerProperties().get(VERSION).toString();
33+
}
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.reactivecommons.async.rabbit.health;
2+
3+
import com.rabbitmq.client.Connection;
4+
import com.rabbitmq.client.ConnectionFactory;
5+
import org.junit.jupiter.api.BeforeEach;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.ExtendWith;
8+
import org.mockito.InjectMocks;
9+
import org.mockito.Mock;
10+
import org.mockito.junit.jupiter.MockitoExtension;
11+
import org.reactivecommons.async.rabbit.config.ConnectionFactoryProvider;
12+
import org.springframework.boot.actuate.health.Health;
13+
import org.springframework.boot.actuate.health.Health.Builder;
14+
import org.springframework.boot.actuate.health.Status;
15+
import reactor.core.publisher.Mono;
16+
import reactor.test.StepVerifier;
17+
18+
import java.io.IOException;
19+
import java.util.Map;
20+
import java.util.TreeMap;
21+
import java.util.concurrent.TimeoutException;
22+
23+
import static org.junit.jupiter.api.Assertions.assertEquals;
24+
import static org.mockito.Mockito.when;
25+
26+
@ExtendWith(MockitoExtension.class)
27+
public class RabbitReactiveHealthIndicatorTest {
28+
@Mock
29+
private ConnectionFactoryProvider provider;
30+
@Mock
31+
private ConnectionFactory factory;
32+
@Mock
33+
private Connection connection;
34+
@InjectMocks
35+
private RabbitReactiveHealthIndicator indicator;
36+
37+
@BeforeEach
38+
void setup() {
39+
when(provider.getConnectionFactory()).thenReturn(factory);
40+
}
41+
42+
@Test
43+
void shouldBeUp() throws IOException, TimeoutException {
44+
// Arrange
45+
Map<String, Object> properties = new TreeMap<>();
46+
properties.put("version", "1.2.3");
47+
when(factory.newConnection()).thenReturn(connection);
48+
when(connection.getServerProperties()).thenReturn(properties);
49+
// Act
50+
Mono<Health> result = indicator.doHealthCheck(new Builder());
51+
// Assert
52+
StepVerifier.create(result)
53+
.assertNext(health -> {
54+
assertEquals("1.2.3", health.getDetails().get("version"));
55+
assertEquals(Status.UP, health.getStatus());
56+
})
57+
.verifyComplete();
58+
}
59+
60+
@Test
61+
void shouldBeDown() throws IOException, TimeoutException {
62+
// Arrange
63+
when(factory.newConnection()).thenThrow(new TimeoutException("Connection timeout"));
64+
// Act
65+
Mono<Health> result = indicator.doHealthCheck(new Builder());
66+
// Assert
67+
StepVerifier.create(result)
68+
.expectError(TimeoutException.class)
69+
.verify();
70+
}
71+
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=1.0.2
1+
version=1.0.3
22
springBootVersion=2.4.2
33
gradleVersionsVersion=0.36.0
44
toPublish=async-commons,async-commons-api,async-commons-rabbit-standalone,async-commons-rabbit-starter,domain-events-api,async-rabbit

samples/async/sender-client/async-sender-client.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ apply plugin: 'org.springframework.boot'
22

33
dependencies {
44
compile project(":async-commons-rabbit-starter")
5-
// compile 'org.reactivecommons:async-commons-starter:1.0.0-beta7'
65
compile group: 'org.springframework.boot', name: 'spring-boot-starter-webflux'
76
compile('org.springframework.boot:spring-boot-starter')
7+
compile('org.springframework.boot:spring-boot-starter-actuator')
88
//runtime('org.springframework.boot:spring-boot-devtools')
99
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
spring.application.name=sender
22
server.port=4001
33
spring.rabbitmq.virtual-host=test
4+
management.endpoint.health.show-details=always

0 commit comments

Comments
 (0)