【问题标题】:Adding XRAY Tracing to non-rest functions e.g., SQS, Cognito Triggers etc将 XRAY 跟踪添加到非静止函数,例如 SQS、Cognito 触发器等
【发布时间】:2020-12-08 21:58:48
【问题描述】:

使用Serverless framework,我有未附加到 API 网关端点的函数,例如:

  • 认知触发器
  • S3 事件
  • DynamoDB 流
  • SQS 事件

我也在使用 XRAY 跟踪,我在 serverless.yml 文件中将其设置为 tracing: true。好像这些函数没有被跟踪,我收到的调试信息是:

忽略子段 20dcd559aa2ab487 上的刷新。关联的片段被标记为未采样。

有没有办法添加这些功能,无论是通过 serverless 还是 cloudformation?

提前致谢。

【问题讨论】:

    标签: serverless-framework serverless aws-serverless


    【解决方案1】:

    要为您的所有服务的 Lambda 函数启用 X-Ray 跟踪,您只需在提供程序级别设置相应的跟踪配置:

    provider:
      tracing:
        lambda: true
    

    如果您想在每个函数级别设置跟踪,您可以在函数定义中使用跟踪配置:

    functions:
      myFunction:
        handler: index.handler
        tracing: true
    

    将跟踪设置为 true 将转换为活动跟踪配置。您可以通过以字符串形式提供所需的配置来覆盖此行为:

    functions:
      myFunction:
        handler: index.handler
        tracing: PassThrough
    

    另请注意,您可以混合使用提供程序级别和功能级别的配置。所有函数都将继承提供者级别的配置,然后可以在单个函数的基础上进行覆盖:

    service:
      name: my-tracing-service
    
    provider:
      name: aws
     stage: dev
      runtime: nodejs8.10
      tracing:
        lambda: true
    
    functions:
      myFunc1: # this function will inherit the provider-level tracing configuration
        handler: index.func1
      myFunc2:
        handler: handler.func2
        tracing: PassThrough # here we're overwriting the provider-level configuration
    

    建议使用上述跟踪配置为 Lambda 设置 X-Ray 跟踪,因为这样做将确保 X-Ray 设置由无服务器框架核心通过 CloudFormation 管理。

    您可以更细化并指定要跟踪的资源:

    打开您的 serverless.yml 并在提供程序部分添加跟踪配置:

    provider:
      ...
      tracing:
        apiGateway: true
        lambda: true
    

    重要提示:由于 CloudFormation 的限制,目前无法在不使用跟踪的现有部署上启用 AWS X-Ray Tracing。

    如果您想使用 AWS X-Ray Tracing for Lambda,请删除旧的无服务器部署并重新部署启用了跟踪的 lambda。

    最后,别忘了配置正确的 IAM 权限策略:

    provider:
      ...
      iamRoleStatements:
        - Effect: Allow
          Action:
            ...
            - xray:PutTraceSegments
            - xray:PutTelemetryRecords
          Resource: "*"
    

    要为 AWS Lambda 调用的其他 AWS 服务启用 X-Ray 跟踪,您必须安装 AWS X-Ray 开发工具包。在您的项目目录中,运行:

    $ npm install -s aws-xray-sdk 更新您的 Lambda 代码并使用 X-Ray 开发工具包包装 AWS 开发工具包。变化:

    const AWS = require('aws-sdk');
    

    收件人:

    const AWSXRay = require('aws-xray-sdk-core');
    const AWS = AWSXRay.captureAWS(require('aws-sdk'));
    

    截至发布Serverless v140

    【讨论】:

    • 谢谢!抱歉,我应该提到我在 Serverless 中设置了 tracing: true,除了 API Gateway 附加功能之外,它不支持任何其他功能。
    • 我已经尝试了上述所有方法,但它仍然没有用于 S3 事件等的自动分段。例如,const segment = getSegment(); 找不到分段,const segment = new Segment('some-func'); 没有跟踪 id
    • 我必须添加一些新服务,并且会尝试一下,看看我发现了什么,我会回来告诉你我发现了什么。
    • 您是否也可以尝试使用 --> - xray:* 并让我知道... 确保在重新部署之前删除旧的部署存储桶和云形成堆栈。我知道这个设置不是很好,但作为一个测试,我想看看你得到了什么,然后从 IAM 向后工作。
    • 我无法像在生产中那样删除堆栈,所以如果是这种情况,将不得不佩戴缺乏功能!但我会尝试其他一些事情。感谢您的帮助,我们会尽快与您联系。
    【解决方案2】:

    目前 Lambda 不支持来自 REST API 或直接调用以外的触发器的持续跟踪

    上游服务可以是检测的 Web 应用程序或另一个 Lambda 函数。您的服务可以使用已检测的 AWS 开发工具包客户端直接调用该函数,或者通过使用已检测的 HTTP 客户端调用 API Gateway API。

    在其他任何情况下,它都会创建自己的新 Trace ID 并使用它。

    您可以通过在 Lambda 函数内创建一个新的 AWS-Xray 分段并使用来自 SQS 消息的传入 TraceID 自行解决此问题。这将为您的 lambda 调用生成两个段。一个由 Lambda 本身创建,另一个由您创建以扩展现有跟踪。这对于您的用例是否可以接受是您必须自己决定的事情!

    如果您使用 Python,则可以使用 aws-xray-lambda-segment-shim
    如果您正在使用 NodeJS,您可以关注 this guide on dev.to
    如果您正在使用 .NET,则此 GitHub issue 上有一些示例。

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多