【问题标题】:AWS X-Ray GoLang Lambda to lambda tracing and displayed in the service mapAWS X-Ray GoLang Lambda 到 lambda 跟踪并显示在服务地图中
【发布时间】:2018-08-29 23:36:43
【问题描述】:

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

到目前为止,我能够做到这一点的唯一方法是创建一个自定义细分,例如称为“父”,并从该上下文创建一个子细分,例如称为“子”。然后使用 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 的整个流程。

请帮忙。

谢谢 瑞克

【问题讨论】:

  • 为了查看多个 lambda 的整个流程,我离开了 XRay 并使用了 OpenTracing -> Zipkin

标签: amazon-web-services go aws-lambda aws-api-gateway aws-xray


【解决方案1】:

除非您想添加注释/元数据,否则您不需要为“子”调用添加子段。

API 网关将名为 X-Amzn-Trace-Id 的跟踪 ID 添加到传入请求的标头中,X-ray 会拾取该请求。如果您在调用中将该跟踪 ID 从 lambda 1 转发到 lambda 2,那么 X-ray 将在概览中使用从 lambda 1 到 lambda 2 的箭头直观地表示调用,并在查看跟踪详细信息时包括 lambda 2 的跟踪详细信息λ 1.

只要你通过调用链转发顶部的trace ID,X-ray就会正确地用节点和箭头将调用链从一个服务可视化到另一个服务。

来自https://aws.amazon.com/xray/faqs/

问:什么是痕迹?

X 射线跟踪是一组共享相同跟踪 ID 的数据点。 例如,当客户端向您的应用程序发出请求时,它是 分配了唯一的跟踪 ID。随着请求通过 应用程序中的服务,服务中继有关的信息 使用此唯一跟踪 ID 将请求返回给 X-Ray。一块 由您的应用程序中的每个服务中继到 X-Ray 的信息是 段,而跟踪是段的集合。

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

【讨论】:

    【解决方案2】:

    这个Go and Lambda boilerplate app 演示了 X-Ray 服务图上的 Lambda 到 Lambda 跟踪:

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

    Resulting X-Ray Service Map

    WorkCreateFunction(函数 1)是 API 网关处理函数。它通过Lambda.InvokeWithContext 调用调用WorkerFunction(函数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

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2023-02-01
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多