yammer @Timed将值保持为零

Lol*_*olo 7 java spring metrics annotations yammer

这是一个后续使用Yammer的定时注解描述了我的奋斗这里.

我的春天上下文文件很简单:

<metrics:annotation-driven />
Run Code Online (Sandbox Code Playgroud)

我有以下课程:

import com.yammer.metrics.annotation.ExceptionMetered;
import com.yammer.metrics.annotation.Metered;
import com.yammer.metrics.annotation.Timed;

...

@Component
public class GetSessionServlet extends HttpServlet {

  private final static Logger log = LoggerFactory.getLogger(GetSessionServlet.class);


  @Override
  public void init(final ServletConfig config) throws ServletException {
    super.init(config);
    SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(
            this, config.getServletContext());
  }

  @Override
  @Timed(name = "get-session", rateUnit = TimeUnit.MILLISECONDS)
  @Metered
  @ExceptionMetered(name = "get-session-failures", rateUnit = TimeUnit.MILLISECONDS)
  public void doGet(final HttpServletRequest req,
          final HttpServletResponse resp) throws ServletException, IOException {
    final String sessionId = req.getParameter("sessionId");
    final String fields = req.getParameter("fields");
    final String format = req.getParameter("format");
    if (StringUtils.isEmpty(sessionId)) {
      resp.getWriter().write("sessionId parameter missing!\n");
      return;
    }
    ...
  }
Run Code Online (Sandbox Code Playgroud)

我在本地运行我的应用程序mvn clean tomcat7:run,然后连接jconsole.

在MBeans选项卡中,我可以看到一个包含我的GetSessionServlet类的包名称的条目,其中包含三个子文件夹doGet(对于@Metered数字),get-session和get-session-failures.

但是,无论我调用多少次servlet,上面子文件夹中的所有值都保持为零.我错过了什么?此外,我们将非常感谢有关这些计量指标的任何文档,这些指标比官方文档更详细.

小智 5

我想我有这个工作.

我注意到的第一件事是示例spring上下文文件的schemaLocation属性中的URI:http: //www.yammer.com/schema/metrics/metrics.xsd 返回404错误.

我搜索了这个问题,看看是否有人抱怨架构无法访问并找到了这个帖子,github.com/codahale/metrics/issues/322,其中用户注意到metrics-spring模块已从核心度量库中删除并转移到:github.com/ryantenney/metrics-spring.

按照该网站上的示例,我从我的pom中删除了旧的metrics-spring依赖项,并添加了以下内容:

  <dependency>
      <groupId>com.ryantenney.metrics</groupId>
      <artifactId>metrics-spring</artifactId>
      <version>2.1.4</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

然后我在spring-context.xml文件中更新了xmlns声明:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:metrics="http://www.ryantenney.com/schema/metrics"
       xsi:schemaLocation="
           http://www.ryantenney.com/schema/metrics 
           http://www.ryantenney.com/schema/metrics/metrics.xsd 
           ...other schemas...">
Run Code Online (Sandbox Code Playgroud)

添加了注释驱动元素:

<metrics:annotation-driven proxy-target-class="true" />
Run Code Online (Sandbox Code Playgroud)

我启用了proxy-target-class来使基于类的自动装配工作.

在bean中,我希望时间添加@Timed注释和@PostConstruct方法,以使ConsoleReporter每10秒转储一次统计信息:

@PostConstruct
public void init() {
    ConsoleReporter.enable(10, TimeUnit.SECONDS);    
} 

@Timed
public void doService(...) {
    .... do stuff ....
}
Run Code Online (Sandbox Code Playgroud)

然后我启动了我的webapp ....并从解析spring context.xml文件的sax解析器中得到了一个令人讨厌的错误.

似乎www.ryantenney.com/schema/metrics/metrics.xsd 404s也是如此!

解决方法很简单,但是,我从github存储库下载了xsd:https: //github.com/ryantenney/metrics-spring/blob/master/src/main/resources/com/ryantenney/metrics/spring/配置/度量-3.0.xsd

然后在我的maven项目的src/main/resources/META-INF目录中添加了以下文件:

META-INF/
    - spring.schemas
    - xsd/
         - metrics.xsd
Run Code Online (Sandbox Code Playgroud)

metrics.xsd是从github下载的xsd文件,spring.schemas是一个文本文件,包含:

http\://www.ryantenney.com/schema/metrics/metrics.xsd=META-INF/xsd/metrics.xsd
Run Code Online (Sandbox Code Playgroud)

Spring.schemas文件在启动时由spring读取,并告诉它从本地文件下拉xsd.

有了上述原因,我能够成功启动我的应用程序并点击使用该服务方法的端点.

看着控制台我确实看到以下每10秒抛弃一次:

com.sample.service.MyServiceClass:
doService:
    count = 8
    mean rate = 0.27 calls/s
    1-minute rate = 0.23 calls/s
    5-minute rate = 0.21 calls/s
    15-minute rate = 0.20 calls/s
    min = 0.13ms
    max = 19.59ms
    mean = 2.59ms
    stddev = 6.87ms
    median = 0.18ms
Run Code Online (Sandbox Code Playgroud)