タダです.
FastAPI を業務のアプリケーションで扱う割合が増えつつあるのですが,FastAPI のパフォーマンスを見えるよう可視化していくために X-Ray を試す機会があったのでこの記事にまとめていきます.
X-Ray について
X-Ray はアプリケーションの処理するリクエストに関する処理時間を収集するサービスで,トレーシングすることでボトルネックの可視化やどこで問題が起こっているかなども見えます.ログ以外の観点でアプリケーションの状態を見る手段が欲しくて X-Ray を試してみることにしたので検証をしてみました.
サポートされている言語
サポートされている言語は Java/Node.js/Python/Go/Ruby/C# です.なお,今回使う Python ではフレームワークとして Django と Flask がサポートされており,ミドルウェアを使ってアプリケーションの受信リクエストを計測できますが,FastAPI はサポートされてないようなのでミドルウェアを使った受信リクエストの計測ではなく他の Python コードの部分でのトレーシングをしてみることにしました.
X-Ray の用語
X-Ray での用語も整理しておきます.
- セグメント: アプリケーションを実行しているコンピューティングリソースを指し,動作に関するデータを送信する
- サブセグメント: セグメントからダウンストリーム呼び出しのアプリケーションビューを表し,AWS サービス,外部 HTTP API,SQL データベースの呼び出しに関する情報を含める
- サービスグラフ:アプリケーションが送信したデータを使って表現されるグラフ
FastAPI のコードに X-Ray を組み込む
それでは FastAPI のコードの中に X-Ray を仕込んでいきます.まず,Amazon Linux2 の EC2 上で FastAPI の開発環境を作ってライブラリと X-Ray にデータを送るデーモンを導入します.FastAPI の導入は公式ドキュメントに沿って行います.
# X-Ray のライブラリの導入 $ pip install aws-xray-sdk # X-Ray デーモン導入 $ curl https://s3.dualstack.ap-northeast-1.amazonaws.com/aws-xray-assets.ap-northeast-1/xray-daemon/aws-xray-daemon-3.x.rpm -o /home/ec2-user/xray.rpm $ sudo yum install -y /home/ec2-user/xray.rpm # FastAPI と uvicorn の導入 $ pip install fastapi uvicorn
X-Ray SDK for Python を使ってライブラリにパッチを適用し,ダウンストリーム呼び出しを実装していくのですが,FastAPI で{"Hello":"World"}
と返すだけのコード(main.py
)で組み込んでみます.これでpython main.py
をしてアクセスしてみます.
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all from fastapi import FastAPI xray_recorder.configure(service='FastAPI') plugins = ('EC2Plugin') xray_recorder.configure(plugins=plugins) patch_all() app = FastAPI() xray_recorder.begin_segment('FastAPITest') @app.get("/") def read_root(): return{"Hello":"World"} xray_recorder.end_segment()
{"Hello":"World"}
が返ってきたのと X-Ray のサービストレース画面でもFastAPITest
のセグメントが記録されました.
FastAPI のアプリケーションにアクセスした画面
X-Ray のサービストレース画面
まとめ
まずはさくっと FastAPI のコードに X-Ray を組み込んで可視化してみました.業務の中でも取り込んでいくのでその時のハマりポイントやどういう風に取り込んでいったのかをまたブログにできたらと思います!