Add support for WithSpan.kind() (#711)
This commit is contained in:
parent
5bab5b9d7d
commit
0e2a85c6dd
|
@ -19,6 +19,8 @@ package io.opentelemetry.auto.instrumentation.traceannotation;
|
||||||
import io.opentelemetry.OpenTelemetry;
|
import io.opentelemetry.OpenTelemetry;
|
||||||
import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator;
|
import io.opentelemetry.auto.bootstrap.instrumentation.decorator.BaseDecorator;
|
||||||
import io.opentelemetry.extensions.auto.annotations.WithSpan;
|
import io.opentelemetry.extensions.auto.annotations.WithSpan;
|
||||||
|
import io.opentelemetry.trace.Span;
|
||||||
|
import io.opentelemetry.trace.Span.Kind;
|
||||||
import io.opentelemetry.trace.Tracer;
|
import io.opentelemetry.trace.Tracer;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
@ -42,4 +44,9 @@ public class TraceDecorator extends BaseDecorator {
|
||||||
|
|
||||||
return spanNameForMethod(method);
|
return spanNameForMethod(method);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Span.Kind extractSpanKind(final Method method) {
|
||||||
|
WithSpan annotation = method.getAnnotation(WithSpan.class);
|
||||||
|
return annotation != null ? annotation.kind() : Kind.INTERNAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,10 @@ public class WithSpanAdvice {
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static SpanWithScope onEnter(@Advice.Origin final Method method) {
|
public static SpanWithScope onEnter(@Advice.Origin final Method method) {
|
||||||
final Span span =
|
final Span span =
|
||||||
TRACER.spanBuilder(DECORATE.spanNameForMethodWithAnnotation(method)).startSpan();
|
TRACER
|
||||||
|
.spanBuilder(DECORATE.spanNameForMethodWithAnnotation(method))
|
||||||
|
.setSpanKind(DECORATE.extractSpanKind(method))
|
||||||
|
.startSpan();
|
||||||
DECORATE.afterStart(span);
|
DECORATE.afterStart(span);
|
||||||
return new SpanWithScope(span, currentContextWith(span));
|
return new SpanWithScope(span, currentContextWith(span));
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,9 +17,10 @@
|
||||||
import io.opentelemetry.auto.test.AgentTestRunner
|
import io.opentelemetry.auto.test.AgentTestRunner
|
||||||
import io.opentelemetry.auto.test.utils.ConfigUtils
|
import io.opentelemetry.auto.test.utils.ConfigUtils
|
||||||
import io.opentelemetry.test.annotation.TracedWithSpan
|
import io.opentelemetry.test.annotation.TracedWithSpan
|
||||||
|
import io.opentelemetry.trace.Span
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This test verifies that auto instrumentation supports {@link io.opentelemetry.contrib.auto.annotations.WithSpan} contrib annotation.
|
* This test verifies that auto instrumentation supports {@link io.opentelemetry.extensions.auto.annotations.WithSpan} contrib annotation.
|
||||||
*/
|
*/
|
||||||
class WithSpanInstrumentationTest extends AgentTestRunner {
|
class WithSpanInstrumentationTest extends AgentTestRunner {
|
||||||
|
|
||||||
|
@ -46,6 +47,7 @@ class WithSpanInstrumentationTest extends AgentTestRunner {
|
||||||
trace(0, 1) {
|
trace(0, 1) {
|
||||||
span(0) {
|
span(0) {
|
||||||
operationName "TracedWithSpan.otel"
|
operationName "TracedWithSpan.otel"
|
||||||
|
spanKind Span.Kind.INTERNAL
|
||||||
parent()
|
parent()
|
||||||
errored false
|
errored false
|
||||||
attributes {
|
attributes {
|
||||||
|
@ -75,6 +77,27 @@ class WithSpanInstrumentationTest extends AgentTestRunner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def "should take span kind from annotation"() {
|
||||||
|
setup:
|
||||||
|
new TracedWithSpan().oneOfAKind()
|
||||||
|
|
||||||
|
expect:
|
||||||
|
assertTraces(1) {
|
||||||
|
trace(0, 1) {
|
||||||
|
span(0) {
|
||||||
|
operationName "TracedWithSpan.oneOfAKind"
|
||||||
|
spanKind Span.Kind.PRODUCER
|
||||||
|
parent()
|
||||||
|
errored false
|
||||||
|
attributes {
|
||||||
|
"providerAttr" "Otel"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def "should ignore method excluded by trace.methods.exclude configuration"() {
|
def "should ignore method excluded by trace.methods.exclude configuration"() {
|
||||||
setup:
|
setup:
|
||||||
new TracedWithSpan().ignored()
|
new TracedWithSpan().ignored()
|
||||||
|
|
|
@ -18,6 +18,7 @@ package io.opentelemetry.test.annotation;
|
||||||
|
|
||||||
import io.opentelemetry.OpenTelemetry;
|
import io.opentelemetry.OpenTelemetry;
|
||||||
import io.opentelemetry.extensions.auto.annotations.WithSpan;
|
import io.opentelemetry.extensions.auto.annotations.WithSpan;
|
||||||
|
import io.opentelemetry.trace.Span.Kind;
|
||||||
import io.opentelemetry.trace.Tracer;
|
import io.opentelemetry.trace.Tracer;
|
||||||
|
|
||||||
public class TracedWithSpan {
|
public class TracedWithSpan {
|
||||||
|
@ -42,4 +43,10 @@ public class TracedWithSpan {
|
||||||
TRACER.getCurrentSpan().setAttribute("providerAttr", "Otel");
|
TRACER.getCurrentSpan().setAttribute("providerAttr", "Otel");
|
||||||
return "hello!";
|
return "hello!";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@WithSpan(kind = Kind.PRODUCER)
|
||||||
|
public String oneOfAKind() {
|
||||||
|
TRACER.getCurrentSpan().setAttribute("providerAttr", "Otel");
|
||||||
|
return "hello!";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue