Spring BootアプリケーションからAWS X-Rayを利用する(Amazon Linux編)
AWS X-RayはApplication Performance Montioring(APM)と呼ばれる種類のサービスです。X-Rayを活用することでアプリケーションの実行状況を監視し、パフォーマンスの問題やエラーの検出などを行うことが可能です。
X-Rayを利用するためにはアプリケーションのソースコードに多少手をいれることが必要です。今回はJava8 + Spring Bootを利用したWebアプリケーションで、X-Rayを使ってみたいと思います。
X-Rayの概要については、以下のドキュメントとブログが参考になりますので、読んでみてください。
バージョン情報
- Java : 1.8
- Spring Boot: 1.5.8
- Amazon Linux: 2017.09
アプリケーションのセットアップ
Spring BootプロジェクトのソースコードはGithubに置きました。以下のリンクから取得可能です。「xray-init」というgit tagを打っているのでご活用ください。
Spring Initializrを利用して作ったプロジェクト雛形をベースにコードを書きました。
ポイントは2つで、1つめはbuild.gradle
にX-Rayのライブラリを記載していることです。
... compile('com.amazonaws:aws-xray-recorder-sdk-core:1.2.0') ...
もう1つは、X-Rayが利用するServletFilterをSpringが利用できるようにBeanとして登録しています。FilterRegistrationBean
を利用して以下のように書きます
package jp.classmethod.devio.config; import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Collections; @Configuration public class XrayConfiguration { @Bean public FilterRegistrationBean awsxRayServletFilter() { FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new AWSXRayServletFilter("xray-sample")); bean.setUrlPatterns(Collections.singleton("/*")); return bean; } }
AWSXRayServletFilter
のコンストラクタに渡している引数はServletFilterのNameなので、適当に編集しても構いません。
プロジェクトルートで./gradlew build
コマンドを実行すると、build/libs
配下にspring-blog-0.0.1-SNAPSHOT.jar
というJARファイルが作成されます。これを今からセットアップするEC2で動かしてみます。
EC2のセットアップ
Amazon Linuxを起動します。起動する際、X-Rayの権限がついたEC2 IAM Roleを付与しておいてください。
まずはJava8をインストールしておきます。
$ sudo yum install java-1.8.0-openjdk.x86_64 $ sudo alternatives --config java
X-Rayにデータを送るには、アプリケーションプロセスと同一のマシンでX-Rayのデーモンが起動している必要があります。OSが起動したら、以下のコマンドを実行してxrayのデーモンをインストールします。
$ curl https://s3.dualstack.ap-northeast-1.amazonaws.com/aws-xray-assets.ap-northeast-1/xray-daemon/aws-xray-daemon-2.x.rpm -o /home/ec2-user/xray.rpm $ sudo yum install -y /home/ec2-user/xray.rpm
Upstart経由で起動されるため、起動設定は/etc/init/xray.conf
になります。rpmのインストールスクリプトで起動されるので、インストール後は自動的に起動しています。
$ ps -ef | grep xray | grep -v grep root 2745 1 0 06:06 ? 00:00:00 su -s /bin/bash -c xray -f /var/log/xray/xray.log xray xray 2746 2745 0 06:06 ? 00:00:00 xray -f /var/log/xray/xray.log
netstatを叩いてみると、デーモンはUDPの2000番で待ち受けていることがわかります。
$ sudo netstat -naup | grep xray udp 0 0 127.0.0.1:2000 0.0.0.0:* 2746/xray
これでOS側の準備は完了です。
先ほど作成したJARファイルをEC2上に配置し、以下のコマンドで実行してみましょう。
$ nohup java -jar spring-blog-0.0.1-SNAPSHOT.jar &
起動後、ブラウザやcurlコマンドで、http://<EC2のIPアドレス>:8080/
を実行してみましょう。成功していると、X-Rayデーモンのログに情報がX-Rayに送信されたことが記録されます。
$ tail /var/log/xray/xray.log 2017-10-24T06:06:35Z [Info] Initializing AWS X-Ray daemon 2.0.0 2017-10-24T06:06:35Z [Info] Using buffer memory limit of 39 MB 2017-10-24T06:06:35Z [Info] 624 segment buffers allocated 2017-10-24T06:06:35Z [Info] Using region: ap-northeast-1 2017-10-24T06:26:21Z [Info] Successfully sent batch of 1 segments (0.007 seconds) 2017-10-24T06:26:25Z [Info] Successfully sent batch of 1 segments (0.005 seconds) 2017-10-24T06:26:29Z [Info] Successfully sent batch of 2 segments (0.007 seconds) 2017-10-24T06:26:31Z [Info] Successfully sent batch of 1 segments (0.007 seconds) 2017-10-24T06:26:32Z [Info] Successfully sent batch of 1 segments (0.033 seconds)
Management ConsoleのX-Rayの画面を開くと、情報が送られてきているのが確認できます。
クライアントの情報やレスポンスタイムなど、HTTPリクエストに関わる基本的な情報が取得できています。
まだServletFilterを登録しただけなので、取得できる情報は非常に少ないです。X-Rayには他にも機能がたくさんありますので、他のブログで紹介したいと思います。