2016-08-26 11 views
1

나는이 질문을 통해 DropWizard Metrics Meters vs Timers 타이머의 개념을 이해했습니다. 그러나 코드 블록의 실행 시간을 기록 할 때마다 호출 할 수있는 방법이 있습니까? 이 방법은 자주 호출되지 않지만 호출 할 때 상당한 시간이 걸리는 것처럼이 타이머의 평균 속도와 내용을 원하지 않습니다. 그렇다면 각 호출의 실행 시간을 인쇄 할 수있는 방법이 있습니까? 또한 아래의 질문에 대한 답변을 얻으려면 어떻게해야합니까?DropWizard 타이머를 사용하여 코드 블록의 실행 시간 찾기

  1. 스파이크 값의 원인을 어떻게 조사 할 수 있습니까?
  2. 로그를 통해 가능한 이유를 확인할 수 있도록 최대 시간 이벤트가 발생한 시점을 어떻게 알 수 있습니까?

모든 도움을 주시면 감사하겠습니다.

답변

0

타이머 컨텍스트 개체를 가져 오는 방법이 있는지 모르겠지만 다른 아이디어가 있습니다. 당신은이 방법이 그렇게 자주 전화하지 않는다고 말했다. 왜 DynamicFeature를 사용하고 컨테이너의 실행 시간을 인쇄합니까?

다음은이 기능을 구현하는 방법을 보여줍니다. 이 코드가 제대로 작동하는지 모르겠습니다. 테스트를하지 않고 코딩 했으므로 시도해보고 필요한 경우 변경하십시오. ExecutionTimeFilter가 구현 된 인터페이스로 인해 두 개의 별도 클래스로 분할해야하는 경우 적절하게 변경하십시오.

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