Spring 使用 aws x-ray 的休息模板

Spring rest template with aws x-ray

我想使用 aws x-ray 跟踪部署为 aws lambda 的 spring 微服务之间的调用。

设置如下:

  1. 具有 api 端点的微服务 A 部署为 aws lambda

  2. 具有 api 端点的微服务 B 部署为 aws lambda 通过 https

  3. 调用微服务 A

两个微服务都包含 xray 的 aws 依赖项:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-xray-recorder-sdk-bom</artifactId>
            <version>1.2.1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-apache-http</artifactId>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-aws-sdk</artifactId>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-xray-recorder-sdk-aws-sdk-instrumentor</artifactId>
    </dependency>
</dependencies>

对于这两个微服务,已通过无服务器应用程序模型启用跟踪 sam.yaml 文件:

Resources:
  FunctionA:
    Type: AWS::Serverless::Function
    Properties:
      Handler: example.HandlerA::handleRequest
      Runtime: java8
      CodeUri: target/foo.jar
      MemorySize: 512
      Tracing: Active
      Policies:
        - AWSLambdaBasicExecutionRole
        - AWSXrayWriteOnlyAccess 
      Timeout: 20
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /{proxy+}
            Method: any

虽然我可以在 X-ray Web 界面中看到对服务 A 和 B 的单独调用的跟踪,但通过 A 调用 B 不会显示为复合跟踪。

有什么想法吗?可能我需要实例化一个 servlet 过滤器。仅仅包括依赖项是不够的,对吗?

此时亚马逊API网关为not propagating x-amzn-trace-id headers

听起来好像您的 AWS Lambda 函数可能部署在 API 网关端点后面。由于 API Gateway 与 AWS 集成的这一限制 X-Ray,今天无法将此操作作为一个连续的跟踪进行跟踪。

在单个连续跟踪中跟踪此操作的一种方法是让微服务 B 直接使用 AWS Lambda Invoke API 调用微服务 A。此 API 确实尊重 x-amzn-trace-id header(它将自动添加到 Invoke 请求中,因为您已将 aws-xray-recorder-sdk-aws-sdk-instrumentor 工件包含在项目中) .