AWSのTracingサービスのX-Rayを使って、LambdaのService MapやTraceを取得しつつ、DatadogのAPMに連携していきます。
Table of Contents
AWS X-Ray とは何ですか。
公式サイトによると、
AWS X-Ray はアプリケーションが処理するリクエストに関するデータを収集するサービスです。
データを表示、フィルタリング、洞察を取得して問題の識別や最適化の機会を識別するために使用するツールを提供します。
アプリケーションに対するトレース対象のリクエストの場合、リクエストとレスポンスに関する情報だけではなく、アプリケーションがダウンストリーム AWS リソース、マイクロサービス、データベース、および HTTP ウェブ API に対して行う呼び出しの詳細な情報も表示できます。
とのことです。
難しいですね・・。もう少し簡単に言ってみると、
アプリケーションがAWSのサービス(DynamoDBとかS3とか)と通信したり、外部サービスのAPIをコールしたりするリクエストとレスポンスを収集し、記録し、良き感じに可視化してくれるサービスです。
このようなサービスのことをTracingとか言ったりします。
実は、X-Rayをお勉強する前に、この手のサービス(Tracing)の基本を押さえる必要があると思い、お正月にGoのEchoでJaegerを使ってボトルネックを調査する という記事を書いてました。
X-Rayからは若干離れますが、OpenTracingな情報を知りたいほうは上記も読んでみてくださいませ。
さて、話をX-Rayに戻すと、X-Rayを使うとTracingと、
Service Mapを作ることができます。
今回はService Mapで監視するような多段でマイクロサービスなアーキテクチャの監視はしませんが、さっそく、X-RayでLambdaのリクエストをTracingしていきましょう!
X-Rayを使う for Lambda (Python)
LambdaはPythonで作っていくことにします。
Lambda Layerを作って利用できるようにする
X-Rayを使うには、X-Rayクライアント(https://github.com/aws/aws-xray-sdk-python)をソースコード上で使えるようにするため、X-Rayを入れたLambda Layerを作っていきます。
ローカル上で、
mkdir python
pip install aws-xray-sdk -t python/
zip -r python.zip python/
としてX-Ray Client入りのpython.zipを作ります。
そして、AWSコンソールのLambda Layersからアップロードします。
作ったLambda LayerはLambda関数にアタッチ(マージ)することで利用できるようになります。
Lambdaで外部APIをたたくため、RequestsのLambda Layerも作ってアタッチしてます。
Pythonコード実装
PythonでX-RayのTracingを使うには大きく2種類の方法があります。
- xray_recorder
- patch
xray_recorderはPython関数にデコレータとして設定することで、関数のIn/Outをキャプチャできます。
patchはRequestsやBoto3などいくつかライブラリをPatchして、リクエストをTracingします。 今回はめんどくさいのでpatch対応しているライブラリに全部Patchするpatch_allを使います。
from aws_xray_sdk.core import xray_recorder # デコレータをつけた関数をキャプチャ
from aws_xray_sdk.core import patch_all # boto3やrequestsにX-Rayパッチを適用し、監視する
patch_all() # X-Rayパッチ
@xray_recorder.capture("hoge_function") # 関数キャプチャ
def hoge_function(hogeeee, hogeeee):
hogehoge_logic(hogeeee)
さぁ、Lambdaのコードを無事に書き終えたらLambdaをデプロイして終わりです。
今回は手でLambdaを作りましたので、特にCIな話題はないです。すみません。
最後に、LambdaのコンソールからX-Rayを有効化することを忘れずに
これで無事にX-Rayが利用できるようになりました。
Lambdaが動くことでTracingされます。
Lambda単体なのでService Mapもショボいですができてます。
Datadog APMと連携する
X-RayはDatadogにも連携可能です。
早速Datadogに連携していきましょう。
DatadogがアクセスするRoleのポリシー設定
DatadogがあなたのアカウントにIntegrationするRoleにX-Rayの読み取り権限を追加します。
追加するポリシーは以下です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "XRay",
"Effect": "Allow",
"Action": [
"xray:GetSamplingTargets",
"xray:GetGroup",
"xray:GetTraceGraph",
"xray:GetServiceGraph",
"xray:GetTimeSeriesServiceStatistics",
"xray:GetEncryptionConfig",
"xray:GetSamplingRules",
"xray:GetGroups",
"xray:GetTraceSummaries",
"xray:GetSamplingStatisticSummaries",
"xray:BatchGetTraces",
"xray:PutEncryptionConfig"
],
"Resource": "*"
}
]
}
DatadogのAWS Integrationを確認
DatadogのWebコンソールから、X-Rayを取得する設定が入っているか確認します。入っていなければチェックしてください。
これでAPMからX-Rayが使えるようになります。次のメトリック取得でAPMにTracing関連が追加されているはず。
APMからTracing情報を確認する
Serviceからダッシュボードの形で、APMに送られてくるTracingをパパっと見ることができます。
細かくみると、こんな感じでAPMからRequestの内訳やレイテンシーが確認できるようになっているはずです。
Service MapもDatadogから確認できますが、こちらはAWSのコンソールのほうが見やすいですね。
Monitorを設定する
APMのメトリックを使って、Monitorを作ることもできます。
例えば、P99のレイテンシーがxx秒を超えてきたらWarningなどにしておくと安心感あるかもですね。
結論
DatadogのAPMはLambda + X-Rayでも問題なく利用できる機能とわかりました。
もう少しX-Rayを使いこなせるように頑張りますね。