2015-12-22 12 views
5

Ho circa 20 API e voglio implementare statistiche come il tempo di esecuzione, il conteggio delle risposte .. per ogni API. Dopo aver fatto qualche ricerca, sono venuto a sapere che le metriche dropwizard rappresentano l'approccio migliore per l'implementazione di tali funzionalità. Sto usando il framework Spring MVC (non avviabile). Qualcuno può suggerirmi come integrare Metrics to Spring MVC framework?Come implementare le statistiche usando metriche dropwizard e spring-mvc

Se possibile, fornire qualsiasi codice come riferimento.

+0

Il link che hai fornito ha tutto il codice che si desidera integrare nella propria applicazione primavera. Hai provato? – Lucky

+0

Sì, ho provato. ma non riesco a sapere cosa chiamare per ottenere le statistiche delle API. – kumar

risposta

4

È possibile utilizzare Metrics for Spring. Ecco uno github link, che spiega come integrarlo con Spring MVC. Il modulo metrics-spring integra Dropwizard Metrics library con Spring e fornisce la configurazione XML e Java.

Maven

La versione corrente è 3.1.2, che è compatibile con Metrics 3.1.2

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

Funzioni di base

A partire dalla versione 3, la metrica-molla potrebbe essere config ured usando XML o Java, a seconda delle preferenze personali.

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

} 

saperne di più su Metrics Spring

+3

Grazie. Ho implementato la stessa cosa, ma non sono in grado di sapere come chiamare per ottenere statistiche sulle API. – kumar

+0

@kumar dove sai cosa chiamare per ottenere le metriche? –

1

Come è stato già suggerito Metrics Primavera offre alcuni interessanti l'integrazione con la Primavera. Se si desidera accedere a tali parametri da un'API JSON, è comunque necessario aggiungere il servlet come documentato allo http://metrics.dropwizard.io/3.1.0/manual/servlets/.

Per poter utilizzare questi servlet è necessario aggiungere la dipendenza:

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

quindi si aggiunge il servlet in 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> 

È anche possibile utilizzare JavaConfig per configurarlo.

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

E fornire gli attributi necessari per il 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

Ho un paio di aggiunte alla risposta di cui sopra.

È necessario registrare MetricsConfiguration come RootConfigClasses all'interno di WebInitializer, altrimenti non verrà caricato.

Ho trovato con la mia versione Spring (4.2.5) una mancata corrispondenza della versione AOP con quella di metriche-spring che provoca una ClassNotFoundException. Escludere semplicemente la molla come dipendenza dalle metriche: molla dentro il tuo pom.

Infine, si può facilmente implementare il proprio controller Metrics in questo modo:

@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."); 
    } 
} 
} 
Problemi correlati