Annotations

For most users, the out-of-the-box instrumentation is completely sufficient and nothing more has to be done. Sometimes, however, users wish to create spans for their own custom code without needing to make many code changes.

If you add the WithSpan annotation to a method, the method is wrapped in a span. The SpanAttribute annotation allows you to capture the method arguments as attributes.

package otel;

import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.annotations.SpanAttribute;
import io.opentelemetry.instrumentation.annotations.WithSpan;
import org.springframework.stereotype.Component;

/** Test WithSpan */
@Component
public class TracedClass {

  @WithSpan
  public void tracedMethod() {}

  @WithSpan(value = "span name")
  public void tracedMethodWithName() {
    Span currentSpan = Span.current();
    currentSpan.addEvent("ADD EVENT TO tracedMethodWithName SPAN");
    currentSpan.setAttribute("isTestAttribute", true);
  }

  @WithSpan(kind = SpanKind.CLIENT)
  public void tracedClientSpan() {}

  @WithSpan
  public void tracedMethodWithAttribute(@SpanAttribute("attributeName") String parameter) {}
}
Note

The OpenTelemetry annotations use Spring AOP based on proxies.

These annotations work only for the methods of the proxy. You can learn more in the Spring documentation.

In the following example, the WithSpan annotation won’t do anything when the GET endpoint is called:

@RestController
public class MyControllerManagedBySpring {

    @GetMapping("/ping")
    public void aMethod() {
        anotherMethod();
    }

    @WithSpan
    public void anotherMethod() {
    }
}
Note

To be able to use the OpenTelemetry annotations, you have to add the Spring Boot Starter AOP dependency to your project:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
  </dependency>
</dependencies>
dependencies {
  implementation("org.springframework.boot:spring-boot-starter-aop")
}

You can disable the OpenTelemetry annotations by setting the otel.instrumentation.annotations.enabled property to false.

You can customize the span by using the elements of the WithSpan annotation:

NameTypeDescriptionDefault Value
valueStringSpan nameClassName.Method
kindSpanKindSpan kind of the spanSpanKind.INTERNAL

You can set the attribute name from the value element of the SpanAttribute annotation:

NameTypeDescriptionDefault Value
valueStringAttribute nameMethod parameter name

Next steps

Beyond the use of annotations, the OpenTelemetry API allows you to obtain a tracer that can be used custom instrumentation.


Morty Proxy This is a proxified and sanitized view of the page, visit original site.