当前位置: 首页 > 知识库问答 >
问题:

如何使用dropwizard指标和sping-mvc实现统计

郑晨
2023-03-14

我有大约20个API,我想为每个API实现执行时间、响应计数等统计信息。在做了一些研究之后,我了解到dropwizard度量是实现这些功能的最佳方法。我使用的是SpringMVC框架(不可启动)。有人能建议我如何将度量集成到Spring MVC框架中吗?

如果可能,请提供任何代码作为参考。

共有3个答案

车诚
2023-03-14

我对上面的答案有一些补充。

您需要将MetricsConfiguration注册为WebInitializer中的RootConfigClasses,否则它将不会加载。

我发现我的Spring版本(4.2.5)与metrics Spring的AOP版本不匹配,这导致了ClassNotFoundException。只需将spring aop排除在pom中作为度量spring的依赖项。

最后,您可以轻松实现自己的指标控制器,如下所示:

@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.");
    }
}
}
何升
2023-03-14

正如已经提到的,Metrics Spring提供了一些有趣的与Spring的集成。如果您想从JSON API访问这些指标,您仍然需要添加http://metrics.dropwizard.io/3.1.0/manual/servlets/.的servlet文档

为了使用这些servlet,您需要添加依赖项:

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

然后在web.xml中添加servlet:

<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对其进行配置。

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

并提供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);
    }
}
吴镜
2023-03-14

您可以使用Metrics for Spring。这是一个github链接,它解释了如何将其与Spring MVC集成。metrics-Spring模块将Dropwizard Metrics库与Spring集成,并提供XML和Java配置。

马文

当前版本是3.1.2,与Metrics 3.1.2兼容

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

基本用法

从版本3开始,metrics-Spring可以使用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);
    }

}

阅读更多关于指标Spring

 类似资料:
  • 嗨,我是java的新手,正在尝试学习如何使用Dropwizard指标库来衡量单个进程的性能。我已经查看了他们的入门,并运行了他们为Metricsignstry编写的内容,但不了解如何将流程和指标注册合并为一个(它测量的是我的流程所花费的时间,而不是它自己运行所需的时间)。 我可能写错了很多东西,但希望我的问题足够清楚。提前感谢我能得到的任何帮助/澄清!我将下面要测量的代码(pi数字到第n个数字)与

  • 我是Java新手。在探索监控卡桑德拉的方法时,我发现(https://cassandra.apache.org/doc/latest/operating/metrics.html)“使用Dropwizard度量库管理Cassandra中的度量”。然而,在一些地方,我读到了Codahale度量,这让我对两者之间的区别/关系感到困惑。这些不同的库是在做同样的事情,还是以前称为dropwizard的度量

  • 我们正在处理定期收到的消息。我们使用codahale dropwizard指标的“计时器”来测量处理这些指标所需的时间。 我发现有人在这里也有同样的问题:“指数衰减水库的问题是,如果没有新数据进来,它会一直给出相同的数字。例如,假设你用5和7更新一个计时器(然后什么都不要放),然后不管你什么时候看到(甚至在x小时之后),计时器仍将显示平均值为6,这无论如何都不能代表过去5分钟的结果。因此,只有当数

  • 我试图给一些网络用户界面的dropwizard指标。检查石墨和Ganglia,但我需要一些可以很容易地安装在windows和linux上,以及。无法配置度量观察器,因为我的应用程序中的度量是动态的。也配置了jclawson/metrics-ui,但是没有发现ui有吸引力。请建议我,如果有任何其他来源,可以很容易地整合。

  • 我们使用Jersey和web创建了多个APIendpoint。xml设置而不是资源配置设置。我们希望捕获并显示每个endpoint的所有请求的度量,包括所有不同的响应代码。到目前为止,我已经创建了一个类,它扩展了InstrumentedFilterContextListener,并在其中包含了Graphite reporter。 在web.xml中,我添加了以下块来使报告工作: 因此,通过上述配置

  • 我使用Dropwizard指标来衡量应用程序中的各种指标。它们是JVM检测中的几个预定义报告器,但奇怪的是,我找不到任何报告CPU使用情况的报告器。 我可以创建自己的Gauge(使用getThreadCpuTime或类似工具),但我最好的猜测是我错过了一些东西。 我是否在当前的实现中错过了它,或者它比我最初想象的更复杂?