From 205d9c1a84786ad08c74869d4f5060744fc7f303 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sun, 24 Jan 2016 11:24:29 +0000 Subject: [PATCH] Move stream header environment properties to stream library --- .../TraceEnvironmentPostProcessor.java} | 28 +---- .../main/resources/META-INF/spring.factories | 2 +- .../StreamEnvironmentPostProcessor.java | 114 ++++++++++++++++++ .../main/resources/META-INF/spring.factories | 6 +- 4 files changed, 122 insertions(+), 28 deletions(-) rename spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/{bootstrap/TraceBootstrapEnvironmentPostProcessor.java => autoconfig/TraceEnvironmentPostProcessor.java} (68%) create mode 100644 spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/StreamEnvironmentPostProcessor.java diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java similarity index 68% rename from spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java rename to spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java index 86243ba02..6e7aae951 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/bootstrap/TraceBootstrapEnvironmentPostProcessor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java @@ -14,44 +14,30 @@ * limitations under the License. */ -package org.springframework.cloud.sleuth.bootstrap; +package org.springframework.cloud.sleuth.autoconfig; import java.util.HashMap; import java.util.Map; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.cloud.sleuth.Span; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; -import org.springframework.util.ClassUtils; /** * @author Dave Syer * */ -public class TraceBootstrapEnvironmentPostProcessor implements EnvironmentPostProcessor { +public class TraceEnvironmentPostProcessor implements EnvironmentPostProcessor { private static final String PROPERTY_SOURCE_NAME = "defaultProperties"; - private static String[] headers = new String[] { Span.SPAN_ID_NAME, - Span.TRACE_ID_NAME, Span.PARENT_ID_NAME, Span.PROCESS_ID_NAME, - Span.NOT_SAMPLED_NAME, Span.SPAN_NAME_NAME }; @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Map map = new HashMap(); - addHeaders(map, - "org.springframework.cloud.stream.binder.redis.RedisMessageChannelBinder", - "redis"); - addHeaders(map, - "org.springframework.cloud.stream.binder.rabbit.RabbitMessageChannelBinder", - "rabbit"); - addHeaders(map, - "org.springframework.cloud.stream.binder.kafka.KafkaMessageChannelBinder", - "kafka"); // This doesn't work with all logging systems but it's a useful default so you see // traces in logs without having to configure it. map.put("logging.pattern.level", @@ -81,14 +67,4 @@ public class TraceBootstrapEnvironmentPostProcessor implements EnvironmentPostPr } } - private void addHeaders(Map map, String type, String binder) { - if (ClassUtils.isPresent(type, null)) { - String stem = "spring.cloud.stream.binder." + binder + ".headers"; - for (int i = 0; i < headers.length; i++) { - map.put(stem + "[" + i + "]", headers[i]); - } - } - - } - } diff --git a/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories b/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories index d3e81a9f7..75a88c8f2 100644 --- a/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-sleuth-core/src/main/resources/META-INF/spring.factories @@ -14,4 +14,4 @@ org.springframework.cloud.sleuth.instrument.zuul.TraceZuulAutoConfiguration # Environment Post Processor org.springframework.boot.env.EnvironmentPostProcessor=\ -org.springframework.cloud.sleuth.bootstrap.TraceBootstrapEnvironmentPostProcessor +org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor diff --git a/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/StreamEnvironmentPostProcessor.java b/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/StreamEnvironmentPostProcessor.java new file mode 100644 index 000000000..4cb938205 --- /dev/null +++ b/spring-cloud-sleuth-stream/src/main/java/org/springframework/cloud/sleuth/stream/StreamEnvironmentPostProcessor.java @@ -0,0 +1,114 @@ +/* + * Copyright 2015 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.sleuth.stream; + +import java.io.IOException; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Properties; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.cloud.sleuth.Span; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; +import org.springframework.core.env.PropertySource; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.PropertiesLoaderUtils; + +/** + * @author Dave Syer + * + */ +public class StreamEnvironmentPostProcessor implements EnvironmentPostProcessor { + + private static final String PROPERTY_SOURCE_NAME = "defaultProperties"; + private static String[] headers = new String[] { Span.SPAN_ID_NAME, + Span.TRACE_ID_NAME, Span.PARENT_ID_NAME, Span.PROCESS_ID_NAME, + Span.NOT_SAMPLED_NAME, Span.SPAN_NAME_NAME }; + + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, + SpringApplication application) { + Map map = new HashMap(); + ResourceLoader resourceLoader = application.getResourceLoader(); + resourceLoader = resourceLoader==null ? new DefaultResourceLoader() : resourceLoader; + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver( + resourceLoader); + try { + for (Resource resource : resolver + .getResources("classpath:META-INF/spring.binders")) { + for (String binderType : parseBinderConfigurations(resource)) { + addHeaders(map, binderType); + } + } + } + catch (IOException e) { + throw new IllegalStateException("Cannot load META-INF/spring.binders", e); + } + addOrReplace(environment.getPropertySources(), map); + } + + private Collection parseBinderConfigurations(Resource resource) { + Collection keys = new HashSet<>(); + try { + Properties props = PropertiesLoaderUtils.loadProperties(resource); + for (Object object : props.keySet()) { + keys.add(object.toString()); + } + } + catch (IOException e) { + } + return keys; + } + + private void addOrReplace(MutablePropertySources propertySources, + Map map) { + MapPropertySource target = null; + if (propertySources.contains(PROPERTY_SOURCE_NAME)) { + PropertySource source = propertySources.get(PROPERTY_SOURCE_NAME); + if (source instanceof MapPropertySource) { + target = (MapPropertySource) source; + for (String key : map.keySet()) { + if (!target.containsProperty(key)) { + target.getSource().put(key, map.get(key)); + } + } + } + } + if (target == null) { + target = new MapPropertySource(PROPERTY_SOURCE_NAME, map); + } + if (!propertySources.contains(PROPERTY_SOURCE_NAME)) { + propertySources.addLast(target); + } + } + + private void addHeaders(Map map, String binder) { + String stem = "spring.cloud.stream.binder." + binder + ".headers"; + for (int i = 0; i < headers.length; i++) { + map.put(stem + "[" + i + "]", headers[i]); + } + } + +} diff --git a/spring-cloud-sleuth-stream/src/main/resources/META-INF/spring.factories b/spring-cloud-sleuth-stream/src/main/resources/META-INF/spring.factories index 5decfc96e..17b85313b 100644 --- a/spring-cloud-sleuth-stream/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-sleuth-stream/src/main/resources/META-INF/spring.factories @@ -1,3 +1,7 @@ # Auto Configuration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.sleuth.stream.SleuthStreamAutoConfiguration \ No newline at end of file +org.springframework.cloud.sleuth.stream.SleuthStreamAutoConfiguration + +# Environment Post Processor +org.springframework.boot.env.EnvironmentPostProcessor=\ +org.springframework.cloud.sleuth.stream.StreamEnvironmentPostProcessor \ No newline at end of file