7

これは、ここで説明するyammerタイミングアノテーションを使用した私の苦労のフォローアップです。

私のSpringコンテキストファイルには単純に次のものがあります。

<metrics:annotation-driven />

私は次のクラスを持っています:

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から、jconsoleに接続します。

[MBeans]タブに、GetSessionServletクラスのパッケージ名が3つのサブフォルダーdoGet(@Metered番号用)、get-session、およびget-session-failuresを含むエントリが表示されます。

ただし、サーブレットを何度呼び出しても、上記のサブフォルダーのすべての値はゼロのままです。私は何が欠けていますか?また、公式ドキュメントよりも詳細に説明されているこれらの従量制メトリックに関するドキュメントは大歓迎です。

4

2 に答える 2

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に移動しました。

そのWebサイトの例に従って、pomから古いmetrics-spring依存関係を取り除き、以下を追加しました。

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

次に、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...">

注釈駆動型要素を追加しました:

<metrics:annotation-driven proxy-target-class="true" />

クラスベースの自動配線を機能させるために、proxy-target-classを有効にしました。

そして、私がTimeにしたかったBeanに、@ Timedアノテーションと@PostConstructメソッドを追加して、ConsoleReporterが10秒ごとに統計をダンプできるようにしました。

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

@Timed
public void doService(...) {
    .... do stuff ....
}

次に、Webアプリケーションを起動しました....そして、春のcontext.xmlファイルを解析しているsaxパーサーから厄介なエラーが発生しました。

www.ryantenney.com/schema/metrics/metrics.xsd404sも同様のようです。

この回避策は簡単でしたが、xsdをgithubリポジトリからダウンロードしました: https ://github.com/ryantenney/metrics-spring/blob/master/src/main/resources/com/ryantenney/metrics/spring/ config /metrics-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
于 2013-02-20T03:10:06.093 に答える
3

私はここに同様の質問を投稿しましたが、それ以上は進みませんでした。「クラス自体からメソッドが呼び出された場合、Springは注釈付きメソッドをインターセプトできない」ため、おそらく0の数値を取得していると指摘されました。以前にそのコメントを読んだことがありますが、このような状況にあることに気づいていませんでしたが、HttpServletのソースを見ると、doGetを呼び出すdoHeadのようなメソッドが実際に見つかります。

その制限だけでは挫折ですが、別のクラスの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();
    }
  }
}

それでも、次のようにサーブレットゲッターからこのメソッドを呼び出します。

public void doGet(final HttpServletRequest req,
      final HttpServletResponse resp) throws ServletException, IOException {

  final Delay delay = new Delay().time();

getを何度実行しても、Delay.timeメソッドのnull以外の数値は表示されません。

この時点で、これらのアノテーションには制限があり、完全なドキュメントと有用なコード例がないため、少なくともタイミングサーブレットのコンテキストでは、これらのアノテーションは役に立たないという挑発的な立場を取ります。

私は間違っていることが証明されることを望んでおり、これらの注釈はMetrics.newTimerや同様のメソッドよりも有望で実用的であるように見えたため、別の回答を受け入れるように投票を変更します。

于 2013-02-18T18:19:33.997 に答える