Skip to content

Commit d0870fe

Browse files
committed
Ensure compatibility with latest 5.x Apache HC
Tests were failing because overriding the less specific execute method resulted in our code not being called at all in newer versions. The changes here should work with both versions of the code. Resolves gh-5575
1 parent 44de2af commit d0870fe

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

micrometer-core/src/main/java/io/micrometer/core/instrument/binder/httpcomponents/hc5/HttpContextUtils.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import io.micrometer.core.instrument.Tags;
1919
import org.apache.hc.client5.http.HttpRoute;
20+
import org.apache.hc.client5.http.protocol.HttpClientContext;
2021
import org.apache.hc.core5.http.HttpHost;
2122
import org.apache.hc.core5.http.protocol.HttpContext;
2223

@@ -31,9 +32,15 @@ static String[] generateTagStringsForRoute(HttpContext context) {
3132
String targetScheme = "UNKNOWN";
3233
String targetHost = "UNKNOWN";
3334
String targetPort = "UNKNOWN";
34-
Object routeAttribute = context.getAttribute("http.route");
35-
if (routeAttribute instanceof HttpRoute) {
36-
HttpHost host = ((HttpRoute) routeAttribute).getTargetHost();
35+
Object route;
36+
if (context instanceof HttpClientContext) {
37+
route = ((HttpClientContext) context).getHttpRoute();
38+
}
39+
else {
40+
route = context.getAttribute("http.route");
41+
}
42+
if (route instanceof HttpRoute) {
43+
HttpHost host = ((HttpRoute) route).getTargetHost();
3744
targetScheme = host.getSchemeName();
3845
targetHost = host.getHostName();
3946
targetPort = String.valueOf(host.getPort());

micrometer-core/src/main/java/io/micrometer/core/instrument/binder/httpcomponents/hc5/MicrometerHttpRequestExecutor.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.hc.core5.http.*;
2929
import org.apache.hc.core5.http.impl.io.HttpRequestExecutor;
3030
import org.apache.hc.core5.http.io.HttpClientConnection;
31+
import org.apache.hc.core5.http.io.HttpResponseInformationCallback;
3132
import org.apache.hc.core5.http.protocol.HttpContext;
3233
import org.apache.hc.core5.util.Timeout;
3334

@@ -102,17 +103,18 @@ public static Builder builder(MeterRegistry registry) {
102103
}
103104

104105
@Override
105-
public ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientConnection conn, HttpContext context)
106+
public ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientConnection conn,
107+
@Nullable HttpResponseInformationCallback informationCallback, HttpContext localContext)
106108
throws IOException, HttpException {
107109
ObservationOrTimerCompatibleInstrumentation<ApacheHttpClientContext> sample = ObservationOrTimerCompatibleInstrumentation
108110
.start(registry, observationRegistry, () -> new ApacheHttpClientContext(request,
109-
HttpClientContext.adapt(context), uriMapper, exportTagsForRoute), convention,
111+
HttpClientContext.adapt(localContext), uriMapper, exportTagsForRoute), convention,
110112
DefaultApacheHttpClientObservationConvention.INSTANCE);
111113
String statusCodeOrError = "UNKNOWN";
112114
Outcome statusOutcome = Outcome.UNKNOWN;
113115

114116
try {
115-
ClassicHttpResponse response = super.execute(request, conn, context);
117+
ClassicHttpResponse response = super.execute(request, conn, informationCallback, localContext);
116118
sample.setResponse(response);
117119
statusCodeOrError = DefaultApacheHttpClientObservationConvention.INSTANCE.getStatusValue(response, null);
118120
statusOutcome = DefaultApacheHttpClientObservationConvention.INSTANCE.getStatusOutcome(response);
@@ -130,11 +132,17 @@ public ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientConnect
130132
() -> Tags
131133
.of("method", DefaultApacheHttpClientObservationConvention.INSTANCE.getMethodString(request),
132134
"uri", uriMapper.apply(request), "status", status, "outcome", outcome)
133-
.and(exportTagsForRoute ? HttpContextUtils.generateTagsForRoute(context) : Tags.empty())
135+
.and(exportTagsForRoute ? HttpContextUtils.generateTagsForRoute(localContext) : Tags.empty())
134136
.and(extraTags));
135137
}
136138
}
137139

140+
@Override
141+
public ClassicHttpResponse execute(ClassicHttpRequest request, HttpClientConnection conn, HttpContext context)
142+
throws IOException, HttpException {
143+
return execute(request, conn, null, context);
144+
}
145+
138146
public static class Builder {
139147

140148
private final MeterRegistry registry;

0 commit comments

Comments
 (0)