yammer @Timed将值保持为零

这是我使用yammer计时注释进行斗争的后续行动,如此处所述。

我的spring上下文文件简单地说:

 

我有以下课程:

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

我用mvn clean tomcat7:run在本地运行我的app mvn clean tomcat7:run然后连接jconsole。

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

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

我想我有这个工作。

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

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

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

   com.ryantenney.metrics metrics-spring 2.1.4  

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

  

添加了注释驱动元素:

  

我启用了proxy-target-class来使基于类的自动assembly工作。

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

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

然后我启动了我的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 

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

 http\://www.ryantenney.com/schema/metrics/metrics.xsd=META-INF/xsd/metrics.xsd 

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 

我在这里发布了一个类似的问题,并没有进一步。 有人向我指出,我可能得到0个数字,因为“当从类本身内部调用该方法时,Spring无法拦截带注释的方法。” 虽然我以前读过那个评论,但我没有意识到我处于这种情况,但是看看HttpServlet的源代码,我确实看到像doHead那样调用doGet的方法。

虽然这个限制本身就是一个挫折,但我继续从我的doGet中调用一个不同类的方法来查看我是否可以按照这种方式执行计时(繁琐但愿意尝试一下):

 import org.springframework.stereotype.Component; import com.yammer.metrics.annotation.Metered; import com.yammer.metrics.annotation.Timed; @Component public class Delay { // @Metered @Timed public void time() { System.out.println("Timing..."); try { Thread.sleep(1000); } catch (final InterruptedException e) { e.printStackTrace(); } } } 

然而,从我的servlet getter调用此方法如下:

 public void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { final Delay delay = new Delay().time(); 

仍然没有向我显示Delay.time方法的任何非空数字,无论我做多少次。

在这一点上,我将采取挑衅性的立场,因为这些注释带来了任何限制,缺乏完整的文档和有用的代码示例,这些注释是无用的,至少在时序servlet的上下文中。

我确实希望被certificate是错误的并且很乐意改变我的投票以接受另一个答案,因为这些注释看起来很有前途,并且比Metrics.newTimer和类似的方法更实用。