はじめに
SREとして語られるものの一つに可観測性というものがあります。単純にログを吐けば良いというものから、どのようなリクエストが行われているのかや各種メトリックスなどの情報を取得することが必要となってきています。ここではAWS App Runner上で動くコンテナ化したSpring Bootアプリケーションの可観測性に関する実装を行なっていきます。
前提事項
今回の検証では以下のバージョンを使いました。
アプリケーションの実装
まずは、ライブラリとしてAWS OpenTelemetry Agentを使用します。
build.gradle
に以下の記述を追加します。
dependencies { // 省略 javaAgent 'software.amazon.opentelemetry:aws-opentelemetry-agent:1.32.0' }
javaAgent
という記述は、Gradleのconfigurationを使って依存性の管理をするように宣言しておきます。
configurations { compileOnly { extendsFrom annotationProcessor } javaAgent }
今回Jibを使ってコンテナイメージを作成するので、AWS OpenTelemetry Agentをコンテナイメージに取り込み、起動時にjavaagentオプションで指定する記述を追加してあげます。
task agentLibs(type: Copy) { from configurations.javaAgent.singleFile into 'myagent' rename 'aws-opentelemetry-agent-.*\\.jar', 'aws-opentelemetry-agent.jar' } jib.from.image = 'eclipse-temurin:21-jre' jib.container.jvmFlags = ['-javaagent:./myagent/aws-opentelemetry-agent.jar'] jib { container { appRoot = '/app' workingDirectory = '/app' extraDirectories { paths { path { from = './myagent' into = '/app/myagent' } } } } } tasks.jibDockerBuild.dependsOn agentLibs
これでアプリケーション側の準備はOKです。
App Runnerの設定
App Runnerは2022年にX-Rayのサポートを開始しました。
具体的な実装は、英語&Pythonの例ですが以下に記述があります。
ポイントは、IAM Roleです。AWSXRayDaemonWriteAccess
が付与されていないとX-Rayには何も表示されないので注意が必要です。
今回、Spring Boot 3.2を使うためにJava 21を使用しました。2024年1月時点でApp RunnerはJava 11までしかサポートしていないので、最新のSpring Bootを使いたい場合はアプリをコンテナ化する必要があります。
環境変数として以下を設定しておきます。
項目 | 値 | 備考 |
---|---|---|
OTEL_PROPAGATORS | xray | |
OTEL_METRICS_EXPORTER | none | App RunnerのOpenTelemetryサポートはメトリックスに未対応のため |
OTEL_RESOURCE_ATTRIBUTES | service.name=任意の名前 |
App Runnerの可観測性のトレースのスイッチをオンにすることも忘れずに。
実行
App Runnerにアプリをデプロイし、いくつかアクセスを行うとX-Rayにトレースやトレースマップが表示されます。
トレースには各リクエストごとにレスポンスコードや応答時間などが取られていることがわかります。
上はトレースマップ。単純な例なのであまり面白い結果ではないですが、どのようなサービスを利用しているかが図として表示されます。
考察
可観測性の重要性はよく語られますが、実際に実装しようとすると思いのほか面倒臭かったです。今回たまたまAWS OpenTelemetry Agentの存在を知り、動作させることを思い立ったのですが、Jibの設定が手間でした。
また、App RunnerのOpenTelemetryサポートはメトリックスに未対応ということもあったのが残念でした。ここについては、Spring Boot Actuatorで取れるのかなと思いますので、今後実装してみようかなと思います。
また、App RunnerがコードビルドとしてサポートしているJavaのバージョンが2024年1月時点では若干古い(Java 11まで)ので、最新のSpring Bootを使いたい場合はコンテナ化一択となる点も注意かなと考えました。