2016-08-26 11 views
1

私はこの質問DropWizard Metrics Meters vs Timersを調べ、タイマーの概念を理解しました。しかし、コードブロックの実行時間を呼び出すたびにログに記録できる方法はありますか?この方法は頻繁に呼び出されるのではなく、呼び出されたときにかなりの時間がかかるので、このタイマーの平均速度やものは欲しくない。では、各呼び出しの実行時間を印刷する方法はありますか?また、以下の質問の答えを得るにはどうすればいいですか?DropWizardタイマーを使用してコードブロックの実行時間を調べる

  1. 値のスパイクの原因を調べるにはどうすればよいですか?
  2. 最大時間イベントが発生したことをどのようにして知ることができるので、ログを通過して考えられる原因を確認できますか?

ご協力いただければ幸いです。

答えて

0

タイマーコンテキストオブジェクトを取得する方法があるかどうかわかりませんが、別の考え方があります。あなたはこの方法はそれほど頻繁ではないと言いました。 DynamicFeatureを使用してコンテナの実行時間を印刷してみませんか?

以下、これをどのように実装するかを説明します。私はこれが動作するかどうか分からない、私はちょうどテストなしでそれをコード化したので、それを試し、必要に応じて変更してください。 ExecutionTimeFilterが実装されたインターフェイスのために2つの別個のクラスに分割が必要な場合は、それに応じて変更します。

ステップ1:作成フィルタ

@Provider 
public class ExecutionTimeFilter implements ContainerRequestFilter, ContainerResponseFilter { 
    public static final String EXECUTION_TIME_HEADER = "X-Execution-Time" 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     requestContext.getHeaders().add(EXECUTION_TIME_HEADER, ZonedDateTime.now().toString()); 
    } 

     @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     ZonedDateTime executionStartHeader = ZonedDateTime.parse(requestContext.getHeaderString(EXECUTION_TIME_HEADER)); 
     Duration executionTime = Duration.between(executionStartHeader, ZonedDateTime.now()); 
     //you can also print some url informations or whatever you need; check out the informations from both mehtod params 
     System.out.println("The execution time was:" + executionTime); 
    } 
} 

ステップ2:作成DynamicFeature

@Provider 
public class ExecutionTimeFeature implements DynamicFeature { 
    @Override 
    public void configure(ResourceInfo resourceInfo, FeatureContext context) { 
     if (resourceInfo.getResourceMethod().getAnnotation(ExecutionTime.class) != null) { 
      context.register(ExecutionTimeFilter.class); 
     } 
    } 
} 

ステップ3:作成注釈

@Target({ ElementType.METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ExecutionTime { 
} 

ステップ4:あなたのリソースに注釈を付ける

@GET 
@ExecutionTime 
public String getExcpensiveCalculation(@QueryParam("number") @DefaultValue("1") IntegerParam number) { 
    return getCalculation(number); 
} 

ステップ5:登録機能

environment.jersey().register(ExecutionTimeFeature.class); 

参考文献:Dropwizard Dynamic Feature with Filters

関連する問題