diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisHealthIndicator.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisHealthIndicator.java index bc594fba5a..2adade42b2 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisHealthIndicator.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/RedisHealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package org.springframework.boot.actuate.health; import java.util.Properties; +import org.springframework.data.redis.connection.ClusterInfo; +import org.springframework.data.redis.connection.RedisClusterConnection; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisConnectionUtils; @@ -28,10 +30,13 @@ import org.springframework.util.Assert; * Redis data stores. * * @author Christian Dupuis + * @author Richard Santana * @since 1.1.0 */ public class RedisHealthIndicator extends AbstractHealthIndicator { + private static final String VERSION = "version"; + private static final String REDIS_VERSION = "redis_version"; private final RedisConnectionFactory redisConnectionFactory; public RedisHealthIndicator(RedisConnectionFactory connectionFactory) { @@ -44,8 +49,18 @@ public class RedisHealthIndicator extends AbstractHealthIndicator { RedisConnection connection = RedisConnectionUtils .getConnection(this.redisConnectionFactory); try { - Properties info = connection.info(); - builder.up().withDetail("version", info.getProperty("redis_version")); + if (connection instanceof RedisClusterConnection) { + ClusterInfo clusterInfo = ((RedisClusterConnection) connection) + .clusterGetClusterInfo(); + builder.up() + .withDetail("cluster_size", clusterInfo.getClusterSize()) + .withDetail("slots_up", clusterInfo.getSlotsOk()) + .withDetail("slots_fail", clusterInfo.getSlotsFail()); + } + else { + Properties info = connection.info(); + builder.up().withDetail(VERSION, info.getProperty(REDIS_VERSION)); + } } finally { RedisConnectionUtils.releaseConnection(connection, diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisHealthIndicatorTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisHealthIndicatorTests.java index 181833b566..ea1ff27c34 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisHealthIndicatorTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/RedisHealthIndicatorTests.java @@ -16,10 +16,13 @@ package org.springframework.boot.actuate.health; +import java.util.Arrays; +import java.util.List; import java.util.Properties; import org.junit.After; import org.junit.Test; +import org.mockito.Mockito; import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.HealthIndicatorAutoConfiguration; @@ -27,6 +30,9 @@ import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfigurati import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.data.redis.RedisConnectionFailureException; +import org.springframework.data.redis.connection.ClusterInfo; +import org.springframework.data.redis.connection.RedisClusterConnection; +import org.springframework.data.redis.connection.RedisClusterNode; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -39,6 +45,7 @@ import static org.mockito.Mockito.verify; * Tests for {@link RedisHealthIndicator}. * * @author Christian Dupuis + * @author Richard Santana */ public class RedisHealthIndicatorTests { @@ -99,4 +106,30 @@ public class RedisHealthIndicatorTests { verify(redisConnection).info(); } + @Test + public void redisClusterIsUp() throws Exception { + Properties clusterProperties = new Properties(); + clusterProperties.setProperty("cluster_size", "4"); + clusterProperties.setProperty("cluster_slots_ok", "4"); + clusterProperties.setProperty("cluster_slots_fail", "0"); + List redisMasterNodes = Arrays.asList( + new RedisClusterNode("127.0.0.1", 7001), + new RedisClusterNode("127.0.0.2", 7001)); + RedisClusterConnection redisConnection = mock(RedisClusterConnection.class); + given(redisConnection.clusterGetNodes()).willReturn(redisMasterNodes); + given(redisConnection.clusterGetClusterInfo()) + .willReturn(new ClusterInfo(clusterProperties)); + RedisConnectionFactory redisConnectionFactory = mock( + RedisConnectionFactory.class); + given(redisConnectionFactory.getConnection()).willReturn(redisConnection); + RedisHealthIndicator healthIndicator = new RedisHealthIndicator( + redisConnectionFactory); + Health health = healthIndicator.health(); + assertThat(health.getStatus()).isEqualTo(Status.UP); + assertThat(health.getDetails().get("cluster_size")).isEqualTo(4L); + assertThat(health.getDetails().get("slots_up")).isEqualTo(4L); + assertThat(health.getDetails().get("slots_fail")).isEqualTo(0L); + verify(redisConnectionFactory, Mockito.atLeastOnce()).getConnection(); + } + }