SDK 配置

此 Spring 启动器支持配置元数据, 这意味着您可以在 IDE 中查看和自动完成所有可用属性。

通用配置

OpenTelemetry 启动器支持所有的 SDK 自动配置(自 2.2.0 版本起)。

你可以在 application.propertiesapplication.yaml 文件中通过属性来更新配置,也可以通过环境变量进行配置。

application.properties 示例:

otel.propagators=tracecontext,b3
otel.resource.attributes.deployment.environment=dev
otel.resource.attributes.service.name=cart
otel.resource.attributes.service.namespace=shop

application.yaml 示例:

otel:
  propagators:
    - tracecontext
    - b3
  resource:
    attributes:
      deployment.environment: dev
      service:
        name: cart
        namespace: shop

环境变量示例:

export OTEL_PROPAGATORS="tracecontext,b3"
export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=dev,service.name=cart,service.namespace=shop"

覆盖资源属性

如同在 Spring Boot 中一样,您可以使用环境变量覆盖 application.propertiesapplication.yaml 文件中的属性。

例如,您可以通过设置标准的 OTEL_RESOURCE_ATTRIBUTES 环境变量来配置或覆盖 deployment.environment 资源属性。

export OTEL_RESOURCE_ATTRIBUTES="deployment.environment=prod"

或者,你可以使用 OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_ENVIRONMENT 这个环境变量, 来设置或覆盖单个资源属性:

export OTEL_RESOURCE_ATTRIBUTES_DEPLOYMENT_ENVIRONMENT="prod"

第二个选项支持 SpEL 表达式。

请注意,DEPLOYMENT_ENVIRONMENT 会被 Spring Boot 的宽松绑定转换为 deployment.environment

禁用 OpenTelemetry 启动器

System property: otel.sdk.disabledEnvironment variable: OTEL_SDK_DISABLED

Description: 将值设置为 true 以禁用启动器,例如用于测试目的。

编程式配置

你可以使用 AutoConfigurationCustomizerProvider 进行编程式配置。 对于无法通过配置属性实现的高级用例,建议使用编程方式进行配置。

从追踪中排除 Actuator 端点

例如,你可以自定义采样器,将健康检查端点从追踪中排除:

<dependencies>
  <dependency>
    <groupId>io.opentelemetry.contrib</groupId>
    <artifactId>opentelemetry-samplers</artifactId>
    <version>1.33.0-alpha</version>
  </dependency>
</dependencies>
dependencies {
  implementation("io.opentelemetry.contrib:opentelemetry-samplers:1.33.0-alpha")
}
package otel;

import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.contrib.sampler.RuleBasedRoutingSampler;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
import io.opentelemetry.semconv.UrlAttributes;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterPaths {

  @Bean
  public AutoConfigurationCustomizerProvider otelCustomizer() {
    return p ->
        p.addSamplerCustomizer(
            (fallback, config) ->
                RuleBasedRoutingSampler.builder(SpanKind.SERVER, fallback)
                    .drop(UrlAttributes.URL_PATH, "^/actuator")
                    .build());
  }
}

编程式配置导出器

你还可以通过编程方式配置 OTLP 导出器。 此配置替换了默认的 OTLP 导出器,并向请求添加了自定义标头。

package otel;

import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
import io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizerProvider;
import java.util.Collections;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CustomAuth {
  @Bean
  public AutoConfigurationCustomizerProvider otelCustomizer() {
    return p ->
        p.addSpanExporterCustomizer(
            (exporter, config) -> {
              if (exporter instanceof OtlpHttpSpanExporter) {
                return ((OtlpHttpSpanExporter) exporter)
                    .toBuilder().setHeaders(this::headers).build();
              }
              return exporter;
            });
  }

  private Map<String, String> headers() {
    return Collections.singletonMap("Authorization", "Bearer " + refreshToken());
  }

  private String refreshToken() {
    // 例如,从 kubernetes 密钥中读取令牌
    return "token";
  }
}

资源提供器

OpenTelemetry 启动器包含与 Java 代理相同的资源提供器:

此外,OpenTelemetry 启动器还包括以下特定于 Spring Boot 的资源提供器:

分发资源启动器

FQN(完全限定名) : io.opentelemetry.instrumentation.spring.autoconfigure.resources.DistroVersionResourceProvider

属性
telemetry.distro.nameopentelemetry-spring-boot-starter
telemetry.distro.version启动器版本

Spring 资源启动器

FQN(完全限定名): io.opentelemetry.instrumentation.spring.autoconfigure.resources.SpringResourceProvider

属性
service.namespring.application.namebuild.name 来自 build-info.properties (请参阅服务名称)
service.versionbuild.version 来自 build-info.properties

服务名称

使用这些资源提供器,服务名称由以下优先级规则确定, 符合 OpenTelemetry 的规范

  1. otel.service.name Spring 属性或 OTEL_SERVICE_NAME 环境变量(优先级最高)
  2. service.name 可配置于 otel.resource.attributes 系统属性、Spring 属性或 OTEL_RESOURCE_ATTRIBUTES 环境变量
  3. spring.application.name Spring 属性
  4. build-info.properties
  5. 来自 META-INF、MANIFEST.MF 的 Implementation-Title
  6. 默认值为 unknown_service:java(优先级最低)

在你的 pom.xml 文件中使用以下代码段来生成 build-info.properties 文件:

<build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>build-info</goal>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
springBoot {
  buildInfo {
  }
}