当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Boot WebFlux上使用AWS X-Ray跟踪传入请求?

王君墨
2023-03-14

我在AWS ECS上运行多个微服务,我想试用AWS X-Ray。根据这个开发者指南,我添加了一个带有跟踪过滤器的WebConfig.java文件。

添加行到build.gradle

implementation "javax.servlet:javax.servlet-api:4.0.1"
implementation "com.amazonaws:aws-xray-recorder-sdk-core:2.8.0"

新的文件WebConfig.java

import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter;
import javax.servlet.Filter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class WebConfig {

  @Bean
  public Filter tracingFilter() {
    return new AWSXRayServletFilter("ordermicroservice");
  }
}

然而,我不认为这是正确的,主要是因为我必须为javax.servlet.Filter添加额外的依赖项。我想这是因为我使用的是SpringBootWebFlux,而不是SpringBootWeb。所以我有一个Netty Web服务器,而不是Tomcat Web服务器。

我的问题是:

  • 如何将日志添加到servlet过滤器中,以确保每个传入的HTTP请求都正确通过过滤器?
  • 在使用Netty而不是Tomcat的spring boot webflux项目中,编写web过滤器的正确方法是什么

编辑:现在我知道了如何用Spring Boot WebFlux编写过滤器。我会在这里补充问题,以供日后参考:

import org.springframework.stereotype.Component
import org.springframework.web.server.ServerWebExchange
import org.springframework.web.server.WebFilter
import org.springframework.web.server.WebFilterChain
import reactor.core.publisher.Mono

@Component
class MyCustomWebFilter : WebFilter {

    override fun filter(webExchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
        print("Successfully reached the WebFilter.\n")

        val request = webExchange.request
        val response = webExchange.response

        // TODO: Do the actual filtering by looking at the request and modifying the response

        return chain.filter(webExchange)
    }
}

共有1个答案

朱啸
2023-03-14

正如Michael提到的,您可能需要实现WebFilter接口。因为AWSXRayServletFilter是一个servlet过滤器,所以它不能与WebFilter一起使用。不幸的是,WebFlux的X-RaySDK中还没有内置支持。您需要做的是在您的WebFilter链中,实现一个您自己的拦截器,通过创建一个段并向其中添加相关数据来跟踪传入的请求。您可以在此处参考AWSXRayServletFilter跟踪传入请求的方式:https://github.com/aws/aws-xray-sdk-java/blob/master/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/javax/servlet/AWSXRayServletFilter.java

或者,您可以使用OpenTelemeterJavaSDK来检测您的应用程序,并使用AWS Collector向X-Ray发送跟踪数据。OTel SDK支持WebFlux框架。您可以在下面找到更多信息。

OTel Java SDK工具:https://github.com/open-telemetry/opentelemetry-java-instrumentation

AWS OTel收藏家:https://aws-otel.github.io/docs/getting-started/collector

 类似资料:
  • 我有在读取队列时创建段的代码。在第一个函数中(在同一个lambda中)我有这个: 在从第一个调用的第二个函数(在同一个lambda中)中,我有这样的东西: 而不是看到 在AWS图表(网站上)上,我看到: ...它们甚至没有关联,即使它们具有相同的跟踪ID,并且正确设置了父ID。我似乎遗漏了什么,但不确定是什么。。。? 我甚至尝试从API请求中提取以将其用作所有内容的根跟踪ID,但这也不起作用。 这

  • 浏览器接口 fetch 发起的请求如何跟踪上传进度?

  • 问题内容: 我可以使用Python中的OpenCV从网络摄像头获取帧。camshift示例接近我想要的,但是我不希望人工干预来定义对象。我想获得在几帧的过程中变化的总像素的中心点,即运动对象的中心。 问题答案: 我已经从博客文章 使用OpenCV进行运动检测中 找到的C版本的代码转换了一些工作代码:

  • 我有一个.NET core API,它执行到其他API的HTTP连接。我能够在Application Insights中的Dependency Event Types下可视化传出的HTTP请求,但它只有基本信息。我正在研究如何添加更多关于传出HTTP调用的信息(例如HTTP头)。 我研究了https://docs.microsoft.com/en-us/azure/azure-monitor/ap

  • 问题内容: 我正在更改网站的很大一部分以使用jQuery Address的深层链接AJAX功能。我正在使用URI之类的。 我已经阅读了很多有关使用此功能跟踪流量的信息,但是我想知道是否有可能以更传统的方式进行此操作… 每个AJAX请求都调用一个PHP函数,该函数生成一个页面并通过包装返回它,这使我可以轻松定义自定义页面标题等。 如果我将分析代码放在该页面上,jQuery会调用该页面来触发它来跟踪访

  • 问题内容: 如果对http请求的响应是带有cookie的重定向(http代码302), 您如何指示Go客户使用收到的Cookie跟踪新位置? 在CURL中,可以通过以下方式轻松设置客户端: 您如何在Go中做到这一点? 问题答案: 使用Go 1.1,您可以使用。 这是一个工作示例: