21
21
import feign .FeignException ;
22
22
import feign .Request ;
23
23
import feign .Response ;
24
+ import feign .Util ;
24
25
import io .micrometer .observation .Observation ;
25
26
import io .micrometer .observation .ObservationRegistry ;
26
27
@@ -59,9 +60,18 @@ public Client enrich(Client client) {
59
60
try {
60
61
Response response = client .execute (request , options );
61
62
62
- throwExceptionOnErrorStatusCode (response , request );
63
+ if (response .body () != null ) {
64
+ response =
65
+ response .toBuilder ().body (Util .toByteArray (response .body ().asInputStream ())).build ();
66
+ }
63
67
64
- finalizeObservation (feignContext , observation , null , response );
68
+ FeignException exception = null ;
69
+
70
+ if (responseContainsError (response )) {
71
+ exception = getFeignExceptionFromStatusCode (response , request );
72
+ }
73
+
74
+ finalizeObservation (feignContext , observation , exception , response );
65
75
return response ;
66
76
} catch (Exception ex ) {
67
77
finalizeObservation (feignContext , observation , ex , null );
@@ -89,12 +99,13 @@ public AsyncClient<Object> enrich(AsyncClient<Object> client) {
89
99
.execute (feignContext .getCarrier (), options , context )
90
100
.whenComplete (
91
101
(r , ex ) -> {
92
- try {
93
- throwExceptionOnErrorStatusCode (r , request );
94
- finalizeObservation (feignContext , observation , ex , r );
95
- } catch (FeignException statusCodeException ) {
96
- finalizeObservation (feignContext , observation , statusCodeException , null );
102
+ FeignException exception = null ;
103
+
104
+ if (responseContainsError (r )) {
105
+ exception = getFeignExceptionFromStatusCode (r , request );
97
106
}
107
+
108
+ finalizeObservation (feignContext , observation , exception , r );
98
109
});
99
110
} catch (Exception ex ) {
100
111
finalizeObservation (feignContext , observation , ex , null );
@@ -113,9 +124,14 @@ private void finalizeObservation(
113
124
observation .stop ();
114
125
}
115
126
116
- private void throwExceptionOnErrorStatusCode (Response response , Request request ) {
117
- if (response . status () >= 400 && response . status () < 600 ) {
118
- throw FeignException .errorStatus (request .requestTemplate ().method (), response );
127
+ private FeignException getFeignExceptionFromStatusCode (Response response , Request request ) {
128
+ if (responseContainsError ( response ) ) {
129
+ return FeignException .errorStatus (request .requestTemplate ().method (), response );
119
130
}
131
+ return null ;
132
+ }
133
+
134
+ private boolean responseContainsError (Response response ) {
135
+ return response .status () >= 400 && response .status () < 600 ;
120
136
}
121
137
}
0 commit comments