Search code examples
prometheusspring-boot-actuatorspring-micrometer

How to know when prometheus server pulls metric from spring boot?


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;
    }
}

Solution

  • 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"