Move stream header environment properties to stream library

This commit is contained in:
Dave Syer
2016-01-24 11:24:29 +00:00
parent 8258289550
commit 205d9c1a84
4 changed files with 122 additions and 28 deletions

View File

@@ -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<String, Object> map = new HashMap<String, Object>();
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<String, Object> 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]);
}
}
}
}

View File

@@ -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

View File

@@ -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<String, Object> map = new HashMap<String, Object>();
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<String> parseBinderConfigurations(Resource resource) {
Collection<String> 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<String, Object> 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<String, Object> 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]);
}
}
}

View File

@@ -1,3 +1,7 @@
# Auto Configuration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.sleuth.stream.SleuthStreamAutoConfiguration
org.springframework.cloud.sleuth.stream.SleuthStreamAutoConfiguration
# Environment Post Processor
org.springframework.boot.env.EnvironmentPostProcessor=\
org.springframework.cloud.sleuth.stream.StreamEnvironmentPostProcessor