Skip to content

Commit e0b523a

Browse files
committed
✨ feat(health): add RabbitMQ health check functionality
- implement healthSnapshot method to retrieve connection status of active RabbitClients - create RabbitClientHealthSnapshot data class for health check results - add RabbitMQMicroserviceHealthContributor for integration with microservice health checks
1 parent 7799b4c commit e0b523a

7 files changed

Lines changed: 59 additions & 6 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
kotlin.code.style=official
22
kotlin.stdlib.default.dependency=false
33
org.gradle.parallel=true
4-
version=1.6.0
4+
version=1.6.1

gradle/libs.versions.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
[versions]
2-
amqp-client = "5.32.0" # Update netty version if needed
3-
netty = "4.2.15.Final" # Keep in sync with https://github.com/rabbitmq/rabbitmq-java-client/blob/main/pom.xml
2+
amqp-client = "5.34.0" # Update netty version if needed
3+
netty = "4.2.16.Final" # Keep in sync with https://github.com/rabbitmq/rabbitmq-java-client/blob/main/pom.xml
4+
surf-microservice = "2.+"
45

56
[libraries]
67
amqp-client = { module = "com.rabbitmq:amqp-client", version.ref = "amqp-client" }
7-
netty-bom = { group = "io.netty", name = "netty-bom", version.ref = "netty" }
8+
netty-bom = { group = "io.netty", name = "netty-bom", version.ref = "netty" }
9+
surf-microservice = { group = "dev.slne.surf.microservice", name = "surf-microservice-api-microservice", version.ref = "surf-microservice" }

surf-rabbitmq-common/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ dependencies {
88
api(projects.surfRabbitmqApi.surfRabbitmqCommonApi)
99
api(libs.amqp.client)
1010

11+
compileOnly(libs.surf.microservice)
12+
1113
api(platform(libs.netty.bom))
1214

1315
// transport classes

surf-rabbitmq-common/src/main/kotlin/dev/slne/surf/rabbitmq/common/connection/RabbitConnectionProvider.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ import com.rabbitmq.client.RecoverableConnection
88
class RabbitConnectionProvider(
99
private val factory: ConnectionFactory,
1010
val connectionName: String
11-
): AutoCloseable {
11+
) : AutoCloseable {
1212

1313
private val lock = Any()
1414

1515
@Volatile
1616
private var connection: RecoverableConnection? = null
1717

18+
val isOpen: Boolean get() = connection?.isOpen == true
19+
1820
fun connection(): RecoverableConnection {
1921
val connection = this.connection
2022
if (connection != null && connection.isOpen) {

surf-rabbitmq-common/src/main/kotlin/dev/slne/surf/rabbitmq/common/connection/client/RabbitClient.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ class RabbitClient private constructor(
8383
private val activeClients = ConcurrentHashMap<RabbitClient, ActiveClientInfo>()
8484

8585
init {
86-
8786
log.atInfo()
8887
.log("Using ${transport.name} for RabbitMQ client")
8988

@@ -174,6 +173,17 @@ class RabbitClient private constructor(
174173
return client
175174
}
176175

176+
fun healthSnapshot(): List<RabbitClientHealthSnapshot> {
177+
return activeClients.entries
178+
.map { (client, info) ->
179+
RabbitClientHealthSnapshot(
180+
connectionName = info.connectionName,
181+
connected = client.connectionProvider.isOpen
182+
)
183+
}
184+
.sortedBy(RabbitClientHealthSnapshot::connectionName)
185+
}
186+
177187
@Blocking
178188
fun closeSharedResources() {
179189
val stillActive = activeClients.values.toList()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package dev.slne.surf.rabbitmq.common.connection.client
2+
3+
data class RabbitClientHealthSnapshot(
4+
val connectionName: String,
5+
val connected: Boolean
6+
)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.slne.surf.rabbitmq.common.health
2+
3+
import com.google.auto.service.AutoService
4+
import dev.slne.surf.microservice.api.microservice.health.MicroserviceHealthCheckResult
5+
import dev.slne.surf.microservice.api.microservice.health.MicroserviceHealthContributor
6+
import dev.slne.surf.microservice.api.microservice.health.MicroserviceHealthStatus
7+
import dev.slne.surf.rabbitmq.common.connection.client.RabbitClient
8+
9+
@AutoService(MicroserviceHealthContributor::class)
10+
class RabbitMQMicroserviceHealthContributor : MicroserviceHealthContributor {
11+
override val name: String = "rabbitmq"
12+
13+
override suspend fun check(): List<MicroserviceHealthCheckResult> {
14+
return RabbitClient.healthSnapshot().map { client ->
15+
if (client.connected) {
16+
MicroserviceHealthCheckResult(
17+
component = name,
18+
instance = client.connectionName,
19+
status = MicroserviceHealthStatus.HEALTHY
20+
)
21+
} else {
22+
MicroserviceHealthCheckResult(
23+
component = name,
24+
instance = client.connectionName,
25+
status = MicroserviceHealthStatus.UNHEALTHY,
26+
message = "RabbitMQ connection is not open."
27+
)
28+
}
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)