Domanda

i am trying to combine a Spring Web Application (completed Annotation Based configuration, no xml configuration) with metrics 3.0.

I am running the application inside a jetty.

This is my current configuration for the default DispatcherServlet:

public class WebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter };
    }

}

This is the WebConfig:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.rebuy.silo.amqpredelivery")
@EnableJpaRepositories(basePackages = "com.rebuy.silo.amqpredelivery.domain")
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Override
    public void configureMessageConverters(
            List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
        jacksonConverter.setObjectMapper(objectMapper());
        converters.add(jacksonConverter);
        super.configureMessageConverters(converters);
    }

    @Bean
    public ObjectMapper objectMapper() {
        SimpleDateFormat format = new SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ssXXX");
        format.setTimeZone(TimeZone.getTimeZone("GMT+1"));
        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(format);
        return mapper;
    }
}

I want to add these two Servlets:

What is the best way to do this? I think there should be some spring magic to make this extremly easy to do! But I was not able to find it :(

Thanks in advance Björn

È stato utile?

Soluzione

You can follow this codebase https://github.com/spiritedtechie/metrics-examples.

Or use this library called metrics-spring http://ryantenney.github.io/metrics-spring/

Altri suggerimenti

If you are using Spring and Metrics you should also be using @RyanTenney's Metrics-Spring module. It will simplify your Java config and make your Metrics usage much cleaner.

Take a look at the code behind the MetricsServlet and HealthCheckServlet. In my opinion its easier to just write your own Spring Controller to do the same thing than to figure out how to embed and wrap those old servlets.

Its easy!

Create a metrics specific config:

@Configuration
@EnableMetrics
public class MetricsConfig extends MetricsConfigurerAdapter {
    @Override
    public void configureReporters(MetricRegistry metricRegistry) {
        registerReporter(ConsoleReporter
            .forRegistry(metricRegistry)
            .build()).start(5, TimeUnit.MINUTES);
    }
}

And include it from your existing config by adding:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.rebuy.silo.amqpredelivery")
@EnableJpaRepositories(basePackages = "com.rebuy.silo.amqpredelivery.domain")
@EnableAspectJAutoProxy
@EnableTransactionManagement
@Import({MetricsConfig.class})
public class WebConfig extends WebMvcConfigurerAdapter {
...

The above config changes make it trivial to inject a MetricRegistry in any Spring component. All the MetricsServlet does is send the registry in response to the request. That is really easy to accomplish in a simple controller. For example:

@Controller
public class AdminMetricsController
{
    @Autowired
    MetricRegistry metricRegistry;

    @RequestMapping(value = "/admin/metrics/", produces = {APPLICATION_JSON_VALUE})
    public @ResponseBody MetricRegistry getMetrics(final HttpServletResponse response)
    {
        response.setHeader("Cache-Control", "must-revalidate,no-cache,no-store");
        return metricRegistry;
    }

}

A HealthCheckRegistry can be injected in a similar way and another method added which would respond to /admin/health/ or whatever url you wanted.

Take a look at the following answer. It explains how to register a Servlet via JavaConfig:

Spring JavaConfig: Add mapping for custom Servlet

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top