Skip to content

Commit ba9df3f

Browse files
Make RxJava2 instrumentation Android-friendly (#7895)
Resolves #7894 Replace `MethodHandle` with older `java.lang.reflect.Field`, which is supported on older Java versions. Also enables animal sniffer for the RxJava2 instrumentation to prevent regression. --------- Co-authored-by: opentelemetrybot <[email protected]>
1 parent cb095e6 commit ba9df3f

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

instrumentation/rxjava/rxjava-2.0/library/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
plugins {
22
id("otel.library-instrumentation")
3+
id("otel.animalsniffer-conventions")
34
}
45

56
dependencies {

instrumentation/rxjava/rxjava-2.0/library/src/main/java/io/opentelemetry/instrumentation/rxjava/v2_0/TracingObserver.java

+14-14
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,10 @@
2727
import io.reactivex.Observer;
2828
import io.reactivex.internal.fuseable.QueueDisposable;
2929
import io.reactivex.internal.observers.BasicFuseableObserver;
30-
import java.lang.invoke.MethodHandle;
31-
import java.lang.invoke.MethodHandles;
30+
import java.lang.reflect.Field;
3231

3332
class TracingObserver<T> extends BasicFuseableObserver<T, T> {
34-
private static final MethodHandle queueDisposableGetter = getQueueDisposableGetter();
33+
private static final Field queueDisposableField = getQueueDisposableField();
3534

3635
// BasicFuseableObserver#actual has been renamed to downstream in newer versions, we can't use it
3736
// in this class
@@ -81,34 +80,35 @@ public T poll() throws Exception {
8180
return getQueueDisposable().poll();
8281
}
8382

83+
@SuppressWarnings("unchecked")
8484
private QueueDisposable<T> getQueueDisposable() {
8585
try {
86-
return (QueueDisposable<T>) queueDisposableGetter.invoke(this);
86+
return (QueueDisposable<T>) queueDisposableField.get(this);
8787
} catch (Throwable throwable) {
8888
throw new IllegalStateException(throwable);
8989
}
9090
}
9191

92-
private static MethodHandle getGetterHandle(String fieldName) {
92+
private static Field getField(String fieldName) {
93+
9394
try {
94-
return MethodHandles.lookup()
95-
.findGetter(BasicFuseableObserver.class, fieldName, QueueDisposable.class);
96-
} catch (NoSuchFieldException | IllegalAccessException ignored) {
95+
return BasicFuseableObserver.class.getDeclaredField(fieldName);
96+
} catch (NoSuchFieldException ignored) {
9797
// Ignore
9898
}
9999
return null;
100100
}
101101

102-
private static MethodHandle getQueueDisposableGetter() {
103-
MethodHandle getter = getGetterHandle("qd");
104-
if (getter == null) {
102+
private static Field getQueueDisposableField() {
103+
Field queueDisposableField = getField("qd");
104+
if (queueDisposableField == null) {
105105
// in versions before 2.2.1 field was named "qs"
106-
getter = getGetterHandle("qs");
106+
queueDisposableField = getField("qs");
107107
}
108-
return getter;
108+
return queueDisposableField;
109109
}
110110

111111
public static boolean canEnable() {
112-
return queueDisposableGetter != null;
112+
return queueDisposableField != null;
113113
}
114114
}

0 commit comments

Comments
 (0)