はじめに
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もした後)
2.EBのiam role設定
EBとともに作成されたaws-elasticbeanstalk-ec2-role
とかにAWSXrayFullAccess/AmazonS3FullAccess/AmazonDynamoDBFullAccess
をアタッチ。
3. サンプルゲーム?をdeploy
eb-java-scorekeep-xray-gettingstarted-v1.3.zipをDLしてdeploy
(1.の図参照)
4. アプリにアクセス
EBのurlにアクセスするとこんなアプリができるので、チュートリアルどおりゲーム?を遊んでみてrequestを生成。
5. X-Ray開いてみる
Sevice map見えたり、
それぞれのnode開くとdetail見えたり、
traceも見えたりする。
仕組みについて
X-Ray SDKの呼び出し
そのままチュートリアル記載の通りですが、
...
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%で」など記載があります。
{
"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
以上。