注释

将仪器注解与 Java 代理一起使用。

对于大多数用户来说,开箱即用的仪器是完全足够的,无需再做任何事情。然而,有时用户希望为自己的自定义代码创建 跨度,而无需更改太多代码。WithSpanSpanAttribute 注解支持这些用例。

依赖项

您需要将 opentelemetry-instrumentation-annotations 库添加到依赖中,才能使用 @WithSpan 注解。

<dependencies>
  <dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-instrumentation-annotations</artifactId>
    <version>2.23.0</version>
  </dependency>
</dependencies>

Gradle

dependencies {
    implementation('io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:2.23.0')
}

使用 @WithSpan 为方法创建跨度

要创建一个 跨度 来仪器化特定方法,请在方法上添加 @WithSpan 注解。

import io.opentelemetry.instrumentation.annotations.WithSpan;

public class MyClass {
  @WithSpan
  public void myMethod() {
      <...>
  }
}

每次应用程序调用被注解的方法时,都会创建一个表示其持续时间并提供任何抛出异常的跨度。默认情况下,跨度名称将是 <className>.<methodName>,除非通过 value 注解参数提供了名称。

如果被 @WithSpan 注解的方法的返回类型是以下列出的 类 future 或 promise 类型 之一,则在 future 完成之前,跨度将不会结束。

参数

@WithSpan 注解支持以下可选参数,以允许自定义跨度

name类型default描述
value字符串""跨度名称。如果未指定,则使用默认的 <className>.<methodName>
种类SpanKind (枚举)INTERNAL跨度的种类
inheritContext布尔值true自 2.14.0 起。控制新跨度是否将在现有(当前)上下文中父化。如果为 false,则会创建一个新上下文。

示例参数用法

@WithSpan(kind = SpanKind.CLIENT, inheritContext = false, value = "my span name")
public void myMethod() {
    <...>
}

@WithSpan("my span name")
public void myOtherMethod() {
    <...>
}

使用 @SpanAttribute 向跨度添加属性

当为被注解的方法创建 跨度 时,方法调用的参数值可以自动添加为已创建跨度的属性。只需在方法参数上添加 @SpanAttribute 注解即可。

import io.opentelemetry.instrumentation.annotations.SpanAttribute;
import io.opentelemetry.instrumentation.annotations.WithSpan;

public class MyClass {

    @WithSpan
    public void myMethod(@SpanAttribute("parameter1") String parameter1,
        @SpanAttribute("parameter2") long parameter2) {
        <...>
    }
}

除非在注解的参数中指定,否则属性名称将从正式参数名称派生,前提是通过将 -parameters 选项传递给 javac 编译器将它们编译到 .class 文件中。

禁用 @WithSpan 仪器

如果您有使用 @WithSpan 进行过度仪器的代码,并且想要在不修改代码的情况下禁用其中的一些,那么禁用 @WithSpan 会很有用。

系统属性: otel.instrumentation.opentelemetry-instrumentation-annotations.exclude-methods环境变量: OTEL_INSTRUMENTATION_OPENTELEMETRY_INSTRUMENTATION_ANNOTATIONS_EXCLUDE_METHODS

描述: 禁用特定方法的 @WithSpan 仪器。格式为 my.package.MyClass1[method1,method2];my.package.MyClass2[method3]

使用 otel.instrumentation.methods.include 为方法创建跨度

在无法修改代码的情况下,您仍然可以配置 Java 代理来捕获特定方法的跨度。

系统属性: otel.instrumentation.methods.include环境变量: OTEL_INSTRUMENTATION_METHODS_INCLUDE

描述: 在 @WithSpan 的情况下,为特定方法添加仪器。格式为 my.package.MyClass1[method1,method2];my.package.MyClass2[method3]

如果一个方法被重载(在同一类中出现多次,名称相同但参数不同),则所有版本的该方法都将被仪器化。

下一步

除了使用注解之外,OpenTelemetry API 还允许您获取一个用于 自定义仪器 的 Tracer。