/** * @return a {@link CodahaleMetricsListener} built with parameters from this builder. */ public CodahaleMetricsListener build() { return new CodahaleMetricsListener( metricsCollector, endpointMetricsHandler, includeServerConfigMetrics, serverStatsMetricNamingStrategy, serverConfigMetricNamingStrategy, requestAndResponseSizeHistogramSupplier ); }
/** * Initialize the endpoint and server config metrics. Note that the server config values will not be added if * {@link #includeServerConfigMetrics} is false, however {@link * EndpointMetricsHandler#setupEndpointsMetrics(ServerConfig, MetricRegistry)} will always be called. * * @param config The {@link ServerConfig} that contains the endpoints and server config values. */ public void initEndpointAndServerConfigMetrics(ServerConfig config) { if (includeServerConfigMetrics) addServerConfigMetrics(config); endpointMetricsHandler.setupEndpointsMetrics(config, metricsCollector.getMetricRegistry()); }
this.requestAndResponseSizeHistogramSupplier = requestAndResponseSizeHistogramSupplier; addServerStatisticsMetrics();
private void verifyServerStatisticMetrics(CodahaleMetricsListener instance) { String prefix = ((DefaultMetricNamingStrategy)instance.serverStatsMetricNamingStrategy).prefix; assertThat(instance.getInflightRequests()).isSameAs(instance.inflightRequests); verify(cmcMock).getNamedCounter(name(prefix, "inflight_requests")); verify(metricRegistryMock).counter(name(prefix, "inflight_requests")); assertThat(instance.inflightRequests).isSameAs(registeredCounterMocks.get(name(prefix, "inflight_requests"))); assertThat(instance.getProcessedRequests()).isSameAs(instance.processedRequests); verify(cmcMock).getNamedCounter(name(prefix, "processed_requests")); verify(metricRegistryMock).counter(name(prefix, "processed_requests")); assertThat(instance.processedRequests).isSameAs(registeredCounterMocks.get(name(prefix, "processed_requests"))); assertThat(instance.getFailedRequests()).isSameAs(instance.failedRequests); verify(cmcMock).getNamedCounter(name(prefix, "failed_requests")); verify(metricRegistryMock).counter(name(prefix, "failed_requests")); assertThat(instance.failedRequests).isSameAs(registeredCounterMocks.get(name(prefix, "failed_requests"))); assertThat(instance.getResponseWriteFailed()).isSameAs(instance.responseWriteFailed); verify(cmcMock).getNamedCounter(name(prefix, "response_write_failed")); verify(metricRegistryMock).counter(name(prefix, "response_write_failed")); assertThat(instance.responseWriteFailed).isSameAs(registeredCounterMocks.get(name(prefix, "response_write_failed"))); assertThat(instance.getResponseSizes()).isSameAs(instance.responseSizes); verify(metricRegistryMock).register(name(prefix, "response_sizes"), instance.responseSizes); assertThat(instance.responseSizes).isSameAs(registeredHistogramMocks.get(name(prefix, "response_sizes"))); verify(cmcMock).registerNamedMetric(name(prefix, "response_sizes"), instance.responseSizes); assertThat(instance.getRequestSizes()).isSameAs(instance.requestSizes); verify(metricRegistryMock).register(name(prefix, "request_sizes"), instance.requestSizes); assertThat(instance.requestSizes).isSameAs(registeredHistogramMocks.get(name(prefix, "request_sizes"))); verify(cmcMock).registerNamedMetric(name(prefix, "request_sizes"), instance.requestSizes); }
@Test public void single_arg_constructor_sets_fields_as_expected() { // given setupMetricRegistryAndCodahaleMetricsCollector(); // when CodahaleMetricsListener instance = new CodahaleMetricsListener(cmcMock); // then verifyServerStatisticMetrics(instance); assertThat(instance.getMetricsCollector()).isSameAs(cmcMock); assertThat(instance.metricsCollector).isSameAs(cmcMock); assertThat(instance.endpointMetricsHandler) .isNotNull() .isInstanceOf(EndpointMetricsHandlerDefaultImpl.class); assertThat(instance.getEndpointMetricsHandler()).isSameAs(instance.endpointMetricsHandler); assertThat(instance.includeServerConfigMetrics).isFalse(); assertNamingStrategyIsDefault(instance.serverStatsMetricNamingStrategy, DEFAULT_PREFIX, DEFAULT_WORD_DELIMITER); assertNamingStrategyIsDefault(instance.serverConfigMetricNamingStrategy, ServerConfig.class.getSimpleName(), DEFAULT_WORD_DELIMITER); assertThat(registeredGauges).isEmpty(); }
CodahaleMetricsListener instance = CodahaleMetricsListener.newBuilder(cmcMock) .withEndpointMetricsHandler(endpointMetricsHandlerMock) .withIncludeServerConfigMetrics(includeServerConfigMetrics) .map( endpoint -> endpoint.getClass().getName() + "-" + instance.getMatchingHttpMethodsAsCombinedString(endpoint) + "-" + endpoint.requestMatcher().matchingPathTemplates() instance.initEndpointAndServerConfigMetrics(serverConfig);
public MetricsTestConfig() { try { port = ComponentTestUtils.findFreePort(); } catch (IOException e) { throw new RuntimeException("Couldn't allocate port", e); } CodahaleMetricsEngine metricsEngine = new CodahaleMetricsEngine() .addReporter(new DefaultSLF4jReporterFactory()) .addReporter(new RiposteGraphiteReporterFactory("test.metrics.stuff", "doesnotexist.nikecloud.com", 2003)) .reportJvmMetrics() .start(); metricsListener = new CodahaleMetricsListener(metricsEngine.getMetricsCollector()); metricsListener.initEndpointAndServerConfigMetrics(this); }
/** * Adds metrics related to the given ServerConfig - usually gauges so you can inspect how the ServerConfig was setup. * Usually not needed - better to log this info on startup. */ protected void addServerConfigMetrics(ServerConfig config) { // add server config gauges metricsCollector.registerNamedMetric(serverConfigMetricNamingStrategy.nameFor(BOSS_THREADS), (Gauge<Integer>)config::numBossThreads); metricsCollector.registerNamedMetric(serverConfigMetricNamingStrategy.nameFor(WORKER_THREADS), (Gauge<Integer>)config::numWorkerThreads); metricsCollector.registerNamedMetric(serverConfigMetricNamingStrategy.nameFor(MAX_REQUEST_SIZE_IN_BYTES), (Gauge<Integer>)config::maxRequestSizeInBytes); List<String> endpointsList = config.appEndpoints() .stream() .map( endpoint -> endpoint.getClass().getName() + "-" + getMatchingHttpMethodsAsCombinedString(endpoint) + "-" + endpoint.requestMatcher().matchingPathTemplates() ) .collect(Collectors.toList()); metricsCollector.registerNamedMetric(serverConfigMetricNamingStrategy.nameFor(ENDPOINTS), (Gauge<List<String>>)() -> endpointsList); }
@Test public void getMetricRegistry_delegates_to_metricsCollector() { // given MetricRegistry mrMock = mock(MetricRegistry.class); doReturn(mrMock).when(cmcMock).getMetricRegistry(); // when MetricRegistry result = listener.getMetricRegistry(); // then assertThat(result).isSameAs(mrMock); }
@Before public void setUp() throws Exception { executor = Executors.newCachedThreadPool(); serverConfig = new MetricsTestConfig(); metricsListener = (CodahaleMetricsListener) serverConfig.metricsListener(); endpointMetricsHandler = (EndpointMetricsHandlerDefaultImpl) metricsListener.getEndpointMetricsHandler(); assertTrue(serverConfig.endpointsPort() > 0); logger.info("Dynamically chose server port {}", serverConfig.endpointsPort()); nonblockingEndpointUrl = "http://127.0.0.1:" + serverConfig.endpointsPort() + NON_BLOCKING_MATCHING_PATH; server = new Server(serverConfig); server.startup(); // Perform a "warmup" to get the Server ready to go - the first call is always slower than normal. List<Future<?>> warmupCalls = new ArrayList<>(); warmupCalls.add(sendServerRequest(nonblockingEndpointUrl)); for (Future f : warmupCalls) { f.get(); } }
logger.warn("serverShouldProcessNonblockingEndpointsAsynchronouslyReturns500 start " + new Date().toString()); CodahaleMetricsListener metricsListener = (CodahaleMetricsListener) serverConfig.metricsListener(); long prevFailedCount = metricsListener.getFailedRequests().getCount(); long prevProcessedCount = metricsListener.getProcessedRequests().getCount(); long prevRequestsCount = endpointMetricsHandler.getRequests().getCount(); long prevGetRequestsCount = endpointMetricsHandler.getGetRequests().getCount(); long countFailed = metricsListener.getFailedRequests().getCount(); long processedCount = metricsListener.getProcessedRequests().getCount(); long requestsCount = endpointMetricsHandler.getRequests().getCount(); long requestSize = metricsListener.getRequestSizes().getSnapshot().getMax(); long responseSize = metricsListener.getResponseSizes().getSnapshot().getMax(); long getRequestsCount = endpointMetricsHandler.getGetRequests().getCount(); long responsesCount = endpointMetricsHandler.getResponses()[5 - 1].getCount(); .getCount(); long inflight = metricsListener.getInflightRequests().getCount(); long responseWriteFailed = metricsListener.getResponseWriteFailed().getCount(); long postRequests = endpointMetricsHandler.getPostRequests().getCount(); long putRequests = endpointMetricsHandler.getPutRequests().getCount();
@Test public void kitchen_sink_constructor_handles_default_args() { // given setupMetricRegistryAndCodahaleMetricsCollector(); // when CodahaleMetricsListener instance = new CodahaleMetricsListener( cmcMock, null, false, null, null, null ); // then verifyServerStatisticMetrics(instance); assertThat(instance.getMetricsCollector()).isSameAs(cmcMock); assertThat(instance.metricsCollector).isSameAs(cmcMock); assertThat(instance.endpointMetricsHandler) .isNotNull() .isInstanceOf(EndpointMetricsHandlerDefaultImpl.class); assertThat(instance.getEndpointMetricsHandler()).isSameAs(instance.endpointMetricsHandler); assertThat(instance.includeServerConfigMetrics).isFalse(); assertNamingStrategyIsDefault(instance.serverStatsMetricNamingStrategy, DEFAULT_PREFIX, DEFAULT_WORD_DELIMITER); assertNamingStrategyIsDefault(instance.serverConfigMetricNamingStrategy, ServerConfig.class.getSimpleName(), DEFAULT_WORD_DELIMITER); assertThat(instance.requestAndResponseSizeHistogramSupplier) .isSameAs(DEFAULT_REQUEST_AND_RESPONSE_SIZE_HISTOGRAM_SUPPLIER); assertThat(registeredGauges).isEmpty(); }
listener = new CodahaleMetricsListener(cmcMock, endpointMetricsHandlerMock, true, null, null, mockHistogramSupplier); listener.initEndpointAndServerConfigMetrics(serverConfig);
@Test public void serverShouldProcessNonblockingEndpointsAsynchronouslyReturns400() throws Exception { logger.warn("serverShouldProcessNonblockingEndpointsAsynchronouslyReturns400 start " + new Date().toString()); long prevFailedCount = metricsListener.getFailedRequests().getCount(); long prevProcessedCount = metricsListener.getProcessedRequests().getCount(); long prevRequestsCount = endpointMetricsHandler.getRequests().getCount(); long prevGetRequestsCount = endpointMetricsHandler.getGetRequests().getCount(); long countFailed = metricsListener.getFailedRequests().getCount(); long processedCount = metricsListener.getProcessedRequests().getCount(); long requestsCount = endpointMetricsHandler.getRequests().getCount(); long requestSize = metricsListener.getRequestSizes().getSnapshot().getMax(); long responseSize = metricsListener.getResponseSizes().getSnapshot().getMax(); long getRequestsCount = endpointMetricsHandler.getGetRequests().getCount(); long responsesCount = endpointMetricsHandler.getResponses()[4 - 1].getCount(); .getCount(); long inflight = metricsListener.getInflightRequests().getCount(); long responseWriteFailed = metricsListener.getResponseWriteFailed().getCount(); long postRequests = endpointMetricsHandler.getPostRequests().getCount(); long putRequests = endpointMetricsHandler.getPutRequests().getCount();
@DataProvider(value = { "true", "false" }) @Test public void kitchen_sink_constructor_sets_fields_as_expected(boolean includeServerConfigMetrics) { // given setupMetricRegistryAndCodahaleMetricsCollector(); MetricNamingStrategy<ServerStatisticsMetricNames> statsNamingStrategyMock = new DefaultMetricNamingStrategy<>(); MetricNamingStrategy<ServerConfigMetricNames> configNamingStrategyMock = new DefaultMetricNamingStrategy<>(); Supplier<Histogram> customRequestAndResponseSizeHistogramSupplier = () -> mock(Histogram.class); // when CodahaleMetricsListener instance = new CodahaleMetricsListener( cmcMock, endpointMetricsHandlerMock, includeServerConfigMetrics, statsNamingStrategyMock, configNamingStrategyMock, customRequestAndResponseSizeHistogramSupplier ); // then verifyServerStatisticMetrics(instance); assertThat(instance.getMetricsCollector()).isSameAs(cmcMock); assertThat(instance.metricsCollector).isSameAs(cmcMock); assertThat(instance.getEndpointMetricsHandler()).isSameAs(endpointMetricsHandlerMock); assertThat(instance.endpointMetricsHandler).isSameAs(endpointMetricsHandlerMock); assertThat(instance.includeServerConfigMetrics).isEqualTo(includeServerConfigMetrics); assertThat(instance.serverStatsMetricNamingStrategy).isSameAs(statsNamingStrategyMock); assertThat(instance.serverConfigMetricNamingStrategy).isSameAs(configNamingStrategyMock); assertThat(instance.requestAndResponseSizeHistogramSupplier) .isSameAs(customRequestAndResponseSizeHistogramSupplier); assertThat(registeredGauges).isEmpty(); }
@Test public void constructor_throws_IllegalArgumentException_if_passed_null() { // when Throwable ex = catchThrowable(() -> new CodahaleMetricsListener(null)); // then assertThat(ex).isInstanceOf(IllegalArgumentException.class); }
logger.warn("serverShouldProcessNonblockingEndpointsAsynchronously start " + new Date().toString()); CodahaleMetricsListener metricsListener = (CodahaleMetricsListener) serverConfig.metricsListener(); long prevFailedCount = metricsListener.getFailedRequests().getCount(); long prevProcessedCount = metricsListener.getProcessedRequests().getCount(); long prevRequestsCount = endpointMetricsHandler.getRequests().getCount(); long prevGetRequestsCount = endpointMetricsHandler.getGetRequests().getCount(); long countFailed = metricsListener.getFailedRequests().getCount(); long processedCount = metricsListener.getProcessedRequests().getCount(); long requestsCount = endpointMetricsHandler.getRequests().getCount(); long requestSize = metricsListener.getRequestSizes().getSnapshot().getMax(); long responseSize = metricsListener.getResponseSizes().getSnapshot().getMax(); long getRequestsCount = endpointMetricsHandler.getGetRequests().getCount(); long responsesCount = endpointMetricsHandler.getResponses()[4 - 1].getCount(); .getCount(); long inflight = metricsListener.getInflightRequests().getCount(); long responseWriteFailed = metricsListener.getResponseWriteFailed().getCount(); long postRequests = endpointMetricsHandler.getPostRequests().getCount(); long putRequests = endpointMetricsHandler.getPutRequests().getCount();
@Test public void constructor_uses_histogram_supplier_for_request_size_and_response_size_metrics() { // given Histogram mockHistogram = mock(Histogram.class); Supplier<Histogram> histogramSupplier = () -> mockHistogram; // when CodahaleMetricsListener instance = new CodahaleMetricsListener( cmcMock, endpointMetricsHandlerMock, false, null, null, histogramSupplier ); // then assertThat(instance.requestSizes).isSameAs(mockHistogram); assertThat(instance.responseSizes).isSameAs(mockHistogram); }