Skip to content

Commit 3b0554c

Browse files
rostislav.dimitrovr-dimitrov
rostislav.dimitrov
authored andcommitted
Fixed feign-micrometer exception handling.
1 parent a44e9d4 commit 3b0554c

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

micrometer/src/main/java/feign/micrometer/MicrometerObservationCapability.java

+21-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import feign.Capability;
2020
import feign.Client;
2121
import feign.FeignException;
22+
import feign.Request;
2223
import feign.Response;
2324
import io.micrometer.observation.Observation;
2425
import io.micrometer.observation.ObservationRegistry;
@@ -57,9 +58,12 @@ public Client enrich(Client client) {
5758

5859
try {
5960
Response response = client.execute(request, options);
61+
62+
throwExceptionOnErrorStatusCode(response, request);
63+
6064
finalizeObservation(feignContext, observation, null, response);
6165
return response;
62-
} catch (FeignException ex) {
66+
} catch (Exception ex) {
6367
finalizeObservation(feignContext, observation, ex, null);
6468
throw ex;
6569
}
@@ -83,8 +87,16 @@ public AsyncClient<Object> enrich(AsyncClient<Object> client) {
8387
try {
8488
return client
8589
.execute(feignContext.getCarrier(), options, context)
86-
.whenComplete((r, ex) -> finalizeObservation(feignContext, observation, ex, r));
87-
} catch (FeignException ex) {
90+
.whenComplete(
91+
(r, ex) -> {
92+
try {
93+
throwExceptionOnErrorStatusCode(r, request);
94+
finalizeObservation(feignContext, observation, ex, r);
95+
} catch (FeignException statusCodeException) {
96+
finalizeObservation(feignContext, observation, statusCodeException, null);
97+
}
98+
});
99+
} catch (Exception ex) {
88100
finalizeObservation(feignContext, observation, ex, null);
89101

90102
throw ex;
@@ -100,4 +112,10 @@ private void finalizeObservation(
100112
}
101113
observation.stop();
102114
}
115+
116+
private void throwExceptionOnErrorStatusCode(Response response, Request request) {
117+
if (response.status() >= 400 && response.status() < 600) {
118+
throw FeignException.errorStatus(request.requestTemplate().method(), response);
119+
}
120+
}
103121
}

micrometer/src/test/java/feign/micrometer/FeignHeaderInstrumentationTest.java

+33
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package feign.micrometer;
1717

1818
import static com.github.tomakehurst.wiremock.client.WireMock.anyUrl;
19+
import static com.github.tomakehurst.wiremock.client.WireMock.badRequest;
1920
import static com.github.tomakehurst.wiremock.client.WireMock.equalTo;
2021
import static com.github.tomakehurst.wiremock.client.WireMock.get;
2122
import static com.github.tomakehurst.wiremock.client.WireMock.getRequestedFor;
@@ -29,6 +30,7 @@
2930
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
3031
import feign.AsyncFeign;
3132
import feign.Feign;
33+
import feign.FeignException;
3234
import feign.Param;
3335
import feign.Request;
3436
import feign.RequestLine;
@@ -81,6 +83,22 @@ void getTemplatedPathForUri(WireMockRuntimeInfo wmRuntimeInfo) {
8183
assertTags();
8284
}
8385

86+
@Test
87+
void getTemplatedPathForUriWithException(WireMockRuntimeInfo wmRuntimeInfo) {
88+
stubFor(get(anyUrl()).willReturn(badRequest()));
89+
90+
TestClient testClient = clientInstrumentedWithObservations(wmRuntimeInfo.getHttpBaseUrl());
91+
92+
try {
93+
testClient.templated("1", "2");
94+
} catch (FeignException e) {
95+
assertThat(e).isInstanceOf(FeignException.BadRequest.class);
96+
}
97+
98+
assertThat(meterRegistry.get(METER_NAME).meter().getId().getTag("error"))
99+
.isEqualTo("BadRequest");
100+
}
101+
84102
@Test
85103
void getTemplatedPathForUriForAsync(WireMockRuntimeInfo wmRuntimeInfo)
86104
throws ExecutionException, InterruptedException {
@@ -98,6 +116,21 @@ void getTemplatedPathForUriForAsync(WireMockRuntimeInfo wmRuntimeInfo)
98116
assertTags();
99117
}
100118

119+
@Test
120+
void getTemplatedPathForUriForAsyncWithException(WireMockRuntimeInfo wmRuntimeInfo) {
121+
stubFor(get(anyUrl()).willReturn(badRequest()));
122+
123+
AsyncTestClient testClient =
124+
asyncClientInstrumentedWithObservations(wmRuntimeInfo.getHttpBaseUrl());
125+
testClient
126+
.templated("1", "2")
127+
.whenComplete(
128+
(s, throwable) -> {
129+
assertThat(meterRegistry.get(METER_NAME).meter().getId().getTag("error"))
130+
.isEqualTo("BadRequest");
131+
});
132+
}
133+
101134
private void assertTags() {
102135
Id requestsId = meterRegistry.get(METER_NAME).meter().getId();
103136

0 commit comments

Comments
 (0)