在 Actuator (Springboot) 中配置 TraceFilter 不起作用
Configuring TraceFilter in Actuator (Springboot) does not work
我正在尝试在与我的主要 spring 引导项目不同的 jar 中创建过滤器。其中之一是 Actuator 中的跟踪过滤器(调用 /trace 时执行的过滤器),我将其配置为不跟踪对 /trace[ 的调用=25=] 本身。如果我在项目中定义过滤器,它会完美运行并且不会跟踪对 /trace.
的调用
但是,当我将 class 提取到另一个库并从主项目引用它时,它正在跟踪这些调用。我已检查所有引用是否正确,并且正在执行过滤器。但是,我怀疑在初始化依赖项时,我的过滤器和 WebRequestTraceFilter(我的过滤器中的 class 正在继承)都被实例化了。这是过滤器 class:
package common.api.filters.trace;
import org.springframework.boot.actuate.trace.TraceProperties;
import org.springframework.boot.actuate.trace.TraceRepository;
import org.springframework.boot.actuate.trace.WebRequestTraceFilter;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* Class to exclude some some endpoints to be traced such as /admin/**, * /trace and
* endpoints provide static files like /css/** and /js/**.
*/
@Component
public class RequestTraceFilter extends WebRequestTraceFilter {
private static final String[] excludedEndpoints = new String[]{"/css/**", "/js/**", "/trace"};
public RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
super(repository, properties);
}
/*
The default implementation was always returning false.
With this implementation, it returns true for the endpoints we don’t want to trace.
*/
@Override
protected boolean shouldNotFilter(final HttpServletRequest request) throws ServletException {
return Arrays
.stream(excludedEndpoints)
.anyMatch(e -> new AntPathMatcher().match(e, request.getServletPath()));
}
}
我也尝试过删除标签@Component 并在带有@Configuration 标签的class 中以这种方式初始化过滤器:
@Bean
public FilterRegistrationBean createTraceFilter(){
FilterRegistrationBean frb = new FilterRegistrationBean();
frb.setFilter(new RequestTraceFilter(new InMemoryTraceRepository(), new TraceProperties()));
return frb;
}
但结果是一样的:正在执行过滤器,但正在跟踪对 /trace 的调用。
如何将主项目中的过滤器初始化为跟踪时唯一执行的过滤器?
我发现了发生了什么:正如我所想,实例化了两个 类:RequestTraceFilter 和 WebRequestTraceFilter。所以,我的被正确执行,但 WebRequestTraceFilter 也被执行并在 shouldNotFilter 方法中返回 false,跟踪对 /trace 本身的调用。我已经解决了它改变我初始化依赖关系的方式:
@Bean
public WebRequestTraceFilter createTraceFilter(){
return new RequestTraceFilter(new InMemoryTraceRepository(), new TraceProperties());
}
所以现在,当 Spring 启动询问 WebRequestTraceFilter 的实例时,它只返回我的实例。
我正在尝试在与我的主要 spring 引导项目不同的 jar 中创建过滤器。其中之一是 Actuator 中的跟踪过滤器(调用 /trace 时执行的过滤器),我将其配置为不跟踪对 /trace[ 的调用=25=] 本身。如果我在项目中定义过滤器,它会完美运行并且不会跟踪对 /trace.
的调用但是,当我将 class 提取到另一个库并从主项目引用它时,它正在跟踪这些调用。我已检查所有引用是否正确,并且正在执行过滤器。但是,我怀疑在初始化依赖项时,我的过滤器和 WebRequestTraceFilter(我的过滤器中的 class 正在继承)都被实例化了。这是过滤器 class:
package common.api.filters.trace;
import org.springframework.boot.actuate.trace.TraceProperties;
import org.springframework.boot.actuate.trace.TraceRepository;
import org.springframework.boot.actuate.trace.WebRequestTraceFilter;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
/**
* Class to exclude some some endpoints to be traced such as /admin/**, * /trace and
* endpoints provide static files like /css/** and /js/**.
*/
@Component
public class RequestTraceFilter extends WebRequestTraceFilter {
private static final String[] excludedEndpoints = new String[]{"/css/**", "/js/**", "/trace"};
public RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
super(repository, properties);
}
/*
The default implementation was always returning false.
With this implementation, it returns true for the endpoints we don’t want to trace.
*/
@Override
protected boolean shouldNotFilter(final HttpServletRequest request) throws ServletException {
return Arrays
.stream(excludedEndpoints)
.anyMatch(e -> new AntPathMatcher().match(e, request.getServletPath()));
}
}
我也尝试过删除标签@Component 并在带有@Configuration 标签的class 中以这种方式初始化过滤器:
@Bean
public FilterRegistrationBean createTraceFilter(){
FilterRegistrationBean frb = new FilterRegistrationBean();
frb.setFilter(new RequestTraceFilter(new InMemoryTraceRepository(), new TraceProperties()));
return frb;
}
但结果是一样的:正在执行过滤器,但正在跟踪对 /trace 的调用。
如何将主项目中的过滤器初始化为跟踪时唯一执行的过滤器?
我发现了发生了什么:正如我所想,实例化了两个 类:RequestTraceFilter 和 WebRequestTraceFilter。所以,我的被正确执行,但 WebRequestTraceFilter 也被执行并在 shouldNotFilter 方法中返回 false,跟踪对 /trace 本身的调用。我已经解决了它改变我初始化依赖关系的方式:
@Bean
public WebRequestTraceFilter createTraceFilter(){
return new RequestTraceFilter(new InMemoryTraceRepository(), new TraceProperties());
}
所以现在,当 Spring 启动询问 WebRequestTraceFilter 的实例时,它只返回我的实例。