2015-12-22 12 views
5

私は約20のAPIを持っており、実行時間、応答数などの統計を各APIに対して実装したいと考えています。いくつかの調査を行った後、私はdropwizardメトリックがそのような機能を実装するための最良の方法であることを知りました。私はSpring MVCフレームワーク(ブート不可)を使用しています。誰でも私にSpring MVCフレームワークにMetricsを統合する方法を教えてください。dropwizardメトリックとspring-mvcを使用して統計を実装する方法

可能であれば、任意のコードを参考にしてください。

+0

リンクはあなたのSpringアプリケーションでそれを統合するすべてのコードを持っています。やってみました? – Lucky

+0

はい私は試しました。 APIの統計情報を得るために何を呼び出すべきかを知ることができません。 – kumar

答えて

4

Metrics for Springを使用できます。 github linkは、Spring MVCとの統合方法を説​​明しています。 Metrics-Springモジュールは、Dropwizard Metrics libraryをSpringと統合し、XMLおよびJava構成を提供します。

Mavenの

最新版は、メトリックバージョンとして3.1.2

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

基本的な使用法

と互換性が3.1.2であります3、metrics-springはconfigあなたの個人的な好みに応じて、XMLまたはJava、 を使用して査定します。

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の設定:すでにメトリック春は春で、いくつかの興味深い統合を提供していますが示唆されているとおり

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

} 

Metrics Spring

+3

ありがとうございます。私も同じことを実装しましたが、私はAPIの統計を得るために何を呼び出すべきかを知ることができません。 – kumar

+0

@kumarメトリックを取得するために何を呼び出すべきかを知ることができますか? –

1

に続きを読みます。 JSON APIからこれらのメトリックにアクセスする場合は、http://metrics.dropwizard.io/3.1.0/manual/servlets/に記載されているようにサーブレットを追加する必要があります。あなたは依存関係を追加する必要がこれらのサーブレットを使用するためには

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

その後、あなたは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> 

あなたはまた、それを構成するためにJavaConfigを使用することができます。

サーブレット登録:私は上記の答えへの追加のカップルを持っている

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

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

とサーブレットで必要な属性を提供します。

WebInitializer内でMetricsConfigurationをRootConfigClassesとして登録する必要があります。そうしないと、読み込まれません。

私のSpringバージョン(4.2。5)AOPのバージョンが、ClassNotFoundExceptionを引き起こすメトリクススプリングのものと一致しない。あなたのpomの中のmetrics-springの依存としてspring-aopを単に除外してください。

最後に、あなたは簡単にそのようなあなた自身のメトリックコントローラを実装することができます:あなたが提供

@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."); 
    } 
} 
} 
関連する問題