# プログラムによる設定

Site [llms.txt](/ja/llms.txt)

---

<?code-excerpt path-base="content-modules/opentelemetry-java-examples/doc-snippets/spring-starter"?>

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

> [!WARNING]
>
> `AutoConfigurationCustomizerProvider` は[宣言的設定](../declarative-configuration/)では動作しません。
> 宣言的設定では、代わりに `DeclarativeConfigurationCustomizerProvider` を使用してください。
> 詳細と例については、[エージェントの Extension API セクション](/docs/zero-code/java/agent/declarative-configuration/)を参照してください。

## アクチュエーターエンドポイントをトレースから除外する {#exclude-actuator-endpoints-from-tracing}

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

   <ul class="nav nav-tabs" id="tabs-0" role="tablist">
  <li class="nav-item">
      <button class="nav-link active"
          id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
          data-td-tp-persist="maven (`pom.xml`)" aria-controls="tabs-00-00" aria-selected="true">
        Maven (<code>pom.xml</code>)
      </button>
    </li><li class="nav-item">
      <button class="nav-link"
          id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
          data-td-tp-persist="gradle (`build.gradle`)" aria-controls="tabs-00-01" aria-selected="false">
        Gradle (<code>build.gradle</code>)
      </button>
    </li>
</ul>

<div class="tab-content" id="tabs-0-content">
    <div class="tab-body tab-pane fade show active"
        id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-xml" data-lang="xml"><span class="line"><span class="cl"><span class="nt">&lt;dependencies&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;dependency&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;groupId&gt;</span>io.opentelemetry.contrib<span class="nt">&lt;/groupId&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;artifactId&gt;</span>opentelemetry-samplers<span class="nt">&lt;/artifactId&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&lt;version&gt;</span>1.54.0-alpha<span class="nt">&lt;/version&gt;</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&lt;/dependency&gt;</span>
</span></span><span class="line"><span class="cl"><span class="nt">&lt;/dependencies&gt;</span>
</span></span></code></pre></div>
    </div>
    <div class="tab-body tab-pane fade"
        id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
        <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-kotlin" data-lang="kotlin"><span class="line"><span class="cl"><span class="n">dependencies</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">implementation</span><span class="p">(</span><span class="s2">&#34;io.opentelemetry.contrib:opentelemetry-samplers:1.54.0-alpha&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
    </div>
</div>


<?code-excerpt "src/main/java/otel/FilterPaths.java"?>

```java
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());
  }
}
```

## エクスポーターをプログラムで設定する {#configure-the-exporter-programmatically}

OTLP エクスポーターをプログラムで設定することもできます。
この設定はデフォルトの OTLP エクスポーターを置き換え、リクエストにカスタムヘッダーを追加します。

<?code-excerpt "src/main/java/otel/CustomAuth.java"?>

```java
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";
  }
}
```

## 計装設定をプログラムで読み取る {#read-instrumentation-configuration-programmatically}

> [!NOTE]
>
> OpenTelemetry Spring Boot スターターバージョン 2.30.0 以降が必要です。

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

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

<?code-excerpt path-base="content-modules/opentelemetry-java-examples/spring-declarative-configuration"?>

<?code-excerpt "src/main/java/io/opentelemetry/examples/fileconfig/ReadInstrumentationConfig.java" from="package"?>

```java
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 で設定した場合でも、[宣言的設定](../declarative-configuration/#instrumentation-configuration)で使用されるのと同じ `instrumentation/development.java.*` 構造に従います。
プロパティ名がこの構造にどのようにマッピングされるかは、[マッピングテーブル](../declarative-configuration/#instrumentation-configuration)を参照してください。
