diff --git a/pom.xml b/pom.xml index 95277bc4e..b15ef1bea 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.springframework.cloud spring-cloud-build - 2.0.0.M2 + 2.0.0.BUILD-SNAPSHOT @@ -110,7 +110,7 @@ spring-cloud-stream-schema spring-cloud-stream-schema-server spring-cloud-stream-tools - spring-cloud-stream-metrics + diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplicationBuilder.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplicationBuilder.java index 70e7c05a2..5c9397797 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplicationBuilder.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/AggregateApplicationBuilder.java @@ -28,9 +28,7 @@ import java.util.Set; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.beans.factory.SmartInitializingSingleton; -import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; -import org.springframework.boot.actuate.endpoint.MetricReaderPublicMetrics; -import org.springframework.boot.actuate.endpoint.MetricsEndpoint; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration; @@ -46,7 +44,6 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; -import org.springframework.integration.monitor.IntegrationMBeanExporter; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -58,6 +55,7 @@ import org.springframework.util.StringUtils; * @author Marius Bogoevici * @author Venil Noronha * @author Janne Valkealahti + * @author Vinicius Carvalho */ @EnableBinding public class AggregateApplicationBuilder implements AggregateApplication, ApplicationContextAware, @@ -419,16 +417,7 @@ public class AggregateApplicationBuilder implements AggregateApplication, Applic e); } } - // Register metrics if JMX enabled and exporter avalable - if (BeanFactoryUtils.beansOfTypeIncludingAncestors(AggregateApplicationBuilder.this.parentContext, - IntegrationMBeanExporter.class).size() > 0) { - BeanFactoryUtils - .beanOfTypeIncludingAncestors(AggregateApplicationBuilder.this.parentContext, - MetricsEndpoint.class) - .registerPublicMetrics( - new MetricReaderPublicMetrics(new NamespaceAwareSpringIntegrationMetricReader( - this.namespace, childContext.getBean(IntegrationMBeanExporter.class)))); - } + } public AggregateApplication build() { diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/NamespaceAwareSpringIntegrationMetricReader.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/NamespaceAwareSpringIntegrationMetricReader.java deleted file mode 100644 index 6cdc70fd1..000000000 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/aggregate/NamespaceAwareSpringIntegrationMetricReader.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 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. - * 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.cloud.stream.aggregate; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import org.springframework.boot.actuate.metrics.Metric; -import org.springframework.boot.actuate.metrics.reader.MetricReader; -import org.springframework.integration.monitor.IntegrationMBeanExporter; -import org.springframework.integration.support.management.Statistics; -import org.springframework.util.Assert; - -/** - * A customized version of - * {@link org.springframework.boot.actuate.metrics.integration.SpringIntegrationMetricReader} - * that provides support for customizing channels with a namespace prefix. - * - * @author Marius Bogoevici - * @see org.springframework.boot.actuate.metrics.integration.SpringIntegrationMetricReader - * for original implementation - */ -public class NamespaceAwareSpringIntegrationMetricReader implements MetricReader { - - private final String namespace; - - private final IntegrationMBeanExporter exporter; - - public NamespaceAwareSpringIntegrationMetricReader(String namespace, IntegrationMBeanExporter exporter) { - Assert.hasText(namespace, "cannot be null or empty String"); - Assert.notNull(exporter, "cannot be null"); - this.namespace = namespace; - this.exporter = exporter; - } - - @Override - public Metric findOne(String metricName) { - return null; - } - - @Override - public Iterable> findAll() { - IntegrationMBeanExporter exporter = this.exporter; - List> metrics = new ArrayList>(); - for (String name : exporter.getChannelNames()) { - String prefix = "integration.channel." + namespace + "." + name; - metrics.addAll(getStatistics(prefix + ".errorRate", - exporter.getChannelErrorRate(name))); - metrics.add(new Metric(prefix + ".sendCount", - exporter.getChannelSendCountLong(name))); - metrics.addAll(getStatistics(prefix + ".sendRate", - exporter.getChannelSendRate(name))); - metrics.add(new Metric(prefix + ".receiveCount", - exporter.getChannelReceiveCountLong(name))); - } - for (String name : exporter.getHandlerNames()) { - metrics.addAll(getStatistics("integration." + namespace + ".handler." + name + ".duration", - exporter.getHandlerDuration(name))); - } - metrics.add(new Metric("integration." + namespace + ".activeHandlerCount", - exporter.getActiveHandlerCount())); - metrics.add(new Metric("integration." + namespace + ".handlerCount", - exporter.getHandlerCount())); - metrics.add(new Metric("integration." + namespace + ".channelCount", - exporter.getChannelCount())); - metrics.add(new Metric("integration." + namespace + ".queuedMessageCount", - exporter.getQueuedMessageCount())); - return metrics; - } - - private Collection> getStatistics(String name, - Statistics statistic) { - List> metrics = new ArrayList>(); - metrics.add(new Metric(name + ".mean", statistic.getMean())); - metrics.add(new Metric(name + ".max", statistic.getMax())); - metrics.add(new Metric(name + ".min", statistic.getMin())); - metrics.add( - new Metric(name + ".stdev", statistic.getStandardDeviation())); - metrics.add(new Metric(name + ".count", statistic.getCountLong())); - return metrics; - } - - @Override - public long count() { - int totalChannelCount = this.exporter.getChannelCount() * 11; - int totalHandlerCount = this.exporter.getHandlerCount() * 5; - return totalChannelCount + totalHandlerCount + 4; - } - -} diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindersHealthIndicatorAutoConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindersHealthIndicatorAutoConfiguration.java index 1e032a1e9..4712d265c 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindersHealthIndicatorAutoConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindersHealthIndicatorAutoConfiguration.java @@ -19,8 +19,8 @@ package org.springframework.cloud.stream.config; import java.util.Map; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.actuate.autoconfigure.ConditionalOnEnabledHealthIndicator; -import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.CompositeHealthIndicator; import org.springframework.boot.actuate.health.Health; diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ChannelsEndpointAutoConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ChannelsEndpointAutoConfiguration.java index 15d536f83..48b2014e9 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ChannelsEndpointAutoConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/ChannelsEndpointAutoConfiguration.java @@ -19,7 +19,7 @@ package org.springframework.cloud.stream.config; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -35,7 +35,7 @@ import org.springframework.context.annotation.Configuration; * @author Ilayaperumal Gopinathan */ @Configuration -@ConditionalOnClass(name = "org.springframework.boot.actuate.endpoint.Endpoint") +@ConditionalOnClass(name = "org.springframework.boot.actuate.endpoint.annotation.Endpoint") @ConditionalOnBean(BindingService.class) @AutoConfigureAfter(EndpointAutoConfiguration.class) public class ChannelsEndpointAutoConfiguration { diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/ChannelsEndpoint.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/ChannelsEndpoint.java index eb2f69fc2..0c2786168 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/ChannelsEndpoint.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/ChannelsEndpoint.java @@ -25,8 +25,8 @@ import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import org.springframework.boot.actuate.endpoint.AbstractEndpoint; -import org.springframework.boot.actuate.endpoint.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import org.springframework.cloud.stream.binding.Bindable; import org.springframework.cloud.stream.config.BindingProperties; import org.springframework.cloud.stream.config.BindingServiceProperties; @@ -37,21 +37,22 @@ import org.springframework.cloud.stream.config.BindingServiceProperties; * * @author Dave Syer * @author Ilayaperumal Gopinathan + * @author Vinicius Carvalho */ -public class ChannelsEndpoint extends AbstractEndpoint> { +@Endpoint(id = "channels") +public class ChannelsEndpoint { private List adapters; private BindingServiceProperties properties; public ChannelsEndpoint(List adapters, BindingServiceProperties properties) { - super("channels"); this.adapters = adapters; this.properties = properties; } - @Override - public Map invoke() { + @ReadOperation + public Map channels() { ChannelsMetaData map = new ChannelsMetaData(); Map inputs = map.getInputs(); Map outputs = map.getOutputs();