2015-12-22 22 views
5

Tôi có khoảng 20 API và tôi muốn triển khai thống kê như thời gian thực hiện, số lần phản hồi .. cho mỗi API. Sau khi thực hiện một số nghiên cứu, tôi đã biết rằng số liệu dropwizard là cách tiếp cận tốt nhất để triển khai các chức năng như vậy. Tôi đang sử dụng khung công tác Spring MVC (không thể khởi động được). Ai có thể đề nghị tôi làm thế nào để tích hợp Metrics vào Spring MVC framework?Cách triển khai thống kê sử dụng chỉ số dropwizard và spring-mvc

Nếu có thể, vui lòng cung cấp bất kỳ mã nào làm tài liệu tham khảo.

+0

Các liên kết mà bạn cung cấp có tất cả các mã bạn muốn tích hợp nó trong ứng dụng mùa xuân của bạn. Bạn đã thử chưa – Lucky

+0

Có, tôi đã thử. nhưng tôi không thể biết phải gọi những gì để có được số liệu thống kê về API. – kumar

Trả lời

4

Bạn có thể sử dụng Metrics for Spring. Đây là github link, giải thích cách tích hợp nó với Spring MVC. Mô-đun số liệu-mùa xuân tích hợp Dropwizard Metrics library với Spring và cung cấp cấu hình XML và Java.

Maven

Phiên bản hiện tại là 3.1.2, đó là tương thích với Metrics 3.1.2

<dependency> 
    <groupId>com.ryantenney.metrics</groupId> 
    <artifactId>metrics-spring</artifactId> 
    <version>3.1.2</version> 
</dependency> 

Cách sử dụng cơ bản

Tính đến phiên bản 3, số liệu-mùa xuân có thể được cấu hình ured bằng cách sử dụng XML hoặc Java, tùy thuộc vào sở thích cá nhân của bạn.

cấu hình XML:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:metrics="http://www.ryantenney.com/schema/metrics" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.ryantenney.com/schema/metrics 
      http://www.ryantenney.com/schema/metrics/metrics.xsd"> 

    <!-- Creates a MetricRegistry bean --> 
    <metrics:metric-registry id="metricRegistry" /> 

    <!-- Creates a HealthCheckRegistry bean (Optional) --> 
    <metrics:health-check-registry id="health" /> 

    <!-- Registers BeanPostProcessors with Spring which proxy beans and capture metrics --> 
    <!-- Include this once per context (once in the parent context and in any subcontexts) --> 
    <metrics:annotation-driven metric-registry="metricRegistry" /> 

    <!-- Example reporter definiton. Supported reporters include jmx, slf4j, graphite, and others. --> 
    <!-- Reporters should be defined only once, preferably in the parent context --> 
    <metrics:reporter type="console" metric-registry="metricRegistry" period="1m" /> 

    <!-- Register metric beans (Optional) --> 
    <!-- The metrics in this example require metrics-jvm --> 
    <metrics:register metric-registry="metricRegistry"> 
     <bean metrics:name="jvm.gc" class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" /> 
     <bean metrics:name="jvm.memory" class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" /> 
     <bean metrics:name="jvm.thread-states" class="com.codahale.metrics.jvm.ThreadStatesGaugeSet" /> 
     <bean metrics:name="jvm.fd.usage" class="com.codahale.metrics.jvm.FileDescriptorRatioGauge" /> 
    </metrics:register> 

    <!-- Beans and other Spring config --> 

</beans> 

Java Config:

import java.util.concurrent.TimeUnit; 
import org.springframework.context.annotation.Configuration; 
import com.codahale.metrics.ConsoleReporter; 
import com.codahale.metrics.MetricRegistry; 
import com.codahale.metrics.SharedMetricRegistries; 
import com.ryantenney.metrics.spring.config.annotation.EnableMetrics; 
import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; 

@Configuration 
@EnableMetrics 
public class SpringConfiguringClass extends MetricsConfigurerAdapter { 

    @Override 
    public void configureReporters(MetricRegistry metricRegistry) { 
     // registerReporter allows the MetricsConfigurerAdapter to 
     // shut down the reporter when the Spring context is closed 
     registerReporter(ConsoleReporter 
      .forRegistry(metricRegistry) 
      .build()) 
      .start(1, TimeUnit.MINUTES); 
    } 

} 

Đọc thêm trên Metrics Spring

+3

Cảm ơn bạn. Tôi đã thực hiện cùng một điều, nhưng tôi không thể biết phải gọi những gì để có được số liệu thống kê về API. – kumar

+0

@kumar nơi bạn có thể biết phải gọi những gì để lấy số liệu? –

1

Như nó đã được đã gợi ý Metrics Xuân cung cấp một số tích hợp thú vị với mùa xuân. Nếu bạn muốn truy cập các số liệu đó từ một API JSON, bạn vẫn cần phải thêm servlet như được ghi tại http://metrics.dropwizard.io/3.1.0/manual/servlets/.

Để sử dụng các servlets bạn cần phải thêm phụ thuộc:

<dependency> 
    <groupId>io.dropwizard.metrics</groupId> 
    <artifactId>metrics-servlets</artifactId> 
    <version>${metrics.version}</version> 
</dependency> 

Sau đó, bạn thêm các servlet trong web.xml:

<servlet> 
<servlet-name>metrics-admin</servlet-name> 
<servlet-class>com.codahale.metrics.servlets.AdminServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>metrics-admin</servlet-name> 
<url-pattern>/metrics/admin/*</url-pattern> 
</servlet-mapping> 

Bạn cũng có thể sử dụng JavaConfig để cấu hình nó.

Đăng ký servlet:

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration; 

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; 

import com.codahale.metrics.servlets.AdminServlet; 

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

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

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return null; 
    } 

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

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     super.onStartup(servletContext); 
     ServletRegistration.Dynamic metricsServlet = servletContext.addServlet("metrics", new AdminServlet()); 
     metricsServlet.addMapping("/metrics/admin/*"); 
    } 
} 

Và cung cấp các thuộc tính cần thiết cho servlet:

import java.util.concurrent.TimeUnit; 

import javax.servlet.ServletContext; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration; 

import com.codahale.metrics.ConsoleReporter; 
import com.codahale.metrics.MetricRegistry; 
import com.codahale.metrics.health.HealthCheckRegistry; 
import com.codahale.metrics.servlets.HealthCheckServlet; 
import com.codahale.metrics.servlets.MetricsServlet; 
import com.ryantenney.metrics.spring.config.annotation.EnableMetrics; 
import com.ryantenney.metrics.spring.config.annotation.MetricsConfigurerAdapter; 

@Configuration 
@EnableMetrics 
public class MetricsConfiguration extends MetricsConfigurerAdapter { 

    @Autowired ServletContext servletContext; 
    @Autowired 
    private HealthCheckRegistry healthCheckRegistry; 
    @Override 
    public void configureReporters(MetricRegistry metricRegistry) { 
     registerReporter(ConsoleReporter 
      .forRegistry(metricRegistry) 
      .build()) 
      .start(1, TimeUnit.MINUTES); 
     servletContext.setAttribute(MetricsServlet.METRICS_REGISTRY, metricRegistry); 
     servletContext.setAttribute(HealthCheckServlet.HEALTH_CHECK_REGISTRY, healthCheckRegistry); 
    } 
} 
0

Tôi có một vài bổ sung vào câu trả lời ở trên.

Bạn cần đăng ký MetricsConfiguration dưới dạng RootConfigClasses bên trong WebInitializer, nếu không nó sẽ không tải.

Tôi tìm thấy với phiên bản Spring (4.2.5) một phiên bản AOP không phù hợp với phiên bản từ số liệu-mùa xuân gây ra một ClassNotFoundException. Đơn giản chỉ cần loại trừ mùa xuân-aop là phụ thuộc của số liệu-mùa xuân bên trong pom của bạn.

Cuối cùng, bạn có thể dễ dàng thực hiện Metrics điều khiển của riêng bạn như vậy:

@Controller 
public class MetricsContoller { 

@Autowired 
private ServletContext servletContext; 

@RequestMapping(value="/metrics", method=RequestMethod.GET) 
public @ResponseBody MetricRegistry saveTestStep() throws ServletException { 
    final Object registryAttr = servletContext.getAttribute(MetricsServlet.METRICS_REGISTRY); 
    if (registryAttr instanceof MetricRegistry) { 
     return (MetricRegistry) registryAttr; 
    } else { 
     throw new ServletException("Couldn't find a MetricRegistry instance."); 
    } 
} 
} 
Các vấn đề liên quan