Spring BootアプリケーションからAWS X-Rayを利用する(Amazon Linux編)

2017.10.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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の画面を開くと、情報が送られてきているのが確認できます。

AWS_X-Ray

クライアントの情報やレスポンスタイムなど、HTTPリクエストに関わる基本的な情報が取得できています。

まだServletFilterを登録しただけなので、取得できる情報は非常に少ないです。X-Rayには他にも機能がたくさんありますので、他のブログで紹介したいと思います。

参考情報