diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/SolrHealthIndicator.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/SolrHealthIndicator.java index 338639626f..21d5f7f4a1 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/SolrHealthIndicator.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/SolrHealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 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. @@ -17,11 +17,15 @@ package org.springframework.boot.actuate.health; import org.apache.solr.client.solrj.SolrClient; +import org.apache.solr.client.solrj.request.CoreAdminRequest; +import org.apache.solr.client.solrj.response.CoreAdminResponse; +import org.apache.solr.common.params.CoreAdminParams; /** * {@link HealthIndicator} for Apache Solr. * * @author Andy Wilkinson + * @author Stephane Nicoll * @since 1.1.0 */ public class SolrHealthIndicator extends AbstractHealthIndicator { @@ -34,8 +38,16 @@ public class SolrHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { - Object status = this.solrClient.ping().getResponse().get("status"); - builder.up().withDetail("solrStatus", status); + CoreAdminRequest request = new CoreAdminRequest(); + request.setAction(CoreAdminParams.CoreAdminAction.STATUS); + CoreAdminResponse response = request.process(this.solrClient); + int status = response.getStatus(); + if (status == 0) { + builder.up().withDetail("solrStatus", "OK"); + } + else { + builder.down().withDetail("solrStatus", status); + } } } diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/SolrHealthIndicatorTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/SolrHealthIndicatorTests.java index e4d055c39e..ba2f1ff786 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/SolrHealthIndicatorTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/health/SolrHealthIndicatorTests.java @@ -19,7 +19,7 @@ package org.springframework.boot.actuate.health; import java.io.IOException; import org.apache.solr.client.solrj.SolrClient; -import org.apache.solr.client.solrj.response.SolrPingResponse; +import org.apache.solr.client.solrj.request.CoreAdminRequest; import org.apache.solr.common.util.NamedList; import org.junit.After; import org.junit.Test; @@ -32,6 +32,8 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.isNull; import static org.mockito.Mockito.mock; /** @@ -65,21 +67,30 @@ public class SolrHealthIndicatorTests { @Test public void solrIsUp() throws Exception { SolrClient solrClient = mock(SolrClient.class); - SolrPingResponse pingResponse = new SolrPingResponse(); - NamedList response = new NamedList(); - response.add("status", "OK"); - pingResponse.setResponse(response); - given(solrClient.ping()).willReturn(pingResponse); + given(solrClient.request(any(CoreAdminRequest.class), (String) isNull())) + .willReturn(mockResponse(0)); SolrHealthIndicator healthIndicator = new SolrHealthIndicator(solrClient); Health health = healthIndicator.health(); assertThat(health.getStatus()).isEqualTo(Status.UP); assertThat(health.getDetails().get("solrStatus")).isEqualTo("OK"); } + @Test + public void solrIsUpAndRequestFailed() throws Exception { + SolrClient solrClient = mock(SolrClient.class); + given(solrClient.request(any(CoreAdminRequest.class), (String) isNull())) + .willReturn(mockResponse(400)); + SolrHealthIndicator healthIndicator = new SolrHealthIndicator(solrClient); + Health health = healthIndicator.health(); + assertThat(health.getStatus()).isEqualTo(Status.DOWN); + assertThat(health.getDetails().get("solrStatus")).isEqualTo(400); + } + @Test public void solrIsDown() throws Exception { SolrClient solrClient = mock(SolrClient.class); - given(solrClient.ping()).willThrow(new IOException("Connection failed")); + given(solrClient.request(any(CoreAdminRequest.class), (String) isNull())) + .willThrow(new IOException("Connection failed")); SolrHealthIndicator healthIndicator = new SolrHealthIndicator(solrClient); Health health = healthIndicator.health(); assertThat(health.getStatus()).isEqualTo(Status.DOWN); @@ -87,4 +98,12 @@ public class SolrHealthIndicatorTests { .contains("Connection failed")); } + private NamedList mockResponse(int status) { + NamedList response = new NamedList(); + NamedList headers = new NamedList(); + headers.add("status", status); + response.add("responseHeader", headers); + return response; + } + }