AWS X-Rayについて

##　はじめに
　こんにちは！今回はAWS X-Rayについてまとめようと思います。
DVAを学習していくうちにX-Rayについてはすこし知識不足を感じブラックベルトなどを見てきたのですが、それでも点数が伸びずらかったのでググった結果や書籍等を読みまとめようと思います。

それではよろしくお願いします(｡･ω･)ﾉﾞ

##　AWS X-Rayで何ができるの？？
　X-Rayを使用すると、アプリケーションの**潜在的なバグを特定**したり**パフォーマンスのボトルネックを特定**できる。またモニタリング複雑なマイクロサービス※1においても**マップで可視化**して**トレースで分析**することが可能になる。

　ようは、X-Rayを使用することで本番環境やマイクロサービスを分析・デバッグしたりすることができる。
　X-Rayのメリットをまとめると。。。

**◆リクエスト実行状況の特定**
　アプリケーションを構成する個々のサービスやリソースの実行結果ステータスを集計し、アプリケーションの実行状況をEnd-to-Endで確認可能

**◆アプリケーションの問題の検出**
　アプリケーションの実行状況についての関連する情報を収集し、問題の根本原因を調査可能

**◆アプリケーションのパフォーマンス向上**
　サービスやリソースの関係をリアルタイムで表示し、レイテンシ増加やパフォーマンス低下などのボトルネックを特定可能

**◆AWSとの連携**
　EC2・ECS・Lambda・ElasticBeanstalkなどど連携可能

**◆さまざまなアプリケーション向けの設計**
　非同期のシンプルなイベントを呼び出し、３層のウェブアプリケーション、数千のサービスから構成される複雑なマイクロサービスも分析可能

##　AWS X-Rayの有用なツール群
　**◆サービスマップ**：トレースデータの可視化
　　　マイクロサービスアプリケーションにおいても把握が難しいサービス間の依存関係をわかりやすく可視化してくれる。

　**◆トレースリスト**：トレースの詳細な情報
　　　詳細なトレースデータにアクセス可能。セグメントやサブセグメントの実行状況を可視化

　**◆アナリティクス**：トレース分析用ツール
　　　インタラクティブな操作によって素早い分析が可能

　**◆サンプリング**：トレースを取得するリクエストを絞ること
　　　パフォーマンスやコスト効率の観点からすべてを取得している訳ではないのでサンプリングを使うことで絞り込みが行える
　　　X-Rayではデータの完全性が保証されていないため、監査やコンプライアンスのツールとして使用できない
##　AWS X-Rayの概念
　**◆セグメント**
　動作に関するデータ
　・リソース名（例：AWS Lambdaの関数名）
　・リクエストの詳細（例：API経由ならエンドポイントやHTTPメソッドなど）
　・行った作業の詳細（例：実行にかかった時間など）

　**◆サブセグメント**
　呼び出しに関する追加の詳細な情報・サブセグメントはセグメントに内包される形になってる
　・AWSのサービス
　・外部HTTP API
　・SQLデータベース

　**◆トレース**
　1つのリクエストで生成されたセグメントの全てを収集したもの
　・単一のリクエストに関するサービスをまたいだエンドツーエンドのデータ
　・同じ一意のトレースIDを持つデータポイントの集合体
　・セグメントのあつまりみたいなもん
![スクリーンショット 2021-07-04 154720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/fecd2d36-5e44-5246-9077-b089cb70f9cf.png)

　　**どのようにトレースがセグメントを管理しているか？**
　**◆トレースID**
　　・リクエストを追跡するためのID
　　・リクエストごとに一意
　　・基本的に最初にセグメントを生成するタイミングで生成
![スクリーンショット 2021-07-04 160540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/afc67ce2-975a-2f79-d6d7-38bcac61a319.png)

 　　**セグメントの繋がり・順序はどう管理しているか？**
　**◆セグメントID**
　　　・トレース内のセグメントに対して一意に決まる
　　　・単一のサービスのリクエストを追跡するためのID
　　　・**親セグメントID**によってセグメントの繋がり・順序が決まる
![スクリーンショット 2021-07-04 161023.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/2d24d59e-f14d-d9a1-8f86-9d0e9271cfba.png)

　　　**セグメントに情報を追加したい場合は？**
　**◆注釈**：検索しやすくするために
　　　・フィルタ式で使用するためにインデックス化された**キーと値のペア**
　　　・例："aws:api_stage":"prod"
　　
　**◆メタデータ**：デバッグや分析のために
　　　・任意のタイプの値を持つことができる**キーと値のペア**
　　　・フィルタ式で使用するためのインデックスは作成されない
　　　・例："game":{"id":"abcdefg","session":"hogehoge"}

##　AWS X-Rayデーモン
**AWS X-RayはセグメントデータをバッファリングしX-Ray APIに定期的に転送**

　・未加工のセグメントデータを収集してAWS X-Ray APIに送信
　・UDPポート2000（デフォルト）をリッスン
　・受信したデータをバッファリングしてAWS X-Ray APIに送信する
　・Linux・OS X・Windows・Lambda・ElasticBeanstalkなどでサポート可能
　
##　AWS X-Ray API
**収集されたセグメントデータからトレースを作成**

◆AWS X-Rayの全ての機能にアクセス可能
　　・トレースの追加・取得・更新
　　・グループの作成・取得・更新・削除
　　・サンプリングルールの作成・取得・更新・削除

◆利用方法
　　・HTTPS経由
　　・AWS SDK経由
　　・AWS CLI経由

◆X-Ray APIアクション
　●**PutTranceSegments**
　　X-Rayにトレースデータを送信します。アプリケーションからX-Rayにトレースデータを送信するためには、このアクションをIAMポリシーで許可することが必要です。
　　
　●**GetServiceGraph**
　　サービスマップのようなJSONサービスグラフの情報を取得できます。例として、直近10分間のサービスグラフをAWS CLIで取得するコマンドを載せます。

```
$EPOCH＝＄（date +%s）
$aws xray get-service-graph --start-time $(($EPOCH-600)) --end-time
$EPOCH
```
　●**GetTranceSummaries**
　　トレースのサマリ情報を取得します
><details><summary>サマリ情報とは</summary>
日々蓄積される詳細データに対して、一定の決まりで集計・圧縮されたデータのこと
</details>

　●**BatchGetTrance**
　　トレースをIDのリストでまとめて取得できます。

##　AWS X-Ray SDK
　・これらの言語（**Java・Node.js・Python・.NET・Ruby・Go**）でサポートされている。
　・トレースデータを作成してX-Rayデーモンに送信するためのクラストとメソッドを提供してくれる。
　・単純なX-Ray APIへの操作
　・SDKを使えばリクエストに関するメタデータを記録するためのコードを手動で実装する必要はない

##　AWS X-Rayの料金と注意点
●**料金**
　◆記録・取得・スキャンされたトレースの数に基づいて料金が発生
　◆永続的な無料利用枠
　　・毎月トレースの記録は10万回まで無料
　　・毎月トレースの取得とスキャンは合わせて100万回まで無料

●**注意点**　
　◆サンプリングについて
　　・デフォルトではサンプリングされる。
　　・100％トレースする設定も可能だが、料金とパフォーマンスへの影響を事前に確認する

　◆データの完全性は保証されない
　　・監視やコンプライアンスのツールとしては使用することができない
　
　◆直近30日間の追跡データが保存
　　・過去30日間の追跡データに対してクエリを実行可能

##　おわりに
　AWS X-Rayについてブラックベルトや書籍などで調べていくうちにすごく便利なサービスでありマイクロアプリケーションにうってつけの分析サービスだなと感じた。
　またX-Ray SDKやX-Rayデーモンによってアプリケーションに簡単に組み込むことができる手軽さとAWSサービスと統合されていて簡単にセットアップできる利用しやすさにびっくりしました。
　これを機にもっとAWSサービスについて調べていこうと思います

　(｡･ω･)ﾉﾞバイバイ