我有调用Lamdba函数1的API网关,并在Go中调用lambda函数2。我想在服务地图中看到这两个函数加入。
到目前为止,我能够做到这一点的唯一方法是创建一个自定义段,例如称为“父”,并从此上下文创建一个子段,例如称为“child”。然后使用client.InvokeWithContext调用函数2传递“子”段上下文。
sess := session.Must(session.NewSession())
client := lambda.New(sess, &aws.Config{Region: aws.String(region)})
xray.Configure(xray.Config{LogLevel: "trace"})
xray.AWS(client.Client)
ctx, seg := xray.BeginSegment(context.Background(), "Parent")
ctx, subseg := xray.BeginSubsegment(ctx, "Child")
result, _ := client.InvokeWithContext(ctx,
lambda.InvokeInput{FunctionName: aws.String(functionName), Payload: nil})
subseg.Close(nil)
seg.Close(nil)
问题是这会创建跟踪父级 - >孩子在服务地图中也有功能1。
请在服务地图上加入这两项功能的最佳方法是什么? 注意。我有超过2个,我想在服务地图上看到链接,向我展示我通过lambdas的全部流程。
请帮忙。
由于 瑞克
答案 0 :(得分:6)
除非您要添加注释/元数据,否则无需为“子”调用添加子段。
API网关将名为X-Amzn-Trace-Id
的跟踪ID添加到X射线拾取的传入请求的标头中。如果您将调用中的跟踪ID从lambda 1转发到lambda 2,那么X-ray将在概览中使用箭头从lambda 1到lambda 2直观地表示调用,并在查看跟踪详细信息时包含lambda 2的跟踪详细信息lambda 1。
只要您通过调用链转发顶部跟踪ID,X射线就可以正确地显示从服务到服务的带有节点和箭头的调用链。
来自https://aws.amazon.com/xray/faqs/:
问:什么是追踪?
X射线跟踪是一组共享相同跟踪ID的数据点。 例如,当客户端向您的应用程序发出请求时,它就是 分配了唯一的跟踪ID。随着请求的完成 您的应用程序中的服务,服务中继信息 使用此唯一跟踪ID将请求返回到X-Ray。这块 您的应用程序中的每个服务转发给X射线的信息是 段,跟踪是段的集合。
https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader
https://docs.aws.amazon.com/xray/latest/devguide/xray-services-apigateway.html
答案 1 :(得分:1)
此Go and Lambda boilerplate app演示了X射线服务地图上的Lambda到Lambda跟踪:
https://github.com/nzoschke/gofaas/blob/master/worker.go
WorkCreateFunction
(函数1)是API网关处理函数。它通过WorkerFunction
电话调用Lambda.InvokeWithContext
(功能2)。
诀窍是在进行Lambda API调用之前使用xray检测Lambda API客户端:
// Lambda is an xray instrumented Lambda client
func Lambda() *lambda.Lambda {
c := lambda.New(sess)
xray.AWS(c.Client)
return c
}
out, err := Lambda().InvokeWithContext(ctx, &lambda.InvokeInput{
FunctionName: aws.String(os.Getenv("WORKER_FUNCTION_NAME")),
InvocationType: aws.String("Event"), // async
})
if err != nil {
return responseEmpty, errors.WithStack(err)
}
aws-xray-sdk-go
将函数1的X-Amzn-Trace-Id
标头复制到函数2的Lambda API请求中:
https://github.com/aws/aws-xray-sdk-go/blob/master/xray/aws.go#L56
如果这不起作用,请尝试更新到最新的aws-xray-sdk-go
。