【レポート】Deep-Dive for AWS X-Ray #reinvent #DEV402

2017.12.06

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

こむろです。

re:Invent 2017にて「DeepDive for AWS X-Ray」に参加して聴講してきましたので、こちらのレポートになります。

Speaker

David Nunnerley氏 - Senior Manager, Amazon

Service Map

  • Analyticsアプリケーションを構築することを想定してX-Rayサービスに含まれるデータストアの機能をウォークスルーで解説する
  • Service MapはAWSコンソール上からTraceデータを表示し、Microservice同士の関係を表示する
  • 各Microserviceをnode、Service同士の繋がりをedgeとして表示
  • nodeの詳細でResponse Timeのヒストグラムを見ることができる
  • さらにHTTP Status Codeなどの各種詳細情報
  • realtimeで更新

Scatter Graph Application

  • 3時間分、1分ごと180分割した情報を表示する
  • それぞれのリクエストのTrace情報を一覧で表示
  • このアプリはMicroserviceについていい感じのVisual Viewを提供する
  • クリックするとの詳細を確認できる
  • 影響の特定が可能

X-Rayの概要

Service Map

  • X-Rayに送ったTrace情報によって構築されている
  • nodeをクリックすると、Responset TimeのHistogramが表示される

  • Filter表記によってHTTPステータスコード500のエラー, Faultについて詳細表示
  • MicroserviceのE2EのすべてのTrace情報
  • 特定のユーザーのTrace情報をAccountIDでFilterするなどして集計することができる
  • ユーザーへの影響を調査することに大変役に立つ
  • 例はAWS SDKを利用したDynamoDB Tableへの処理エラーに関する指数関数的後退(exponential backoff)でどれだけ処理時間が伸びたかを示している

X-Ray Serviceの動作について

  • どのようにしてあなたのアプリケーション及びMicroserviceからTrace情報をすべて通せるか
  • X-Rayでは2つのComponentを提供している
  • 提供始めてから12ヶ月
  • 様々な言語で使えるように頑張ってるとこ
  • 今使えるのは Java, .Net, nodeJs, goとPythonは最終Beta版
  • Trace情報を簡単に送信できる機能を提供する
  • SDKをコードに追加して、我々はこれをHelper SDKって呼んでる
  • SDK入れて、幾つかのStatementを追加するだけで、ほぼ自動的にAWS SDKの呼び出しや簡単なHTTP RequestについてのTraceを開始する
  • Daemonは、EC2やECS, EB、オンプレミスにインストールすることができる。
    • AWSへ到達できること
    • CredentialsでX-Ray Serviceへ接続する
  • DaemonはAWS SDKから出力される情報、基本的にそれぞれのMicroserviceはRequestとしてぶん投げてくる
    • Traceのかけら、我々はセグメントとよんでる
    • これらはTraceIDと共にすべて結び付けられてる
  • X-Ray ServiceにUDPで送りつける
  • めっちゃパフォーマンスは良い。1秒間あたり数千リクエストを処理できる
  • SDKとDaemonはUDPで疎結合
  • 一番大事なことだが、SDKとDaemonを疎結合にしている理由は、DaemonやX-Ray Serviceに何らかの障害があった際に、アプリケーションに組み込んでいるX-Ray SDKに影響を与えないため。これによりアプリケーション及びそれより先のClientなどには障害の影響を一切受けないようにしている
  • LambdaはConsoleから作成すると自動的にX-RayがTraceを開始する
  • X-RayでX-Rayを計測する

AWS X-Rayの利点

  • 以下のようなケースに有効である
  • 昨日のAPI実行失敗の根本的な原因が何か?
  • どのユーザーに影響があるか?
  • APIは何回実行されているか
  • ダウンストリームパートナーへのSLAを満たしているか?
  • クリティカルコードのパスをどのように明らかにできるか?
  • AWSがスロットリングしてるか?
  • いくつかのAPIが他に比べて低パフォーマンスになっていないか?それはなぜか?
  • StackTraceは何と書いてあるか?

価格

  • 10万Traceの記録までは無料
  • Traceの取得 or スキャンで100万回までは無料
  • 無料枠超過後、100万回のTrace記録あたり5$ずつ課金
  • 無料枠超過後、100万回のTrace取得orスキャンあたり0.50$ずつ課金

AWS X-RayのAPI

  • PutTraceSegments: AWS X-Rayにある期間のドキュメントをアップロードする
  • BatchGetTraces: TraceIDによるTraceリストの取得
  • GetServiceGraph: アプリケーション内のServiceのDocumentを取得する。DocumentにはServiceの時間枠ごとのコネクション, エラー, Fault, 単一TraceのResponse Time, Latencyヒストグラムが含まれる。
  • GetTraceGraph: アプリケーション内のServiceのDocumentを取得する。DocumentにはServiceの単一Traceごとのコネクション, エラー, Fault, Response Timeヒストグラムが含まれる。
  • GetTraceSummaries: 指定した時間枠内でFilterを適用した結果、利用可能なTraceID郡とメタデータが取得できる。

  • X-Ray Daemonの仕事はSegumentsを送信すること

  • まだサポートしてない言語とかで利用する場合、直接X-Ray ServiceにTrace情報を直接送ることができる
    • ただし並行処理やアプリケーションとX-Ray Serviceを強固に結びつけること(疎結合の破壊)には充分に注意しないとダメ

GetServiceGraph API

  • このAPIはService Mapの情報を取得するのに利用される
  • Serviceのステータスを与えられたTime Rangeに従って返却する
  • それぞれのService、Edgeに関わるResponse Time, Request数, エラー, Faultsさらに各AWSサービスのスロットル数などを集計して取得できる
  • Response TimeとDurationのヒストグラムが提供される
  • Response timeとDurationの違いは?
    • Response TimeはAPIをコールして返答があった時間
    • DurationはAPIをコールして非同期で正常なレスポンスが返却されるまでの時間
    • 同期のみの世界ではResponse Time=Duration Time、非同期の世界では異なる
  • APIのResponseの中身は複雑かつ巨大

Summary

単語の概要はこちらを参照

  • Services
    • 各ノードごとに一意に与えられた名前とType
    • 状態(ActiveなSegmentsに現在投げられているもの)
    • Request数とResponse Timeの合計
    • Statusのカウンタ情報
    • ResponseTimeとLatencyのヒストグラム
    • GetTraceSummariesのTime Range
  • Edges(2つのサービスをつなぐConnection情報のこと)
    • Request数とResponse Timeの合計
    • Statusのカウンタ情報
    • Response Timeのヒストグラム
    • GetTraceSummariesのTime Range
  • Clients
    • 1 Client/Service
    • ServiceのEdgeの全統計データ

Histograms

  • Histogramsは定数の値を利用しない。Histogramsの値は疎であり、非線形スケールを利用する。
  • T-Digest Algorithmに従って算出される。
  • Histogramsは動的に、データにフィットした形に変化する

AWS X-Ray API GetTraceSummaries

  • 選択したエリアの中のTraceのセットを取得できる
  • 様々な情報のDigestが表示される
  • このAPIを使うとTraceIDのセットが取得できるので、そのIDを使ってさらにGetTrace APIを呼び出すことでさらに低レベルの詳細情報を取得することができる。
  • --filter-expression で条件指定し、情報をフィルタすることができる

AWS X-Ray API BatchGetTraces

  • 1つ以上のTraceIDを指定してX-Ray ServiceからTrace情報を取得する
  • TraceIDは前述のGetTraceSummaries APIのレスポンスから取得する事ができる
  • 複雑で長大なTraceIDの情報を取得できる

Scatter Graph Application Build

  • GetServiceGraphを使ってアプリを構築する
  • 左上のDrop-DownリストはすべてのService, Microservice, Edge
  • GetServiceGraph APIを呼んで、過去5分間のServie, Edgeの情報を引き出してDrop-downリストへ入力
  • 上段にResponse Time, Duration TimeのヒストグラムをPlot
  • 下段にHTTP Status Code(200,300,400,500)をPlot
  • VisualizeするOpen Sourceグラフィックパッケージとして、Vega-Liteを利用している
  • 1秒ごとに情報が更新され左にスクロールしていく

  • 選択した領域を利用して、Start Time, End Time, Filter Expressionを作成し、GetTraceSummaries APIを呼び出すことで情報を取得する

アプリケーションのソースコードは以下

感想

Scatter Graph Applicationを実装するためのWalkthroughを通して、AWS X-Ray APIにはどのようなものがあるか、それぞれどういった情報が取得できるか、X-Ray ServiceとDaemonの役割とその関係性など多岐に渡る内容でした。実際に聴講していた現場では半分以下程度の理解しかできなかったのですが、今一度映像で確認してみると、非常に多くの情報が詰め込まれていました。

アプリケーションに関する膨大な種類の情報がX-Ray SDKで取得できるようですので、これらをうまく使い、監視や解析に活かしていけるよう理解を深める必要があると感じました。

参照