From 7ae2b74a6499bcd2913ca77de3e33de7072b0f75 Mon Sep 17 00:00:00 2001 From: Lu Jiajing Date: Wed, 26 May 2021 19:01:16 +0800 Subject: [PATCH] Optimize Class.getDeclaredField in Feign plugin (#7017) --- CHANGES.md | 1 + .../http/v9/DefaultHttpClientInterceptor.java | 35 ++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index bb05844258..e22c381946 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -32,6 +32,7 @@ Release Notes. * Introduce method interceptor API v2 * Fix ClassCast issue for RequestHolder/ResponseHolder. * fixed `jdk-threading-plugin` memory leak. +* Optimize multiple field reflection opeartion in Fiegn plugin. #### OAP-Backend * BugFix: filter invalid Envoy access logs whose socket address is empty. diff --git a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java index c3c5861c83..6b91d15ee5 100644 --- a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/feign/http/v9/DefaultHttpClientInterceptor.java @@ -50,6 +50,17 @@ import static feign.Util.valuesOrEmpty; public class DefaultHttpClientInterceptor implements InstanceMethodsAroundInterceptor { private static final String CONTENT_TYPE_HEADER = "Content-Type"; + private static Field FIELD_HEADERS_OF_REQUEST; + + static { + try { + final Field field = Request.class.getDeclaredField("headers"); + field.setAccessible(true); + FIELD_HEADERS_OF_REQUEST = field; + } catch (Exception ignore) { + FIELD_HEADERS_OF_REQUEST = null; + } + } /** * Get the {@link feign.Request} from {@link EnhancedInstance}, then create {@link AbstractSpan} and set host, port, @@ -101,19 +112,19 @@ public class DefaultHttpClientInterceptor implements InstanceMethodsAroundInterc } } - Field headersField = Request.class.getDeclaredField("headers"); - headersField.setAccessible(true); - Map> headers = new LinkedHashMap>(); - CarrierItem next = contextCarrier.items(); - while (next.hasNext()) { - next = next.next(); - List contextCollection = new ArrayList(1); - contextCollection.add(next.getHeadValue()); - headers.put(next.getHeadKey(), contextCollection); - } - headers.putAll(request.headers()); + if (FIELD_HEADERS_OF_REQUEST != null) { + Map> headers = new LinkedHashMap>(); + CarrierItem next = contextCarrier.items(); + while (next.hasNext()) { + next = next.next(); + List contextCollection = new ArrayList(1); + contextCollection.add(next.getHeadValue()); + headers.put(next.getHeadKey(), contextCollection); + } + headers.putAll(request.headers()); - headersField.set(request, Collections.unmodifiableMap(headers)); + FIELD_HEADERS_OF_REQUEST.set(request, Collections.unmodifiableMap(headers)); + } } private void collectHttpBody(final Request request, final AbstractSpan span) { -- GitLab