Skip to content

Commit

Permalink
Support automatic addition of percentiles to client requests (issue m…
Browse files Browse the repository at this point in the history
  • Loading branch information
jkschneider committed Sep 5, 2017
1 parent 016d23c commit f6bed73
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,22 @@ public void setClientRequestsName(String clientRequestsName) {
public String getClientRequestsName() {
return clientRequestsName;
}

public void setServerRequestPercentiles(Boolean serverRequestPercentiles) {
this.serverRequestPercentiles = serverRequestPercentiles;
}

public Boolean getServerRequestPercentiles() {
return serverRequestPercentiles;
}

public void setClientRequestPercentiles(Boolean clientRequestPercentiles) {
this.clientRequestPercentiles = clientRequestPercentiles;
}

public Boolean getClientRequestPercentiles() {
return clientRequestPercentiles;
}
}

public Web getWeb() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ private class TimerConfig {
Iterable<Tag> extraTags = Collections.emptyList();
boolean longTask = false;
double[] quantiles = new double[0];
boolean percentiles = properties.getWeb().getAutoTimeServerRequests();
boolean percentiles = properties.getWeb().getServerRequestPercentiles();

@Override
public boolean equals(Object o) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
/**
* Copyright 2017 Pivotal Software, Inc.
*
* <p>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Expand All @@ -16,6 +16,8 @@
package io.micrometer.spring.web;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.stats.hist.Histogram;
import io.micrometer.spring.MetricsConfigurationProperties;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
Expand All @@ -33,14 +35,14 @@
public class MetricsRestTemplateInterceptor implements ClientHttpRequestInterceptor {
private final MeterRegistry meterRegistry;
private final RestTemplateTagConfigurer tagProvider;
private final String metricName;
private final MetricsConfigurationProperties properties;

public MetricsRestTemplateInterceptor(MeterRegistry meterRegistry,
RestTemplateTagConfigurer tagProvider,
MetricsConfigurationProperties properties) {
this.tagProvider = tagProvider;
this.meterRegistry = meterRegistry;
this.metricName = properties.getWeb().getClientRequestsName();
this.properties = properties;
}

@Override
Expand All @@ -53,8 +55,15 @@ public ClientHttpResponse intercept(HttpRequest request, byte[] body,
response = execution.execute(request, body);
return response;
} finally {
meterRegistry.timer(metricName, tagProvider.clientHttpRequestTags(request, response))
.record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
Timer.Builder builder = meterRegistry.timerBuilder(properties.getWeb().getClientRequestsName())
.tags(tagProvider.clientHttpRequestTags(request, response));

if(properties.getWeb().getClientRequestPercentiles())
builder = builder.histogram(Histogram.percentiles());

builder
.create()
.record(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package io.micrometer.spring.web;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import io.micrometer.spring.MetricsConfigurationProperties;
import org.junit.Test;
Expand All @@ -28,6 +29,7 @@

import static io.micrometer.core.instrument.Statistic.Count;
import static java.util.Collections.singletonList;
import static java.util.stream.StreamSupport.stream;
import static org.assertj.core.api.Assertions.assertThat;

/**
Expand All @@ -39,9 +41,13 @@ public void interceptRestTemplate() {
MeterRegistry registry = new SimpleMeterRegistry();

RestTemplate restTemplate = new RestTemplate();

MetricsConfigurationProperties properties = new MetricsConfigurationProperties();
properties.getWeb().setClientRequestPercentiles(true);

restTemplate.setInterceptors(singletonList(new MetricsRestTemplateInterceptor(
registry, new RestTemplateTagConfigurer(),
new MetricsConfigurationProperties()
properties
)));

MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
Expand All @@ -55,6 +61,10 @@ registry, new RestTemplateTagConfigurer(),
assertThat(registry.find("http.client.requests").tags("method", "GET", "uri", "none", "status", "200")
.value(Count, 1.0).timer()).isPresent();

assertThat(registry.find("http.client.requests").meters().stream()
.flatMap(m -> stream(m.getId().getTags().spliterator(), false))
.map(Tag::getKey)).contains("bucket");

assertThat(s).isEqualTo("OK");

mockServer.verify();
Expand Down

0 comments on commit f6bed73

Please sign in to comment.