Skip to content

Commit a7a71da

Browse files
committed
Polish "Bring back Elasticsearch RestClient auto-configuration"
See gh-28496
1 parent eb3bf40 commit a7a71da

File tree

13 files changed

+88
-384
lines changed

13 files changed

+88
-384
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticSearchRestHealthContributorAutoConfiguration.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,9 @@
3939
* @author Artsiom Yudovin
4040
* @since 2.1.1
4141
*/
42-
@SuppressWarnings("deprecation")
4342
@AutoConfiguration(after = ElasticsearchRestClientAutoConfiguration.class)
44-
@ConditionalOnClass(org.elasticsearch.client.RestHighLevelClient.class)
45-
@ConditionalOnBean(org.elasticsearch.client.RestHighLevelClient.class)
43+
@ConditionalOnClass(RestClient.class)
44+
@ConditionalOnBean(RestClient.class)
4645
@ConditionalOnEnabledHealthIndicator("elasticsearch")
4746
public class ElasticSearchRestHealthContributorAutoConfiguration
4847
extends CompositeHealthContributorConfiguration<ElasticsearchRestHealthIndicator, RestClient> {
@@ -53,4 +52,4 @@ public HealthContributor elasticsearchHealthContributor(Map<String, RestClient>
5352
return createContributor(clients);
5453
}
5554

56-
}
55+
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticSearchRestHealthContributorConfigurations.java

Lines changed: 0 additions & 69 deletions
This file was deleted.
Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -21,7 +21,6 @@
2121
import org.junit.jupiter.api.Test;
2222

2323
import org.springframework.boot.actuate.autoconfigure.health.HealthContributorAutoConfiguration;
24-
import org.springframework.boot.actuate.elasticsearch.ElasticsearchRestClientHealthIndicator;
2524
import org.springframework.boot.actuate.elasticsearch.ElasticsearchRestHealthIndicator;
2625
import org.springframework.boot.autoconfigure.AutoConfigurations;
2726
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration;
@@ -33,54 +32,53 @@
3332
import static org.assertj.core.api.Assertions.assertThat;
3433

3534
/**
36-
* Tests for {@link ElasticsearchRestClientAutoConfiguration}.
35+
* Tests for {@link ElasticSearchRestHealthContributorAutoConfiguration}.
3736
*
3837
* @author Filip Hrisafov
38+
* @author Andy Wilkinson
3939
*/
40-
class ElasticsearchRestHealthContributorAutoConfigurationTests {
40+
class ElasticSearchRestHealthContributorAutoConfigurationTests {
4141

4242
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4343
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class,
4444
ElasticSearchRestHealthContributorAutoConfiguration.class,
4545
HealthContributorAutoConfiguration.class));
4646

4747
@Test
48-
@SuppressWarnings("deprecation")
4948
void runShouldCreateIndicator() {
5049
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestHealthIndicator.class)
5150
.hasBean("elasticsearchHealthContributor"));
5251
}
5352

5453
@Test
54+
@SuppressWarnings("deprecation")
5555
void runWithoutRestHighLevelClientAndWithoutRestClientShouldNotCreateIndicator() {
5656
this.contextRunner
5757
.withClassLoader(
5858
new FilteredClassLoader(org.elasticsearch.client.RestHighLevelClient.class, RestClient.class))
59-
.run((context) -> assertThat(context).doesNotHaveBean(ElasticsearchRestClientHealthIndicator.class)
59+
.run((context) -> assertThat(context).doesNotHaveBean(ElasticsearchRestHealthIndicator.class)
6060
.doesNotHaveBean("elasticsearchHealthContributor"));
6161
}
6262

6363
@Test
64-
@SuppressWarnings("deprecation")
6564
void runWithoutRestHighLevelClientAndWithRestClientShouldCreateIndicator() {
6665
this.contextRunner.withUserConfiguration(CustomRestClientConfiguration.class)
67-
.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestClientHealthIndicator.class)
68-
.doesNotHaveBean(ElasticsearchRestHealthIndicator.class)
66+
.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestHealthIndicator.class)
67+
.hasSingleBean(ElasticsearchRestHealthIndicator.class)
6968
.hasBean("elasticsearchHealthContributor"));
7069
}
7170

7271
@Test
73-
@SuppressWarnings("deprecation")
7472
void runWithRestHighLevelClientAndWithRestClientShouldCreateIndicator() {
7573
this.contextRunner.withUserConfiguration(CustomRestHighClientConfiguration.class)
76-
.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestClientHealthIndicator.class)
74+
.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestHealthIndicator.class)
7775
.hasBean("elasticsearchHealthContributor"));
7876
}
7977

8078
@Test
8179
void runWhenDisabledShouldNotCreateIndicator() {
8280
this.contextRunner.withPropertyValues("management.health.elasticsearch.enabled:false")
83-
.run((context) -> assertThat(context).doesNotHaveBean(ElasticsearchRestClientHealthIndicator.class)
81+
.run((context) -> assertThat(context).doesNotHaveBean(ElasticsearchRestHealthIndicator.class)
8482
.doesNotHaveBean("elasticsearchHealthContributor"));
8583
}
8684

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/elasticsearch/ElasticsearchReactiveHealthContributorAutoConfigurationTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ void runShouldCreateIndicator() {
5050
}
5151

5252
@Test
53-
@SuppressWarnings("deprecation")
5453
void runWithRegularIndicatorShouldOnlyCreateReactiveIndicator() {
5554
this.contextRunner
5655
.withConfiguration(AutoConfigurations.of(ElasticSearchRestHealthContributorAutoConfiguration.class))

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/elasticsearch/ElasticsearchRestClientHealthIndicator.java

Lines changed: 0 additions & 85 deletions
This file was deleted.

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/elasticsearch/ElasticsearchRestHealthIndicator.java

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,22 @@
1616

1717
package org.springframework.boot.actuate.elasticsearch;
1818

19+
import java.io.InputStream;
20+
import java.nio.charset.StandardCharsets;
21+
import java.util.Map;
22+
23+
import org.apache.http.HttpStatus;
24+
import org.apache.http.StatusLine;
25+
import org.elasticsearch.client.Request;
26+
import org.elasticsearch.client.Response;
1927
import org.elasticsearch.client.RestClient;
2028

29+
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
30+
import org.springframework.boot.actuate.health.Health;
2131
import org.springframework.boot.actuate.health.HealthIndicator;
32+
import org.springframework.boot.json.JsonParser;
33+
import org.springframework.boot.json.JsonParserFactory;
34+
import org.springframework.util.StreamUtils;
2235

2336
/**
2437
* {@link HealthIndicator} for an Elasticsearch cluster using a {@link RestClient}.
@@ -27,19 +40,51 @@
2740
* @author Brian Clozel
2841
* @author Filip Hrisafov
2942
* @since 2.1.1
30-
* @deprecated since 2.7.0 for removal in 2.9.0 in favor of
31-
* {@link ElasticsearchRestClientHealthIndicator}
3243
*/
33-
@Deprecated
34-
public class ElasticsearchRestHealthIndicator extends ElasticsearchRestClientHealthIndicator {
44+
public class ElasticsearchRestHealthIndicator extends AbstractHealthIndicator {
45+
46+
private static final String RED_STATUS = "red";
47+
48+
private final RestClient client;
49+
50+
private final JsonParser jsonParser;
3551

3652
@SuppressWarnings("deprecation")
3753
public ElasticsearchRestHealthIndicator(org.elasticsearch.client.RestHighLevelClient client) {
3854
this(client.getLowLevelClient());
3955
}
4056

4157
public ElasticsearchRestHealthIndicator(RestClient client) {
42-
super(client);
58+
super("Elasticsearch health check failed");
59+
this.client = client;
60+
this.jsonParser = JsonParserFactory.getJsonParser();
61+
}
62+
63+
@Override
64+
protected void doHealthCheck(Health.Builder builder) throws Exception {
65+
Response response = this.client.performRequest(new Request("GET", "/_cluster/health/"));
66+
StatusLine statusLine = response.getStatusLine();
67+
if (statusLine.getStatusCode() != HttpStatus.SC_OK) {
68+
builder.down();
69+
builder.withDetail("statusCode", statusLine.getStatusCode());
70+
builder.withDetail("reasonPhrase", statusLine.getReasonPhrase());
71+
return;
72+
}
73+
try (InputStream inputStream = response.getEntity().getContent()) {
74+
doHealthCheck(builder, StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8));
75+
}
76+
}
77+
78+
private void doHealthCheck(Health.Builder builder, String json) {
79+
Map<String, Object> response = this.jsonParser.parseMap(json);
80+
String status = (String) response.get("status");
81+
if (RED_STATUS.equals(status)) {
82+
builder.outOfService();
83+
}
84+
else {
85+
builder.up();
86+
}
87+
builder.withDetails(response);
4388
}
4489

4590
}

0 commit comments

Comments
 (0)