@Before public void beforeMethod() { metricMetadataMock = mock(MetricMetadata.class); metricRegistryMock = mock(MetricRegistry.class); requestTimerBuilderMock = mock(MetricBuilder.class); dimensionConfiguratorMock = mock(MetricDimensionConfigurator.class); handler = new SignalFxEndpointMetricsHandler( metricMetadataMock, metricRegistryMock, requestTimerBuilderMock, dimensionConfiguratorMock ); requestInfoMock = mock(RequestInfo.class); responseInfoMock = mock(ResponseInfo.class); httpStateMock = mock(HttpProcessingState.class); endpointMock = mock(Endpoint.class); requestStartTime = Instant.now().minus(42, ChronoUnit.MILLIS); httpMethod = HttpMethod.PATCH; matchingPathTemplate = "/" + UUID.randomUUID().toString(); doReturn(requestStartTime).when(httpStateMock).getRequestStartTime(); doReturn(endpointMock).when(httpStateMock).getEndpointForExecution(); doReturn(httpMethod).when(requestInfoMock).getMethod(); doReturn(matchingPathTemplate).when(httpStateMock).getMatchingPathTemplate(); timerBuilderTaggerMock = mock(BuilderTagger.class); doReturn(timerBuilderTaggerMock).when(metricMetadataMock).forBuilder(requestTimerBuilderMock); doReturn(timerBuilderTaggerMock).when(dimensionConfiguratorMock).setupMetricWithDimensions( eq(timerBuilderTaggerMock), eq(requestInfoMock), eq(responseInfoMock), eq(httpStateMock), anyInt(), anyInt(), anyLong(), any(Endpoint.class), anyString(), anyString(), anyString() ); timerMock = mock(Timer.class); doReturn(timerMock).when(timerBuilderTaggerMock).createOrGet(metricRegistryMock); }
BuilderTagger secondResultBuilderMock = mock(BuilderTagger.class); doReturn(firstResultBuilderMock).when(first).setupMetricWithDimensions( any(BuilderTagger.class), any(RequestInfo.class), any(ResponseInfo.class), any(HttpProcessingState.class), anyInt(), anyInt(), anyLong(), any(Endpoint.class), anyString(), anyString(), anyString() ); doReturn(secondResultBuilderMock).when(second).setupMetricWithDimensions( any(BuilderTagger.class), any(RequestInfo.class), any(ResponseInfo.class), any(HttpProcessingState.class), anyInt(), anyInt(), anyLong(), any(Endpoint.class), anyString(), anyString(), anyString() verify(first).setupMetricWithDimensions( origBuilderMock, requestInfoMock, responseInfoMock, httpStateMock, responseStatusCode, responseStatusCodeXXValue, elapsedTimeMillis, endpointMock, endpointClass, method, matchingPathTemplate ); verify(second).setupMetricWithDimensions( firstResultBuilderMock, requestInfoMock, responseInfoMock, httpStateMock, responseStatusCode, responseStatusCodeXXValue, elapsedTimeMillis, endpointMock, endpointClass, method, matchingPathTemplate
@Test public void handleRequest_works_as_expected() { // given int statusCode = 242; int statusCodeXXValue = 2; long elapsedTimeMillis = 42; // when handler.handleRequest( requestInfoMock, responseInfoMock, httpStateMock, statusCode, statusCodeXXValue, elapsedTimeMillis ); // then verify(metricMetadataMock).forBuilder(requestTimerBuilderMock); verify(dimensionConfiguratorMock).setupMetricWithDimensions( timerBuilderTaggerMock, requestInfoMock, responseInfoMock, httpStateMock, statusCode, statusCodeXXValue, elapsedTimeMillis, endpointMock, endpointMock.getClass().getName(), httpMethod.name(), matchingPathTemplate ); verify(timerBuilderTaggerMock).createOrGet(metricRegistryMock); verify(timerMock).update(elapsedTimeMillis, TimeUnit.MILLISECONDS); }
verify(dimensionConfiguratorMock).setupMetricWithDimensions( timerBuilderTaggerMock, requestInfoMock, responseInfoMock, httpStateMock, statusCode, statusCodeXXValue, elapsedTimeMillis, endpoint, expectedEndpointClass, expectedMethodName, expectedPathTemplate
@Override public void handleRequest(RequestInfo<?> requestInfo, ResponseInfo<?> responseInfo, HttpProcessingState httpState, int responseHttpStatusCode, int responseHttpStatusCodeXXValue, long requestElapsedTimeMillis) { Endpoint<?> endpoint = httpState.getEndpointForExecution(); String endpointClass = (endpoint == null) ? "NONE" : endpoint.getClass().getName(); String method = (requestInfo.getMethod() == null) ? "NONE" : requestInfo.getMethod().name(); String matchingPathTemplate = (httpState.getMatchingPathTemplate() == null) ? "NONE" : httpState.getMatchingPathTemplate(); Timer latencyTimer = requestTimerDimensionConfigurator.setupMetricWithDimensions( metricMetadata.forBuilder(requestTimerBuilder), requestInfo, responseInfo, httpState, responseHttpStatusCode, responseHttpStatusCodeXXValue, requestElapsedTimeMillis, endpoint, endpointClass, method, matchingPathTemplate ).createOrGet(metricRegistry); latencyTimer.update(requestElapsedTimeMillis, TimeUnit.MILLISECONDS); }
@Override public MetricMetadata.BuilderTagger<T> setupMetricWithDimensions(MetricMetadata.BuilderTagger<T> rawBuilder, RequestInfo<?> requestInfo, ResponseInfo<?> responseInfo, HttpProcessingState httpState, int responseHttpStatusCode, int responseHttpStatusCodeXXValue, long elapsedTimeMillis, Endpoint<?> endpoint, String endpointClass, String method, String matchingPathTemplate) { // Execute the first configurator. MetricMetadata.BuilderTagger<T> withFirstConfiguration = firstConfigurator.setupMetricWithDimensions( rawBuilder, requestInfo, responseInfo, httpState, responseHttpStatusCode, responseHttpStatusCodeXXValue, elapsedTimeMillis, endpoint, endpointClass, method, matchingPathTemplate ); // Execute the second configurator with the result of the first. return secondConfigurator.setupMetricWithDimensions( withFirstConfiguration, requestInfo, responseInfo, httpState, responseHttpStatusCode, responseHttpStatusCodeXXValue, elapsedTimeMillis, endpoint, endpointClass, method, matchingPathTemplate ); }