Skip to content

Commit a88a951

Browse files
authored
Merge pull request #3320 from cexes/add-custom-tags-metrics5
Add custom tags support to Metrics5Capability Allows users to pass a…
2 parents 21237c5 + eff00bf commit a88a951

8 files changed

Lines changed: 118 additions & 9 deletions

File tree

dropwizard-metrics5/src/main/java/feign/metrics5/FeignMetricName.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,22 @@
2222
import java.lang.reflect.Method;
2323
import java.net.URI;
2424
import java.net.URISyntaxException;
25+
import java.util.Collections;
26+
import java.util.Map;
2527

2628
final class FeignMetricName {
2729

2830
private final Class<?> meteredComponent;
31+
private final Map<String, String> customTags;
2932

3033
public FeignMetricName(Class<?> meteredComponent) {
3134
this.meteredComponent = meteredComponent;
35+
this.customTags = Collections.emptyMap();
36+
}
37+
38+
public FeignMetricName(Class<?> meteredComponent, Map<String, String> customTags) {
39+
this.meteredComponent = meteredComponent;
40+
this.customTags = customTags;
3241
}
3342

3443
public MetricName metricName(MethodMetadata methodMetadata, Target<?> target, String suffix) {
@@ -40,10 +49,16 @@ public MetricName metricName(MethodMetadata methodMetadata, Target<?> target) {
4049
}
4150

4251
public MetricName metricName(Class<?> targetType, Method method, String url) {
43-
return MetricRegistry.name(meteredComponent)
44-
.tagged("client", targetType.getName())
45-
.tagged("method", method.getName())
46-
.tagged("host", extractHost(url));
52+
MetricName name =
53+
MetricRegistry.name(meteredComponent)
54+
.tagged("client", targetType.getName())
55+
.tagged("method", method.getName())
56+
.tagged("host", extractHost(url));
57+
58+
for (Map.Entry<String, String> entry : customTags.entrySet()) {
59+
name = name.tagged(entry.getKey(), entry.getValue());
60+
}
61+
return name;
4762
}
4863

4964
private String extractHost(final String targetUrl) {

dropwizard-metrics5/src/main/java/feign/metrics5/MeteredAsyncClient.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import feign.Response;
2424
import io.dropwizard.metrics5.MetricRegistry;
2525
import io.dropwizard.metrics5.Timer;
26+
import java.util.Map;
2627
import java.util.Optional;
2728
import java.util.concurrent.CompletableFuture;
2829

@@ -39,6 +40,15 @@ public MeteredAsyncClient(
3940
this.asyncClient = asyncClient;
4041
}
4142

43+
public MeteredAsyncClient(
44+
AsyncClient<Object> asyncClient,
45+
MetricRegistry metricRegistry,
46+
MetricSuppliers metricSuppliers,
47+
Map<String, String> customTags) {
48+
super(metricRegistry, new FeignMetricName(AsyncClient.class, customTags), metricSuppliers);
49+
this.asyncClient = asyncClient;
50+
}
51+
4252
@Override
4353
public CompletableFuture<Response> execute(
4454
Request request, Options options, Optional<Object> requestContext) {

dropwizard-metrics5/src/main/java/feign/metrics5/MeteredClient.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.dropwizard.metrics5.MetricRegistry;
2525
import io.dropwizard.metrics5.Timer;
2626
import java.io.IOException;
27+
import java.util.Map;
2728

2829
/** Warp feign {@link Client} with metrics. */
2930
public class MeteredClient extends BaseMeteredClient implements Client {
@@ -33,7 +34,15 @@ public class MeteredClient extends BaseMeteredClient implements Client {
3334
public MeteredClient(
3435
Client client, MetricRegistry metricRegistry, MetricSuppliers metricSuppliers) {
3536
super(metricRegistry, new FeignMetricName(Client.class), metricSuppliers);
37+
this.client = client;
38+
}
3639

40+
public MeteredClient(
41+
Client client,
42+
MetricRegistry metricRegistry,
43+
MetricSuppliers metricSuppliers,
44+
Map<String, String> customTags) {
45+
super(metricRegistry, new FeignMetricName(Client.class, customTags), metricSuppliers);
3746
this.client = client;
3847
}
3948

dropwizard-metrics5/src/main/java/feign/metrics5/MeteredDecoder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import io.dropwizard.metrics5.Timer.Context;
2626
import java.io.IOException;
2727
import java.lang.reflect.Type;
28+
import java.util.Map;
2829

2930
/** Warp feign {@link Decoder} with metrics. */
3031
public class MeteredDecoder implements Decoder {
@@ -42,6 +43,17 @@ public MeteredDecoder(
4243
this.metricName = new FeignMetricName(Decoder.class);
4344
}
4445

46+
public MeteredDecoder(
47+
Decoder decoder,
48+
MetricRegistry metricRegistry,
49+
MetricSuppliers metricSuppliers,
50+
Map<String, String> customTags) {
51+
this.decoder = decoder;
52+
this.metricRegistry = metricRegistry;
53+
this.metricSuppliers = metricSuppliers;
54+
this.metricName = new FeignMetricName(Decoder.class, customTags);
55+
}
56+
4557
@Override
4658
public Object decode(Response response, Type type)
4759
throws IOException, DecodeException, FeignException {

dropwizard-metrics5/src/main/java/feign/metrics5/MeteredEncoder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.dropwizard.metrics5.MetricRegistry;
2222
import io.dropwizard.metrics5.Timer.Context;
2323
import java.lang.reflect.Type;
24+
import java.util.Map;
2425

2526
/** Warp feign {@link Encoder} with metrics. */
2627
public class MeteredEncoder implements Encoder {
@@ -38,6 +39,17 @@ public MeteredEncoder(
3839
this.metricName = new FeignMetricName(Encoder.class);
3940
}
4041

42+
public MeteredEncoder(
43+
Encoder encoder,
44+
MetricRegistry metricRegistry,
45+
MetricSuppliers metricSuppliers,
46+
Map<String, String> customTags) {
47+
this.encoder = encoder;
48+
this.metricRegistry = metricRegistry;
49+
this.metricSuppliers = metricSuppliers;
50+
this.metricName = new FeignMetricName(Encoder.class, customTags);
51+
}
52+
4153
@Override
4254
public void encode(Object object, Type bodyType, RequestTemplate template)
4355
throws EncodeException {

dropwizard-metrics5/src/main/java/feign/metrics5/MeteredInvocationHandleFactory.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,17 @@ public MeteredInvocationHandleFactory(
5757
this.metricName = new FeignMetricName(Feign.class);
5858
}
5959

60+
public MeteredInvocationHandleFactory(
61+
InvocationHandlerFactory invocationHandler,
62+
MetricRegistry metricRegistry,
63+
MetricSuppliers metricSuppliers,
64+
Map<String, String> customTags) {
65+
this.invocationHandler = invocationHandler;
66+
this.metricRegistry = metricRegistry;
67+
this.metricSuppliers = metricSuppliers;
68+
this.metricName = new FeignMetricName(Feign.class, customTags);
69+
}
70+
6071
@Override
6172
public InvocationHandler create(Target target, Map<Method, MethodHandler> dispatch) {
6273
final Class clientClass = target.type();

dropwizard-metrics5/src/main/java/feign/metrics5/Metrics5Capability.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@
2323
import feign.codec.Encoder;
2424
import io.dropwizard.metrics5.MetricRegistry;
2525
import io.dropwizard.metrics5.SharedMetricRegistries;
26+
import java.util.Collections;
27+
import java.util.Map;
2628

2729
public class Metrics5Capability implements Capability {
2830

2931
private final MetricRegistry metricRegistry;
3032
private final MetricSuppliers metricSuppliers;
33+
private final Map<String, String> customTags;
3134

3235
public Metrics5Capability() {
3336
this(SharedMetricRegistries.getOrCreate("feign"), new MetricSuppliers());
@@ -40,31 +43,41 @@ public Metrics5Capability(MetricRegistry metricRegistry) {
4043
public Metrics5Capability(MetricRegistry metricRegistry, MetricSuppliers metricSuppliers) {
4144
this.metricRegistry = metricRegistry;
4245
this.metricSuppliers = metricSuppliers;
46+
this.customTags = Collections.emptyMap();
47+
}
48+
49+
public Metrics5Capability(
50+
MetricRegistry metricRegistry,
51+
MetricSuppliers metricSuppliers,
52+
Map<String, String> customTags) {
53+
this.metricRegistry = metricRegistry;
54+
this.metricSuppliers = metricSuppliers;
55+
this.customTags = customTags;
4356
}
4457

4558
@Override
4659
public Client enrich(Client client) {
47-
return new MeteredClient(client, metricRegistry, metricSuppliers);
60+
return new MeteredClient(client, metricRegistry, metricSuppliers, customTags);
4861
}
4962

5063
@Override
5164
public AsyncClient<Object> enrich(AsyncClient<Object> client) {
52-
return new MeteredAsyncClient(client, metricRegistry, metricSuppliers);
65+
return new MeteredAsyncClient(client, metricRegistry, metricSuppliers, customTags);
5366
}
5467

5568
@Override
5669
public Encoder enrich(Encoder encoder) {
57-
return new MeteredEncoder(encoder, metricRegistry, metricSuppliers);
70+
return new MeteredEncoder(encoder, metricRegistry, metricSuppliers, customTags);
5871
}
5972

6073
@Override
6174
public Decoder enrich(Decoder decoder) {
62-
return new MeteredDecoder(decoder, metricRegistry, metricSuppliers);
75+
return new MeteredDecoder(decoder, metricRegistry, metricSuppliers, customTags);
6376
}
6477

6578
@Override
6679
public InvocationHandlerFactory enrich(InvocationHandlerFactory invocationHandlerFactory) {
6780
return new MeteredInvocationHandleFactory(
68-
invocationHandlerFactory, metricRegistry, metricSuppliers);
81+
invocationHandlerFactory, metricRegistry, metricSuppliers, customTags);
6982
}
7083
}

dropwizard-metrics5/src/test/java/feign/metrics5/Metrics5CapabilityTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,24 @@
1515
*/
1616
package feign.metrics5;
1717

18+
import static org.junit.jupiter.api.Assertions.assertTrue;
19+
1820
import feign.Capability;
21+
import feign.Feign;
1922
import feign.Util;
2023
import feign.micrometer.AbstractMetricsTestBase;
24+
import feign.micrometer.AbstractMetricsTestBase.SimpleSource;
25+
import feign.mock.HttpMethod;
26+
import feign.mock.MockClient;
27+
import feign.mock.MockTarget;
2128
import io.dropwizard.metrics5.Metered;
2229
import io.dropwizard.metrics5.Metric;
2330
import io.dropwizard.metrics5.MetricName;
2431
import io.dropwizard.metrics5.MetricRegistry;
2532
import java.util.Arrays;
2633
import java.util.Map;
2734
import java.util.Map.Entry;
35+
import org.junit.jupiter.api.Test;
2836

2937
public class Metrics5CapabilityTest
3038
extends AbstractMetricsTestBase<MetricRegistry, MetricName, Metric> {
@@ -120,4 +128,23 @@ protected boolean doesMetricHasCounter(Metric metric) {
120128
protected long getMetricCounter(Metric metric) {
121129
return ((Metered) metric).getCount();
122130
}
131+
132+
@Test
133+
void customTagsAreAppliedToMetrics() {
134+
SimpleSource source =
135+
Feign.builder()
136+
.client(new MockClient().ok(HttpMethod.GET, "/get", "1234567890abcde"))
137+
.addCapability(
138+
new Metrics5Capability(
139+
metricsRegistry, new MetricSuppliers(), Map.of("env", "prod")))
140+
.target(new MockTarget<>(SimpleSource.class));
141+
142+
source.get("0x3456789");
143+
144+
boolean hasCustomTag =
145+
metricsRegistry.getMetrics().keySet().stream()
146+
.anyMatch(name -> "prod".equals(name.getTags().get("env")));
147+
148+
assertTrue(hasCustomTag);
149+
}
123150
}

0 commit comments

Comments
 (0)