16 changed files with 679 additions and 72 deletions
@ -0,0 +1,137 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2014 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.actuate.autoconfigure; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import javax.sql.DataSource; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.boot.actuate.health.CompositeHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.HealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.MongoHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.RedisHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.SimpleDataSourceHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.VanillaHealthIndicator; |
||||||
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter; |
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; |
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.CommonsDataSourceConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.HikariDataSourceConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.TomcatDataSourceConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.data.mongodb.core.MongoTemplate; |
||||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Christian Dupuis |
||||||
|
* @since 1.1.0 |
||||||
|
*/ |
||||||
|
@Configuration |
||||||
|
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, |
||||||
|
EmbeddedDataSourceConfiguration.class, CommonsDataSourceConfiguration.class, |
||||||
|
HikariDataSourceConfiguration.class, TomcatDataSourceConfiguration.class, |
||||||
|
MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, |
||||||
|
RedisAutoConfiguration.class }) |
||||||
|
public class HealthIndicatorAutoConfiguration { |
||||||
|
|
||||||
|
@Bean |
||||||
|
@ConditionalOnMissingBean(HealthIndicator.class) |
||||||
|
public HealthIndicator<?> statusHealthIndicator() { |
||||||
|
return new VanillaHealthIndicator(); |
||||||
|
} |
||||||
|
|
||||||
|
@Configuration |
||||||
|
@ConditionalOnBean(DataSource.class) |
||||||
|
public static class DataSourcesHealthIndicatorConfiguration { |
||||||
|
|
||||||
|
@Autowired(required = false) |
||||||
|
private Map<String, DataSource> dataSources; |
||||||
|
|
||||||
|
@Bean |
||||||
|
@ConditionalOnMissingBean(name = "dbHealthIndicator") |
||||||
|
public HealthIndicator<? extends Object> dbHealthIndicator() { |
||||||
|
if (this.dataSources.size() == 1) { |
||||||
|
return new SimpleDataSourceHealthIndicator(this.dataSources.values().iterator() |
||||||
|
.next()); |
||||||
|
} |
||||||
|
|
||||||
|
CompositeHealthIndicator composite = new CompositeHealthIndicator(); |
||||||
|
for (Map.Entry<String, DataSource> entry : this.dataSources.entrySet()) { |
||||||
|
composite.addHealthIndicator(entry.getKey(), new SimpleDataSourceHealthIndicator( |
||||||
|
entry.getValue())); |
||||||
|
} |
||||||
|
return composite; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Configuration |
||||||
|
@ConditionalOnBean(MongoTemplate.class) |
||||||
|
public static class MongoHealthIndicatorConfiguration { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private Map<String, MongoTemplate> mongoTemplates; |
||||||
|
|
||||||
|
@Bean |
||||||
|
@ConditionalOnMissingBean(name = "mongoHealthIndicator") |
||||||
|
public HealthIndicator<?> mongoHealthIndicator() { |
||||||
|
if (this.mongoTemplates.size() == 1) { |
||||||
|
return new MongoHealthIndicator(this.mongoTemplates.values().iterator() |
||||||
|
.next()); |
||||||
|
} |
||||||
|
|
||||||
|
CompositeHealthIndicator composite = new CompositeHealthIndicator(); |
||||||
|
for (Map.Entry<String, MongoTemplate> entry : this.mongoTemplates.entrySet()) { |
||||||
|
composite.addHealthIndicator(entry.getKey(), new MongoHealthIndicator( |
||||||
|
entry.getValue())); |
||||||
|
} |
||||||
|
return composite; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Configuration |
||||||
|
@ConditionalOnBean(RedisConnectionFactory.class) |
||||||
|
public static class RedisHealthIndicatorConfiguration { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private Map<String, RedisConnectionFactory> redisConnectionFactories; |
||||||
|
|
||||||
|
@Bean |
||||||
|
@ConditionalOnMissingBean(name = "redisHealthIndicator") |
||||||
|
public HealthIndicator<?> redisHealthIndicator() { |
||||||
|
if (this.redisConnectionFactories.size() == 1) { |
||||||
|
return new RedisHealthIndicator(this.redisConnectionFactories.values() |
||||||
|
.iterator().next()); |
||||||
|
} |
||||||
|
|
||||||
|
CompositeHealthIndicator composite = new CompositeHealthIndicator(); |
||||||
|
for (Map.Entry<String, RedisConnectionFactory> entry : this.redisConnectionFactories |
||||||
|
.entrySet()) { |
||||||
|
composite.addHealthIndicator(entry.getKey(), new RedisHealthIndicator( |
||||||
|
entry.getValue())); |
||||||
|
} |
||||||
|
return composite; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,57 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2014 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.actuate.health; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.springframework.data.mongodb.core.MongoTemplate; |
||||||
|
|
||||||
|
import com.mongodb.CommandResult; |
||||||
|
|
||||||
|
/** |
||||||
|
* Simple implementation of a {@link HealthIndicator} returning status information for |
||||||
|
* Mongo data stores. |
||||||
|
* |
||||||
|
* @author Christian Dupuis |
||||||
|
* @since 1.1.0 |
||||||
|
*/ |
||||||
|
public class MongoHealthIndicator implements HealthIndicator<Map<String, Object>> { |
||||||
|
|
||||||
|
private final MongoTemplate mongoTemplate; |
||||||
|
|
||||||
|
public MongoHealthIndicator(MongoTemplate mongoTemplate) { |
||||||
|
this.mongoTemplate = mongoTemplate; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<String, Object> health() { |
||||||
|
Map<String, Object> health = new HashMap<String, Object>(); |
||||||
|
try { |
||||||
|
CommandResult result = this.mongoTemplate |
||||||
|
.executeCommand("{ serverStatus: 1 }"); |
||||||
|
health.put("status", "ok"); |
||||||
|
health.put("version", result.getString("version")); |
||||||
|
} |
||||||
|
catch (Exception ex) { |
||||||
|
health.put("status", "error"); |
||||||
|
health.put("error", ex.getClass().getName() + ": " + ex.getMessage()); |
||||||
|
} |
||||||
|
return health; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
@ -0,0 +1,63 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2014 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.actuate.health; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Properties; |
||||||
|
|
||||||
|
import org.springframework.data.redis.connection.RedisConnection; |
||||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||||
|
import org.springframework.data.redis.core.RedisConnectionUtils; |
||||||
|
|
||||||
|
/** |
||||||
|
* Simple implementation of a {@link HealthIndicator} returning status information for |
||||||
|
* Redis data stores. |
||||||
|
* |
||||||
|
* @author Christian Dupuis |
||||||
|
* @since 1.1.0 |
||||||
|
*/ |
||||||
|
public class RedisHealthIndicator implements HealthIndicator<Map<String, Object>> { |
||||||
|
|
||||||
|
private final RedisConnectionFactory redisConnectionFactory; |
||||||
|
|
||||||
|
public RedisHealthIndicator(RedisConnectionFactory connectionFactory) { |
||||||
|
this.redisConnectionFactory = connectionFactory; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Map<String, Object> health() { |
||||||
|
Map<String, Object> health = new HashMap<String, Object>(); |
||||||
|
|
||||||
|
RedisConnection connection = null; |
||||||
|
try { |
||||||
|
connection = RedisConnectionUtils.getConnection(this.redisConnectionFactory); |
||||||
|
Properties info = connection.info(); |
||||||
|
health.put("status", "ok"); |
||||||
|
health.put("version", info.getProperty("redis_version")); |
||||||
|
} |
||||||
|
catch (Exception ex) { |
||||||
|
health.put("status", "error"); |
||||||
|
health.put("error", ex.getClass().getName() + ": " + ex.getMessage()); |
||||||
|
} |
||||||
|
finally { |
||||||
|
RedisConnectionUtils.releaseConnection(connection, |
||||||
|
this.redisConnectionFactory); |
||||||
|
} |
||||||
|
return health; |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,126 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2014 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.actuate.autoconfigure; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import org.junit.After; |
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
import org.springframework.boot.actuate.health.HealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.MongoHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.RedisHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.SimpleDataSourceHealthIndicator; |
||||||
|
import org.springframework.boot.actuate.health.VanillaHealthIndicator; |
||||||
|
import org.springframework.boot.autoconfigure.jdbc.EmbeddedDataSourceConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration; |
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link HealthIndicatorAutoConfiguration}. |
||||||
|
* |
||||||
|
* @author Christian Dupuis |
||||||
|
*/ |
||||||
|
public class HealthIndicatorAutoConfigurationTests { |
||||||
|
|
||||||
|
private AnnotationConfigApplicationContext context; |
||||||
|
|
||||||
|
@Before |
||||||
|
public void setup() { |
||||||
|
this.context = new AnnotationConfigApplicationContext(); |
||||||
|
this.context.register(EndpointAutoConfiguration.class); |
||||||
|
this.context.refresh(); |
||||||
|
} |
||||||
|
|
||||||
|
@After |
||||||
|
public void close() { |
||||||
|
if (this.context != null) { |
||||||
|
this.context.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes") |
||||||
|
@Test |
||||||
|
public void defaultHealthIndicator() { |
||||||
|
this.context = new AnnotationConfigApplicationContext(); |
||||||
|
this.context.register(HealthIndicatorAutoConfiguration.class); |
||||||
|
this.context.refresh(); |
||||||
|
Map<String, HealthIndicator> beans = this.context |
||||||
|
.getBeansOfType(HealthIndicator.class); |
||||||
|
assertEquals(1, beans.size()); |
||||||
|
assertEquals(VanillaHealthIndicator.class, beans.values().iterator().next() |
||||||
|
.getClass()); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes") |
||||||
|
@Test |
||||||
|
public void redisHealthIndicator() { |
||||||
|
this.context = new AnnotationConfigApplicationContext(); |
||||||
|
this.context.register(RedisAutoConfiguration.class, |
||||||
|
HealthIndicatorAutoConfiguration.class); |
||||||
|
this.context.refresh(); |
||||||
|
Map<String, HealthIndicator> beans = this.context |
||||||
|
.getBeansOfType(HealthIndicator.class); |
||||||
|
assertEquals(1, beans.size()); |
||||||
|
assertEquals(RedisHealthIndicator.class, beans.values().iterator().next() |
||||||
|
.getClass()); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes") |
||||||
|
@Test |
||||||
|
public void mongoHealthIndicator() { |
||||||
|
this.context = new AnnotationConfigApplicationContext(); |
||||||
|
this.context.register(MongoAutoConfiguration.class, |
||||||
|
MongoDataAutoConfiguration.class, HealthIndicatorAutoConfiguration.class); |
||||||
|
this.context.refresh(); |
||||||
|
Map<String, HealthIndicator> beans = this.context |
||||||
|
.getBeansOfType(HealthIndicator.class); |
||||||
|
assertEquals(1, beans.size()); |
||||||
|
assertEquals(MongoHealthIndicator.class, beans.values().iterator().next() |
||||||
|
.getClass()); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes") |
||||||
|
@Test |
||||||
|
public void combinedHealthIndicator() { |
||||||
|
this.context = new AnnotationConfigApplicationContext(); |
||||||
|
this.context.register(MongoAutoConfiguration.class, RedisAutoConfiguration.class, |
||||||
|
MongoDataAutoConfiguration.class, HealthIndicatorAutoConfiguration.class); |
||||||
|
this.context.refresh(); |
||||||
|
Map<String, HealthIndicator> beans = this.context |
||||||
|
.getBeansOfType(HealthIndicator.class); |
||||||
|
assertEquals(2, beans.size()); |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes") |
||||||
|
@Test |
||||||
|
public void dataSourceHealthIndicator() { |
||||||
|
this.context = new AnnotationConfigApplicationContext(); |
||||||
|
this.context.register(EmbeddedDataSourceConfiguration.class, |
||||||
|
HealthIndicatorAutoConfiguration.class); |
||||||
|
this.context.refresh(); |
||||||
|
Map<String, HealthIndicator> beans = this.context |
||||||
|
.getBeansOfType(HealthIndicator.class); |
||||||
|
assertEquals(1, beans.size()); |
||||||
|
assertEquals(SimpleDataSourceHealthIndicator.class, beans.values().iterator().next() |
||||||
|
.getClass()); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,97 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2014 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.actuate.health; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
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; |
||||||
|
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.mongo.MongoDataAutoConfiguration; |
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||||
|
import org.springframework.data.mongodb.core.MongoTemplate; |
||||||
|
|
||||||
|
import com.mongodb.CommandResult; |
||||||
|
import com.mongodb.MongoException; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals; |
||||||
|
import static org.junit.Assert.assertNotNull; |
||||||
|
import static org.junit.Assert.assertTrue; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link MongoHealthIndicator}. |
||||||
|
* |
||||||
|
* @author Christian Dupuis |
||||||
|
*/ |
||||||
|
public class MongoHealthIndicatorTests { |
||||||
|
|
||||||
|
private AnnotationConfigApplicationContext context; |
||||||
|
|
||||||
|
@After |
||||||
|
public void close() { |
||||||
|
if (this.context != null) { |
||||||
|
this.context.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void indicatorExists() { |
||||||
|
this.context = new AnnotationConfigApplicationContext( |
||||||
|
PropertyPlaceholderAutoConfiguration.class, MongoAutoConfiguration.class, |
||||||
|
MongoDataAutoConfiguration.class, EndpointAutoConfiguration.class, |
||||||
|
HealthIndicatorAutoConfiguration.class); |
||||||
|
assertEquals(1, this.context.getBeanNamesForType(MongoTemplate.class).length); |
||||||
|
MongoHealthIndicator healthIndicator = this.context |
||||||
|
.getBean(MongoHealthIndicator.class); |
||||||
|
assertNotNull(healthIndicator); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void mongoIsUp() throws Exception { |
||||||
|
CommandResult commandResult = Mockito.mock(CommandResult.class); |
||||||
|
Mockito.when(commandResult.getString("version")).thenReturn("2.6.4"); |
||||||
|
MongoTemplate mongoTemplate = Mockito.mock(MongoTemplate.class); |
||||||
|
Mockito.when(mongoTemplate.executeCommand("{ serverStatus: 1 }")).thenReturn( |
||||||
|
commandResult); |
||||||
|
MongoHealthIndicator healthIndicator = new MongoHealthIndicator(mongoTemplate); |
||||||
|
|
||||||
|
Map<String, Object> health = healthIndicator.health(); |
||||||
|
assertEquals("ok", health.get("status")); |
||||||
|
assertEquals("2.6.4", health.get("version")); |
||||||
|
|
||||||
|
Mockito.verify(commandResult).getString("version"); |
||||||
|
Mockito.verify(mongoTemplate).executeCommand("{ serverStatus: 1 }"); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void mongoIsDown() throws Exception { |
||||||
|
MongoTemplate mongoTemplate = Mockito.mock(MongoTemplate.class); |
||||||
|
Mockito.when(mongoTemplate.executeCommand("{ serverStatus: 1 }")).thenThrow( |
||||||
|
new MongoException("Connection failed")); |
||||||
|
MongoHealthIndicator healthIndicator = new MongoHealthIndicator(mongoTemplate); |
||||||
|
|
||||||
|
Map<String, Object> health = healthIndicator.health(); |
||||||
|
assertEquals("error", health.get("status")); |
||||||
|
assertTrue(((String) health.get("error")).contains("Connection failed")); |
||||||
|
|
||||||
|
Mockito.verify(mongoTemplate).executeCommand("{ serverStatus: 1 }"); |
||||||
|
} |
||||||
|
} |
||||||
@ -0,0 +1,105 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2014 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. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package org.springframework.boot.actuate.health; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
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; |
||||||
|
import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; |
||||||
|
import org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration; |
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext; |
||||||
|
import org.springframework.data.redis.RedisConnectionFailureException; |
||||||
|
import org.springframework.data.redis.connection.RedisConnection; |
||||||
|
import org.springframework.data.redis.connection.RedisConnectionFactory; |
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals; |
||||||
|
import static org.junit.Assert.assertNotNull; |
||||||
|
import static org.junit.Assert.assertTrue; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link RedisHealthIndicator}. |
||||||
|
* |
||||||
|
* @author Christian Dupuis |
||||||
|
*/ |
||||||
|
public class RedisHealthIndicatorTests { |
||||||
|
|
||||||
|
private AnnotationConfigApplicationContext context; |
||||||
|
|
||||||
|
@After |
||||||
|
public void close() { |
||||||
|
if (this.context != null) { |
||||||
|
this.context.close(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void indicatorExists() { |
||||||
|
this.context = new AnnotationConfigApplicationContext( |
||||||
|
PropertyPlaceholderAutoConfiguration.class, RedisAutoConfiguration.class, |
||||||
|
EndpointAutoConfiguration.class, HealthIndicatorAutoConfiguration.class); |
||||||
|
assertEquals(1, |
||||||
|
this.context.getBeanNamesForType(RedisConnectionFactory.class).length); |
||||||
|
RedisHealthIndicator healthIndicator = this.context |
||||||
|
.getBean(RedisHealthIndicator.class); |
||||||
|
assertNotNull(healthIndicator); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void redisIsUp() throws Exception { |
||||||
|
Properties info = new Properties(); |
||||||
|
info.put("redis_version", "2.8.9"); |
||||||
|
|
||||||
|
RedisConnection redisConnection = Mockito.mock(RedisConnection.class); |
||||||
|
RedisConnectionFactory redisConnectionFactory = Mockito |
||||||
|
.mock(RedisConnectionFactory.class); |
||||||
|
Mockito.when(redisConnectionFactory.getConnection()).thenReturn(redisConnection); |
||||||
|
Mockito.when(redisConnection.info()).thenReturn(info); |
||||||
|
RedisHealthIndicator healthIndicator = new RedisHealthIndicator( |
||||||
|
redisConnectionFactory); |
||||||
|
|
||||||
|
Map<String, Object> health = healthIndicator.health(); |
||||||
|
assertEquals("ok", health.get("status")); |
||||||
|
assertEquals("2.8.9", health.get("version")); |
||||||
|
|
||||||
|
Mockito.verify(redisConnectionFactory).getConnection(); |
||||||
|
Mockito.verify(redisConnection).info(); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void redisIsDown() throws Exception { |
||||||
|
RedisConnection redisConnection = Mockito.mock(RedisConnection.class); |
||||||
|
RedisConnectionFactory redisConnectionFactory = Mockito |
||||||
|
.mock(RedisConnectionFactory.class); |
||||||
|
Mockito.when(redisConnectionFactory.getConnection()).thenReturn(redisConnection); |
||||||
|
Mockito.when(redisConnection.info()).thenThrow( |
||||||
|
new RedisConnectionFailureException("Connection failed")); |
||||||
|
RedisHealthIndicator healthIndicator = new RedisHealthIndicator( |
||||||
|
redisConnectionFactory); |
||||||
|
|
||||||
|
Map<String, Object> health = healthIndicator.health(); |
||||||
|
assertEquals("error", health.get("status")); |
||||||
|
assertTrue(((String) health.get("error")).contains("Connection failed")); |
||||||
|
|
||||||
|
Mockito.verify(redisConnectionFactory).getConnection(); |
||||||
|
Mockito.verify(redisConnection).info(); |
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue