001/*
002 * Copyright 2012-2018 the original author or authors.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017package org.springframework.boot.actuate.autoconfigure.elasticsearch;
018
019import java.time.Duration;
020import java.util.Map;
021
022import org.elasticsearch.client.Client;
023
024import org.springframework.boot.actuate.autoconfigure.health.CompositeHealthIndicatorConfiguration;
025import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator;
026import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
027import org.springframework.boot.actuate.elasticsearch.ElasticsearchHealthIndicator;
028import org.springframework.boot.actuate.health.HealthIndicator;
029import org.springframework.boot.autoconfigure.AutoConfigureAfter;
030import org.springframework.boot.autoconfigure.AutoConfigureBefore;
031import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
032import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
033import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
034import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
035import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration;
036import org.springframework.boot.context.properties.EnableConfigurationProperties;
037import org.springframework.context.annotation.Bean;
038import org.springframework.context.annotation.Configuration;
039
040/**
041 * {@link EnableAutoConfiguration Auto-configuration} for
042 * {@link ElasticsearchHealthIndicator} using the Elasticsearch {@link Client}.
043 *
044 * @author Stephane Nicoll
045 * @since 2.1.0
046 */
047@Configuration
048@ConditionalOnClass(Client.class)
049@ConditionalOnBean(Client.class)
050@ConditionalOnEnabledHealthIndicator("elasticsearch")
051@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)
052@AutoConfigureAfter(ElasticsearchAutoConfiguration.class)
053@EnableConfigurationProperties(ElasticsearchHealthIndicatorProperties.class)
054public class ElasticSearchClientHealthIndicatorAutoConfiguration extends
055                CompositeHealthIndicatorConfiguration<ElasticsearchHealthIndicator, Client> {
056
057        private final Map<String, Client> clients;
058
059        private final ElasticsearchHealthIndicatorProperties properties;
060
061        public ElasticSearchClientHealthIndicatorAutoConfiguration(
062                        Map<String, Client> clients,
063                        ElasticsearchHealthIndicatorProperties properties) {
064                this.clients = clients;
065                this.properties = properties;
066        }
067
068        @Bean
069        @ConditionalOnMissingBean(name = "elasticsearchHealthIndicator")
070        public HealthIndicator elasticsearchHealthIndicator() {
071                return createHealthIndicator(this.clients);
072        }
073
074        @Override
075        protected ElasticsearchHealthIndicator createHealthIndicator(Client client) {
076                Duration responseTimeout = this.properties.getResponseTimeout();
077                return new ElasticsearchHealthIndicator(client,
078                                (responseTimeout != null) ? responseTimeout.toMillis() : 100,
079                                this.properties.getIndices());
080        }
081
082}