プログラムによる設定

プログラムによる設定には AutoConfigurationCustomizerProvider を使用できます。 プログラムによる設定は、プロパティでは設定できない高度なユースケースに推奨されます。

アクチュエーターエンドポイントをトレースから除外する

例として、ヘルスチェックエンドポイントをトレースから除外するようにサンプラーをカスタマイズできます。

<dependencies>
  <dependency>
    <groupId>io.opentelemetry.contrib</groupId>
    <artifactId>opentelemetry-samplers</artifactId>
    <version>1.54.0-alpha</version>
  </dependency>
</dependencies>
dependencies {
  implementation("io.opentelemetry.contrib:opentelemetry-samplers:1.54.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";
  }
}

計装設定をプログラムで読み取る

計装モジュールは、application.properties / application.yaml で設定した場合でも、宣言的設定で設定した場合でも、ConfigProvider Bean を通じて設定を読み取ります。 自分のコードから計装設定の値を読み取る必要がある場合は、ConfigProvider Bean を直接オートワイヤーしてください。

宣言的設定が有効な場合、otelPropertiesConfigProperties)Bean は互換性ブリッジとしてのみ提供されます。 これは非推奨であり、3.0 で削除される予定です。 かわりに ConfigProvider を使用してください。

package io.opentelemetry.examples.fileconfig;

import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
import org.springframework.stereotype.Component;

/** アプリケーションコードから計装設定を読み取る例。 */
@Component
public class ReadInstrumentationConfig {

  private final ConfigProvider configProvider;

  public ReadInstrumentationConfig(ConfigProvider configProvider) {
    this.configProvider = configProvider;
  }

  public boolean isDbQuerySanitizationEnabled() {
    DeclarativeConfigProperties dbConfig =
        configProvider
            .getInstrumentationConfig()
            .get("java")
            .get("common")
            .get("db")
            .get("query_sanitization");
    return dbConfig.getBoolean("enabled", true);
  }
}

getInstrumentationConfig() 配下のキーは、値を otel.instrumentation.* プロパティで設定した場合でも、宣言的 YAML で設定した場合でも、宣言的設定で使用されるのと同じ instrumentation/development.java.* 構造に従います。 プロパティ名がこの構造にどのようにマッピングされるかは、マッピングテーブルを参照してください。