この記事は2451文字約7分で読めます

AWSのTracingサービスのX-Rayを使って、LambdaのService MapやTraceを取得しつつ、DatadogのAPMに連携していきます。

Table of Contents

AWS X-Ray とは何ですか。

公式サイトによると、

AWS X-Ray はアプリケーションが処理するリクエストに関するデータを収集するサービスです。

データを表示、フィルタリング、洞察を取得して問題の識別や最適化の機会を識別するために使用するツールを提供します。

アプリケーションに対するトレース対象のリクエストの場合、リクエストとレスポンスに関する情報だけではなく、アプリケーションがダウンストリーム AWS リソース、マイクロサービス、データベース、および HTTP ウェブ API に対して行う呼び出しの詳細な情報も表示できます。

公式Doc AWS X-Ray とは何ですか。

とのことです。

難しいですね・・。もう少し簡単に言ってみると、

アプリケーションAWSのサービス(DynamoDBとかS3とか)と通信したり外部サービスのAPIをコールしたりするリクエストとレスポンスを収集し、記録し、良き感じに可視化してくれるサービスです。

このようなサービスのことをTracingとか言ったりします。

実は、X-Rayをお勉強する前に、この手のサービス(Tracing)の基本を押さえる必要があると思い、お正月にGoのEchoでJaegerを使ってボトルネックを調査する という記事を書いてました。

X-Rayからは若干離れますが、OpenTracingな情報を知りたいほうは上記も読んでみてくださいませ。

さて、話をX-Rayに戻すと、X-Rayを使うとTracingと、

img

Service Mapを作ることができます。

img

今回は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からアップロードします。

img

作ったLambda LayerはLambda関数にアタッチ(マージ)することで利用できるようになります。

Lambdaで外部APIをたたくため、RequestsのLambda Layerも作ってアタッチしてます。

img

Pythonコード実装

PythonでX-RayのTracingを使うには大きく2種類の方法があります。

  • xray_recorder
  • patch

xray_recorderはPython関数にデコレータとして設定することで、関数のIn/Outをキャプチャできます。

patchはRequestsBoto3などいくつかライブラリを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を有効化することを忘れずに

img

これで無事にX-Rayが利用できるようになりました。

Lambdaが動くことでTracingされます。

img

Lambda単体なのでService Mapもショボいですができてます。

img

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を取得する設定が入っているか確認します。入っていなければチェックしてください。

img

これでAPMからX-Rayが使えるようになります。次のメトリック取得でAPMにTracing関連が追加されているはず。

img

APMからTracing情報を確認する

Serviceからダッシュボードの形で、APMに送られてくるTracingをパパっと見ることができます。

img

細かくみると、こんな感じでAPMからRequestの内訳やレイテンシーが確認できるようになっているはずです。

img

Service MapもDatadogから確認できますが、こちらはAWSのコンソールのほうが見やすいですね。

img

Monitorを設定する

APMのメトリックを使って、Monitorを作ることもできます。

例えば、P99のレイテンシーがxx秒を超えてきたらWarningなどにしておくと安心感あるかもですね。

img

結論

DatadogのAPMはLambda + X-Rayでも問題なく利用できる機能とわかりました。

もう少しX-Rayを使いこなせるように頑張りますね。

tubone24にラーメンを食べさせよう!

ぽちっとな↓

Buy me a ramen
hatena bookmark