From a258f1424ad907a40bcc1630be2cd4860c378b9d Mon Sep 17 00:00:00 2001 From: Nikita Salnikov-Tarnovski Date: Wed, 20 May 2020 23:47:25 +0300 Subject: [PATCH] Fix khttp instrumentation in case of absent or read-only headers map (#416) --- .../instrumentation/khttp/KHttpAdvice.java | 5 +++-- .../khttp/KHttpHeadersInjectAdapter.java | 18 ++---------------- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpAdvice.java b/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpAdvice.java index d04bc8d65f..31a7999b79 100644 --- a/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpAdvice.java +++ b/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpAdvice.java @@ -39,7 +39,7 @@ public class KHttpAdvice { public static SpanWithScope methodEnter( @Advice.Argument(value = 0) String method, @Advice.Argument(value = 1) String uri, - @Advice.Argument(value = 2) Map headers) { + @Advice.Argument(value = 2, readOnly = false) Map headers) { final int callDepth = CallDepthThreadLocalMap.incrementCallDepth(KHttp.class); if (callDepth > 0) { @@ -53,7 +53,8 @@ public class KHttpAdvice { final Context context = withSpan(span, Context.current()); - OpenTelemetry.getPropagators().getHttpTextFormat().inject(context, asWritable(headers), SETTER); + headers = asWritable(headers); + OpenTelemetry.getPropagators().getHttpTextFormat().inject(context, headers, SETTER); return new SpanWithScope(span, withScopedContext(context)); } diff --git a/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpHeadersInjectAdapter.java b/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpHeadersInjectAdapter.java index 1809f7127c..ce321eba37 100644 --- a/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpHeadersInjectAdapter.java +++ b/instrumentation/khttp-0.1/src/main/java/io/opentelemetry/auto/instrumentation/khttp/KHttpHeadersInjectAdapter.java @@ -21,23 +21,9 @@ import java.util.Map; public class KHttpHeadersInjectAdapter implements HttpTextFormat.Setter> { - private static Class emptyMap; - - static { - try { - emptyMap = Class.forName("kotlin.collections.EmptyMap"); - } catch (ClassNotFoundException e) { - } - } - public static Map asWritable(Map headers) { - // EmptyMap is read-only so we have to substitute it with writable instance to be able to inject - // headers - if (emptyMap != null && emptyMap.isInstance(headers)) { - return new HashMap<>(); - } else { - return headers; - } + // Kotlin likes to use read-only data structures, so wrap into new writable map + return new HashMap<>(headers); } public static final KHttpHeadersInjectAdapter SETTER = new KHttpHeadersInjectAdapter();