2015-12-22 20 views
5

Yaklaşık 20 API'm var ve her API için yürütme süresi, yanıt sayısı gibi istatistikleri uygulamak istiyorum. Bazı araştırmalar yaptıktan sonra, dropwizard metrikleri bu gibi işlevleri uygulamak için en iyi yaklaşım olduğunu anladım. Spring MVC framework kullanıyorum (önyüklenebilir değil). Herkes, Metrikleri Spring MVC çerçevesine nasıl entegre edeceğimi önerebilir mi?Dropwizard metrikleri ve spring-mvc kullanarak istatistik nasıl uygulanır

Mümkünse lütfen referans olarak herhangi bir kod veriniz.

+0

bağlantı size Bahar uygulamasında entegre etmek istediğiniz tüm kodu vardır. Denedin mi? – Lucky

+0

Evet Denedim. ancak API'ların istatistiklerini almak için ne arayacağımı bilmiyorum. – kumar

cevap

4

Metrics for Spring'u kullanabilirsiniz. Burada, Spring MVC ile nasıl entegre edileceğini açıklayan bir github link. Metrik-yay modülü Dropwizard Metrics library'u Yay ile bütünleştirir ve XML ve Java yapılandırması sağlar.

Maven

Güncel sürüm Metrik sürümü itibariyle 3.1.2

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

Temel Kullanım

ile uyumludur 3.1.2 olduğunu 3, metrik-bahar yapılandırması olabilir Kişisel tercihinize bağlı olarak XML veya Java, kullanarak üretti.

XML yapılandırma:

<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 Yapılandırma:

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

} 

zaten yapılmış Metrik bahar önerdiği gibi fazla üzerinde Metrics Spring

+3

Teşekkürler. Aynı şeyi uyguladım, ancak API'lerin istatistiklerini almak için ne arayacağımı bilmiyorum. – kumar

+0

Metrikleri almak için ne arayacağınızı nereden biliyorsunuz? –

1

Oku Bahar ile bazı ilginç entegrasyon sunuyor. Bir JSON API'sinden bu metriklere erişmek istiyorsanız, yine de http://metrics.dropwizard.io/3.1.0/manual/servlets/ numaralı belgede belgelenen belgeyi eklemeniz gerekir. Eğer bağımlılık eklemeniz gerekir bu servlet kullanmak için

:

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

Sonra web.xml''deki sunucu uygulamasını ekleyin:

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

Ayrıca yapılandırmak için JavaConfig kullanabilirsiniz.

Servlet'dir Kayıt:

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/*"); 
    } 
} 

Ve sunucu uygulaması gerekli nitelikleri sağlamak:

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

Yukarıdaki cevaba eklemeler bir çift var.

WebInitializer içinde MetricsConfiguration öğesini RootConfigClasses olarak kaydetmeniz gerekir, aksi halde yüklenmez.

Yay sürümümde (4.2.5) bir ClassNotFoundException neden metrikleri-bahar biri ile bir AOP sürümü uyuşmazlığı. Yay-aop'u pompanızın içindeki metrik-yay bağımlılığı olarak basitçe hariç tutun.

Son olarak, bunu kolaylıkla gibi kendi Metrik Kontrolörü uygulayabilirsiniz: Verdiğiniz

@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."); 
    } 
} 
} 
İlgili konular