Is there a way to intercept calls to actuator/prometheus
in the spring boot application?
I need to change the metric value once the pull request happens. This is what I have tried, but the request to the actuator wsn't filtered.
@Component
@WebFilter(urlPatterns = "/actuator")
public class ActuatorFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
chain.doFilter(request,response);
if (request instanceof HttpServletRequest) {
HandlerExecutionChain handlerChain = null;
try {
HttpServletRequest request1 = (HttpServletRequest) request;
request1.getRequestURI();
// do something
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
After following the discussion on Spring Github, I implemented this
@ManagementContextConfiguration
public class ActuatorFilterConfig {
@Bean
public FilterRegistrationBean<ActuatorFilter> registrationBean() {
FilterRegistrationBean<ActuatorFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new ActuatorFilter());
registrationBean.addUrlPatterns("/actuator/prometheus");
registrationBean.getFilter();
return registrationBean;
}
}
After following the discussion here at Spring. I implemented a class with management context configuration annotation.
@ManagementContextConfiguration
public class ActuatorFilterConfig {
@Bean
public FilterRegistrationBean<ActuatorFilter> registrationBean() {
FilterRegistrationBean<ActuatorFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new ActuatorFilter());
registrationBean.addUrlPatterns("/actuator/prometheus");
registrationBean.getFilter();
return registrationBean;
}
}
My filter class looks like this
@Order(1)
public class ActuatorFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
// Do something
chain.doFilter(request, response);
// Do something
}
Since my actuator runs on a different port. I have to use @ManagementContextConfiguration along with spring.factories file. The location for spring.factories is as follows:
main/resources/META-INF/spring.factories
with the following content
org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration = "path to the configuration class"