Spring boot3でPowertools for AWS Lambda (Java)のTracing機能を使いたい！

## はじめに

Powertools for AWS Lambda (Java)で性能測定をしてたのですが、公式に書いている通りに導入できなかったので、記事にしてみた。

https://docs.powertools.aws.dev/lambda/java/core/tracing/#__tabbed_3_1

## こんなエラーが出る。

クラスローディングのタイミングで、以下のエラーが出てた。

> Caused by: java.lang.NoSuchFieldError: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
	at com.amazonaws.xray.interceptors.TracingInterceptor.<clinit>(TracingInterceptor.java:70)


## 原因は？

Jacksonってモジュールが以前利用していた、`CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES`を利用している模様。

`aws-xray-recorder-sdk-aws-sdk-v2-2.14.0.jar`を参照してみると、確かに使ってる。

![スクリーンショット 2025-02-01 8.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/8c5e7609-525b-87a5-9b6c-6ab4b77c4d61.png)

SpringBootとXray用のライブラリそれぞれが使っているJacksonのバージョンに差異があるみたい。

## どこから参照されている？

```
./gradlew dependencyInsight --dependency aws-xray-recorder-sdk-aws-sdk-v2

誰が使っているかを調査します。

> Task :dependencyInsight
com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2:2.14.0
  Variant compile:
    | Attribute Name                 | Provided | Requested    |
    |--------------------------------|----------|--------------|
    | org.gradle.status              | release  |              |
    | org.gradle.category            | library  | library      |
    | org.gradle.libraryelements     | jar      | classes      |
    | org.gradle.usage               | java-api | java-api     |
    | org.gradle.dependency.bundling |          | external     |
    | org.gradle.jvm.environment     |          | standard-jvm |
    | org.gradle.jvm.version         |          | 17           |

com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2:2.14.0
\--- software.amazon.lambda:powertools-tracing:1.18.0
     \--- compileClasspath

com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor:2.14.0
  Variant compile:
    | Attribute Name                 | Provided | Requested    |
    |--------------------------------|----------|--------------|
    | org.gradle.status              | release  |              |
    | org.gradle.category            | library  | library      |
    | org.gradle.libraryelements     | jar      | classes      |
    | org.gradle.usage               | java-api | java-api     |
    | org.gradle.dependency.bundling |          | external     |
    | org.gradle.jvm.environment     |          | standard-jvm |
    | org.gradle.jvm.version         |          | 17           |

com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor:2.14.0
\--- software.amazon.lambda:powertools-tracing:1.18.0
     \--- compileClasspath
```

参照元は`software.amazon.lambda:powertools-tracing`ですね。

Mavenリポジトリを確認しても、PowerToolsモジュール自体は最新なんだけど、現時点で最新の`2.18.2`ではなく、`2.14.0(Apr 13, 2023)`を利用しているみたい。

https://mvnrepository.com/artifact/software.amazon.lambda/powertools-tracing

なぜ`2.14.0`を利用しているか調べてみると、`powertools-tracing`の親POM`powertools-parent`に指定がありました！

```
<aws.xray.recorder.version>2.14.0</aws.xray.recorder.version>
```

https://repo1.maven.org/maven2/software/amazon/lambda/powertools-parent/1.18.0/powertools-parent-1.18.0.pom



## 対処法

Jackson(jackson-databind)を内包しているSpringBootのバージョンを下げることで、Jacksonのバージョンを下げることも可能ですが、明示的に `aws-xray-recorder-sdk-aws-sdk-v2`を利用するように定義し、バージョンを`2.14.0`->`2.18.2`まで上げてるとエラーがなくなりました！

```
> implementation group: 'com.amazonaws', name: 'aws-xray-recorder-sdk-aws-sdk-v2', version: '2.18.2'
```

同じモジュールを複数の箇所で利用している場合、nearest winsの法則で、間接的に依存しているものより、直接的に指定したものを優先するみたいです。

## まとめ

本当は性能改善の記事を書きたかったのですが、この問題や最近の体調不良のせいもあって、一旦ここまでにします。。