kawabatas技術ブログ

試してみたことを書いていきます

Golang Lambda を AWS X-Ray で表示する

概要

Golang Lambda で DynamoDB のトレース、外部HTTPリクエストのトレースをした際のメモです。

Lambda のトレースの有効化

Lambda での AWS X-Ray のセットアップにあるように、

「アクティブトレースを有効にします」にチェックを入れれば、Lambda の起動・実行時間は表示できるようになります。

f:id:kawabatas:20190214141300p:plain

しかし、DynamoDB などの AWSサービスの呼び出しや、HTTPリクエストの呼び出しにはプラスの対応が必要でした。

X-Ray SDK for Go の使用

公式のドキュメントはこれらです。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-tracing.html

https://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-sdk-go-awssdkclients.html

Lambda 関数で Go 用 X-Ray SDK を使用することで、DynamoDB などの AWSサービスの呼び出しや、HTTPリクエストの呼び出しをトレースすることが可能になります。

ポイントとしては、Lambda 関数が実行されたときにハンドラに渡されるコンテキストを X-Ray SDK で使う点です。

また、2019/2月現在、aws-xray-sdk-go は rc を使わねばならないことも注意です。issue

DynamoDB のトレース一部抜粋。xxxxxWithContextメソッドを使います。

sess, err := session.NewSession()
dynamo := dynamodb.New(sess)
xray.AWS(dynamo.Client)

dynamo.ScanWithContext(ctx, params)
dynamo.PutItemWithContext(ctx, input)
dynamo.UpdateItemWithContext(ctx, input)
dynamo.DeleteItemWithContext(ctx, input)

外部HTTPリクエストのトレース一部抜粋。ctxhttpを使います。

client := &http.Client{}
client = xray.Client(client)

ctxhttp.Get(ctx, client, "https://www.google.com/")

表示

AWS マネジメントコンソールでの表示はこんな感じに

X-Ray Service Map f:id:kawabatas:20190214141651p:plain

X-Ray Traces f:id:kawabatas:20190214142000p:plain