AWS X-Ray GoLang Lambda到lambda跟踪并显示在服务映射中

ric*_*ick 10 go amazon-web-services aws-lambda aws-api-gateway aws-xray

我有API网关调用Lamdba函数1并在Go中调用lambda函数2.我想看到服务地图中加入了这两个功能.

到目前为止,我能够做到这一点的唯一方法是创建一个自定义段,例如称为"父",并从此上下文创建一个子段,例如称为"子".然后使用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)
Run Code Online (Sandbox Code Playgroud)

问题是这会在服务地图中创建跟踪父 - >子,但也有功能1.

请在服务地图上加入这两个功能的最佳方法是什么?注意.我有超过2个,我想看到服务地图上的链接,向我展示我通过lambdas的整个流程.

请帮忙.

谢谢里克

Kim*_*ard 6

除非要添加注释/元数据,否则无需为"子"调用添加子段.

API网关将调用的跟踪ID添加X-Amzn-Trace-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


Noa*_*hke 2

这个Go 和 Lambda 样板应用程序演示了 X-Ray 服务地图上的 Lambda 到 Lambda 跟踪:

https://github.com/nzoschke/gofaas/blob/master/worker.go

生成的 X 射线服务图

WorkCreateFunction(函数 1) 是 API 网关处理函数。它通过a调用WorkerFunction(函数2)Lambda.InvokeWithContext

诀窍是在进行 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)
}
Run Code Online (Sandbox Code Playgroud)

将函数 1 中的标头aws-xray-sdk-go复制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.