

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Spring による AOP と X-Ray SDK for Java
<a name="xray-sdk-java-aop-spring"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

このトピックでは、X-Ray SDK および Spring Framework を使用して、コアロジックを変更せずにアプリケーションを計測する方法について説明します。つまり、リモートで実行されているアプリケーションをインストルメントする非侵襲的な方法が追加されました AWS。

**Spring で AOP を有効にするには**

1. [Spring を設定します](#xray-sdk-java-aop-spring-configuration)

1. [トレースフィルターをアプリケーションに追加する](#xray-sdk-java-aop-filters-spring)

1. [コードに注釈を付けるか、インターフェイスを実装します](#xray-sdk-java-aop-annotate-or-implement)

1. [アプリケーションで X-Ray を有効化します](#xray-sdk-java-aop-activate-xray)

## Spring の設定
<a name="xray-sdk-java-aop-spring-configuration"></a>

Maven または Gradle を使用して、AOP でアプリケーションを計測するように Spring を設定できます。

Maven を使用してアプリケーションを構築する場合は、次の依存関係を `pom.xml` ファイルに追加します。

```
<dependency> 
     <groupId>com.amazonaws</groupId> 
     <artifactId>aws-xray-recorder-sdk-spring</artifactId> 
     <version>2.11.0</version> 
</dependency>
```

Gradle の場合は、次の依存関係を `build.gradle` ファイルに追加します。

```
compile 'com.amazonaws:aws-xray-recorder-sdk-spring:2.11.0'
```

## Spring Boot の設定
<a name="xray-sdk-java-aop-spring-boot-configuration"></a>

前のセクションで説明した Spring の依存関係に加えて、Spring Boot を使用している場合で、それがまだクラスパス上にない場合は、次の依存関係を追加します。

Maven:

```
<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-aop</artifactId> 
     <version>2.5.2</version> 
</dependency>
```

Gradle:

```
compile 'org.springframework.boot:spring-boot-starter-aop:2.5.2'
```

## トレースフィルターをアプリケーションに追加する
<a name="xray-sdk-java-aop-filters-spring"></a>

`WebConfig` のクラスに `Filter` を追加します。セグメント名を文字列として [https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/javax/servlet/AWSXRayServletFilter.html](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/javax/servlet/AWSXRayServletFilter.html) コンストラクタに渡します。フィルターのトレースおよび受信リクエストの計測の詳細については、「[X-Ray SDK for Java を使用して受信リクエストをトレースします。](xray-sdk-java-filters.md)」を参照してください。

**Example src/main/java/myapp/WebConfig.java - Spring**  

```
package myapp;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import javax.servlet.Filter;
import [com.amazonaws.xray.javax.servlet.AWSXRayServletFilter](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/javax/servlet/AWSXRayServletFilter.html);

@Configuration
public class WebConfig {

  @Bean
  public Filter TracingFilter() {
    return new AWSXRayServletFilter("Scorekeep");
  }
}
```

## Jakarta のサポート
<a name="xray-sdk-java-aop-jakarta-support"></a>

 Spring 6 の Enterprise Edition では、Javax ではなく [Jakarta](https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga) を使用しています。この新しい名前空間をサポートするために、X-Ray では独自の Jakarta 名前空間に存在するクラスの並列セットを作成しました。

フィルタークラスの場合は、`javax` を `jakarta` に置き換えてください。セグメント命名ルールを設定するときは、次の例のように、命名ルールクラス名の前に `jakarta` を追加してください。

```
package myapp;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Bean;
import jakarta.servlet.Filter;
import com.amazonaws.xray.jakarta.servlet.AWSXRayServletFilter;
import com.amazonaws.xray.strategy.jakarta.SegmentNamingStrategy;

@Configuration
public class WebConfig {
    @Bean
    public Filter TracingFilter() {
        return new AWSXRayServletFilter(SegmentNamingStrategy.dynamic("Scorekeep"));
    }
}
```

## コードに注釈を付ける、またはインターフェイスを実装する
<a name="xray-sdk-java-aop-annotate-or-implement"></a>

クラスには `@XRayEnabled` の注釈を付けるか、`XRayTraced` インターフェイスを実装する必要があります。これにより、X-Ray の計測のため、影響を受けた関数をラップするように AOP システムに伝えます。

## アプリケーションでの X-Ray のアクティベーション
<a name="xray-sdk-java-aop-activate-xray"></a>

アプリケーションで X-Ray トレースを有効化するには、コードで次のメソッドをオーバーライドして、抽象クラス `BaseAbstractXRayInterceptor` を拡張する必要があります。
+ `generateMetadata`—この関数では、現在の関数のトレースにアタッチされたメタデータをカスタマイズできます。デフォルトでは、実行中の関数のクラス名がメタデータに記録されます。追加情報が必要な場合は、さらにデータを追加できます。
+ `xrayEnabledClasses`—この関数は空であり、空のままにしておく必要があります。これは、ラップするメソッドをインターセプターに指示するポイントカットのホストとして機能します。`@XRayEnabled` の注釈が付けられたどのクラスをトレースするか指定して、ポイントカットを定義します。次のステートメントは、`@XRayEnabled` という注釈が付けられたすべてのコントローラービーンをラップするようにインターセプターに伝えます。

  ```
  @Pointcut(“@within(com.amazonaws.xray.spring.aop.XRayEnabled) && bean(*Controller)”)
  ```

 プロジェクトで Spring Data JPA を使用している場合は、`BaseAbstractXRayInterceptor` ではなく `AbstractXRayInterceptor` から拡張することを検討してください。

## 例
<a name="xray-sdk-java-aop-example"></a>

次のコードは、抽象クラス `BaseAbstractXRayInterceptor`を示しています。

```
@Aspect
@Component
public class XRayInspector extends BaseAbstractXRayInterceptor {    
    @Override    
    protected Map<String, Map<String, Object>> generateMetadata(ProceedingJoinPoint proceedingJoinPoint, Subsegment subsegment) throws Exception {      
        return super.generateMetadata(proceedingJoinPoint, subsegment);    
    }    
  
  @Override    
  @Pointcut("@within(com.amazonaws.xray.spring.aop.XRayEnabled) && bean(*Controller)")    
  public void xrayEnabledClasses() {}
  
}
```

次のコードは、X-Ray によって計測されるクラスです。

```
@Service
@XRayEnabled
public class MyServiceImpl implements MyService {    
    private final MyEntityRepository myEntityRepository;    
    
    @Autowired    
    public MyServiceImpl(MyEntityRepository myEntityRepository) {        
        this.myEntityRepository = myEntityRepository;    
    }    
    
    @Transactional(readOnly = true)    
    public List<MyEntity> getMyEntities(){        
        try(Stream<MyEntity> entityStream = this.myEntityRepository.streamAll()){            
            return entityStream.sorted().collect(Collectors.toList());        
        }    
    }
}
```

アプリケーションを正しく設定した場合は、コンソールの次のスクリーンショットに示すように、コントローラーからサービス呼び出しまで、アプリケーションの完全なコールスタックが表示されます。

![\[Timeline showing API call duration and breakdown of server operations for metering service.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/aop-spring-console.png)
