LoginSignup
16
10

More than 5 years have passed since last update.

今更X-Rayに入門してみた

Last updated at Posted at 2017-12-05

はじめに

X-Ray使うとApplication中心に各サービス間の通信をトレースあれこれできていいと聞いたが、どういうものか?仕組みがピンと来てなかったのでチュートリアルをやったよ、というチュートリアル。

AWS X-Ray とは何ですか

  • X-Ray SDK (Java/Node.js/Python/Go/.NET)を自分のアプリケーションに組み込んで、
  • X-Ray デーモンと通信すると、
  • GUIでかっこいいService mapとかTrace見れる、

やつ。

チュートリアルやってみた

まんまAWS X-Rayの開始方法をやっただけです... まだの人はちゃんと読もう、公式チュートリアル!

流れとして、

  • EBでjava web server立てて、
  • 必要なrole権限をiamから設定して、
  • EBにサンプルX-RayアプリDeployすると、
  • X-RayでかっこいいService map/traceが見れる

というもの。
ここで手順詳細書こうとするとほぼ↑のコピペになるので簡単に記載します。
詳細はそちらのチュートリアルページをご確認ください。

(なお、最初は【新機能】AWS X-Rayを試してみた #reinventにあるように、x-ray topからサンプルアプリをcloud formation経由で作ろうとしたが、No Solution Stack named '64bit Amazon Linux 2017.03 v4.3.0 running Node.js' found.とか言われて諦めた。)

1. EB立てる

javaのweb appを立てる。(図は3.のdeployもした後)
image.png

2.EBのiam role設定

EBとともに作成されたaws-elasticbeanstalk-ec2-roleとかにAWSXrayFullAccess/AmazonS3FullAccess/AmazonDynamoDBFullAccessをアタッチ。
image.png

3. サンプルゲーム?をdeploy

eb-java-scorekeep-xray-gettingstarted-v1.3.zipをDLしてdeploy
(1.の図参照)

4. アプリにアクセス

session作って、
image.png

OXゲーム?...
image.png

EBのurlにアクセスするとこんなアプリができるので、チュートリアルどおりゲーム?を遊んでみてrequestを生成。

5. X-Ray開いてみる

Sevice map見えたり、
image.png
それぞれのnode開くとdetail見えたり、
image.png
traceも見えたりする。
image.png

仕組みについて

X-Ray SDKの呼び出し

そのままチュートリアル記載の通りですが、

src/main/java/scorekeep/WebConfig.java
...
import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.AWSXRayRecorderBuilder;
import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter;
import com.amazonaws.xray.plugins.EC2Plugin;
import com.amazonaws.xray.plugins.ElasticBeanstalkPlugin;
import com.amazonaws.xray.strategy.sampling.LocalizedSamplingStrategy;
...
@Configuration                                                            
public class WebConfig {                                                  
  private static final Logger logger = LoggerFactory.getLogger(WebConfig.class);

  @Bean                                                                   
  public Filter TracingFilter() {                                         
    return new AWSXRayServletFilter("Scorekeep");                         
  }                                                                                                                                              
...
  static {                                                                
    AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard().wit

    URL ruleFile = WebConfig.class.getResource("/sampling-rules.json");   
    builder.withSamplingStrategy(new LocalizedSamplingStrategy(ruleFile));
...

という感じにSDKをimportして、sampling-rules.json記載の条件でtraceするくだりを入れておきます。
でその中身は、「/api/以下のPOSTをすべて」や「/api/session/以下のGETを5%で」など記載があります。

src/main/resources/sampling-rules.json
{
  "version": 1,
  "rules": [
    {
      "description": "Resource creation.",
      "service_name": "*",
      "http_method": "POST",
      "url_path": "/api/*",
      "fixed_target": 1,
      "rate": 1.0
    },
    {
      "description": "Session polling.",
      "service_name": "*",
      "http_method": "GET",
      "url_path": "/api/session/*",
      "fixed_target": 0,
      "rate": 0.05
    },
...

基本的に他の言語も同様で大本でSDKでのtraceを宣言しておいて、あとはsampling-rules.jsonの条件に従う。という形になっています。
X-Ray SDK for Go の設定
X-Ray SDK for Python の設定
など。

X-Ray デーモン

udp 2000 portをlistenするもので、linuxのrpmなどは公式からDLできます。
また、EBの場合にはXrayEnabledオプションを有効いすればあがるようです。
だいたいweb appと同じEC2なりEBなりインスタンスにいるのかな?

終わりに

思ったこととして、

  • アプリにlogger?/tracer?埋め込むのでパフォーマンス影響どのくらいあるのだろう?
  • 自作X-Ray SDK?を作るにはどの程度気楽なのだろうか?
    • SDKに対応言語がない場合に
    • applicationで直接tracer仕込むのちょっとやだというか、
    • 原理的にはX-Rayデーモンに直接request投げつければいいのだからlogパースして送るなりするbatch書いたらうごくのか?

とちゃんと使いこなすにはまだまだお勉強が必要そうで。
AWS re:invent 2017: Deep-Dive for AWS X-Ray (DEV402)
AWS Summit Series 2017: London - Deep Dive: AWS X-Ray

以上。

16
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10