はじめに
Powertools for AWS Lambda (Java)で性能測定をしてたのですが、公式に書いている通りに導入できなかったので、記事にしてみた。
こんなエラーが出る。
クラスローディングのタイミングで、以下のエラーが出てた。
Caused by: java.lang.NoSuchFieldError: CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
at com.amazonaws.xray.interceptors.TracingInterceptor.(TracingInterceptor.java:70)
原因は?
Jacksonってモジュールが以前利用していた、CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
を利用している模様。
aws-xray-recorder-sdk-aws-sdk-v2-2.14.0.jar
を参照してみると、確かに使ってる。
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)
を利用しているみたい。
なぜ2.14.0
を利用しているか調べてみると、powertools-tracing
の親POMpowertools-parent
に指定がありました!
<aws.xray.recorder.version>2.14.0</aws.xray.recorder.version>
対処法
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の法則で、間接的に依存しているものより、直接的に指定したものを優先するみたいです。
まとめ
本当は性能改善の記事を書きたかったのですが、この問題や最近の体調不良のせいもあって、一旦ここまでにします。。