将Spring MVC 3.2与Coda Hales指标相结合

时间:2013-10-28 20:39:47

标签: java spring servlets spring-mvc metrics

我正在尝试将Spring Web应用程序(已完成的基于注释的配置, xml配置)与度量标准3.0相结合。

我正在码头内运行应用程序。

这是我对默认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 };
    }

}

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

我想添加这两个Servlet:

最好的方法是什么?我认为应该有一些春天的魔力使这个极其容易做到!但我无法找到它:(

提前致谢 的Björn

3 个答案:

答案 0 :(得分:4)

您可以关注此代码库https://github.com/spiritedtechie/metrics-examples

或者使用名为metrics-spring http://ryantenney.github.io/metrics-spring/

的库

答案 1 :(得分:2)

如果您使用的是Spring和Metrics,您还应该使用@ RyanTenney的Metrics-Spring模块。它将简化您的Java配置并使您的Metrics使用更加清晰。

查看MetricsServlet和HealthCheckServlet背后的代码。在我看来,更容易编写自己的Spring Controller来做同样的事情,而不是弄清楚如何嵌入和包装那些旧的servlet。

很容易!

创建特定于指标的配置:

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

通过添加以下内容从现有配置中包含它:

@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 {
...

上面的配置更改使得在任何Spring组件中注入MetricRegistry变得微不足道。所有MetricsServlet都会发送注册表以响应请求。这在一个简单的控制器中很容易实现。例如:

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

}

可以以类似的方式注入HealthCheckRegistry,并添加另一个响应/ admin / health /或您想要的任何URL的方法。

答案 2 :(得分:0)

看看以下答案。它解释了如何通过JavaConfig注册Servlet:

Spring JavaConfig: Add mapping for custom Servlet