diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..323872eea
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+root=true
+
+[*.java]
+indent_style = tab
+indent_size = 4
+continuation_indent_size = 8
+
+[*.groovy]
+indent_style = tab
+indent_size = 4
+continuation_indent_size = 8
+
+[*.xml]
+indent_style = tab
+indent_size = 4
+continuation_indent_size = 8
\ No newline at end of file
diff --git a/.springformat b/.springformat
new file mode 100644
index 000000000..e69de29bb
diff --git a/pom.xml b/pom.xml
index 9d9c9869b..4cd626149 100644
--- a/pom.xml
+++ b/pom.xml
@@ -115,6 +115,10 @@
org.apache.maven.pluginsmaven-checkstyle-plugin
+
+ io.spring.javaformat
+ spring-javaformat-maven-plugin
+
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/DefaultSpanNamer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/DefaultSpanNamer.java
index a902a9faf..1bbfc9ddb 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/DefaultSpanNamer.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/DefaultSpanNamer.java
@@ -23,17 +23,24 @@ import org.springframework.core.annotation.AnnotationUtils;
/**
* Default implementation of SpanNamer that tries to get the span name as follows:
*
- *
- *
from the @SpanName annotation on the class if one is present
- *
from the @SpanName annotation on the method if passed object is of a {@link Method} type
- *
from the toString() of the delegate if it's not the
- * default {@link Object#toString()}
- *
the default provided value
+ *
+ *
+ * from the @SpanName annotation on the class if one is present.
+ *
+ *
+ * from the @SpanName annotation on the method if passed object is of a {@link Method}.
+ * type
+ *
+ *
+ * from the toString() of the delegate if it's not the default {@link Object#toString()}.
+ *
+ *
+ * the default provided value.
+ *
*
*
* @author Marcin Grzejszczak
* @since 1.0.0
- *
* @see SpanName
*/
public class DefaultSpanNamer implements SpanNamer {
@@ -53,15 +60,15 @@ public class DefaultSpanNamer implements SpanNamer {
if (o instanceof Method) {
return AnnotationUtils.findAnnotation((Method) o, SpanName.class);
}
- return AnnotationUtils
- .findAnnotation(o.getClass(), SpanName.class);
+ return AnnotationUtils.findAnnotation(o.getClass(), SpanName.class);
}
private static boolean isDefaultToString(Object delegate, String spanName) {
if (delegate instanceof Method) {
return delegate.toString().equals(spanName);
}
- return (delegate.getClass().getName() + "@" +
- Integer.toHexString(delegate.hashCode())).equals(spanName);
+ return (delegate.getClass().getName() + "@"
+ + Integer.toHexString(delegate.hashCode())).equals(spanName);
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanAdjuster.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanAdjuster.java
index e3a833a5b..72eb3ba21 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanAdjuster.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanAdjuster.java
@@ -19,19 +19,27 @@ package org.springframework.cloud.sleuth;
import zipkin2.Span;
/**
+ * Deprecated Span Adjuster.
+ *
* @deprecated use {@link brave.handler.FinishedSpanHandler}
+ * @author Marcin Grzejszczak
*/
@Deprecated
public interface SpanAdjuster {
+
/**
- * You can adjust the {@link zipkin2.Span} by creating a new one using the {@link Span#toBuilder()}
- * before reporting it.
+ * You can adjust the {@link zipkin2.Span} by creating a new one using the
+ * {@link Span#toBuilder()} before reporting it.
*
- * With the legacy Sleuth approach we're generating spans with a fixed name. Some users want to modify the name
- * depending on some values of tags. Implementation of this interface can be used to alter
- * then name. Example:
+ * With the legacy Sleuth approach we're generating spans with a fixed name. Some
+ * users want to modify the name depending on some values of tags. Implementation of
+ * this interface can be used to alter then name. Example:
*
* {@code span -> span.toBuilder().name(scrub(span.getName())).build();}
+ *
+ * @param - span to adjust
+ * @return - adjusted span
*/
Span adjust(Span span);
-}
\ No newline at end of file
+
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanName.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanName.java
index 78115f22f..c45a1d983 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanName.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanName.java
@@ -23,16 +23,15 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Annotation to provide the name for the span. You should annotate all your
- * custom {@link Runnable Runnable} or {@link java.util.concurrent.Callable Callable} classes
- * for the instrumentation logic to pick up how to name the span.
+ * Annotation to provide the name for the span. You should annotate all your custom
+ * {@link Runnable Runnable} or {@link java.util.concurrent.Callable Callable} classes for
+ * the instrumentation logic to pick up how to name the span.
*
*
- * Having for example the following code
- *
{@code
- * @SpanName("custom-operation")
+ * Having for example the following code
{@code
+ * @SpanName("custom-operation")
* class CustomRunnable implements Runnable {
- * @Override
+ * @Override
* public void run() {
* // latency of this method will be recorded in a span named "custom-operation"
* }
@@ -42,21 +41,21 @@ import java.lang.annotation.Target;
* Will result in creating a span with name {@code custom-operation}.
*
*
- * When there's no @SpanName annotation, {@code toString} is used. Here's an
- * example of the above, but via an anonymous instance.
- *
{@code
+ * When there's no @SpanName annotation, {@code toString} is used. Here's an example of
+ * the above, but via an anonymous instance.
*
- * Starting with version {@code 1.3.0} you can also put the annotation on an {@link org.springframework.scheduling.annotation.Async}
- * annotated method and the value of that annotation will be used as the span name.
+ * Starting with version {@code 1.3.0} you can also put the annotation on an
+ * {@link org.springframework.scheduling.annotation.Async} annotated method and the value
+ * of that annotation will be used as the span name.
*
* @author Marcin Grzejszczak
* @since 1.0.0
@@ -65,8 +64,11 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SpanName {
+
/**
- * Name of the span to be resolved at runtime
+ * Name of the span to be resolved at runtime.
+ * @return - value of the span name.
*/
String value();
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java
index 53ec24365..1a5bd93e4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanNamer.java
@@ -17,10 +17,9 @@
package org.springframework.cloud.sleuth;
/**
- * Describes how for a given object a span should be named. In the vast majority
- * of cases a name should be provided explicitly. In case of instrumentation
- * where the name has to be resolved at runtime this interface will provide
- * the name of the span.
+ * Describes how for a given object a span should be named. In the vast majority of cases
+ * a name should be provided explicitly. In case of instrumentation where the name has to
+ * be resolved at runtime this interface will provide the name of the span.
*
* @author Marcin Grzejszczak
* @since 1.0.0
@@ -29,10 +28,11 @@ public interface SpanNamer {
/**
* Retrieves the span name for the given object.
- *
* @param object - object for which span name should be picked
- * @param defaultValue - the default valued to be returned if span name can't be calculated
+ * @param defaultValue - the default valued to be returned if span name can't be
+ * calculated
* @return span name
*/
String name(Object object, String defaultValue);
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java
index dc956f40a..a6ca43ac1 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/AbstractSleuthMethodInvocationProcessor.java
@@ -26,18 +26,26 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
/**
+ * Sleuth annotation processor
+ *
* @author Marcin Grzejszczak
*/
abstract class AbstractSleuthMethodInvocationProcessor
implements SleuthMethodInvocationProcessor, BeanFactoryAware {
+
private static final Log logger = LogFactory
.getLog(AbstractSleuthMethodInvocationProcessor.class);
+
private static final String CLASS_KEY = "class";
+
private static final String METHOD_KEY = "method";
BeanFactory beanFactory;
+
private NewSpanParser newSpanParser;
+
private Tracer tracer;
+
private SpanTagAnnotationHandler spanTagAnnotationHandler;
void before(MethodInvocation invocation, Span span, String log, boolean hasLog) {
@@ -111,7 +119,9 @@ abstract class AbstractSleuthMethodInvocationProcessor
return this.spanTagAnnotationHandler;
}
- @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+ @Override
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java
index a1c183a04..8b36b7877 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ContinueSpan.java
@@ -23,20 +23,25 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
- * Tells Sleuth that all Sleuth related annotations should be applied
- * to an existing span instead of creating a new one.
+ * Tells Sleuth that all Sleuth related annotations should be applied to an existing span
+ * instead of creating a new one.
*
* @author Marcin Grzejszczak
* @since 1.2.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited
-@Target(value = { ElementType.METHOD })
+@Target(value = {
+ ElementType.METHOD
+})
public @interface ContinueSpan {
/**
- * The value passed to the annotation will be used and the framework
- * will create two events with the {@code .start} and {@code .end} suffixes
+ * Log statement to be appended to the span.
+ *
+ * @return - the value passed to the annotation will be used and the framework will create two
+ * events with the {@code .start} and {@code .end} suffixes.
*/
String log() default "";
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java
index e2dd913ba..090948144 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/DefaultSpanCreator.java
@@ -23,24 +23,24 @@ import org.springframework.cloud.sleuth.util.SpanNameUtil;
import org.springframework.util.StringUtils;
/**
- * Default implementation of the {@link NewSpanParser} that parses only the
- * span name.
+ * Default implementation of the {@link NewSpanParser} that parses only the span name.
*
* @author Christian Schwerdtfeger
* @since 1.2.0
*/
-class DefaultNewSpanParser implements NewSpanParser {
+class DefaultSpanCreator implements NewSpanParser {
- private static final Log log = LogFactory.getLog(DefaultNewSpanParser.class);
+ private static final Log log = LogFactory.getLog(DefaultSpanCreator.class);
@Override
public void parse(MethodInvocation pjp, NewSpan newSpan, SpanCustomizer span) {
- String name = newSpan == null || StringUtils.isEmpty(newSpan.name()) ?
- pjp.getMethod().getName() : newSpan.name();
+ String name = newSpan == null || StringUtils.isEmpty(newSpan.name())
+ ? pjp.getMethod().getName() : newSpan.name();
String changedName = SpanNameUtil.toLowerHyphen(name);
if (log.isDebugEnabled()) {
- log.debug("For the class [" + pjp.getThis().getClass() + "] method "
- + "[" + pjp.getMethod().getName() + "] will name the span [" + changedName + "]");
+ log.debug("For the class [" + pjp.getThis().getClass() + "] method " + "["
+ + pjp.getMethod().getName() + "] will name the span [" + changedName
+ + "]");
}
span.name(changedName);
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java
index 34a060dc8..af5e215bf 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpan.java
@@ -24,13 +24,13 @@ import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
/**
- * Allows to create a new span around a public method. The new span
- * will be either a child of an existing span if a trace is already in progress
- * or a new span will be created if there was no previous trace.
+ * Allows to create a new span around a public method. The new span will be either a child
+ * of an existing span if a trace is already in progress or a new span will be created if
+ * there was no previous trace.
*
- * Method parameters can be annotated with {@link SpanTag}, which will end
- * in adding the parameter value as a tag value to the span. The tag key will be
- * the value of the {@code key} annotation from {@link SpanTag}.
+ * Method parameters can be annotated with {@link SpanTag}, which will end in adding the
+ * parameter value as a tag value to the span. The tag key will be the value of the
+ * {@code key} annotation from {@link SpanTag}.
*
*
* @author Christian Schwerdtfeger
@@ -38,17 +38,21 @@ import org.springframework.core.annotation.AliasFor;
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited
-@Target(value = { ElementType.METHOD })
+@Target(value = {
+ ElementType.METHOD
+})
public @interface NewSpan {
/**
- * The name of the span which will be created. Default is the annotated method's name separated by hyphens.
+ * @return - The name of the span which will be created. Default is the annotated method's name
+ * separated by hyphens.
*/
@AliasFor("value")
String name() default "";
/**
- * The name of the span which will be created. Default is the annotated method's name separated by hyphens.
+ * @return - The name of the span which will be created. Default is the annotated method's name
+ * separated by hyphens.
*/
@AliasFor("name")
String value() default "";
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java
index 91a31a60b..68d93fc0f 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NewSpanParser.java
@@ -27,6 +27,13 @@ import org.aopalliance.intercept.MethodInvocation;
*/
public interface NewSpanParser {
- /** Override to control the name and tags on an annotation-based span */
+ /**
+ * Override to control the name and tags on an annotation-based span.
+ *
+ * @param methodInvocation
+ * @param newSpan
+ * @param span
+ */
void parse(MethodInvocation methodInvocation, NewSpan newSpan, SpanCustomizer span);
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java
index e33267f31..603d47589 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NoOpTagValueResolver.java
@@ -17,13 +17,16 @@
package org.springframework.cloud.sleuth.annotation;
/**
- * Does nothing
+ * Does nothing.
*
* @author Marcin Grzejszczak
* @since 1.2.0
*/
class NoOpTagValueResolver implements TagValueResolver {
- @Override public String resolve(Object parameter) {
+
+ @Override
+ public String resolve(Object parameter) {
return null;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java
index 09074c0c3..9e5382fe8 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/NonReactorSleuthMethodInvocationProcessor.java
@@ -22,20 +22,25 @@ import org.aopalliance.intercept.MethodInvocation;
import org.springframework.util.StringUtils;
/**
+ * Method Invocation processor for non reactor apps.
+ *
* @author Marcin Grzejszczak
* @since 2.1.0
*/
-class NonReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocationProcessor {
+class NonReactorSleuthMethodInvocationProcessor
+ extends AbstractSleuthMethodInvocationProcessor {
- @Override public Object process(MethodInvocation invocation, NewSpan newSpan,
- ContinueSpan continueSpan) throws Throwable {
+ @Override
+ public Object process(MethodInvocation invocation, NewSpan newSpan,
+ ContinueSpan continueSpan) throws Throwable {
return proceedUnderSynchronousSpan(invocation, newSpan, continueSpan);
}
- private Object proceedUnderSynchronousSpan(
- MethodInvocation invocation, NewSpan newSpan, ContinueSpan continueSpan) throws Throwable {
+ private Object proceedUnderSynchronousSpan(MethodInvocation invocation,
+ NewSpan newSpan, ContinueSpan continueSpan) throws Throwable {
Span span = tracer().currentSpan();
- //in case of @ContinueSpan and no span in tracer we start new span and should close it on completion
+ // in case of @ContinueSpan and no span in tracer we start new span and should
+ // close it on completion
boolean startNewSpan = newSpan != null || span == null;
if (startNewSpan) {
span = tracer().nextSpan();
@@ -47,11 +52,14 @@ class NonReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvo
try (Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
before(invocation, span, log, hasLog);
return invocation.proceed();
- } catch (Exception e) {
- onFailure(span, log, hasLog, e);
- throw e;
- } finally {
+ }
+ catch (Exception ex) {
+ onFailure(span, log, hasLog, ex);
+ throw ex;
+ }
+ finally {
after(span, startNewSpan, log, hasLog);
}
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java
index c1f105cf5..1c2fa7c9f 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/ReactorSleuthMethodInvocationProcessor.java
@@ -30,39 +30,46 @@ import reactor.core.publisher.Mono;
import reactor.core.publisher.SignalType;
/**
+ * Method Invocation Processor for Reactor.
+ *
* @author Marcin Grzejszczak
* @since 2.1.0
*/
-class ReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocationProcessor {
+class ReactorSleuthMethodInvocationProcessor
+ extends AbstractSleuthMethodInvocationProcessor {
private NonReactorSleuthMethodInvocationProcessor nonReactorSleuthMethodInvocationProcessor;
- @Override public Object process(MethodInvocation invocation, NewSpan newSpan,
+ @Override
+ public Object process(MethodInvocation invocation, NewSpan newSpan,
ContinueSpan continueSpan) throws Throwable {
Method method = invocation.getMethod();
- if(isReactorReturnType(method.getReturnType())){
+ if (isReactorReturnType(method.getReturnType())) {
return proceedUnderReactorSpan(invocation, newSpan, continueSpan);
- } else {
- return nonReactorSleuthMethodInvocationProcessor()
- .process(invocation, newSpan, continueSpan);
+ }
+ else {
+ return nonReactorSleuthMethodInvocationProcessor().process(invocation,
+ newSpan, continueSpan);
}
}
- private Object proceedUnderReactorSpan(
- MethodInvocation invocation, NewSpan newSpan, ContinueSpan continueSpan) throws Throwable{
+ private Object proceedUnderReactorSpan(MethodInvocation invocation, NewSpan newSpan,
+ ContinueSpan continueSpan) throws Throwable {
Span spanPrevious = tracer().currentSpan();
- //in case of @ContinueSpan and no span in tracer we start new span and should close it on completion
+ // in case of @ContinueSpan and no span in tracer we start new span and should
+ // close it on completion
boolean startNewSpan = newSpan != null || spanPrevious == null;
Span span;
if (startNewSpan) {
span = tracer().nextSpan();
newSpanParser().parse(invocation, newSpan, span);
- } else {
+ }
+ else {
span = spanPrevious;
}
String log = log(continueSpan);
boolean hasLog = StringUtils.hasText(log);
- try(Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
+ try (Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
Publisher> publisher = (Publisher) invocation.proceed();
Mono startSpan = Mono.defer(() -> withSpanInScope(span, () -> {
if (startNewSpan) {
@@ -71,35 +78,43 @@ class ReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocat
before(invocation, span, log, hasLog);
return Mono.just(span);
}));
- if(publisher instanceof Mono){
- return startSpan.flatMap(spanStarted -> ((Mono>)publisher)
- .doOnError(onFailureReactor(log, hasLog, spanStarted))
- .doFinally(afterReactor(startNewSpan, log, hasLog, spanStarted)))
- //put span in context so it can be used by ScopePassingSpanSubscriber
+ if (publisher instanceof Mono) {
+ return startSpan
+ .flatMap(spanStarted -> ((Mono>) publisher)
+ .doOnError(onFailureReactor(log, hasLog, spanStarted))
+ .doFinally(afterReactor(startNewSpan, log, hasLog,
+ spanStarted)))
+ // put span in context so it can be used by
+ // ScopePassingSpanSubscriber
.subscriberContext(context -> context.put(Span.class, span));
}
- else if(publisher instanceof Flux){
- return startSpan.flatMapMany(spanStarted -> ((Flux>)publisher)
- .doOnError(onFailureReactor(log, hasLog, spanStarted))
- .doFinally(afterReactor(startNewSpan, log, hasLog, spanStarted)))
- //put span in context so it can be used by ScopePassingSpanSubscriber
+ else if (publisher instanceof Flux) {
+ return startSpan
+ .flatMapMany(spanStarted -> ((Flux>) publisher)
+ .doOnError(onFailureReactor(log, hasLog, spanStarted))
+ .doFinally(afterReactor(startNewSpan, log, hasLog,
+ spanStarted)))
+ // put span in context so it can be used by
+ // ScopePassingSpanSubscriber
.subscriberContext(context -> context.put(Span.class, span));
}
else {
- throw new IllegalArgumentException("Unexpected type of publisher: "+publisher.getClass());
+ throw new IllegalArgumentException(
+ "Unexpected type of publisher: " + publisher.getClass());
}
}
}
private T withSpanInScope(Span span, Supplier supplier) {
- try(Tracer.SpanInScope ws1 = tracer().withSpanInScope(span)) {
+ try (Tracer.SpanInScope ws1 = tracer().withSpanInScope(span)) {
return supplier.get();
}
}
- private Consumer afterReactor(boolean isNewSpan, String log, boolean hasLog, Span span) {
+ private Consumer afterReactor(boolean isNewSpan, String log,
+ boolean hasLog, Span span) {
return signalType -> {
- try(Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
+ try (Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
after(span, isNewSpan, log, hasLog);
}
};
@@ -107,7 +122,7 @@ class ReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocat
private Consumer onFailureReactor(String log, boolean hasLog, Span span) {
return throwable -> {
- try(Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
+ try (Tracer.SpanInScope ws = tracer().withSpanInScope(span)) {
onFailure(span, log, hasLog, throwable);
}
};
@@ -120,8 +135,10 @@ class ReactorSleuthMethodInvocationProcessor extends AbstractSleuthMethodInvocat
private NonReactorSleuthMethodInvocationProcessor nonReactorSleuthMethodInvocationProcessor() {
if (this.nonReactorSleuthMethodInvocationProcessor == null) {
this.nonReactorSleuthMethodInvocationProcessor = new NonReactorSleuthMethodInvocationProcessor();
- this.nonReactorSleuthMethodInvocationProcessor.setBeanFactory(this.beanFactory);
+ this.nonReactorSleuthMethodInvocationProcessor
+ .setBeanFactory(this.beanFactory);
}
return this.nonReactorSleuthMethodInvocationProcessor;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java
index b5780d291..c326f73bc 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAdvisorConfig.java
@@ -37,8 +37,8 @@ import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.ReflectionUtils;
/**
- * Custom pointcut advisor that picks all classes / interfaces that
- * have the Sleuth related annotations.
+ * Custom pointcut advisor that picks all classes / interfaces that have the Sleuth
+ * related annotations.
*
* @author Marcin Grzejszczak
* @since 1.2.0
@@ -88,22 +88,26 @@ class SleuthAdvisorConfig extends AbstractPointcutAdvisor implements BeanFactory
}
/**
- * Checks if a class or a method is is annotated with Sleuth related annotations
+ * Checks if a class or a method is is annotated with Sleuth related annotations.
*/
- private final class AnnotationClassOrMethodOrArgsPointcut extends
- DynamicMethodMatcherPointcut {
+ private final class AnnotationClassOrMethodOrArgsPointcut
+ extends DynamicMethodMatcherPointcut {
@Override
public boolean matches(Method method, Class> targetClass, Object... args) {
- //Skip check here as actual check takes place in SleuthInterceptor.invoke(MethodInvocation)
+ // Skip check here as actual check takes place in
+ // SleuthInterceptor.invoke(MethodInvocation)
return true;
}
- @Override public ClassFilter getClassFilter() {
+ @Override
+ public ClassFilter getClassFilter() {
return new ClassFilter() {
- @Override public boolean matches(Class> clazz) {
- return new AnnotationClassOrMethodFilter(NewSpan.class).matches(clazz) ||
- new AnnotationClassOrMethodFilter(ContinueSpan.class).matches(clazz);
+ @Override
+ public boolean matches(Class> clazz) {
+ return new AnnotationClassOrMethodFilter(NewSpan.class).matches(clazz)
+ || new AnnotationClassOrMethodFilter(ContinueSpan.class)
+ .matches(clazz);
}
};
}
@@ -127,39 +131,45 @@ class SleuthAdvisorConfig extends AbstractPointcutAdvisor implements BeanFactory
}
/**
- * Checks if a method is properly annotated with a given Sleuth annotation
+ * Checks if a method is properly annotated with a given Sleuth annotation.
*/
private static class AnnotationMethodsResolver {
private final Class extends Annotation> annotationType;
- public AnnotationMethodsResolver(Class extends Annotation> annotationType) {
+ AnnotationMethodsResolver(Class extends Annotation> annotationType) {
this.annotationType = annotationType;
}
- public boolean hasAnnotatedMethods(Class> clazz) {
+ boolean hasAnnotatedMethods(Class> clazz) {
final AtomicBoolean found = new AtomicBoolean(false);
- ReflectionUtils.doWithMethods(clazz, method -> {
+ ReflectionUtils.doWithMethods(clazz, (method -> {
if (found.get()) {
return;
}
Annotation annotation = AnnotationUtils.findAnnotation(method,
AnnotationMethodsResolver.this.annotationType);
- if (annotation != null) { found.set(true); }
- });
+ if (annotation != null) {
+ found.set(true);
+ }
+ }));
return found.get();
}
}
+
}
/**
- * Interceptor that creates or continues a span depending on the provided
- * annotation. Also it adds logs and tags if necessary.
+ * Interceptor that creates or continues a span depending on the provided annotation. Also
+ * it adds logs and tags if necessary.
+ *
+ * @author Marcin Grzejszczak
*/
-class SleuthInterceptor implements IntroductionInterceptor, BeanFactoryAware {
+class SleuthInterceptor implements IntroductionInterceptor, BeanFactoryAware {
private BeanFactory beanFactory;
+
private SleuthMethodInvocationProcessor methodInvocationProcessor;
@Override
@@ -168,10 +178,12 @@ class SleuthInterceptor implements IntroductionInterceptor, BeanFactoryAware {
if (method == null) {
return invocation.proceed();
}
- Method mostSpecificMethod = AopUtils
- .getMostSpecificMethod(method, invocation.getThis().getClass());
- NewSpan newSpan = SleuthAnnotationUtils.findAnnotation(mostSpecificMethod, NewSpan.class);
- ContinueSpan continueSpan = SleuthAnnotationUtils.findAnnotation(mostSpecificMethod, ContinueSpan.class);
+ Method mostSpecificMethod = AopUtils.getMostSpecificMethod(method,
+ invocation.getThis().getClass());
+ NewSpan newSpan = SleuthAnnotationUtils.findAnnotation(mostSpecificMethod,
+ NewSpan.class);
+ ContinueSpan continueSpan = SleuthAnnotationUtils
+ .findAnnotation(mostSpecificMethod, ContinueSpan.class);
if (newSpan == null && continueSpan == null) {
return invocation.proceed();
}
@@ -180,16 +192,20 @@ class SleuthInterceptor implements IntroductionInterceptor, BeanFactoryAware {
private SleuthMethodInvocationProcessor methodInvocationProcessor() {
if (this.methodInvocationProcessor == null) {
- this.methodInvocationProcessor = this.beanFactory.getBean(SleuthMethodInvocationProcessor.class);
+ this.methodInvocationProcessor = this.beanFactory
+ .getBean(SleuthMethodInvocationProcessor.class);
}
return this.methodInvocationProcessor;
}
- @Override public boolean implementsInterface(Class> intf) {
+ @Override
+ public boolean implementsInterface(Class> intf) {
return true;
}
- @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
+ @Override
+ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java
index bbea6c381..4c253528d 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotatedParameter.java
@@ -16,8 +16,8 @@
package org.springframework.cloud.sleuth.annotation;
/**
- * A container class that holds information about the parameter
- * of the annotated method argument.
+ * A container class that holds information about the parameter of the annotated method
+ * argument.
*
* @author Christian Schwerdtfeger
* @since 1.2.0
@@ -25,11 +25,12 @@ package org.springframework.cloud.sleuth.annotation;
class SleuthAnnotatedParameter {
final int parameterIndex;
+
final SpanTag annotation;
+
final Object argument;
- SleuthAnnotatedParameter(int parameterIndex, SpanTag annotation,
- Object argument) {
+ SleuthAnnotatedParameter(int parameterIndex, SpanTag annotation, Object argument) {
this.parameterIndex = parameterIndex;
this.annotation = annotation;
this.argument = argument;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java
index d822bed10..714c93861 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationAutoConfiguration.java
@@ -30,9 +30,9 @@ import org.springframework.context.annotation.Role;
/**
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} that allows creating spans by means of a
- * {@link NewSpan} annotation. You can annotate classes or just methods.
- * You can also apply this annotation to an interface.
+ * Auto-configuration} that allows creating spans by means of a {@link NewSpan}
+ * annotation. You can annotate classes or just methods. You can also apply this
+ * annotation to an interface.
*
* @author Christian Schwerdtfeger
* @author Marcin Grzejszczak
@@ -44,24 +44,28 @@ import org.springframework.context.annotation.Role;
@ConditionalOnProperty(name = "spring.sleuth.annotation.enabled", matchIfMissing = true)
@AutoConfigureAfter(TraceAutoConfiguration.class)
public class SleuthAnnotationAutoConfiguration {
-
+
@Bean
- @ConditionalOnMissingBean NewSpanParser newSpanParser() {
- return new DefaultNewSpanParser();
+ @ConditionalOnMissingBean
+ NewSpanParser newSpanParser() {
+ return new DefaultSpanCreator();
}
@Bean
- @ConditionalOnMissingBean TagValueExpressionResolver spelTagValueExpressionResolver() {
+ @ConditionalOnMissingBean
+ TagValueExpressionResolver spelTagValueExpressionResolver() {
return new SpelTagValueExpressionResolver();
}
@Bean
- @ConditionalOnMissingBean TagValueResolver noOpTagValueResolver() {
+ @ConditionalOnMissingBean
+ TagValueResolver noOpTagValueResolver() {
return new NoOpTagValueResolver();
}
@Bean
- @Role(BeanDefinition.ROLE_INFRASTRUCTURE) SleuthAdvisorConfig sleuthAdvisorConfig() {
+ @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+ SleuthAdvisorConfig sleuthAdvisorConfig() {
return new SleuthAdvisorConfig();
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationProperties.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationProperties.java
index 87cfa0b70..ed8f7ffa4 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationProperties.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationProperties.java
@@ -19,7 +19,7 @@ package org.springframework.cloud.sleuth.annotation;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
- * Sleuth annotation settings
+ * Sleuth annotation settings.
*
* @author Marcin Grzejszczak
* @since 1.2.0
@@ -36,4 +36,5 @@ public class SleuthAnnotationProperties {
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java
index b08b24c7d..07b3aad53 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthAnnotationUtils.java
@@ -26,33 +26,39 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.core.annotation.AnnotationUtils;
/**
- * Utility class that can verify whether the method is annotated with
- * the Sleuth annotations.
+ * Utility class that can verify whether the method is annotated with the Sleuth
+ * annotations.
*
* @author Christian Schwerdtfeger
* @since 1.2.0
*/
class SleuthAnnotationUtils {
+ private SleuthAnnotationUtils() {
+
+ }
+
private static final Log log = LogFactory.getLog(SleuthAnnotationUtils.class);
static boolean isMethodAnnotated(Method method) {
- return findAnnotation(method, NewSpan.class) != null ||
- findAnnotation(method, ContinueSpan.class) != null;
+ return findAnnotation(method, NewSpan.class) != null
+ || findAnnotation(method, ContinueSpan.class) != null;
}
static boolean hasAnnotatedParams(Method method, Object[] args) {
return !findAnnotatedParameters(method, args).isEmpty();
}
- static List findAnnotatedParameters(Method method, Object[] args) {
+ static List findAnnotatedParameters(Method method,
+ Object[] args) {
Annotation[][] parameters = method.getParameterAnnotations();
List result = new ArrayList<>();
int i = 0;
for (Annotation[] parameter : parameters) {
for (Annotation parameter2 : parameter) {
if (parameter2 instanceof SpanTag) {
- result.add(new SleuthAnnotatedParameter(i, (SpanTag) parameter2, args[i]));
+ result.add(new SleuthAnnotatedParameter(i, (SpanTag) parameter2,
+ args[i]));
}
}
i++;
@@ -61,21 +67,28 @@ class SleuthAnnotationUtils {
}
/**
- * Searches for an annotation either on a method or inside the method parameters
+ * Searches for an annotation either on a method or inside the method parameters.
+ *
+ * @param - annotation
+ * @param clazz - class with annotation
+ * @param method - annotated method
+ * @return annotation
*/
static T findAnnotation(Method method, Class clazz) {
T annotation = AnnotationUtils.findAnnotation(method, clazz);
if (annotation == null) {
try {
- annotation = AnnotationUtils.findAnnotation(
- method.getDeclaringClass().getMethod(method.getName(),
- method.getParameterTypes()), clazz);
- } catch (NoSuchMethodException | SecurityException e) {
+ annotation = AnnotationUtils.findAnnotation(method.getDeclaringClass()
+ .getMethod(method.getName(), method.getParameterTypes()), clazz);
+ }
+ catch (NoSuchMethodException | SecurityException ex) {
if (log.isDebugEnabled()) {
- log.debug("Exception occurred while tyring to find the annotation", e);
+ log.debug("Exception occurred while tyring to find the annotation",
+ ex);
}
}
}
return annotation;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java
index a4ce3ffcb..c8d54a15f 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SleuthMethodInvocationProcessor.java
@@ -19,10 +19,14 @@ package org.springframework.cloud.sleuth.annotation;
import org.aopalliance.intercept.MethodInvocation;
/**
+ * Contract for processing Sleuth annotations.
+ *
* @author Marcin Grzejszczak
* @since 2.1.0
*/
interface SleuthMethodInvocationProcessor {
- Object process(MethodInvocation invocation, NewSpan newSpan, ContinueSpan continueSpan) throws Throwable;
+ Object process(MethodInvocation invocation, NewSpan newSpan,
+ ContinueSpan continueSpan) throws Throwable;
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java
index 8259d2517..6e536b582 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTag.java
@@ -25,43 +25,46 @@ import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
/**
- * There are 3 different ways to add tags to a span. All of them are controlled by the annotation values.
- * Precedence is:
+ * There are 3 different ways to add tags to a span. All of them are controlled by the
+ * annotation values. Precedence is:
*
- *
- *
try with the {@link TagValueResolver} bean
- *
if the value of the bean wasn't set, try to evaluate a SPEL expression
- *
if there’s no SPEL expression just return a {@code toString()} value of the parameter
- *
+ *
+ *
try with the {@link TagValueResolver} bean
+ *
if the value of the bean wasn't set, try to evaluate a SPEL expression
+ *
if there’s no SPEL expression just return a {@code toString()} value of the
+ * parameter
+ *
*
* @author Christian Schwerdtfeger
* @since 1.2.0
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited
-@Target(value = { ElementType.PARAMETER })
+@Target(value = {
+ ElementType.PARAMETER
+})
public @interface SpanTag {
/**
- * The name of the key of the tag which should be created.
+ * @return - The name of the key of the tag which should be created.
*/
@AliasFor("key")
String value() default "";
/**
- * The name of the key of the tag which should be created.
+ * @return - The name of the key of the tag which should be created.
*/
@AliasFor("value")
String key() default "";
/**
- * Execute this SPEL expression to calculate the tag value. Will be analyzed if no value of the
- * {@link SpanTag#resolver()} was set.
+ * @return - Execute this SPEL expression to calculate the tag value. Will be analyzed if no
+ * value of the {@link SpanTag#resolver()} was set.
*/
String expression() default "";
/**
- * Use this bean to resolve the tag value. Has the highest precedence.
+ * @return - Use this bean to resolve the tag value. Has the highest precedence.
*/
Class extends TagValueResolver> resolver() default NoOpTagValueResolver.class;
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java
index 31e73c475..8d6b51253 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpanTagAnnotationHandler.java
@@ -29,13 +29,13 @@ import org.springframework.beans.factory.BeanFactory;
import org.springframework.util.StringUtils;
/**
- * This class is able to find all methods annotated with the
- * Sleuth annotations. All methods mean that if you have both an interface
- * and an implementation annotated with Sleuth annotations then this class is capable
- * of finding both of them and merging into one set of tracing information.
+ * This class is able to find all methods annotated with the Sleuth annotations. All
+ * methods mean that if you have both an interface and an implementation annotated with
+ * Sleuth annotations then this class is capable of finding both of them and merging into
+ * one set of tracing information.
*
- * This information is then used to add proper tags to the span from the
- * method arguments that are annotated with {@link SpanTag}.
+ * This information is then used to add proper tags to the span from the method arguments
+ * that are annotated with {@link SpanTag}.
*
* @author Christian Schwerdtfeger
* @since 1.2.0
@@ -45,8 +45,9 @@ class SpanTagAnnotationHandler {
private static final Log log = LogFactory.getLog(SpanTagAnnotationHandler.class);
private final BeanFactory beanFactory;
+
private SpanCustomizer spanCustomizer;
-
+
SpanTagAnnotationHandler(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
@@ -56,14 +57,15 @@ class SpanTagAnnotationHandler {
Method method = pjp.getMethod();
Method mostSpecificMethod = AopUtils.getMostSpecificMethod(method,
pjp.getThis().getClass());
- List annotatedParameters =
- SleuthAnnotationUtils.findAnnotatedParameters(mostSpecificMethod, pjp.getArguments());
+ List annotatedParameters = SleuthAnnotationUtils
+ .findAnnotatedParameters(mostSpecificMethod, pjp.getArguments());
getAnnotationsFromInterfaces(pjp, mostSpecificMethod, annotatedParameters);
mergeAnnotatedMethodsIfNecessary(pjp, method, mostSpecificMethod,
annotatedParameters);
addAnnotatedArguments(annotatedParameters);
- } catch (SecurityException e) {
- log.error("Exception occurred while trying to add annotated parameters", e);
+ }
+ catch (SecurityException ex) {
+ log.error("Exception occurred while trying to add annotated parameters", ex);
}
}
@@ -75,9 +77,11 @@ class SpanTagAnnotationHandler {
for (Class> implementedInterface : implementedInterfaces) {
for (Method methodFromInterface : implementedInterface.getMethods()) {
if (methodsAreTheSame(mostSpecificMethod, methodFromInterface)) {
- List annotatedParametersForActualMethod =
- SleuthAnnotationUtils.findAnnotatedParameters(methodFromInterface, pjp.getArguments());
- mergeAnnotatedParameters(annotatedParameters, annotatedParametersForActualMethod);
+ List annotatedParametersForActualMethod = SleuthAnnotationUtils
+ .findAnnotatedParameters(methodFromInterface,
+ pjp.getArguments());
+ mergeAnnotatedParameters(annotatedParameters,
+ annotatedParametersForActualMethod);
}
}
}
@@ -85,22 +89,25 @@ class SpanTagAnnotationHandler {
}
private boolean methodsAreTheSame(Method mostSpecificMethod, Method method1) {
- return method1.getName().equals(mostSpecificMethod.getName()) &&
- Arrays.equals(method1.getParameterTypes(), mostSpecificMethod.getParameterTypes());
+ return method1.getName().equals(mostSpecificMethod.getName()) && Arrays.equals(
+ method1.getParameterTypes(), mostSpecificMethod.getParameterTypes());
}
private void mergeAnnotatedMethodsIfNecessary(MethodInvocation pjp, Method method,
- Method mostSpecificMethod, List annotatedParameters) {
+ Method mostSpecificMethod,
+ List annotatedParameters) {
// that can happen if we have an abstraction and a concrete class that is
// annotated with @NewSpan annotation
if (!method.equals(mostSpecificMethod)) {
- List annotatedParametersForActualMethod = SleuthAnnotationUtils.findAnnotatedParameters(
- method, pjp.getArguments());
- mergeAnnotatedParameters(annotatedParameters, annotatedParametersForActualMethod);
+ List annotatedParametersForActualMethod = SleuthAnnotationUtils
+ .findAnnotatedParameters(method, pjp.getArguments());
+ mergeAnnotatedParameters(annotatedParameters,
+ annotatedParametersForActualMethod);
}
}
- private void mergeAnnotatedParameters(List annotatedParametersIndices,
+ private void mergeAnnotatedParameters(
+ List annotatedParametersIndices,
List annotatedParametersIndicesForActualMethod) {
for (SleuthAnnotatedParameter container : annotatedParametersIndicesForActualMethod) {
final int index = container.parameterIndex;
@@ -132,11 +139,9 @@ class SpanTagAnnotationHandler {
return this.spanCustomizer;
}
-
- private String resolveTagKey(
- SleuthAnnotatedParameter container) {
- return StringUtils.hasText(container.annotation.value()) ?
- container.annotation.value() : container.annotation.key();
+ private String resolveTagKey(SleuthAnnotatedParameter container) {
+ return StringUtils.hasText(container.annotation.value())
+ ? container.annotation.value() : container.annotation.key();
}
String resolveTagValue(SpanTag annotation, Object argument) {
@@ -144,12 +149,15 @@ class SpanTagAnnotationHandler {
return "";
}
if (annotation.resolver() != NoOpTagValueResolver.class) {
- TagValueResolver tagValueResolver = this.beanFactory.getBean(annotation.resolver());
+ TagValueResolver tagValueResolver = this.beanFactory
+ .getBean(annotation.resolver());
return tagValueResolver.resolve(argument);
- } else if (StringUtils.hasText(annotation.expression())) {
+ }
+ else if (StringUtils.hasText(annotation.expression())) {
return this.beanFactory.getBean(TagValueExpressionResolver.class)
.resolve(annotation.expression(), argument);
}
return argument.toString();
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java
index b2b06824b..df6fcf42c 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/SpelTagValueExpressionResolver.java
@@ -24,27 +24,32 @@ import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.SimpleEvaluationContext;
/**
- * Uses SPEL to evaluate the expression. If an exception is thrown will return
- * the {@code toString()} of the parameter.
+ * Uses SPEL to evaluate the expression. If an exception is thrown will return the
+ * {@code toString()} of the parameter.
*
* @author Marcin Grzejszczak
* @since 1.2.0
*/
class SpelTagValueExpressionResolver implements TagValueExpressionResolver {
- private static final Log log = LogFactory.getLog(SpelTagValueExpressionResolver.class);
+
+ private static final Log log = LogFactory
+ .getLog(SpelTagValueExpressionResolver.class);
@Override
public String resolve(String expression, Object parameter) {
try {
SimpleEvaluationContext context = SimpleEvaluationContext
- .forReadOnlyDataBinding()
- .build();
+ .forReadOnlyDataBinding().build();
ExpressionParser expressionParser = new SpelExpressionParser();
- Expression expressionToEvaluate = expressionParser.parseExpression(expression);
+ Expression expressionToEvaluate = expressionParser
+ .parseExpression(expression);
return expressionToEvaluate.getValue(context, parameter, String.class);
- } catch (Exception e) {
- log.error("Exception occurred while tying to evaluate the SPEL expression [" + expression + "]", e);
+ }
+ catch (Exception ex) {
+ log.error("Exception occurred while tying to evaluate the SPEL expression ["
+ + expression + "]", ex);
}
return parameter.toString();
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java
index 9e6176ec8..ae6be9056 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueExpressionResolver.java
@@ -25,12 +25,11 @@ package org.springframework.cloud.sleuth.annotation;
public interface TagValueExpressionResolver {
/**
- * Returns the tag value for the given parameter and the provided expression
- *
+ * Returns the tag value for the given parameter and the provided expression.
* @param expression - the expression coming from {@link SpanTag#expression()}
* @param parameter - parameter annotated with {@link SpanTag}
* @return the value of the tag
*/
String resolve(String expression, Object parameter);
-
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java
index ac558423b..32d1690fe 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/annotation/TagValueResolver.java
@@ -25,11 +25,10 @@ package org.springframework.cloud.sleuth.annotation;
public interface TagValueResolver {
/**
- * Returns the tag value for the given parameter
- *
+ * Returns the tag value for the given parameter.
* @param parameter - parameter annotated with {@link SpanTag}
* @return the value of the tag
*/
String resolve(Object parameter);
-
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthProperties.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthProperties.java
index 878314cc6..0b40aee78 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthProperties.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/SleuthProperties.java
@@ -22,8 +22,9 @@ import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
- * Sleuth settings
+ * Sleuth settings.
*
+ * @author Marcin Grzejszczak
* @since 1.0.11
*/
@ConfigurationProperties("spring.sleuth")
@@ -34,24 +35,28 @@ public class SleuthProperties {
/** When true, generate 128-bit trace IDs instead of 64-bit ones. */
private boolean traceId128 = false;
- /** True means the tracing system supports sharing a span ID between a client and server. */
+ /**
+ * True means the tracing system supports sharing a span ID between a client and
+ * server.
+ */
private boolean supportsJoin = true;
/**
- * List of baggage key names that should be propagated out of process.
- * These keys will be prefixed with `baggage` before the actual key.
- * This property is set in order to be backward compatible with previous
- * Sleuth versions.
+ * List of baggage key names that should be propagated out of process. These keys will
+ * be prefixed with `baggage` before the actual key. This property is set in order to
+ * be backward compatible with previous Sleuth versions.
*
- * @see brave.propagation.ExtraFieldPropagation.FactoryBuilder#addPrefixedFields(String, java.util.Collection)
+ * @see brave.propagation.ExtraFieldPropagation.FactoryBuilder#addPrefixedFields(String,
+ * java.util.Collection)
*/
private List baggageKeys = new ArrayList<>();
/**
- * List of fields that are referenced the same in-process as it is on the wire. For example, the
- * name "x-vcap-request-id" would be set as-is including the prefix.
+ * List of fields that are referenced the same in-process as it is on the wire. For
+ * example, the name "x-vcap-request-id" would be set as-is including the prefix.
*
- *
Note: {@code fieldName} will be implicitly lower-cased.
+ *
+ * Note: {@code fieldName} will be implicitly lower-cased.
*
* @see brave.propagation.ExtraFieldPropagation.FactoryBuilder#addField(String)
*/
@@ -96,4 +101,5 @@ public class SleuthProperties {
public void setPropagationKeys(List propagationKeys) {
this.propagationKeys = propagationKeys;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
index de43d1788..8b5c92555 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java
@@ -44,41 +44,43 @@ import zipkin2.Span;
import zipkin2.reporter.Reporter;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration Auto-configuration}
- * to enable tracing via Spring Cloud Sleuth.
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} to enable tracing via Spring Cloud Sleuth.
*
* @author Spencer Gibb
* @author Marcin Grzejszczak
* @since 2.0.0
*/
@Configuration
-@ConditionalOnProperty(value="spring.sleuth.enabled", matchIfMissing=true)
+@ConditionalOnProperty(value = "spring.sleuth.enabled", matchIfMissing = true)
@EnableConfigurationProperties(SleuthProperties.class)
public class TraceAutoConfiguration {
+ /**
+ * Tracer bean name. Name of the bean matters for some instrumentations.
+ */
public static final String TRACER_BEAN_NAME = "tracer";
- @Autowired(required = false) List spanAdjusters = new ArrayList<>();
- @Autowired(required = false) List finishedSpanHandlers = new ArrayList<>();
- @Autowired(required = false) List scopeDecorators = new ArrayList<>();
+ @Autowired(required = false)
+ List spanAdjusters = new ArrayList<>();
+
+ @Autowired(required = false)
+ List finishedSpanHandlers = new ArrayList<>();
+
+ @Autowired(required = false)
+ List scopeDecorators = new ArrayList<>();
@Bean
@ConditionalOnMissingBean
// NOTE: stable bean name as might be used outside sleuth
- Tracing tracing(@Value("${spring.zipkin.service.name:${spring.application.name:default}}") String serviceName,
- Propagation.Factory factory,
- CurrentTraceContext currentTraceContext,
- Reporter reporter,
- Sampler sampler,
- ErrorParser errorParser,
- SleuthProperties sleuthProperties
- ) {
- Tracing.Builder builder = Tracing.newBuilder()
- .sampler(sampler)
- .errorParser(errorParser)
- .localServiceName(serviceName)
- .propagationFactory(factory)
- .currentTraceContext(currentTraceContext)
+ Tracing tracing(
+ @Value("${spring.zipkin.service.name:${spring.application.name:default}}") String serviceName,
+ Propagation.Factory factory, CurrentTraceContext currentTraceContext,
+ Reporter reporter, Sampler sampler, ErrorParser errorParser,
+ SleuthProperties sleuthProperties) {
+ Tracing.Builder builder = Tracing.newBuilder().sampler(sampler)
+ .errorParser(errorParser).localServiceName(serviceName)
+ .propagationFactory(factory).currentTraceContext(currentTraceContext)
.spanReporter(adjustedReporter(reporter))
.traceId128Bit(sleuthProperties.isTraceId128())
.supportsJoin(sleuthProperties.isSupportsJoin());
@@ -89,7 +91,7 @@ public class TraceAutoConfiguration {
}
private Reporter adjustedReporter(Reporter delegate) {
- return span -> {
+ return (span) -> {
Span spanToAdjust = span;
for (SpanAdjuster spanAdjuster : this.spanAdjusters) {
spanToAdjust = spanAdjuster.adjust(spanToAdjust);
@@ -111,14 +113,16 @@ public class TraceAutoConfiguration {
}
@Bean
- @ConditionalOnMissingBean SpanNamer sleuthSpanNamer() {
+ @ConditionalOnMissingBean
+ SpanNamer sleuthSpanNamer() {
return new DefaultSpanNamer();
}
@Bean
@ConditionalOnMissingBean
Propagation.Factory sleuthPropagation(SleuthProperties sleuthProperties) {
- if (sleuthProperties.getBaggageKeys().isEmpty() && sleuthProperties.getPropagationKeys().isEmpty()) {
+ if (sleuthProperties.getBaggageKeys().isEmpty()
+ && sleuthProperties.getPropagationKeys().isEmpty()) {
return B3Propagation.FACTORY;
}
ExtraFieldPropagation.FactoryBuilder factoryBuilder = ExtraFieldPropagation
@@ -170,4 +174,5 @@ public class TraceAutoConfiguration {
CurrentSpanCustomizer spanCustomizer(Tracing tracing) {
return CurrentSpanCustomizer.create(tracing);
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java
index e155411ac..9fba6a093 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java
@@ -29,7 +29,7 @@ import org.springframework.core.env.PropertySource;
/**
* Adds default properties for the application:
*
- *
logging pattern level that prints trace information (e.g. trace ids)
+ *
logging pattern level that prints trace information (e.g. trace ids)
*
*
* @author Dave Syer
@@ -46,7 +46,8 @@ public class TraceEnvironmentPostProcessor implements EnvironmentPostProcessor {
Map map = new HashMap();
// 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.
- if (Boolean.parseBoolean(environment.getProperty("spring.sleuth.enabled", "true"))) {
+ if (Boolean
+ .parseBoolean(environment.getProperty("spring.sleuth.enabled", "true"))) {
map.put("logging.pattern.level",
"%5p [${spring.zipkin.service.name:${spring.application.name:-}},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]");
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java
index 5b9facb0e..78bc480b8 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncAutoConfiguration.java
@@ -21,8 +21,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration Auto-configuration}
- * that wraps an existing custom {@link AsyncConfigurer} in a {@link LazyTraceAsyncCustomizer}
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} that wraps an existing custom {@link AsyncConfigurer} in a
+ * {@link LazyTraceAsyncCustomizer}.
*
* @author Jesus Alonso
* @since 2.1.0
@@ -30,4 +31,5 @@ import org.springframework.scheduling.annotation.AsyncConfigurer;
@Configuration
@EnableConfigurationProperties(SleuthAsyncProperties.class)
public class AsyncAutoConfiguration {
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java
index 163959645..c4f190d79 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncCustomAutoConfiguration.java
@@ -29,8 +29,9 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration Auto-configuration}
- * that wraps an existing custom {@link AsyncConfigurer} in a {@link LazyTraceAsyncCustomizer}
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} that wraps an existing custom {@link AsyncConfigurer} in a
+ * {@link LazyTraceAsyncCustomizer}.
*
* @author Dave Syer
* @since 1.0.0
@@ -54,11 +55,12 @@ public class AsyncCustomAutoConfiguration implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
- if (bean instanceof AsyncConfigurer && !(bean instanceof LazyTraceAsyncCustomizer)) {
+ if (bean instanceof AsyncConfigurer
+ && !(bean instanceof LazyTraceAsyncCustomizer)) {
AsyncConfigurer configurer = (AsyncConfigurer) bean;
return new LazyTraceAsyncCustomizer(this.beanFactory, configurer);
}
return bean;
}
-}
\ No newline at end of file
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java
index 053dc5ff4..24b4d5bd8 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/AsyncDefaultAutoConfiguration.java
@@ -35,13 +35,12 @@ import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration Auto-configuration}
- * enabling async related processing.
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} enabling async related processing.
*
* @author Dave Syer
* @author Marcin Grzejszczak
* @since 1.0.0
- *
* @see LazyTraceExecutor
* @see TraceAsyncAspect
*/
@@ -50,18 +49,10 @@ import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
@ConditionalOnBean(Tracing.class)
public class AsyncDefaultAutoConfiguration {
- @Configuration
- @ConditionalOnMissingBean(AsyncConfigurer.class)
- @ConditionalOnProperty(value = "spring.sleuth.async.configurer.enabled", matchIfMissing = true)
- @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
- static class DefaultAsyncConfigurerSupport extends AsyncConfigurerSupport {
-
- @Autowired private BeanFactory beanFactory;
-
- @Override
- public Executor getAsyncExecutor() {
- return new LazyTraceExecutor(this.beanFactory, new SimpleAsyncTaskExecutor());
- }
+ @Bean
+ public static ExecutorBeanPostProcessor executorBeanPostProcessor(
+ BeanFactory beanFactory) {
+ return new ExecutorBeanPostProcessor(beanFactory);
}
@Bean
@@ -69,9 +60,23 @@ public class AsyncDefaultAutoConfiguration {
return new TraceAsyncAspect(tracer, spanNamer);
}
- @Bean
- public static ExecutorBeanPostProcessor executorBeanPostProcessor(BeanFactory beanFactory) {
- return new ExecutorBeanPostProcessor(beanFactory);
+ /**
+ * Wrapper for the async executor.
+ */
+ @Configuration
+ @ConditionalOnMissingBean(AsyncConfigurer.class)
+ @ConditionalOnProperty(value = "spring.sleuth.async.configurer.enabled", matchIfMissing = true)
+ @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+ static class DefaultAsyncConfigurerSupport extends AsyncConfigurerSupport {
+
+ @Autowired
+ private BeanFactory beanFactory;
+
+ @Override
+ public Executor getAsyncExecutor() {
+ return new LazyTraceExecutor(this.beanFactory, new SimpleAsyncTaskExecutor());
+ }
+
}
-}
\ No newline at end of file
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java
index 15515673b..1d3858463 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java
@@ -34,9 +34,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.ReflectionUtils;
/**
- * Bean post processor that wraps a call to an {@link Executor} either in a
- * JDK or CGLIB proxy. Depending on whether the implementation has a final
- * method or is final.
+ * Bean post processor that wraps a call to an {@link Executor} either in a JDK or CGLIB
+ * proxy. Depending on whether the implementation has a final method or is final.
*
* @author Marcin Grzejszczak
* @author Jesus Alonso
@@ -45,10 +44,10 @@ import org.springframework.util.ReflectionUtils;
*/
class ExecutorBeanPostProcessor implements BeanPostProcessor {
- private static final Log log = LogFactory.getLog(
- ExecutorBeanPostProcessor.class);
+ private static final Log log = LogFactory.getLog(ExecutorBeanPostProcessor.class);
private final BeanFactory beanFactory;
+
private SleuthAsyncProperties sleuthAsyncProperties;
ExecutorBeanPostProcessor(BeanFactory beanFactory) {
@@ -65,29 +64,35 @@ class ExecutorBeanPostProcessor implements BeanPostProcessor {
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof Executor && !(bean instanceof ThreadPoolTaskExecutor)) {
- Method execute = ReflectionUtils.findMethod(bean.getClass(), "execute", Runnable.class);
+ Method execute = ReflectionUtils.findMethod(bean.getClass(), "execute",
+ Runnable.class);
boolean methodFinal = Modifier.isFinal(execute.getModifiers());
boolean classFinal = Modifier.isFinal(bean.getClass().getModifiers());
boolean cglibProxy = !methodFinal && !classFinal;
Executor executor = (Executor) bean;
try {
return createProxy(bean, cglibProxy, executor);
- } catch (AopConfigException e) {
+ }
+ catch (AopConfigException ex) {
if (cglibProxy) {
if (log.isDebugEnabled()) {
- log.debug("Exception occurred while trying to create a proxy, falling back to JDK proxy", e);
+ log.debug(
+ "Exception occurred while trying to create a proxy, falling back to JDK proxy",
+ ex);
}
return createProxy(bean, false, executor);
}
- throw e;
+ throw ex;
}
- } else if (bean instanceof ThreadPoolTaskExecutor) {
+ }
+ else if (bean instanceof ThreadPoolTaskExecutor) {
if (isProxyNeeded(beanName)) {
boolean classFinal = Modifier.isFinal(bean.getClass().getModifiers());
boolean cglibProxy = !classFinal;
ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) bean;
return createThreadPoolTaskExecutorProxy(bean, cglibProxy, executor);
- } else {
+ }
+ else {
log.info("Not instrumenting bean " + beanName);
}
}
@@ -103,8 +108,10 @@ class ExecutorBeanPostProcessor implements BeanPostProcessor {
ThreadPoolTaskExecutor executor) {
ProxyFactoryBean factory = new ProxyFactoryBean();
factory.setProxyTargetClass(cglibProxy);
- factory.addAdvice(new ExecutorMethodInterceptor(executor, this.beanFactory) {
- @Override Executor executor(BeanFactory beanFactory, ThreadPoolTaskExecutor executor) {
+ factory.addAdvice(new ExecutorMethodInterceptor(executor,
+ this.beanFactory) {
+ @Override
+ Executor executor(BeanFactory beanFactory, ThreadPoolTaskExecutor executor) {
return new LazyTraceThreadPoolTaskExecutor(beanFactory, executor);
}
});
@@ -120,18 +127,27 @@ class ExecutorBeanPostProcessor implements BeanPostProcessor {
factory.setTarget(bean);
return factory.getObject();
}
-
+
private SleuthAsyncProperties asyncConfigurationProperties() {
if (this.sleuthAsyncProperties == null) {
- this.sleuthAsyncProperties = this.beanFactory.getBean(SleuthAsyncProperties.class);
+ this.sleuthAsyncProperties = this.beanFactory
+ .getBean(SleuthAsyncProperties.class);
}
return this.sleuthAsyncProperties;
}
+
}
+/**
+ * Interceptor for executor methods.
+ *
+ * @param - executor type
+ * @author Marcin Grzejszczak
+ */
class ExecutorMethodInterceptor implements MethodInterceptor {
private final T delegate;
+
private final BeanFactory beanFactory;
ExecutorMethodInterceptor(T delegate, BeanFactory beanFactory) {
@@ -139,14 +155,15 @@ class ExecutorMethodInterceptor implements MethodInterceptor
this.beanFactory = beanFactory;
}
- @Override public Object invoke(MethodInvocation invocation)
- throws Throwable {
+ @Override
+ public Object invoke(MethodInvocation invocation) throws Throwable {
Executor executor = executor(this.beanFactory, this.delegate);
Method methodOnTracedBean = getMethod(invocation, executor);
if (methodOnTracedBean != null) {
try {
return methodOnTracedBean.invoke(executor, invocation.getArguments());
- } catch (InvocationTargetException ex) {
+ }
+ catch (InvocationTargetException ex) {
// gh-1092: throw the target exception (if present)
Throwable cause = ex.getCause();
throw (cause != null) ? cause : ex;
@@ -157,11 +174,12 @@ class ExecutorMethodInterceptor implements MethodInterceptor
private Method getMethod(MethodInvocation invocation, Object object) {
Method method = invocation.getMethod();
- return ReflectionUtils
- .findMethod(object.getClass(), method.getName(), method.getParameterTypes());
+ return ReflectionUtils.findMethod(object.getClass(), method.getName(),
+ method.getParameterTypes());
}
Executor executor(BeanFactory beanFactory, T executor) {
return new LazyTraceExecutor(beanFactory, executor);
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java
index 7d0ad3d9a..06f070bdb 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceAsyncCustomizer.java
@@ -24,8 +24,8 @@ import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
/**
- * {@link AsyncConfigurerSupport} that creates a tracing data passing version
- * of the {@link Executor}
+ * {@link AsyncConfigurerSupport} that creates a tracing data passing version of the
+ * {@link Executor}.
*
* @author Dave Syer
* @since 1.0.0
@@ -33,6 +33,7 @@ import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
public class LazyTraceAsyncCustomizer extends AsyncConfigurerSupport {
private final BeanFactory beanFactory;
+
private final AsyncConfigurer delegate;
public LazyTraceAsyncCustomizer(BeanFactory beanFactory, AsyncConfigurer delegate) {
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
index 926d44597..f18de2c42 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceExecutor.java
@@ -27,7 +27,7 @@ import org.springframework.cloud.sleuth.DefaultSpanNamer;
import org.springframework.cloud.sleuth.SpanNamer;
/**
- * {@link Executor} that wraps {@link Runnable} in a trace representation
+ * {@link Executor} that wraps {@link Runnable} in a trace representation.
*
* @author Dave Syer
* @since 1.0.0
@@ -35,10 +35,9 @@ import org.springframework.cloud.sleuth.SpanNamer;
public class LazyTraceExecutor implements Executor {
private static final Log log = LogFactory.getLog(LazyTraceExecutor.class);
-
- private Tracing tracing;
private final BeanFactory beanFactory;
private final Executor delegate;
+ private Tracing tracing;
private SpanNamer spanNamer;
public LazyTraceExecutor(BeanFactory beanFactory, Executor delegate) {
@@ -52,7 +51,7 @@ public class LazyTraceExecutor implements Executor {
try {
this.tracing = this.beanFactory.getBean(Tracing.class);
}
- catch (NoSuchBeanDefinitionException e) {
+ catch (NoSuchBeanDefinitionException ex) {
this.delegate.execute(command);
return;
}
@@ -66,11 +65,13 @@ public class LazyTraceExecutor implements Executor {
try {
this.spanNamer = this.beanFactory.getBean(SpanNamer.class);
}
- catch (NoSuchBeanDefinitionException e) {
- log.warn("SpanNamer bean not found - will provide a manually created instance");
+ catch (NoSuchBeanDefinitionException ex) {
+ log.warn(
+ "SpanNamer bean not found - will provide a manually created instance");
return new DefaultSpanNamer();
}
}
return this.spanNamer;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
index b6a5320f6..6a426d182 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/LazyTraceThreadPoolTaskExecutor.java
@@ -34,7 +34,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;
/**
- * Trace representation of {@link ThreadPoolTaskExecutor}
+ * Trace representation of {@link ThreadPoolTaskExecutor}.
*
* @author Marcin Grzejszczak
* @since 1.0.10
@@ -42,11 +42,15 @@ import org.springframework.util.concurrent.ListenableFuture;
@SuppressWarnings("serial")
public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
- private static final Log log = LogFactory.getLog(LazyTraceThreadPoolTaskExecutor.class);
+ private static final Log log = LogFactory
+ .getLog(LazyTraceThreadPoolTaskExecutor.class);
private final BeanFactory beanFactory;
+
private final ThreadPoolTaskExecutor delegate;
+
private Tracing tracing;
+
private SpanNamer spanNamer;
public LazyTraceThreadPoolTaskExecutor(BeanFactory beanFactory,
@@ -62,7 +66,8 @@ public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
@Override
public void execute(Runnable task, long startTimeout) {
- this.delegate.execute(new TraceRunnable(tracing(), spanNamer(), task), startTimeout);
+ this.delegate.execute(new TraceRunnable(tracing(), spanNamer(), task),
+ startTimeout);
}
@Override
@@ -77,41 +82,46 @@ public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
@Override
public ListenableFuture> submitListenable(Runnable task) {
- return this.delegate.submitListenable(new TraceRunnable(tracing(), spanNamer(), task));
+ return this.delegate
+ .submitListenable(new TraceRunnable(tracing(), spanNamer(), task));
}
@Override
public ListenableFuture submitListenable(Callable task) {
- return this.delegate.submitListenable(new TraceCallable<>(tracing(), spanNamer(), task));
+ return this.delegate
+ .submitListenable(new TraceCallable<>(tracing(), spanNamer(), task));
}
- @Override public boolean prefersShortLivedTasks() {
+ @Override
+ public boolean prefersShortLivedTasks() {
return this.delegate.prefersShortLivedTasks();
}
- @Override public void setThreadFactory(ThreadFactory threadFactory) {
+ @Override
+ public void setThreadFactory(ThreadFactory threadFactory) {
this.delegate.setThreadFactory(threadFactory);
}
- @Override public void setThreadNamePrefix(String threadNamePrefix) {
- this.delegate.setThreadNamePrefix(threadNamePrefix);
- }
-
- @Override public void setRejectedExecutionHandler(
+ @Override
+ public void setRejectedExecutionHandler(
RejectedExecutionHandler rejectedExecutionHandler) {
this.delegate.setRejectedExecutionHandler(rejectedExecutionHandler);
}
- @Override public void setWaitForTasksToCompleteOnShutdown(
+ @Override
+ public void setWaitForTasksToCompleteOnShutdown(
boolean waitForJobsToCompleteOnShutdown) {
- this.delegate.setWaitForTasksToCompleteOnShutdown(waitForJobsToCompleteOnShutdown);
+ this.delegate
+ .setWaitForTasksToCompleteOnShutdown(waitForJobsToCompleteOnShutdown);
}
- @Override public void setAwaitTerminationSeconds(int awaitTerminationSeconds) {
+ @Override
+ public void setAwaitTerminationSeconds(int awaitTerminationSeconds) {
this.delegate.setAwaitTerminationSeconds(awaitTerminationSeconds);
}
- @Override public void setBeanName(String name) {
+ @Override
+ public void setBeanName(String name) {
this.delegate.setBeanName(name);
}
@@ -120,11 +130,13 @@ public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
return this.delegate.getThreadPoolExecutor();
}
- @Override public int getPoolSize() {
+ @Override
+ public int getPoolSize() {
return this.delegate.getPoolSize();
}
- @Override public int getActiveCount() {
+ @Override
+ public int getActiveCount() {
return this.delegate.getActiveCount();
}
@@ -140,7 +152,8 @@ public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
super.afterPropertiesSet();
}
- @Override public void initialize() {
+ @Override
+ public void initialize() {
this.delegate.initialize();
}
@@ -150,79 +163,103 @@ public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
super.shutdown();
}
- @Override public Thread newThread(Runnable runnable) {
+ @Override
+ public Thread newThread(Runnable runnable) {
return this.delegate.newThread(runnable);
}
- @Override public String getThreadNamePrefix() {
+ @Override
+ public String getThreadNamePrefix() {
return this.delegate.getThreadNamePrefix();
}
- @Override public void setThreadPriority(int threadPriority) {
- this.delegate.setThreadPriority(threadPriority);
+ @Override
+ public void setThreadNamePrefix(String threadNamePrefix) {
+ this.delegate.setThreadNamePrefix(threadNamePrefix);
}
- @Override public int getThreadPriority() {
+ @Override
+ public int getThreadPriority() {
return this.delegate.getThreadPriority();
}
- @Override public void setDaemon(boolean daemon) {
- this.delegate.setDaemon(daemon);
+ @Override
+ public void setThreadPriority(int threadPriority) {
+ this.delegate.setThreadPriority(threadPriority);
}
- @Override public boolean isDaemon() {
+ @Override
+ public boolean isDaemon() {
return this.delegate.isDaemon();
}
- @Override public void setThreadGroupName(String name) {
+ @Override
+ public void setDaemon(boolean daemon) {
+ this.delegate.setDaemon(daemon);
+ }
+
+ @Override
+ public void setThreadGroupName(String name) {
this.delegate.setThreadGroupName(name);
}
- @Override public void setThreadGroup(ThreadGroup threadGroup) {
- this.delegate.setThreadGroup(threadGroup);
- }
-
- @Override public ThreadGroup getThreadGroup() {
+ @Override
+ public ThreadGroup getThreadGroup() {
return this.delegate.getThreadGroup();
}
- @Override public Thread createThread(Runnable runnable) {
+ @Override
+ public void setThreadGroup(ThreadGroup threadGroup) {
+ this.delegate.setThreadGroup(threadGroup);
+ }
+
+ @Override
+ public Thread createThread(Runnable runnable) {
return this.delegate.createThread(runnable);
}
- @Override public void setCorePoolSize(int corePoolSize) {
- this.delegate.setCorePoolSize(corePoolSize);
- }
-
- @Override public int getCorePoolSize() {
+ @Override
+ public int getCorePoolSize() {
return this.delegate.getCorePoolSize();
}
- @Override public void setMaxPoolSize(int maxPoolSize) {
- this.delegate.setMaxPoolSize(maxPoolSize);
+ @Override
+ public void setCorePoolSize(int corePoolSize) {
+ this.delegate.setCorePoolSize(corePoolSize);
}
- @Override public int getMaxPoolSize() {
+ @Override
+ public int getMaxPoolSize() {
return this.delegate.getMaxPoolSize();
}
- @Override public void setKeepAliveSeconds(int keepAliveSeconds) {
- this.delegate.setKeepAliveSeconds(keepAliveSeconds);
+ @Override
+ public void setMaxPoolSize(int maxPoolSize) {
+ this.delegate.setMaxPoolSize(maxPoolSize);
}
- @Override public int getKeepAliveSeconds() {
+ @Override
+ public int getKeepAliveSeconds() {
return this.delegate.getKeepAliveSeconds();
}
- @Override public void setQueueCapacity(int queueCapacity) {
+ @Override
+ public void setKeepAliveSeconds(int keepAliveSeconds) {
+ this.delegate.setKeepAliveSeconds(keepAliveSeconds);
+ }
+
+ @Override
+ public void setQueueCapacity(int queueCapacity) {
this.delegate.setQueueCapacity(queueCapacity);
}
- @Override public void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) {
+ @Override
+ public void setAllowCoreThreadTimeOut(boolean allowCoreThreadTimeOut) {
this.delegate.setAllowCoreThreadTimeOut(allowCoreThreadTimeOut);
}
- @Override public void setTaskDecorator(TaskDecorator taskDecorator) {
+ @Override
+ public void setTaskDecorator(TaskDecorator taskDecorator) {
this.delegate.setTaskDecorator(taskDecorator);
}
@@ -238,11 +275,13 @@ public class LazyTraceThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
try {
this.spanNamer = this.beanFactory.getBean(SpanNamer.class);
}
- catch (NoSuchBeanDefinitionException e) {
- log.warn("SpanNamer bean not found - will provide a manually created instance");
+ catch (NoSuchBeanDefinitionException ex) {
+ log.warn(
+ "SpanNamer bean not found - will provide a manually created instance");
return new DefaultSpanNamer();
}
}
return this.spanNamer;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java
index f4c06ff2c..eb35abacd 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/SleuthAsyncProperties.java
@@ -22,7 +22,7 @@ import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
- * Settings for disable instrumentation of ThreadPoolTaskExecutors
+ * Settings for disable instrumentation of ThreadPoolTaskExecutors.
*
* @author Jesus Alonso
* @since 2.1.0
@@ -32,8 +32,8 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
public class SleuthAsyncProperties {
/**
- * List of {@link java.util.concurrent.Executor} bean names that should
- * be ignored and not wrapped in a trace representation
+ * List of {@link java.util.concurrent.Executor} bean names that should be ignored and
+ * not wrapped in a trace representation.
*/
private List ignoredBeans = Collections.emptyList();
@@ -44,4 +44,5 @@ public class SleuthAsyncProperties {
public void setIgnoredBeans(List ignoredBeans) {
this.ignoredBeans = ignoredBeans;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
index 68996d2db..126238e91 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java
@@ -34,16 +34,17 @@ import org.springframework.util.ReflectionUtils;
*
* @author Marcin Grzejszczak
* @since 1.0.0
- *
* @see Tracer
*/
@Aspect
public class TraceAsyncAspect {
private static final String CLASS_KEY = "class";
+
private static final String METHOD_KEY = "method";
private final Tracer tracer;
+
private final SpanNamer spanNamer;
public TraceAsyncAspect(Tracer tracer, SpanNamer spanNamer) {
@@ -59,11 +60,12 @@ public class TraceAsyncAspect {
span = this.tracer.nextSpan();
}
span = span.name(spanName);
- try(Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
+ try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
span.tag(CLASS_KEY, pjp.getTarget().getClass().getSimpleName());
span.tag(METHOD_KEY, pjp.getSignature().getName());
return pjp.proceed();
- } finally {
+ }
+ finally {
span.finish();
}
}
@@ -76,8 +78,8 @@ public class TraceAsyncAspect {
private Method getMethod(ProceedingJoinPoint pjp, Object object) {
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
- return ReflectionUtils
- .findMethod(object.getClass(), method.getName(), method.getParameterTypes());
+ return ReflectionUtils.findMethod(object.getClass(), method.getName(),
+ method.getParameterTypes());
}
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
index 508320e0a..77c191fd2 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutor.java
@@ -24,17 +24,18 @@ import org.springframework.core.task.AsyncListenableTaskExecutor;
import org.springframework.util.concurrent.ListenableFuture;
/**
- * AsyncListenableTaskExecutor that wraps all Runnable / Callable tasks into
- * their trace related representation
+ * AsyncListenableTaskExecutor that wraps all Runnable / Callable tasks into their trace
+ * related representation.
*
* @since 1.0.0
- *
+ * @author Marcin Grzejszczak
* @see brave.propagation.CurrentTraceContext#wrap(Runnable)
* @see brave.propagation.CurrentTraceContext#wrap(Callable)
*/
public class TraceAsyncListenableTaskExecutor implements AsyncListenableTaskExecutor {
private final AsyncListenableTaskExecutor delegate;
+
private final Tracing tracing;
TraceAsyncListenableTaskExecutor(AsyncListenableTaskExecutor delegate,
@@ -45,17 +46,20 @@ public class TraceAsyncListenableTaskExecutor implements AsyncListenableTaskExec
@Override
public ListenableFuture> submitListenable(Runnable task) {
- return this.delegate.submitListenable(this.tracing.currentTraceContext().wrap(task));
+ return this.delegate
+ .submitListenable(this.tracing.currentTraceContext().wrap(task));
}
@Override
public ListenableFuture submitListenable(Callable task) {
- return this.delegate.submitListenable(this.tracing.currentTraceContext().wrap(task));
+ return this.delegate
+ .submitListenable(this.tracing.currentTraceContext().wrap(task));
}
@Override
public void execute(Runnable task, long startTimeout) {
- this.delegate.execute(this.tracing.currentTraceContext().wrap(task), startTimeout);
+ this.delegate.execute(this.tracing.currentTraceContext().wrap(task),
+ startTimeout);
}
@Override
@@ -73,4 +77,4 @@ public class TraceAsyncListenableTaskExecutor implements AsyncListenableTaskExec
this.delegate.execute(this.tracing.currentTraceContext().wrap(task));
}
-}
\ No newline at end of file
+}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
index d40d1e4bf..6f92f1579 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceCallable.java
@@ -16,56 +16,64 @@
package org.springframework.cloud.sleuth.instrument.async;
-import brave.ScopedSpan;
-import brave.Tracing;
-import brave.propagation.TraceContext;
import java.util.concurrent.Callable;
+import brave.ScopedSpan;
import brave.Tracer;
+import brave.Tracing;
+import brave.propagation.TraceContext;
import org.springframework.cloud.sleuth.SpanNamer;
/**
- * Callable that passes Span between threads. The Span name is
- * taken either from the passed value or from the {@link SpanNamer}
- * interface.
+ * Callable that passes Span between threads. The Span name is taken either from the
+ * passed value or from the {@link SpanNamer} interface.
*
* @author Spencer Gibb
* @author Marcin Grzejszczak
+ * @param - return type from callable
* @since 1.0.0
*/
public class TraceCallable implements Callable {
/**
- * Since we don't know the exact operation name we provide a default
- * name for the Span
+ * Since we don't know the exact operation name we provide a default name for the Span.
*/
private static final String DEFAULT_SPAN_NAME = "async";
private final Tracer tracer;
+
private final Callable delegate;
+
private final TraceContext parent;
+
private final String spanName;
public TraceCallable(Tracing tracing, SpanNamer spanNamer, Callable delegate) {
this(tracing, spanNamer, delegate, null);
}
- public TraceCallable(Tracing tracing, SpanNamer spanNamer, Callable delegate, String name) {
+ public TraceCallable(Tracing tracing, SpanNamer spanNamer, Callable delegate,
+ String name) {
this.tracer = tracing.tracer();
this.delegate = delegate;
this.parent = tracing.currentTraceContext().get();
this.spanName = name != null ? name : spanNamer.name(delegate, DEFAULT_SPAN_NAME);
}
- @Override public V call() throws Exception {
- ScopedSpan span = this.tracer.startScopedSpanWithParent(this.spanName, this.parent);
+ @Override
+ public V call() throws Exception {
+ ScopedSpan span = this.tracer.startScopedSpanWithParent(this.spanName,
+ this.parent);
try {
return this.delegate.call();
- } catch (Exception | Error e) {
- span.error(e);
- throw e;
- } finally {
+ }
+ catch (Exception | Error ex) {
+ span.error(ex);
+ throw ex;
+ }
+ finally {
span.finish();
}
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
index af0b8e1da..b5f5a65b3 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnable.java
@@ -23,9 +23,8 @@ import brave.propagation.TraceContext;
import org.springframework.cloud.sleuth.SpanNamer;
/**
- * Runnable that passes Span between threads. The Span name is
- * taken either from the passed value or from the {@link SpanNamer}
- * interface.
+ * Runnable that passes Span between threads. The Span name is taken either from the
+ * passed value or from the {@link SpanNamer} interface.
*
* @author Spencer Gibb
* @author Marcin Grzejszczak
@@ -34,21 +33,24 @@ import org.springframework.cloud.sleuth.SpanNamer;
public class TraceRunnable implements Runnable {
/**
- * Since we don't know the exact operation name we provide a default
- * name for the Span
+ * Since we don't know the exact operation name we provide a default name for the Span
*/
private static final String DEFAULT_SPAN_NAME = "async";
private final Tracer tracer;
+
private final Runnable delegate;
+
private final TraceContext parent;
+
private final String spanName;
public TraceRunnable(Tracing tracing, SpanNamer spanNamer, Runnable delegate) {
this(tracing, spanNamer, delegate, null);
}
- public TraceRunnable(Tracing tracing, SpanNamer spanNamer, Runnable delegate, String name) {
+ public TraceRunnable(Tracing tracing, SpanNamer spanNamer, Runnable delegate,
+ String name) {
this.tracer = tracing.tracer();
this.delegate = delegate;
this.parent = tracing.currentTraceContext().get();
@@ -57,14 +59,18 @@ public class TraceRunnable implements Runnable {
@Override
public void run() {
- ScopedSpan span = this.tracer.startScopedSpanWithParent(this.spanName, this.parent);
+ ScopedSpan span = this.tracer.startScopedSpanWithParent(this.spanName,
+ this.parent);
try {
this.delegate.run();
- } catch (Exception | Error e) {
+ }
+ catch (Exception | Error e) {
span.error(e);
throw e;
- } finally {
+ }
+ finally {
span.finish();
}
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
index 56b47bee5..eb9e033e5 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorService.java
@@ -36,17 +36,24 @@ import org.springframework.cloud.sleuth.SpanNamer;
* @since 1.0.0
*/
public class TraceableExecutorService implements ExecutorService {
+
final ExecutorService delegate;
+
private final String spanName;
+
Tracing tracing;
+
SpanNamer spanNamer;
+
BeanFactory beanFactory;
- public TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate) {
+ public TraceableExecutorService(BeanFactory beanFactory,
+ final ExecutorService delegate) {
this(beanFactory, delegate, null);
}
- public TraceableExecutorService(BeanFactory beanFactory, final ExecutorService delegate, String spanName) {
+ public TraceableExecutorService(BeanFactory beanFactory,
+ final ExecutorService delegate, String spanName) {
this.delegate = delegate;
this.beanFactory = beanFactory;
this.spanName = spanName;
@@ -54,7 +61,8 @@ public class TraceableExecutorService implements ExecutorService {
@Override
public void execute(Runnable command) {
- final Runnable r = new TraceRunnable(tracing(), spanNamer(), command, this.spanName);
+ final Runnable r = new TraceRunnable(tracing(), spanNamer(), command,
+ this.spanName);
this.delegate.execute(r);
}
@@ -79,7 +87,8 @@ public class TraceableExecutorService implements ExecutorService {
}
@Override
- public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
+ public boolean awaitTermination(long timeout, TimeUnit unit)
+ throws InterruptedException {
return this.delegate.awaitTermination(timeout, unit);
}
@@ -102,28 +111,32 @@ public class TraceableExecutorService implements ExecutorService {
}
@Override
- public List> invokeAll(Collection extends Callable> tasks) throws InterruptedException {
+ public List> invokeAll(Collection extends Callable> tasks)
+ throws InterruptedException {
return this.delegate.invokeAll(wrapCallableCollection(tasks));
}
@Override
- public List> invokeAll(Collection extends Callable> tasks, long timeout, TimeUnit unit)
- throws InterruptedException {
+ public List> invokeAll(Collection extends Callable> tasks,
+ long timeout, TimeUnit unit) throws InterruptedException {
return this.delegate.invokeAll(wrapCallableCollection(tasks), timeout, unit);
}
@Override
- public T invokeAny(Collection extends Callable> tasks) throws InterruptedException, ExecutionException {
+ public T invokeAny(Collection extends Callable> tasks)
+ throws InterruptedException, ExecutionException {
return this.delegate.invokeAny(wrapCallableCollection(tasks));
}
@Override
- public T invokeAny(Collection extends Callable> tasks, long timeout, TimeUnit unit)
+ public T invokeAny(Collection extends Callable> tasks, long timeout,
+ TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
return this.delegate.invokeAny(wrapCallableCollection(tasks), timeout, unit);
}
- private Collection extends Callable> wrapCallableCollection(Collection extends Callable> tasks) {
+ private Collection extends Callable> wrapCallableCollection(
+ Collection extends Callable> tasks) {
List> ts = new ArrayList<>();
for (Callable task : tasks) {
if (!(task instanceof TraceCallable)) {
@@ -146,4 +159,5 @@ public class TraceableExecutorService implements ExecutorService {
}
return this.spanNamer;
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java
index 0fb22cf33..010a64859 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorService.java
@@ -30,9 +30,11 @@ import org.springframework.beans.factory.BeanFactory;
* @author Gaurav Rai Mazra
* @since 1.0.0
*/
-public class TraceableScheduledExecutorService extends TraceableExecutorService implements ScheduledExecutorService {
+public class TraceableScheduledExecutorService extends TraceableExecutorService
+ implements ScheduledExecutorService {
- public TraceableScheduledExecutorService(BeanFactory beanFactory, final ExecutorService delegate) {
+ public TraceableScheduledExecutorService(BeanFactory beanFactory,
+ final ExecutorService delegate) {
super(beanFactory, delegate);
}
@@ -47,21 +49,26 @@ public class TraceableScheduledExecutorService extends TraceableExecutorService
}
@Override
- public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) {
+ public ScheduledFuture schedule(Callable callable, long delay,
+ TimeUnit unit) {
Callable c = new TraceCallable<>(tracing(), spanNamer(), callable);
return getScheduledExecutorService().schedule(c, delay, unit);
}
@Override
- public ScheduledFuture> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
+ public ScheduledFuture> scheduleAtFixedRate(Runnable command, long initialDelay,
+ long period, TimeUnit unit) {
Runnable r = new TraceRunnable(tracing(), spanNamer(), command);
- return getScheduledExecutorService().scheduleAtFixedRate(r, initialDelay, period, unit);
+ return getScheduledExecutorService().scheduleAtFixedRate(r, initialDelay, period,
+ unit);
}
@Override
- public ScheduledFuture> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
+ public ScheduledFuture> scheduleWithFixedDelay(Runnable command, long initialDelay,
+ long delay, TimeUnit unit) {
Runnable r = new TraceRunnable(tracing(), spanNamer(), command);
- return getScheduledExecutorService().scheduleWithFixedDelay(r, initialDelay, delay, unit);
+ return getScheduledExecutorService().scheduleWithFixedDelay(r, initialDelay,
+ delay, unit);
}
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixAutoConfiguration.java
index a341757ab..bad0a6875 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixAutoConfiguration.java
@@ -17,6 +17,7 @@
package org.springframework.cloud.sleuth.instrument.hystrix;
import brave.Tracing;
+import com.netflix.hystrix.HystrixCommand;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -26,15 +27,13 @@ import org.springframework.cloud.sleuth.autoconfig.TraceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import com.netflix.hystrix.HystrixCommand;
-
/**
- * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration Auto-configuration}
- * that registers a custom Sleuth {@link com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy}.
+ * {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
+ * Auto-configuration} that registers a custom Sleuth
+ * {@link com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategy}.
*
* @author Marcin Grzejszczak
* @since 1.0.0
- *
* @see SleuthHystrixConcurrencyStrategy
*/
@Configuration
@@ -44,7 +43,8 @@ import com.netflix.hystrix.HystrixCommand;
@ConditionalOnProperty(value = "spring.sleuth.hystrix.strategy.enabled", matchIfMissing = true)
public class SleuthHystrixAutoConfiguration {
- @Bean SleuthHystrixConcurrencyStrategy sleuthHystrixConcurrencyStrategy(Tracing tracing,
+ @Bean
+ SleuthHystrixConcurrencyStrategy sleuthHystrixConcurrencyStrategy(Tracing tracing,
SpanNamer spanNamer) {
return new SleuthHystrixConcurrencyStrategy(tracing, spanNamer);
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategy.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategy.java
index 39237001e..f83e5be27 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategy.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategy.java
@@ -49,11 +49,14 @@ import org.springframework.cloud.sleuth.instrument.async.TraceCallable;
public class SleuthHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy {
private static final String HYSTRIX_COMPONENT = "hystrix";
+
private static final Log log = LogFactory
.getLog(SleuthHystrixConcurrencyStrategy.class);
private final Tracing tracing;
+
private final SpanNamer spanNamer;
+
private HystrixConcurrencyStrategy delegate;
public SleuthHystrixConcurrencyStrategy(Tracing tracing, SpanNamer spanNamer) {
@@ -83,8 +86,8 @@ public class SleuthHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy
HystrixPlugins.getInstance().registerMetricsPublisher(metricsPublisher);
HystrixPlugins.getInstance().registerPropertiesStrategy(propertiesStrategy);
}
- catch (Exception e) {
- log.error("Failed to register Sleuth Hystrix Concurrency Strategy", e);
+ catch (Exception ex) {
+ log.error("Failed to register Sleuth Hystrix Concurrency Strategy", ex);
}
}
@@ -92,10 +95,10 @@ public class SleuthHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy
HystrixMetricsPublisher metricsPublisher,
HystrixPropertiesStrategy propertiesStrategy) {
if (log.isDebugEnabled()) {
- log.debug("Current Hystrix plugins configuration is [" + "concurrencyStrategy ["
- + this.delegate + "]," + "eventNotifier [" + eventNotifier + "],"
- + "metricPublisher [" + metricsPublisher + "]," + "propertiesStrategy ["
- + propertiesStrategy + "]," + "]");
+ log.debug("Current Hystrix plugins configuration is ["
+ + "concurrencyStrategy [" + this.delegate + "]," + "eventNotifier ["
+ + eventNotifier + "]," + "metricPublisher [" + metricsPublisher + "],"
+ + "propertiesStrategy [" + propertiesStrategy + "]," + "]");
log.debug("Registering Sleuth Hystrix Concurrency Strategy.");
}
}
@@ -110,8 +113,8 @@ public class SleuthHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy
if (wrappedCallable instanceof TraceCallable) {
return wrappedCallable;
}
- return new TraceCallable<>(this.tracing, this.spanNamer,
- wrappedCallable, HYSTRIX_COMPONENT);
+ return new TraceCallable<>(this.tracing, this.spanNamer, wrappedCallable,
+ HYSTRIX_COMPONENT);
}
@Override
@@ -140,4 +143,5 @@ public class SleuthHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy
HystrixRequestVariableLifecycle rv) {
return this.delegate.getRequestVariable(rv);
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java
index 0d03d528c..76561e261 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommand.java
@@ -23,24 +23,28 @@ import brave.Tracer;
import com.netflix.hystrix.HystrixCommand;
/**
- * Abstraction over {@code HystrixCommand} that wraps command execution with Trace setting
- *
- * @see HystrixCommand
- * @see Tracer
+ * Abstraction over {@code HystrixCommand} that wraps command execution with Trace setting.
*
+ * @param - return type of Hystrix Command
* @author Tomasz Nurkiewicz, 4financeIT
* @author Marcin Grzejszczak
* @author Spencer Gibb
* @since 1.0.0
+ * @see HystrixCommand
+ * @see Tracer
*/
public abstract class TraceCommand extends HystrixCommand {
private static final String COMMAND_KEY = "commandKey";
+
private static final String COMMAND_GROUP_KEY = "commandGroup";
+
private static final String THREAD_POOL_KEY = "threadPoolKey";
+
private static final String FALLBACK_METHOD_NAME_KEY = "fallbackMethodName";
private final Tracer tracer;
+
private final AtomicReference span;
protected TraceCommand(Tracer tracer, Setter setter) {
@@ -59,10 +63,12 @@ public abstract class TraceCommand extends HystrixCommand {
Throwable throwable = null;
try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span.start())) {
return doRun();
- } catch (Throwable t) {
+ }
+ catch (Throwable t) {
throwable = t;
throw t;
- } finally {
+ }
+ finally {
if (throwable == null) {
span.finish();
this.span.set(null);
@@ -73,12 +79,14 @@ public abstract class TraceCommand extends HystrixCommand {
public abstract R doRun() throws Exception;
- @Override protected R getFallback() {
+ @Override
+ protected R getFallback() {
Span span = this.span.get();
try (Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) {
span.tag(FALLBACK_METHOD_NAME_KEY, getFallbackMethodName());
return doGetFallback();
- } finally {
+ }
+ finally {
span.finish();
this.span.set(null);
}
@@ -87,4 +95,5 @@ public abstract class TraceCommand extends HystrixCommand {
public R doGetFallback() {
return super.getFallback();
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
index 3096fb865..c2fe78f58 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/MessageHeaderPropagation.java
@@ -16,6 +16,7 @@
package org.springframework.cloud.sleuth.instrument.messaging;
+import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -29,15 +30,16 @@ import org.springframework.messaging.support.NativeMessageHeaderAccessor;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.StringUtils;
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.springframework.messaging.support.NativeMessageHeaderAccessor.NATIVE_HEADERS;
-
/**
- * This always sets native headers in defence of STOMP issues discussed here
+ * This always sets native headers in defence of STOMP issues discussed here.
+ *
+ * @author Marcin Grzejszczak
*/
enum MessageHeaderPropagation
implements Propagation.Setter,
Propagation.Getter {
+
INSTANCE;
private static final Log log = LogFactory.getLog(MessageHeaderPropagation.class);
@@ -45,99 +47,24 @@ enum MessageHeaderPropagation
private static final Map LEGACY_HEADER_MAPPING = new HashMap<>();
private static final String TRACE_ID_NAME = "X-B3-TraceId";
+
private static final String SPAN_ID_NAME = "X-B3-SpanId";
+
private static final String PARENT_SPAN_ID_NAME = "X-B3-ParentSpanId";
+
private static final String SAMPLED_NAME = "X-B3-Sampled";
+
private static final String FLAGS_NAME = "X-B3-Flags";
static {
LEGACY_HEADER_MAPPING.put(TRACE_ID_NAME, TraceMessageHeaders.TRACE_ID_NAME);
LEGACY_HEADER_MAPPING.put(SPAN_ID_NAME, TraceMessageHeaders.SPAN_ID_NAME);
- LEGACY_HEADER_MAPPING.put(PARENT_SPAN_ID_NAME, TraceMessageHeaders.PARENT_ID_NAME);
+ LEGACY_HEADER_MAPPING.put(PARENT_SPAN_ID_NAME,
+ TraceMessageHeaders.PARENT_ID_NAME);
LEGACY_HEADER_MAPPING.put(SAMPLED_NAME, TraceMessageHeaders.SAMPLED_NAME);
LEGACY_HEADER_MAPPING.put(FLAGS_NAME, TraceMessageHeaders.SPAN_FLAGS_NAME);
}
- @Override public void put(MessageHeaderAccessor accessor, String key, String value) {
- try {
- doPut(accessor, key, value);
- } catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug("An exception happened when we tried to retrieve the [" + key + "] from message", e);
- }
- }
- String legacyKey = LEGACY_HEADER_MAPPING.get(key);
- if (legacyKey != null) {
- doPut(accessor, legacyKey, value);
- }
- }
-
- private void doPut(MessageHeaderAccessor accessor, String key, String value) {
- accessor.setHeader(key, value);
- if (accessor instanceof NativeMessageHeaderAccessor) {
- NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
- nativeAccessor.setNativeHeader(key, value);
- }
- else {
- Object nativeHeaders = accessor.getHeader(NATIVE_HEADERS);
- if (nativeHeaders == null) {
- accessor.setHeader(NATIVE_HEADERS,
- nativeHeaders = new LinkedMultiValueMap<>());
- }
- if (nativeHeaders instanceof Map, ?>) {
- ((Map) nativeHeaders).put(key, Collections.singletonList(value));
- }
- }
- }
-
- @Override public String get(MessageHeaderAccessor accessor, String key) {
- try {
- String value = doGet(accessor, key);
- if (StringUtils.hasText(value)) {
- return value;
- }
- } catch (Exception e) {
- if (log.isDebugEnabled()) {
- log.debug("An exception happened when we tried to retrieve the [" + key + "] from message", e);
- }
- }
- return legacyValue(accessor, key);
- }
-
- private String legacyValue(MessageHeaderAccessor accessor, String key) {
- String legacyKey = LEGACY_HEADER_MAPPING.get(key);
- if (legacyKey != null) {
- return doGet(accessor, legacyKey);
- }
- return null;
- }
-
- private String doGet(MessageHeaderAccessor accessor, String key) {
- if (accessor instanceof NativeMessageHeaderAccessor) {
- NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
- String result = nativeAccessor.getFirstNativeHeader(key);
- if (result != null) {
- return result;
- }
- } else {
- Object nativeHeaders = accessor.getHeader(NATIVE_HEADERS);
- if (nativeHeaders instanceof Map) {
- Object result = ((Map) nativeHeaders).get(key);
- if (result instanceof List && !((List) result).isEmpty()) {
- return String.valueOf(((List) result).get(0));
- }
- }
- }
- Object result = accessor.getHeader(key);
- if (result != null) {
- if (result instanceof byte[]) {
- return new String((byte[]) result, UTF_8);
- }
- return result.toString();
- }
- return null;
- }
-
static Map propagationHeaders(Map headers,
List propagationHeaders) {
Map headersToCopy = new HashMap<>();
@@ -156,8 +83,9 @@ enum MessageHeaderPropagation
if (accessor instanceof NativeMessageHeaderAccessor) {
NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
nativeAccessor.removeNativeHeader(keyToRemove);
- } else {
- Object nativeHeaders = accessor.getHeader(NATIVE_HEADERS);
+ }
+ else {
+ Object nativeHeaders = accessor.getHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS);
if (nativeHeaders instanceof Map) {
((Map) nativeHeaders).remove(keyToRemove);
}
@@ -165,7 +93,96 @@ enum MessageHeaderPropagation
}
}
- @Override public String toString() {
+ @Override
+ public void put(MessageHeaderAccessor accessor, String key, String value) {
+ try {
+ doPut(accessor, key, value);
+ }
+ catch (Exception ex) {
+ if (log.isDebugEnabled()) {
+ log.debug("An exception happened when we tried to retrieve the [" + key
+ + "] from message", ex);
+ }
+ }
+ String legacyKey = LEGACY_HEADER_MAPPING.get(key);
+ if (legacyKey != null) {
+ doPut(accessor, legacyKey, value);
+ }
+ }
+
+ private void doPut(MessageHeaderAccessor accessor, String key, String value) {
+ accessor.setHeader(key, value);
+ if (accessor instanceof NativeMessageHeaderAccessor) {
+ NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
+ nativeAccessor.setNativeHeader(key, value);
+ }
+ else {
+ Object nativeHeaders = accessor.getHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS);
+ if (nativeHeaders == null) {
+ accessor.setHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS,
+ nativeHeaders = new LinkedMultiValueMap<>());
+ }
+ if (nativeHeaders instanceof Map, ?>) {
+ ((Map) nativeHeaders).put(key, Collections.singletonList(value));
+ }
+ }
+ }
+
+ @Override
+ public String get(MessageHeaderAccessor accessor, String key) {
+ try {
+ String value = doGet(accessor, key);
+ if (StringUtils.hasText(value)) {
+ return value;
+ }
+ }
+ catch (Exception ex) {
+ if (log.isDebugEnabled()) {
+ log.debug("An exception happened when we tried to retrieve the [" + key
+ + "] from message", ex);
+ }
+ }
+ return legacyValue(accessor, key);
+ }
+
+ private String legacyValue(MessageHeaderAccessor accessor, String key) {
+ String legacyKey = LEGACY_HEADER_MAPPING.get(key);
+ if (legacyKey != null) {
+ return doGet(accessor, legacyKey);
+ }
+ return null;
+ }
+
+ private String doGet(MessageHeaderAccessor accessor, String key) {
+ if (accessor instanceof NativeMessageHeaderAccessor) {
+ NativeMessageHeaderAccessor nativeAccessor = (NativeMessageHeaderAccessor) accessor;
+ String result = nativeAccessor.getFirstNativeHeader(key);
+ if (result != null) {
+ return result;
+ }
+ }
+ else {
+ Object nativeHeaders = accessor.getHeader(NativeMessageHeaderAccessor.NATIVE_HEADERS);
+ if (nativeHeaders instanceof Map) {
+ Object result = ((Map) nativeHeaders).get(key);
+ if (result instanceof List && !((List) result).isEmpty()) {
+ return String.valueOf(((List) result).get(0));
+ }
+ }
+ }
+ Object result = accessor.getHeader(key);
+ if (result != null) {
+ if (result instanceof byte[]) {
+ return new String((byte[]) result, StandardCharsets.UTF_8);
+ }
+ return result.toString();
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
return "MessageHeaderPropagation{}";
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/OnMessagingEnabled.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/OnMessagingEnabled.java
index 4eac04af4..4b4127999 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/OnMessagingEnabled.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/OnMessagingEnabled.java
@@ -25,6 +25,8 @@ import java.lang.annotation.Target;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
/**
+ * Verifies if messaging property was enabled.
+ *
* @author Marcin Grzejszczak
* @since 2.0.0
*/
@@ -33,4 +35,5 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@Documented
@ConditionalOnProperty(value = "spring.sleuth.messaging.enabled", matchIfMissing = true)
@interface OnMessagingEnabled {
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthMessagingProperties.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthMessagingProperties.java
index 3c6cd32c8..dd534bede 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthMessagingProperties.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/SleuthMessagingProperties.java
@@ -19,6 +19,8 @@ package org.springframework.cloud.sleuth.instrument.messaging;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
+ * Properties for messaging
+ *
* @author Marcin Grzejszczak
* @since 2.0.0
*/
@@ -45,7 +47,13 @@ public class SleuthMessagingProperties {
this.messaging = messaging;
}
+ /**
+ * Properties for Spring Integration
+ *
+ * @author Marcin Grzejszczak
+ */
public static class Integration {
+
/**
* An array of patterns against which channel names will be matched.
* @see org.springframework.integration.config.GlobalChannelInterceptor#patterns().
@@ -54,7 +62,7 @@ public class SleuthMessagingProperties {
private String[] patterns = new String[] { "!hystrixStreamOutput*", "*" };
/**
- * Enable Spring Integration sleuth instrumentation
+ * Enable Spring Integration sleuth instrumentation.
*/
private boolean enabled;
@@ -73,15 +81,34 @@ public class SleuthMessagingProperties {
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
+
}
+ /**
+ * Generic messaging properties.
+ *
+ * @author Marcin Grzejszczak
+ */
public static class Messaging {
+
+ /**
+ * Should messaging be turned on.
+ */
private boolean enabled;
+ /**
+ * Rabbit related properties.
+ */
private Rabbit rabbit = new Rabbit();
+ /**
+ * Kafka related properties.
+ */
private Kafka kafka = new Kafka();
+ /**
+ * JMS related properties.
+ */
private Jms jms = new Jms();
public boolean isEnabled() {
@@ -115,9 +142,11 @@ public class SleuthMessagingProperties {
public void setJms(Jms jms) {
this.jms = jms;
}
+
}
public static class Rabbit {
+
private boolean enabled;
private String remoteServiceName = "rabbitmq";
@@ -137,9 +166,11 @@ public class SleuthMessagingProperties {
public void setRemoteServiceName(String remoteServiceName) {
this.remoteServiceName = remoteServiceName;
}
+
}
public static class Kafka {
+
private boolean enabled;
private String remoteServiceName = "kafka";
@@ -159,9 +190,11 @@ public class SleuthMessagingProperties {
public void setRemoteServiceName(String remoteServiceName) {
this.remoteServiceName = remoteServiceName;
}
+
}
public static class Jms {
+
private boolean enabled;
private String remoteServiceName = "jms";
@@ -181,5 +214,7 @@ public class SleuthMessagingProperties {
public void setRemoteServiceName(String remoteServiceName) {
this.remoteServiceName = remoteServiceName;
}
+
}
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java
index d47165f8e..473794b5a 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessageHeaders.java
@@ -27,11 +27,18 @@ package org.springframework.cloud.sleuth.instrument.messaging;
public class TraceMessageHeaders {
public static final String SPAN_ID_NAME = "spanId";
+
public static final String SAMPLED_NAME = "spanSampled";
+
public static final String PARENT_ID_NAME = "spanParentSpanId";
+
public static final String TRACE_ID_NAME = "spanTraceId";
+
public static final String SPAN_NAME_NAME = "spanName";
+
public static final String SPAN_FLAGS_NAME = "spanFlags";
- private TraceMessageHeaders() {}
+ private TraceMessageHeaders() {
+ }
+
}
diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessagingAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessagingAutoConfiguration.java
index 095407d14..e6d2a60c7 100644
--- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessagingAutoConfiguration.java
+++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TraceMessagingAutoConfiguration.java
@@ -63,8 +63,7 @@ import org.springframework.util.ReflectionUtils;
/**
* {@link org.springframework.boot.autoconfigure.EnableAutoConfiguration
- * Auto-configuration} that registers a tracing instrumentation of
- * messaging components.
+ * Auto-configuration} that registers a tracing instrumentation of messaging components.
*
* @author Marcin Grzejszczak
* @since 2.0.0
@@ -80,21 +79,25 @@ public class TraceMessagingAutoConfiguration {
@ConditionalOnProperty(value = "spring.sleuth.messaging.rabbit.enabled", matchIfMissing = true)
@ConditionalOnClass(RabbitTemplate.class)
protected static class SleuthRabbitConfiguration {
+
+ @Bean
+ // for tests
+ @ConditionalOnMissingBean
+ static SleuthRabbitBeanPostProcessor sleuthRabbitBeanPostProcessor(
+ BeanFactory beanFactory) {
+ return new SleuthRabbitBeanPostProcessor(beanFactory);
+ }
+
@Bean
@ConditionalOnMissingBean
SpringRabbitTracing springRabbitTracing(Tracing tracing,
SleuthMessagingProperties properties) {
return SpringRabbitTracing.newBuilder(tracing)
- .remoteServiceName(properties.getMessaging().getRabbit().getRemoteServiceName())
+ .remoteServiceName(
+ properties.getMessaging().getRabbit().getRemoteServiceName())
.build();
}
- @Bean
- // for tests
- @ConditionalOnMissingBean
- static SleuthRabbitBeanPostProcessor sleuthRabbitBeanPostProcessor(BeanFactory beanFactory) {
- return new SleuthRabbitBeanPostProcessor(beanFactory);
- }
}
@Configuration
@@ -105,9 +108,9 @@ public class TraceMessagingAutoConfiguration {
@Bean
@ConditionalOnMissingBean
KafkaTracing kafkaTracing(Tracing tracing, SleuthMessagingProperties properties) {
- return KafkaTracing
- .newBuilder(tracing)
- .remoteServiceName(properties.getMessaging().getKafka().getRemoteServiceName())
+ return KafkaTracing.newBuilder(tracing)
+ .remoteServiceName(
+ properties.getMessaging().getKafka().getRemoteServiceName())
.build();
}
@@ -117,6 +120,7 @@ public class TraceMessagingAutoConfiguration {
SleuthKafkaAspect sleuthKafkaAspect(KafkaTracing kafkaTracing, Tracer tracer) {
return new SleuthKafkaAspect(kafkaTracing, tracer);
}
+
}
@Configuration
@@ -128,48 +132,56 @@ public class TraceMessagingAutoConfiguration {
@ConditionalOnMissingBean
JmsTracing jmsTracing(Tracing tracing, SleuthMessagingProperties properties) {
return JmsTracing.newBuilder(tracing)
- .remoteServiceName(properties.getMessaging().getJms().getRemoteServiceName())
+ .remoteServiceName(
+ properties.getMessaging().getJms().getRemoteServiceName())
.build();
}
@Bean
// for tests
@ConditionalOnMissingBean
- TracingConnectionFactoryBeanPostProcessor tracingConnectionFactoryBeanPostProcessor(BeanFactory beanFactory) {
+ TracingConnectionFactoryBeanPostProcessor tracingConnectionFactoryBeanPostProcessor(
+ BeanFactory beanFactory) {
return new TracingConnectionFactoryBeanPostProcessor(beanFactory);
}
/** Choose the tracing endpoint registry */
@Bean
- TracingJmsListenerEndpointRegistry tracingJmsListenerEndpointRegistry(JmsTracing jmsTracing, CurrentTraceContext current) {
+ TracingJmsListenerEndpointRegistry tracingJmsListenerEndpointRegistry(
+ JmsTracing jmsTracing, CurrentTraceContext current) {
return new TracingJmsListenerEndpointRegistry(jmsTracing, current);
}
/** Setup the tracing endpoint registry */
@Bean
- JmsListenerConfigurer configureTracing(TracingJmsListenerEndpointRegistry registry) {
+ JmsListenerConfigurer configureTracing(
+ TracingJmsListenerEndpointRegistry registry) {
return registrar -> registrar.setEndpointRegistry(registry);
}
+
}
+
}
class SleuthRabbitBeanPostProcessor implements BeanPostProcessor {
private final BeanFactory beanFactory;
+
private SpringRabbitTracing tracing;
SleuthRabbitBeanPostProcessor(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
- @Override public Object postProcessBeforeInitialization(Object bean, String beanName)
+ @Override
+ public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof RabbitTemplate) {
- return rabbitTracing()
- .decorateRabbitTemplate((RabbitTemplate) bean);
- } else if (bean instanceof SimpleRabbitListenerContainerFactory) {
- return rabbitTracing()
- .decorateSimpleRabbitListenerContainerFactory((SimpleRabbitListenerContainerFactory) bean);
+ return rabbitTracing().decorateRabbitTemplate((RabbitTemplate) bean);
+ }
+ else if (bean instanceof SimpleRabbitListenerContainerFactory) {
+ return rabbitTracing().decorateSimpleRabbitListenerContainerFactory(
+ (SimpleRabbitListenerContainerFactory) bean);
}
return bean;
}
@@ -180,31 +192,35 @@ class SleuthRabbitBeanPostProcessor implements BeanPostProcessor {
}
return this.tracing;
}
+
}
@Aspect
class SleuthKafkaAspect {
private static final Log log = LogFactory.getLog(SleuthKafkaAspect.class);
-
+ final Field recordMessageConverter;
private final KafkaTracing kafkaTracing;
private final Tracer tracer;
- final Field recordMessageConverter;
SleuthKafkaAspect(KafkaTracing kafkaTracing, Tracer tracer) {
this.kafkaTracing = kafkaTracing;
this.tracer = tracer;
- this.recordMessageConverter = ReflectionUtils.findField(MessagingMessageListenerAdapter.class, "recordMessageConverter");
+ this.recordMessageConverter = ReflectionUtils.findField(
+ MessagingMessageListenerAdapter.class, "recordMessageConverter");
}
@Pointcut("execution(public * org.springframework.kafka.core.ProducerFactory.createProducer(..))")
- private void anyProducerFactory() { } // NOSONAR
+ private void anyProducerFactory() {
+ } // NOSONAR
@Pointcut("execution(public * org.springframework.kafka.core.ConsumerFactory.createConsumer(..))")
- private void anyConsumerFactory() { } // NOSONAR
+ private void anyConsumerFactory() {
+ } // NOSONAR
@Pointcut("execution(public * org.springframework.kafka.config.KafkaListenerContainerFactory.createListenerContainer(..))")
- private void anyCreateListenerContainer() { } // NOSONAR
+ private void anyCreateListenerContainer() {
+ } // NOSONAR
@Around("anyProducerFactory()")
public Object wrapProducerFactory(ProceedingJoinPoint pjp) throws Throwable {
@@ -219,23 +235,28 @@ class SleuthKafkaAspect {
}
@Around("anyCreateListenerContainer()")
- public Object wrapListenerContainerCreation(ProceedingJoinPoint pjp) throws Throwable {
+ public Object wrapListenerContainerCreation(ProceedingJoinPoint pjp)
+ throws Throwable {
MessageListenerContainer listener = (MessageListenerContainer) pjp.proceed();
if (listener instanceof AbstractMessageListenerContainer) {
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) listener;
- Object someMessageListener = container.getContainerProperties().getMessageListener();
+ Object someMessageListener = container.getContainerProperties()
+ .getMessageListener();
if (someMessageListener == null) {
if (log.isDebugEnabled()) {
log.debug("No message listener to wrap. Proceeding");
}
- } else if (someMessageListener instanceof MessageListener) {
+ }
+ else if (someMessageListener instanceof MessageListener) {
container.setupMessageListener(createProxy(someMessageListener));
- } else {
+ }
+ else {
if (log.isDebugEnabled()) {
log.debug("ATM we don't support Batch message listeners");
}
}
- } else {
+ }
+ else {
if (log.isDebugEnabled()) {
log.debug("Can't wrap this listener. Proceeding");
}
@@ -247,17 +268,22 @@ class SleuthKafkaAspect {
Object createProxy(Object bean) {
ProxyFactoryBean factory = new ProxyFactoryBean();
factory.setProxyTargetClass(true);
- factory.addAdvice(new MessageListenerMethodInterceptor(this.kafkaTracing, this.tracer));
+ factory.addAdvice(
+ new MessageListenerMethodInterceptor(this.kafkaTracing, this.tracer));
factory.setTarget(bean);
return factory.getObject();
}
+
}
-class MessageListenerMethodInterceptor implements MethodInterceptor {
+class MessageListenerMethodInterceptor
+ implements MethodInterceptor {
- private static final Log log = LogFactory.getLog(MessageListenerMethodInterceptor.class);
+ private static final Log log = LogFactory
+ .getLog(MessageListenerMethodInterceptor.class);
private final KafkaTracing kafkaTracing;
+
private final Tracer tracer;
MessageListenerMethodInterceptor(KafkaTracing kafkaTracing, Tracer tracer) {
@@ -265,29 +291,35 @@ class MessageListenerMethodInterceptor implements Met
this.tracer = tracer;
}
- @Override public Object invoke(MethodInvocation invocation)
- throws Throwable {
+ @Override
+ public Object invoke(MethodInvocation invocation) throws Throwable {
if (!"onMessage".equals(invocation.getMethod().getName())) {
return invocation.proceed();
}
Object[] arguments = invocation.getArguments();
- Optional