From 9fc3bd9f468ee1229e8a501c2be1cbc4dc2259cb Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Mon, 6 Jan 2025 11:40:20 -0600 Subject: [PATCH 1/4] baseline --- .../rxjava2/NRFlowableObserver.java | 15 +++++++++-- .../rxjava2/NRFlowableObserver2.java | 25 +++++++++++++++---- .../instrumentation/rxjava2/NRObserver.java | 5 ++++ .../instrumentation/rxjava2/NRSingleLift.java | 14 ----------- .../rxjava2/NRSingleObserver.java | 5 +++- .../rxjava2/NRSingleObserver2.java | 6 +++++ .../operators/flowable/FlowableCreate.java | 10 +++----- .../operators/flowable/FlowableDefer.java | 11 +++----- .../operators/flowable/FlowableEmpty.java | 11 +++----- .../operators/flowable/FlowableError.java | 11 +++----- .../operators/flowable/FlowableFromArray.java | 11 +++----- .../flowable/FlowableFromCallable.java | 11 +++----- .../flowable/FlowableFromFuture.java | 11 +++----- .../flowable/FlowableFromIterable.java | 11 +++----- .../operators/flowable/FlowableGenerate.java | 11 +++----- .../operators/flowable/FlowableInterval.java | 11 +++----- .../flowable/FlowableIntervalRange.java | 11 +++----- .../operators/flowable/FlowableJust.java | 11 +++----- .../operators/flowable/FlowableRange.java | 11 +++----- .../operators/flowable/FlowableRangeLong.java | 11 +++----- .../operators/flowable/FlowableUtils.java | 19 ++++++++++++++ .../operators/single/SingleUtils.java | 13 ++++++++++ 22 files changed, 136 insertions(+), 119 deletions(-) create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleLift.java create mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java index 3c03ddd..3a75eda 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java @@ -1,25 +1,29 @@ package com.newrelic.instrumentation.rxjava2; +import java.util.logging.Level; + import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -public class NRFlowableObserver implements Subscriber, Subscription { +public class NRFlowableObserver implements Subscriber, Subscription, NRObserver { private Subscriber downstream; Subscription upstream; public Token token = null; - public Segment segment = null; + private Segment segment = null; private static boolean isTransformed = false; public NRFlowableObserver(Subscriber s) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver. with subscriber {0}",s); downstream = s; if(!isTransformed) { isTransformed = true; @@ -27,6 +31,10 @@ public NRFlowableObserver(Subscriber s) { } } + public void setSegment(Segment s) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver.setSegment with subscriber {0}, using segment {1}",downstream,s); + segment = s; + } @Override @Trace(async=true,excludeFromTransactionTrace=true) @@ -40,6 +48,7 @@ public void onNext(T t) { @Override @Trace(async=true,excludeFromTransactionTrace=true) public void onError(Throwable t) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver.onError with subscriber {0}",downstream); if(token != null) { token.linkAndExpire(); token = null; @@ -54,11 +63,13 @@ public void onError(Throwable t) { @Override @Trace(async=true,excludeFromTransactionTrace=true) public void onComplete() { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver.onComplete with subscriber {0}",downstream); if(token != null) { token.linkAndExpire(); token = null; } if(segment != null) { + NewRelic.getAgent().getLogger().log(Level.FINE, "In NRFlowableObserver.onComplete ending segment {0}",segment); segment.end(); segment = null; } diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java index cfbbc38..8603fd7 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java @@ -1,5 +1,7 @@ package com.newrelic.instrumentation.rxjava2; +import java.util.logging.Level; + import org.reactivestreams.Subscriber; import org.reactivestreams.Subscription; @@ -19,6 +21,7 @@ public class NRFlowableObserver2 implements Subscriber { public NRFlowableObserver2(Subscriber downstream, String n) { this.downstream = downstream; name = n; + NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver2. with subscriber {0} and name {1}",this.downstream, name); if(!isTransformed) { isTransformed = true; AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); @@ -27,32 +30,44 @@ public NRFlowableObserver2(Subscriber downstream, String n) { @Override public void onSubscribe(Subscription s) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Flowable/"+name : "Flowable"); - downstream.onSubscribe(s); + if(downstream != null) { + segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Flowable/"+name : "Flowable"); + } + if(downstream != null) { + downstream.onSubscribe(s); + } } @Override public void onError(Throwable e) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",downstream,name); if(segment != null) { segment.end(); segment = null; } - downstream.onError(e); + if (downstream != null) { + downstream.onError(e); + } } @Override public void onComplete() { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserve2.onComplete with subscriber {0}, name {1}",downstream,name); if(segment != null) { segment.end(); segment = null; } - downstream.onComplete(); + if (downstream != null) { + downstream.onComplete(); + } } @Override public void onNext(T t) { - downstream.onNext(t); + if (downstream != null) { + downstream.onNext(t); + } } } diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java new file mode 100644 index 0000000..e750451 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java @@ -0,0 +1,5 @@ +package com.newrelic.instrumentation.rxjava2; + +public interface NRObserver { + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleLift.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleLift.java deleted file mode 100644 index a91b94b..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleLift.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import io.reactivex.SingleObserver; -import io.reactivex.SingleOperator; - -public class NRSingleLift implements SingleOperator { - - @Override - public SingleObserver apply(SingleObserver observer) throws Exception { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java index 7161aed..e2a9fb2 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java @@ -1,5 +1,7 @@ package com.newrelic.instrumentation.rxjava2; +import java.util.logging.Level; + import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Segment; @@ -9,7 +11,7 @@ import io.reactivex.SingleObserver; import io.reactivex.disposables.Disposable; -public class NRSingleObserver implements SingleObserver, Disposable { +public class NRSingleObserver implements SingleObserver, Disposable, NRObserver { private SingleObserver downstream; @@ -22,6 +24,7 @@ public class NRSingleObserver implements SingleObserver, Disposable { public Segment segment = null; public NRSingleObserver(SingleObserver downstream) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver. with subscriber {0}",downstream); this.downstream = downstream; if(!isTransformed) { isTransformed = true; diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java index 63182bb..9835b4f 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java @@ -1,5 +1,7 @@ package com.newrelic.instrumentation.rxjava2; +import java.util.logging.Level; + import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Segment; @@ -21,6 +23,7 @@ public class NRSingleObserver2 implements SingleObserver { public NRSingleObserver2(SingleObserver downstream, String n) { this.downstream = downstream; name = n; + NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver2. with subscriber {0}, name {1}",this.downstream, name); start = System.currentTimeMillis(); // if(!ignore) // startSegment(); @@ -38,6 +41,7 @@ public void onSubscribe(Disposable d) { @Override public void onError(Throwable e) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",this.downstream, name); if(segment != null) { segment.end(); segment = null; @@ -48,6 +52,7 @@ public void onError(Throwable e) { @Override public void onSuccess(T value) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onSuccess with subscriber {0}, name {1}",this.downstream, name); if(segment != null) { segment.end(); segment = null; @@ -57,6 +62,7 @@ public void onSuccess(T value) { } public void startSegment() { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.startSegment with subscriber {0}, name {1}",this.downstream, name); if(!ignore) segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Single/"+name : "Single"); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java index 38ebcbc..100a7ec 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,11 +15,11 @@ public class FlowableCreate extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java index 10a6292..ca0029b 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableDefer extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java index 18fde17..2dfa270 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableEmpty extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java index 8880c50..df0b815 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableError extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java index 9598d0b..a310b87 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableFromArray extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java index ad3c2f7..c4995bb 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableFromCallable extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java index 251c9f9..6caf1a2 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableFromFuture extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java index 197ef70..ec25d0d 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableFromIterable extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java index 5f561b8..efb9a57 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableGenerate extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java index 154750c..eeb6a4b 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableInterval extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java index e18e1da..794632e 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableIntervalRange extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java index cf3ab63..749c7bd 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableJust extends Flowable { protected void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java index b436d5f..0e36642 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableRange extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java index d8fccf8..a90a753 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java @@ -2,8 +2,6 @@ import org.reactivestreams.Subscriber; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; @@ -17,12 +15,11 @@ public class FlowableRangeLong extends Flowable { public void subscribeActual(Subscriber t) { if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - + NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); + if(wrapper != null) { + t = wrapper; + } } Weaver.callOriginal(); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java index a5e12a2..ebaf11f 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java @@ -1,5 +1,13 @@ package io.reactivex.internal.operators.flowable; +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Segment; +import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; + import io.reactivex.Flowable; public class FlowableUtils { @@ -12,4 +20,15 @@ public static boolean ignore(Flowable flowable) { return false; } + + public static NRFlowableObserver getWrapper(Subscriber actual, String name) { + if(!(actual instanceof NRFlowableObserver)) { + NRFlowableObserver wrapper = new NRFlowableObserver<>(actual); + Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); + wrapper.setSegment(segment); + NewRelic.getAgent().getLogger().log(Level.FINE, "Created NRFlowableObserver with subscriber {0} and segment {1} with name {2}", actual, segment, name); + return wrapper; + } + return null; + } } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java new file mode 100644 index 0000000..519d4b7 --- /dev/null +++ b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java @@ -0,0 +1,13 @@ +package io.reactivex.internal.operators.single; + +import org.reactivestreams.Subscriber; + +import com.newrelic.instrumentation.rxjava2.NRSingleObserver; + +public class SingleUtils { + + public static NRSingleObserver getWrapper(Subscriber actual, String name) { + + } + +} From 3dd547f0109d19d276a096d19d8646d153a3bc05 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Mon, 6 Jan 2025 11:42:16 -0600 Subject: [PATCH 2/4] baseline --- rxjava1-finder/build.gradle | 1 + rxjava2-finder/build.gradle | 1 + rxjava3-finder/build.gradle | 1 + 3 files changed, 3 insertions(+) diff --git a/rxjava1-finder/build.gradle b/rxjava1-finder/build.gradle index 55fb135..c5ce132 100644 --- a/rxjava1-finder/build.gradle +++ b/rxjava1-finder/build.gradle @@ -18,6 +18,7 @@ jar { attributes 'Implementation-Vendor': 'New Relic' attributes 'Implementation-Vendor-Id': 'com.newrelic' attributes 'Implementation-Version': 1.0 + attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava1.RxJava1PreMain' } } diff --git a/rxjava2-finder/build.gradle b/rxjava2-finder/build.gradle index 6aeeb63..dd5a037 100644 --- a/rxjava2-finder/build.gradle +++ b/rxjava2-finder/build.gradle @@ -18,6 +18,7 @@ jar { attributes 'Implementation-Vendor': 'New Relic' attributes 'Implementation-Vendor-Id': 'com.newrelic' attributes 'Implementation-Version': 1.0 + attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava2.RxJava2PreMain' } } diff --git a/rxjava3-finder/build.gradle b/rxjava3-finder/build.gradle index 2c351e0..0f1b513 100644 --- a/rxjava3-finder/build.gradle +++ b/rxjava3-finder/build.gradle @@ -18,6 +18,7 @@ jar { attributes 'Implementation-Vendor': 'New Relic' attributes 'Implementation-Vendor-Id': 'com.newrelic' attributes 'Implementation-Version': 1.0 + attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava3.RxJava3PreMain' } } From 3fb8486eb1784fb96e4517a47f995614dac062c4 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Fri, 10 Jan 2025 10:00:29 -0600 Subject: [PATCH 3/4] fixes to get rid of unending segments on RxJava objects --- rxjava1-1.1/build.gradle | 8 +- .../labs}/rxjava1/NROperator.java | 2 +- .../labs}/rxjava1/NRSubscriber.java | 2 +- .../java/rx/Observable_Instrumentation.java | 2 +- .../util/ScalarSynchronousObservable.java | 2 +- rxjava1-1.2/build.gradle | 8 +- .../rxjava1_2/NRCompletableOperator.java | 2 +- .../rxjava1_2/NRCompletableSubscriber.java | 2 +- .../labs}/rxjava1_2/NRSingleOperator.java | 2 +- .../labs}/rxjava1_2/NRSubscriber.java | 2 +- .../java/rx/Completable_Instrumentation.java | 2 +- .../main/java/rx/Single_Instrumentation.java | 2 +- rxjava1-finder/build.gradle | 8 +- rxjava2-2.0.7/build.gradle | 30 ++ .../labs/rxjava2_0_7/NRCancelAction.java | 21 + .../rxjava2_0_7/NRCompletableAssembly.java | 55 ++ .../rxjava2_0_7/NRCompletableObserver.java | 57 +++ .../rxjava2_0_7}/NRCompletableSubWrapper.java | 10 +- .../labs/rxjava2_0_7/NRCompleteAction.java | 21 + .../rxjava2_0_7/NRDisposableConsumer.java | 30 ++ .../labs/rxjava2_0_7/NRErrorConsumer.java | 25 + .../labs/rxjava2_0_7/NRFlowableAssembly.java | 60 +++ .../labs/rxjava2_0_7/NRFlowableObserver.java | 97 ++++ .../rxjava2_0_7}/NRFlowableSubWrapper.java | 13 +- .../labs/rxjava2_0_7/NRMaybeAssembly.java | 48 ++ .../labs/rxjava2_0_7/NRMaybeObserver.java | 65 +++ .../labs/rxjava2_0_7}/NRMaybeSubWrapper.java | 10 +- .../labs/rxjava2_0_7/NRNextConsumer.java | 20 + .../rxjava2_0_7/NRObservableAssembly.java | 58 +++ .../rxjava2_0_7/NRObservableObserver.java | 65 +++ .../rxjava2_0_7}/NRObservableSubWrapper.java | 10 +- .../labs/rxjava2_0_7/NRRunnable.java | 37 ++ .../labs/rxjava2_0_7/NRRunnableDecorator.java | 34 ++ .../labs/rxjava2_0_7/NRRxJava2Holder.java | 78 +++ .../labs/rxjava2_0_7/NRSingleAssembly.java | 48 ++ .../labs/rxjava2_0_7/NRSingleObserver.java | 57 +++ .../labs/rxjava2_0_7/NRSingleSubWrapper.java | 35 ++ .../rxjava2_0_7/NRSubscriberConsumer.java | 22 + .../labs/rxjava2_0_7/NRSuccessConsumer.java | 21 + .../labs/rxjava2_0_7/NRTerminationAction.java | 21 + .../labs/rxjava2_0_7/Utils.java | 325 ++++++++++++ .../main/java/io/reactivex/Completable.java | 13 + .../src/main/java/io/reactivex/Flowable.java | 15 + .../src/main/java/io/reactivex/Maybe.java | 12 + .../main/java/io/reactivex/Observable.java | 13 + .../src/main/java/io/reactivex/Single.java | 19 + .../io/reactivex/plugins/RxJavaPlugins.java | 480 ++++++++++++++++++ rxjava2-2.0/build.gradle | 12 +- .../labs/rxjava2/NRCancelAction.java | 21 + .../labs/rxjava2/NRCompletableAssembly.java | 55 ++ .../labs/rxjava2/NRCompletableObserver.java | 57 +++ .../labs/rxjava2/NRCompletableSubWrapper.java | 31 ++ .../labs/rxjava2/NRCompleteAction.java | 21 + .../labs/rxjava2/NRDisposableConsumer.java | 30 ++ .../labs/rxjava2/NRErrorConsumer.java | 25 + .../labs/rxjava2/NRFlowableAssembly.java | 59 +++ .../labs/rxjava2/NRFlowableObserver.java | 97 ++++ .../labs/rxjava2/NRFlowableSubWrapper.java | 37 ++ .../labs/rxjava2/NRMaybeAssembly.java | 48 ++ .../labs/rxjava2/NRMaybeObserver.java | 65 +++ .../labs/rxjava2/NRMaybeSubWrapper.java | 35 ++ .../labs/rxjava2/NRNextConsumer.java | 20 + .../labs/rxjava2/NRObservableAssembly.java | 58 +++ .../labs/rxjava2/NRObservableObserver.java | 65 +++ .../labs/rxjava2/NRObservableSubWrapper.java | 35 ++ .../labs/rxjava2}/NRRunnable.java | 2 +- .../rxjava2/NRRunnableDecorator.java | 2 +- .../labs/rxjava2/NRRxJava2Holder.java | 78 +++ .../labs/rxjava2/NRSingleAssembly.java | 48 ++ .../labs/rxjava2/NRSingleObserver.java | 57 +++ .../rxjava2/NRSingleSubWrapper.java | 6 +- .../labs/rxjava2/NRSubscriberConsumer.java | 22 + .../labs/rxjava2/NRSuccessConsumer.java | 21 + .../labs/rxjava2/NRTerminationAction.java | 21 + .../instrumentation/labs/rxjava2/Utils.java | 325 ++++++++++++ .../rxjava2/NRCompletableObserver.java | 82 --- .../rxjava2/NRCompletableObserver2.java | 54 -- .../rxjava2/NRFlowableObserver.java | 107 ---- .../rxjava2/NRFlowableObserver2.java | 73 --- .../rxjava2/NRMaybeObserver.java | 100 ---- .../rxjava2/NRMaybeObserver2.java | 63 --- .../rxjava2/NRObservableObserver.java | 93 ---- .../rxjava2/NRObservableObserver2.java | 59 --- .../instrumentation/rxjava2/NRObserver.java | 5 - .../rxjava2/NRSingleDeferObserver.java | 53 -- .../rxjava2/NRSingleObserver.java | 86 ---- .../rxjava2/NRSingleObserver2.java | 70 --- .../instrumentation/rxjava2/Utils.java | 148 ------ .../main/java/io/reactivex/Completable.java | 2 +- .../src/main/java/io/reactivex/Flowable.java | 6 +- .../src/main/java/io/reactivex/Maybe.java | 2 +- .../java/io/reactivex/NRSingleWrapper.java | 29 -- .../main/java/io/reactivex/Observable.java | 2 +- .../src/main/java/io/reactivex/Single.java | 9 +- .../completable/CompletableCreate.java | 26 - .../completable/CompletableDefer.java | 26 - .../completable/CompletableDelay.java | 29 -- .../completable/CompletableEmpty.java | 26 - .../completable/CompletableError.java | 26 - .../completable/CompletableErrorSupplier.java | 26 - .../completable/CompletableFromAction.java | 26 - .../completable/CompletableFromCallable.java | 26 - .../completable/CompletableFromRunnable.java | 26 - .../completable/CompletableObserveOn.java | 28 - .../completable/CompletableSubscribeOn.java | 48 -- .../completable/CompletableUtils.java | 15 - .../operators/flowable/FlowableCreate.java | 28 - .../operators/flowable/FlowableDefer.java | 27 - .../operators/flowable/FlowableDelay.java | 28 - .../FlowableDelaySubscriptionOther.java | 29 -- .../operators/flowable/FlowableEmpty.java | 27 - .../operators/flowable/FlowableError.java | 27 - .../operators/flowable/FlowableFromArray.java | 27 - .../flowable/FlowableFromCallable.java | 27 - .../flowable/FlowableFromFuture.java | 27 - .../flowable/FlowableFromIterable.java | 27 - .../operators/flowable/FlowableGenerate.java | 27 - .../operators/flowable/FlowableInterval.java | 27 - .../flowable/FlowableIntervalRange.java | 27 - .../operators/flowable/FlowableJust.java | 27 - .../operators/flowable/FlowableObserveOn.java | 29 -- .../operators/flowable/FlowableRange.java | 27 - .../operators/flowable/FlowableRangeLong.java | 27 - .../flowable/FlowableSubscribeOn.java | 29 -- .../operators/flowable/FlowableUtils.java | 34 -- .../internal/operators/maybe/MaybeCreate.java | 28 - .../internal/operators/maybe/MaybeDefer.java | 28 - .../internal/operators/maybe/MaybeDelay.java | 29 -- .../MaybeDelaySubscriptionOtherPublisher.java | 30 -- .../internal/operators/maybe/MaybeEmpty.java | 27 - .../internal/operators/maybe/MaybeError.java | 28 - .../operators/maybe/MaybeErrorCallable.java | 28 - .../operators/maybe/MaybeFromAction.java | 28 - .../operators/maybe/MaybeFromCallable.java | 28 - .../operators/maybe/MaybeFromFuture.java | 28 - .../operators/maybe/MaybeFromRunnable.java | 28 - .../internal/operators/maybe/MaybeJust.java | 28 - .../operators/maybe/MaybeObserveOn.java | 30 -- .../operators/maybe/MaybeSubscribeOn.java | 30 -- .../internal/operators/maybe/MaybeUtils.java | 15 - .../operators/observable/ObervableUtils.java | 12 - .../observable/ObservableCreate.java | 28 - .../operators/observable/ObservableDefer.java | 28 - .../operators/observable/ObservableDelay.java | 30 -- .../ObservableDelaySubscriptionOther.java | 30 -- .../operators/observable/ObservableEmpty.java | 28 - .../operators/observable/ObservableError.java | 28 - .../observable/ObservableFromArray.java | 28 - .../observable/ObservableFromCallable.java | 28 - .../observable/ObservableFromFuture.java | 28 - .../observable/ObservableFromIterable.java | 28 - .../observable/ObservableFromPublisher.java | 28 - .../observable/ObservableGenerate.java | 28 - .../observable/ObservableInterval.java | 28 - .../observable/ObservableIntervalRange.java | 28 - .../operators/observable/ObservableJust.java | 28 - .../observable/ObservableObserveOn.java | 30 -- .../operators/observable/ObservableRange.java | 28 - .../observable/ObservableRangeLong.java | 28 - .../observable/ObservableSubscribeOn.java | 30 -- .../operators/observable/ObservableTimer.java | 30 -- .../operators/single/SingleCreate.java | 28 - .../operators/single/SingleDefer.java | 28 - .../operators/single/SingleDelay.java | 25 - .../operators/single/SingleError.java | 28 - .../operators/single/SingleFromCallable.java | 29 -- .../operators/single/SingleFromPublisher.java | 29 -- .../internal/operators/single/SingleJust.java | 29 -- .../operators/single/SingleObserveOn.java | 25 - .../operators/single/SingleSubscribeOn.java | 25 - .../operators/single/SingleTimer.java | 25 - .../operators/single/SingleUtils.java | 13 - .../io/reactivex/plugins/RxJavaPlugins.java | 185 ++++++- rxjava2-finder/build.gradle | 8 +- .../rxjava2/finder/RxJava2LoaderService.java | 96 ---- .../labs/rxjava2/finder/RxJava2PointCut.java | 40 -- rxjava3-3.0/build.gradle | 6 +- .../labs/rxjava3/NRCancelAction.java | 21 + .../labs/rxjava3/NRCompletableAssembly.java | 55 ++ .../labs/rxjava3/NRCompletableObserver.java | 57 +++ .../rxjava3/NRCompletableSubWrapper.java | 10 +- .../labs/rxjava3/NRCompleteAction.java | 21 + .../labs/rxjava3/NRDisposableConsumer.java | 30 ++ .../labs/rxjava3/NRErrorConsumer.java | 25 + .../labs/rxjava3/NRFlowableAssembly.java | 60 +++ .../labs/rxjava3/NRFlowableObserver.java | 97 ++++ .../rxjava3/NRFlowableSubWrapper.java | 13 +- .../labs/rxjava3/NRMaybeAssembly.java | 48 ++ .../labs/rxjava3/NRMaybeObserver.java | 65 +++ .../{ => labs}/rxjava3/NRMaybeSubWrapper.java | 10 +- .../labs/rxjava3/NRNextConsumer.java | 20 + .../labs/rxjava3/NRObservableAssembly.java | 58 +++ .../labs/rxjava3/NRObservableObserver.java | 65 +++ .../rxjava3/NRObservableSubWrapper.java | 10 +- .../labs/rxjava3}/NRRunnable.java | 2 +- .../rxjava3/NRRunnableDecorator.java | 2 +- .../labs/rxjava3/NRRxJava3Holder.java | 78 +++ .../labs/rxjava3/NRSingleAssembly.java | 48 ++ .../labs/rxjava3/NRSingleObserver.java | 57 +++ .../rxjava3/NRSingleSubWrapper.java | 6 +- .../labs/rxjava3/NRSubscriberConsumer.java | 22 + .../labs/rxjava3/NRSuccessConsumer.java | 21 + .../labs/rxjava3/NRTerminationAction.java | 21 + .../instrumentation/labs/rxjava3/Utils.java | 325 ++++++++++++ .../rxjava3/NRCompletableObserver.java | 82 --- .../rxjava3/NRCompletableObserver2.java | 54 -- .../rxjava3/NRFlowableObserver.java | 96 ---- .../rxjava3/NRFlowableObserver2.java | 58 --- .../rxjava3/NRMaybeObserver.java | 100 ---- .../rxjava3/NRMaybeObserver2.java | 63 --- .../rxjava3/NRObservableObserver.java | 93 ---- .../rxjava3/NRObservableObserver2.java | 59 --- .../rxjava3/NRSingleDeferObserver.java | 53 -- .../instrumentation/rxjava3/NRSingleLift.java | 14 - .../rxjava3/NRSingleObserver.java | 83 --- .../rxjava3/NRSingleObserver2.java | 64 --- .../instrumentation/rxjava3/Utils.java | 148 ------ .../reactivex/rxjava3/core/Completable.java | 2 +- .../io/reactivex/rxjava3/core/Flowable.java | 6 +- .../java/io/reactivex/rxjava3/core/Maybe.java | 2 +- .../rxjava3/core/NRSingleWrapper.java | 31 -- .../io/reactivex/rxjava3/core/Observable.java | 2 +- .../io/reactivex/rxjava3/core/Single.java | 9 +- .../completable/CompletableCreate.java | 26 - .../completable/CompletableDefer.java | 26 - .../completable/CompletableDelay.java | 29 -- .../completable/CompletableEmpty.java | 26 - .../completable/CompletableError.java | 26 - .../completable/CompletableErrorSupplier.java | 26 - .../completable/CompletableFromAction.java | 26 - .../completable/CompletableFromCallable.java | 26 - .../completable/CompletableFromRunnable.java | 26 - .../completable/CompletableObserveOn.java | 28 - .../completable/CompletableSubscribeOn.java | 48 -- .../completable/CompletableUtils.java | 15 - .../operators/flowable/FlowableCreate.java | 30 -- .../operators/flowable/FlowableDefer.java | 30 -- .../operators/flowable/FlowableDelay.java | 28 - .../FlowableDelaySubscriptionOther.java | 29 -- .../operators/flowable/FlowableEmpty.java | 30 -- .../operators/flowable/FlowableError.java | 30 -- .../operators/flowable/FlowableFromArray.java | 30 -- .../flowable/FlowableFromCallable.java | 30 -- .../flowable/FlowableFromFuture.java | 30 -- .../flowable/FlowableFromIterable.java | 30 -- .../operators/flowable/FlowableGenerate.java | 30 -- .../operators/flowable/FlowableInterval.java | 30 -- .../flowable/FlowableIntervalRange.java | 30 -- .../operators/flowable/FlowableJust.java | 30 -- .../operators/flowable/FlowableObserveOn.java | 29 -- .../operators/flowable/FlowableRange.java | 30 -- .../operators/flowable/FlowableRangeLong.java | 30 -- .../flowable/FlowableSubscribeOn.java | 29 -- .../operators/flowable/FlowableUtils.java | 13 - .../internal/operators/maybe/MaybeCreate.java | 28 - .../internal/operators/maybe/MaybeDefer.java | 28 - .../internal/operators/maybe/MaybeDelay.java | 29 -- .../MaybeDelaySubscriptionOtherPublisher.java | 30 -- .../internal/operators/maybe/MaybeEmpty.java | 27 - .../internal/operators/maybe/MaybeError.java | 28 - .../operators/maybe/MaybeErrorCallable.java | 28 - .../operators/maybe/MaybeFromAction.java | 28 - .../operators/maybe/MaybeFromCallable.java | 28 - .../operators/maybe/MaybeFromFuture.java | 28 - .../operators/maybe/MaybeFromRunnable.java | 28 - .../internal/operators/maybe/MaybeJust.java | 28 - .../operators/maybe/MaybeObserveOn.java | 30 -- .../operators/maybe/MaybeSubscribeOn.java | 30 -- .../internal/operators/maybe/MaybeUtils.java | 15 - .../operators/observable/ObervableUtils.java | 12 - .../observable/ObservableCreate.java | 28 - .../operators/observable/ObservableDefer.java | 28 - .../operators/observable/ObservableDelay.java | 30 -- .../ObservableDelaySubscriptionOther.java | 30 -- .../operators/observable/ObservableEmpty.java | 28 - .../operators/observable/ObservableError.java | 28 - .../observable/ObservableFromArray.java | 28 - .../observable/ObservableFromCallable.java | 28 - .../observable/ObservableFromFuture.java | 28 - .../observable/ObservableFromIterable.java | 28 - .../observable/ObservableFromPublisher.java | 28 - .../observable/ObservableGenerate.java | 28 - .../observable/ObservableInterval.java | 28 - .../observable/ObservableIntervalRange.java | 28 - .../operators/observable/ObservableJust.java | 28 - .../observable/ObservableObserveOn.java | 30 -- .../operators/observable/ObservableRange.java | 28 - .../observable/ObservableRangeLong.java | 28 - .../observable/ObservableSubscribeOn.java | 30 -- .../operators/observable/ObservableTimer.java | 30 -- .../operators/single/SingleCreate.java | 28 - .../operators/single/SingleDefer.java | 28 - .../operators/single/SingleDelay.java | 25 - .../operators/single/SingleError.java | 28 - .../operators/single/SingleFromCallable.java | 29 -- .../operators/single/SingleFromPublisher.java | 29 -- .../internal/operators/single/SingleJust.java | 29 -- .../operators/single/SingleObserveOn.java | 25 - .../operators/single/SingleSubscribeOn.java | 25 - .../operators/single/SingleTimer.java | 25 - .../rxjava3/plugins/RxJavaPlugins.java | 185 ++++++- rxjava3-finder/build.gradle | 10 +- settings.gradle | 1 + 303 files changed, 4836 insertions(+), 6603 deletions(-) rename rxjava1-1.1/src/main/java/com/{nr => newrelic/instrumentation/labs}/rxjava1/NROperator.java (87%) rename rxjava1-1.1/src/main/java/com/{nr => newrelic/instrumentation/labs}/rxjava1/NRSubscriber.java (96%) rename rxjava1-1.2/src/main/java/com/{nr => newrelic/instrumentation/labs}/rxjava1_2/NRCompletableOperator.java (87%) rename rxjava1-1.2/src/main/java/com/{nr => newrelic/instrumentation/labs}/rxjava1_2/NRCompletableSubscriber.java (95%) rename rxjava1-1.2/src/main/java/com/{nr => newrelic/instrumentation/labs}/rxjava1_2/NRSingleOperator.java (87%) rename rxjava1-1.2/src/main/java/com/{nr => newrelic/instrumentation/labs}/rxjava1_2/NRSubscriber.java (95%) create mode 100644 rxjava2-2.0.7/build.gradle create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCancelAction.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableAssembly.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableObserver.java rename {rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2 => rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7}/NRCompletableSubWrapper.java (61%) create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompleteAction.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRDisposableConsumer.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRErrorConsumer.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableAssembly.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableObserver.java rename {rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2 => rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7}/NRFlowableSubWrapper.java (60%) create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeAssembly.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeObserver.java rename {rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2 => rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7}/NRMaybeSubWrapper.java (62%) create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRNextConsumer.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableAssembly.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableObserver.java rename {rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2 => rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7}/NRObservableSubWrapper.java (58%) create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJava2Holder.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleAssembly.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleObserver.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleSubWrapper.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSubscriberConsumer.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSuccessConsumer.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRTerminationAction.java create mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/Utils.java create mode 100644 rxjava2-2.0.7/src/main/java/io/reactivex/Completable.java create mode 100644 rxjava2-2.0.7/src/main/java/io/reactivex/Flowable.java create mode 100644 rxjava2-2.0.7/src/main/java/io/reactivex/Maybe.java create mode 100644 rxjava2-2.0.7/src/main/java/io/reactivex/Observable.java create mode 100644 rxjava2-2.0.7/src/main/java/io/reactivex/Single.java create mode 100644 rxjava2-2.0.7/src/main/java/io/reactivex/plugins/RxJavaPlugins.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCancelAction.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableAssembly.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableObserver.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableSubWrapper.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompleteAction.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRDisposableConsumer.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRErrorConsumer.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableAssembly.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableObserver.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableSubWrapper.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeAssembly.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeObserver.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeSubWrapper.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRNextConsumer.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableAssembly.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableObserver.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableSubWrapper.java rename {rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3 => rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2}/NRRunnable.java (94%) rename rxjava2-2.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava2/NRRunnableDecorator.java (94%) create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJava2Holder.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleAssembly.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleObserver.java rename rxjava2-2.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava2/NRSingleSubWrapper.java (70%) create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSubscriberConsumer.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSuccessConsumer.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRTerminationAction.java create mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/Utils.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver2.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver2.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver2.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleDeferObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/Utils.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/NRSingleWrapper.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableCreate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDefer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDelay.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableEmpty.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableError.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableErrorSupplier.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromAction.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromCallable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromRunnable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableObserveOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableSubscribeOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableUtils.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelay.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelaySubscriptionOther.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableObserveOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableSubscribeOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeCreate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDefer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelay.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeEmpty.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeError.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeErrorCallable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromAction.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromCallable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromFuture.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromRunnable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeJust.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeObserveOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeSubscribeOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeUtils.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObervableUtils.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableCreate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDefer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelay.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelaySubscriptionOther.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableEmpty.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableError.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromArray.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromCallable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromFuture.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromIterable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromPublisher.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableGenerate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableInterval.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableIntervalRange.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableJust.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableObserveOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRange.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRangeLong.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableSubscribeOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableTimer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleCreate.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDefer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDelay.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleError.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromCallable.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromPublisher.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleJust.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleObserveOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleSubscribeOn.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleTimer.java delete mode 100644 rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java delete mode 100644 rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2LoaderService.java delete mode 100644 rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2PointCut.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCancelAction.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableAssembly.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableObserver.java rename rxjava3-3.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava3/NRCompletableSubWrapper.java (61%) create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompleteAction.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRDisposableConsumer.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRErrorConsumer.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableAssembly.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableObserver.java rename rxjava3-3.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava3/NRFlowableSubWrapper.java (60%) create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeAssembly.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeObserver.java rename rxjava3-3.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava3/NRMaybeSubWrapper.java (62%) create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRNextConsumer.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableAssembly.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableObserver.java rename rxjava3-3.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava3/NRObservableSubWrapper.java (59%) rename {rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2 => rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3}/NRRunnable.java (94%) rename rxjava3-3.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava3/NRRunnableDecorator.java (94%) create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJava3Holder.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleAssembly.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleObserver.java rename rxjava3-3.0/src/main/java/com/newrelic/instrumentation/{ => labs}/rxjava3/NRSingleSubWrapper.java (71%) create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSubscriberConsumer.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSuccessConsumer.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRTerminationAction.java create mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/Utils.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver2.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver2.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver2.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver2.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleDeferObserver.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleLift.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver2.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/Utils.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/NRSingleWrapper.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableCreate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDefer.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDelay.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableEmpty.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableError.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableErrorSupplier.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromAction.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromCallable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromRunnable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableObserveOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableSubscribeOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableUtils.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableCreate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDefer.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelay.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelaySubscriptionOther.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableEmpty.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableError.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromArray.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromCallable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromIterable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableGenerate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableInterval.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableIntervalRange.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableJust.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRange.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRangeLong.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableUtils.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeCreate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDefer.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelay.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeError.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeErrorCallable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromAction.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromFuture.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromRunnable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeJust.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeSubscribeOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeUtils.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObervableUtils.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableCreate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDefer.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelay.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelaySubscriptionOther.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableEmpty.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableError.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromArray.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromCallable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromIterable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableGenerate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableInterval.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableIntervalRange.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableJust.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRange.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRangeLong.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableTimer.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleCreate.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDefer.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDelay.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleError.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromCallable.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromPublisher.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleJust.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleObserveOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn.java delete mode 100644 rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleTimer.java diff --git a/rxjava1-1.1/build.gradle b/rxjava1-1.1/build.gradle index 65ef1ab..91b52cb 100644 --- a/rxjava1-1.1/build.gradle +++ b/rxjava1-1.1/build.gradle @@ -19,10 +19,10 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava1-1.1' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' - attributes 'Implementation-Version': 1.0 + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava1-1.1' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.1 } } diff --git a/rxjava1-1.1/src/main/java/com/nr/rxjava1/NROperator.java b/rxjava1-1.1/src/main/java/com/newrelic/instrumentation/labs/rxjava1/NROperator.java similarity index 87% rename from rxjava1-1.1/src/main/java/com/nr/rxjava1/NROperator.java rename to rxjava1-1.1/src/main/java/com/newrelic/instrumentation/labs/rxjava1/NROperator.java index e589be4..938ada2 100644 --- a/rxjava1-1.1/src/main/java/com/nr/rxjava1/NROperator.java +++ b/rxjava1-1.1/src/main/java/com/newrelic/instrumentation/labs/rxjava1/NROperator.java @@ -1,4 +1,4 @@ -package com.nr.rxjava1; +package com.newrelic.instrumentation.labs.rxjava1; import rx.Observable.Operator; import rx.Subscriber; diff --git a/rxjava1-1.1/src/main/java/com/nr/rxjava1/NRSubscriber.java b/rxjava1-1.1/src/main/java/com/newrelic/instrumentation/labs/rxjava1/NRSubscriber.java similarity index 96% rename from rxjava1-1.1/src/main/java/com/nr/rxjava1/NRSubscriber.java rename to rxjava1-1.1/src/main/java/com/newrelic/instrumentation/labs/rxjava1/NRSubscriber.java index b6e1e18..659cd0c 100644 --- a/rxjava1-1.1/src/main/java/com/nr/rxjava1/NRSubscriber.java +++ b/rxjava1-1.1/src/main/java/com/newrelic/instrumentation/labs/rxjava1/NRSubscriber.java @@ -1,4 +1,4 @@ -package com.nr.rxjava1; +package com.newrelic.instrumentation.labs.rxjava1; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; diff --git a/rxjava1-1.1/src/main/java/rx/Observable_Instrumentation.java b/rxjava1-1.1/src/main/java/rx/Observable_Instrumentation.java index 8a27db6..6390079 100644 --- a/rxjava1-1.1/src/main/java/rx/Observable_Instrumentation.java +++ b/rxjava1-1.1/src/main/java/rx/Observable_Instrumentation.java @@ -3,7 +3,7 @@ import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.rxjava1.NROperator; +import com.newrelic.instrumentation.labs.rxjava1.NROperator; import rx.Observable.Operator; diff --git a/rxjava1-1.1/src/main/java/rx/internal/util/ScalarSynchronousObservable.java b/rxjava1-1.1/src/main/java/rx/internal/util/ScalarSynchronousObservable.java index 91e9360..96d3095 100644 --- a/rxjava1-1.1/src/main/java/rx/internal/util/ScalarSynchronousObservable.java +++ b/rxjava1-1.1/src/main/java/rx/internal/util/ScalarSynchronousObservable.java @@ -2,7 +2,7 @@ import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.rxjava1.NROperator; +import com.newrelic.instrumentation.labs.rxjava1.NROperator; import rx.Observable; import rx.Scheduler; diff --git a/rxjava1-1.2/build.gradle b/rxjava1-1.2/build.gradle index 2f0ce74..ee97c83 100644 --- a/rxjava1-1.2/build.gradle +++ b/rxjava1-1.2/build.gradle @@ -16,10 +16,10 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava1-1.2' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' - attributes 'Implementation-Version': 1.0 + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava1-1.2' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.1 } } diff --git a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRCompletableOperator.java b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRCompletableOperator.java similarity index 87% rename from rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRCompletableOperator.java rename to rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRCompletableOperator.java index 7210ea7..49103bb 100644 --- a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRCompletableOperator.java +++ b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRCompletableOperator.java @@ -1,4 +1,4 @@ -package com.nr.rxjava1_2; +package com.newrelic.instrumentation.labs.rxjava1_2; import rx.Completable.Operator; import rx.CompletableSubscriber; diff --git a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRCompletableSubscriber.java b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRCompletableSubscriber.java similarity index 95% rename from rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRCompletableSubscriber.java rename to rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRCompletableSubscriber.java index 95ebec5..8242cf3 100644 --- a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRCompletableSubscriber.java +++ b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRCompletableSubscriber.java @@ -1,4 +1,4 @@ -package com.nr.rxjava1_2; +package com.newrelic.instrumentation.labs.rxjava1_2; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; diff --git a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRSingleOperator.java b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRSingleOperator.java similarity index 87% rename from rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRSingleOperator.java rename to rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRSingleOperator.java index 81f156b..e0c6a56 100644 --- a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRSingleOperator.java +++ b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRSingleOperator.java @@ -1,4 +1,4 @@ -package com.nr.rxjava1_2; +package com.newrelic.instrumentation.labs.rxjava1_2; import rx.Observable.Operator; import rx.Subscriber; diff --git a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRSubscriber.java b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRSubscriber.java similarity index 95% rename from rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRSubscriber.java rename to rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRSubscriber.java index 2bcf272..afd0a32 100644 --- a/rxjava1-1.2/src/main/java/com/nr/rxjava1_2/NRSubscriber.java +++ b/rxjava1-1.2/src/main/java/com/newrelic/instrumentation/labs/rxjava1_2/NRSubscriber.java @@ -1,4 +1,4 @@ -package com.nr.rxjava1_2; +package com.newrelic.instrumentation.labs.rxjava1_2; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; diff --git a/rxjava1-1.2/src/main/java/rx/Completable_Instrumentation.java b/rxjava1-1.2/src/main/java/rx/Completable_Instrumentation.java index 106b5a5..03c83fa 100644 --- a/rxjava1-1.2/src/main/java/rx/Completable_Instrumentation.java +++ b/rxjava1-1.2/src/main/java/rx/Completable_Instrumentation.java @@ -2,7 +2,7 @@ import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.rxjava1_2.NRCompletableOperator; +import com.newrelic.instrumentation.labs.rxjava1_2.NRCompletableOperator; import rx.Completable.Operator; diff --git a/rxjava1-1.2/src/main/java/rx/Single_Instrumentation.java b/rxjava1-1.2/src/main/java/rx/Single_Instrumentation.java index 9594e6a..4cbf825 100644 --- a/rxjava1-1.2/src/main/java/rx/Single_Instrumentation.java +++ b/rxjava1-1.2/src/main/java/rx/Single_Instrumentation.java @@ -2,7 +2,7 @@ import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.nr.rxjava1_2.NRSingleOperator; +import com.newrelic.instrumentation.labs.rxjava1_2.NRSingleOperator; import rx.Observable.Operator; diff --git a/rxjava1-finder/build.gradle b/rxjava1-finder/build.gradle index c5ce132..ab187a2 100644 --- a/rxjava1-finder/build.gradle +++ b/rxjava1-finder/build.gradle @@ -14,10 +14,10 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava1-finder' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' - attributes 'Implementation-Version': 1.0 + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava1-finder' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.1 attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava1.RxJava1PreMain' } } diff --git a/rxjava2-2.0.7/build.gradle b/rxjava2-2.0.7/build.gradle new file mode 100644 index 0000000..1d43abb --- /dev/null +++ b/rxjava2-2.0.7/build.gradle @@ -0,0 +1,30 @@ + +// Build.gradle generated for instrumentation module rxjava2-2.0 + +apply plugin: 'java' + +dependencies { + implementation 'io.reactivex.rxjava2:rxjava:2.0.7' + implementation 'org.reactivestreams:reactive-streams:1.0.3' + + + // New Relic Java Agent dependencies + implementation fileTree(include: ['*.jar'], dir: '../libs') + + testImplementation 'junit:junit:4.12' + +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava2-2.0.7' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + passes 'io.reactivex.rxjava2:rxjava:[2.0.7,)' + excludeRegex '.*RC[0-9]' +} \ No newline at end of file diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCancelAction.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCancelAction.java new file mode 100644 index 0000000..081dabb --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCancelAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import io.reactivex.functions.Action; + +public class NRCancelAction implements Action { + + private NRRxJava2Holder holder = null; + + public NRCancelAction(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.ignoreSegment(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableAssembly.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableAssembly.java new file mode 100644 index 0000000..c59b430 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableAssembly.java @@ -0,0 +1,55 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Completable; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.completable.CompletablePeek; + +public class NRCompletableAssembly implements Function { + + private static final String FROM_PREFIX = "CompletableFrom"; + private static final String INTERVAL_PREFIX = "CompletableInterval"; + private static final String NEVER = "CompletableNever"; + + private Function delegate = null; + + public NRCompletableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Completable apply(Completable t) throws Exception { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getCompletableIgnores().contains(simpleName)) return t; + if(t.completableName == null) { + t.completableName = simpleName; + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Completable",t.completableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + + Completable result = delegate != null ? delegate.apply(t) : t; + + Completable subscribe = new CompletablePeek(result, disposableConsumer, errorConsumer, completeAction, terminationAction, Functions.EMPTY_ACTION,Functions.EMPTY_ACTION); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableObserver.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableObserver.java new file mode 100644 index 0000000..bafdf1c --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableObserver.java @@ -0,0 +1,57 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.CompletableObserver; +import io.reactivex.disposables.Disposable; + +public class NRCompletableObserver implements CompletableObserver { + + private CompletableObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRCompletableObserver(CompletableObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Completable",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Completable",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Completable",name,"onError"); + if(downstream != null) { + downstream.onComplete(); + } + } + + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableSubWrapper.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableSubWrapper.java similarity index 61% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableSubWrapper.java rename to rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableSubWrapper.java index 43c5992..421241c 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableSubWrapper.java +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompletableSubWrapper.java @@ -1,9 +1,8 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava2_0_7; import io.reactivex.Completable; import io.reactivex.CompletableObserver; import io.reactivex.functions.BiFunction; -import io.reactivex.internal.operators.completable.CompletableUtils; public class NRCompletableSubWrapper implements BiFunction { @@ -15,14 +14,11 @@ public NRCompletableSubWrapper(BiFunction getDelegate() { diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompleteAction.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompleteAction.java new file mode 100644 index 0000000..a8be5dc --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRCompleteAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import io.reactivex.functions.Action; + +public class NRCompleteAction implements Action { + + private NRRxJava2Holder holder = null; + + public NRCompleteAction(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.endSegment(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRDisposableConsumer.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRDisposableConsumer.java new file mode 100644 index 0000000..8bfff7e --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRDisposableConsumer.java @@ -0,0 +1,30 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Trace; + +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; + +public class NRDisposableConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + private static boolean isTransformed = false; + + public NRDisposableConsumer(NRRxJava2Holder h) { + holder = h; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + } + + @Override + @Trace(async = true) + public void accept(Disposable t) throws Exception { + if(holder != null) { + holder.startSegment(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRErrorConsumer.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRErrorConsumer.java new file mode 100644 index 0000000..e88dd74 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRErrorConsumer.java @@ -0,0 +1,25 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.functions.Consumer; + +public class NRErrorConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRErrorConsumer( NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(Throwable t) throws Exception { + NewRelic.noticeError(t); + if(holder != null) { + holder.ignoreSegment(); + holder.expireToken(); + holder = null; + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableAssembly.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableAssembly.java new file mode 100644 index 0000000..63c4f56 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableAssembly.java @@ -0,0 +1,60 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Flowable; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.flowable.FlowableDoOnEach; +import io.reactivex.internal.operators.flowable.FlowableDoOnLifecycle; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NRFlowableAssembly implements Function { + + private static final String FROM_PREFIX = "FlowableFrom"; + private static final String INTERVAL_PREFIX = "FlowableInterval"; + private static final String NEVER = "FlowableNever"; + + private Function delegate = null; + + public NRFlowableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Flowable apply(Flowable t) throws Exception { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getFlowableIgnores().contains(simpleName)) return t; + if(t.flowableName == null) { + t.flowableName = simpleName; + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Flowable",t.flowableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRNextConsumer nextConsumer = new NRNextConsumer<>(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRSubscriberConsumer subscribeConsumer = new NRSubscriberConsumer(holder); + NRCancelAction cancelAction = new NRCancelAction(holder); + + + Flowable result = delegate != null ? delegate.apply(t) : t; + Flowable result2 = new FlowableDoOnEach<>(result, nextConsumer , errorConsumer, completeAction, terminationAction); + Flowable subscribe = new FlowableDoOnLifecycle<>(result2, subscribeConsumer, Functions.EMPTY_LONG_CONSUMER, cancelAction); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableObserver.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableObserver.java new file mode 100644 index 0000000..fd86a1b --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableObserver.java @@ -0,0 +1,97 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.Transaction; + +public class NRFlowableObserver implements Subscriber { + + private Subscriber downstream; + + private String name = null; + private Transaction transaction = null; + + private static boolean isTransformed = false; + + public NRFlowableObserver(Subscriber downstream, String n, Transaction txn) { + transaction = txn; + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Subscription s) { + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onSubscribe"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onSubscribe"); + } + + if(downstream != null) { + downstream.onSubscribe(s); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.noticeError(e); + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onError"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onError"); + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",downstream,name); + if (downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onComplete"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onComplete"); + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserve2.onComplete with subscriber {0}, name {1}",downstream,name); + if (downstream != null) { + downstream.onComplete(); + } + } + + @Override + @Trace(async = true) + public void onNext(T t) { + Token token = transaction.getToken(); + if(token != null && token.isActive()) { + token.linkAndExpire(); + } else if(token != null) { + token.expire(); + } + token = null; + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onNext"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onNext"); + } + if (downstream != null) { + downstream.onNext(t); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableSubWrapper.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableSubWrapper.java similarity index 60% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableSubWrapper.java rename to rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableSubWrapper.java index bb79975..b890469 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableSubWrapper.java +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRFlowableSubWrapper.java @@ -1,10 +1,11 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava2_0_7; import org.reactivestreams.Subscriber; +import com.newrelic.api.agent.NewRelic; + import io.reactivex.Flowable; import io.reactivex.functions.BiFunction; -import io.reactivex.internal.operators.flowable.FlowableUtils; @SuppressWarnings("rawtypes") public class NRFlowableSubWrapper implements BiFunction { @@ -18,14 +19,12 @@ public NRFlowableSubWrapper(BiFunction d) { @SuppressWarnings("unchecked") @Override public Subscriber apply(Flowable t1, Subscriber t2) throws Exception { - boolean ignore = FlowableUtils.ignore(t1); + if(delegate == null) { - if(ignore) return t2; - return t2 instanceof NRFlowableObserver2 ? t2 : new NRFlowableObserver2(t2, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName()); + return t2 instanceof NRFlowableObserver ? t2 : new NRFlowableObserver(t2, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName(),NewRelic.getAgent().getTransaction()); } Subscriber actual = delegate.apply(t1, t2); - if(ignore) return actual; - return t2 instanceof NRFlowableObserver2 ? actual : new NRFlowableObserver2(actual, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName()); + return t2 instanceof NRFlowableObserver ? actual : new NRFlowableObserver(actual, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName(), NewRelic.getAgent().getTransaction()); } public BiFunction getDelegate() { diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeAssembly.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeAssembly.java new file mode 100644 index 0000000..35c97ea --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeAssembly.java @@ -0,0 +1,48 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Maybe; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.maybe.MaybePeek; + +@SuppressWarnings({"rawtypes", "unchecked"}) +public class NRMaybeAssembly implements Function { + + private Function delegate = null; + + public NRMaybeAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Maybe apply(Maybe t) throws Exception { + if(Utils.useSegments) { + if(t.maybeName == null) { + t.maybeName = t.getClass().getSimpleName(); + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Maybe",t.maybeName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + NRSuccessConsumer successConsumer = new NRSuccessConsumer<>(holder); + + Maybe result = delegate != null ? delegate.apply(t) : t; + + Maybe subscribe = new MaybePeek(result, disposableConsumer,successConsumer, errorConsumer, completeAction, terminationAction,Functions.EMPTY_ACTION); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeObserver.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeObserver.java new file mode 100644 index 0000000..1592efa --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeObserver.java @@ -0,0 +1,65 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.MaybeObserver; +import io.reactivex.disposables.Disposable; + +public class NRMaybeObserver implements MaybeObserver { + + private MaybeObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRMaybeObserver(MaybeObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onComplete"); + if(downstream != null) { + downstream.onComplete(); + } + } + + @Override + @Trace + public void onSuccess(T value) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onSuccess"); + if(downstream != null) { + downstream.onSuccess(value); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeSubWrapper.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeSubWrapper.java similarity index 62% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeSubWrapper.java rename to rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeSubWrapper.java index bc20e1a..9c435de 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeSubWrapper.java +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRMaybeSubWrapper.java @@ -1,9 +1,8 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava2_0_7; import io.reactivex.Maybe; import io.reactivex.MaybeObserver; import io.reactivex.functions.BiFunction; -import io.reactivex.internal.operators.maybe.MaybeUtils; @SuppressWarnings("rawtypes") public class NRMaybeSubWrapper implements BiFunction { @@ -17,15 +16,12 @@ public NRMaybeSubWrapper(BiFunction d) { @SuppressWarnings("unchecked") @Override public MaybeObserver apply(Maybe t1, MaybeObserver t2) throws Exception { - boolean ignore = MaybeUtils.ignore(t1); if(delegate == null) { - if(ignore) return t2; - return t2 instanceof NRMaybeObserver2 ? t2 : new NRMaybeObserver2(t2, t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); + return t2 instanceof NRMaybeObserver ? t2 : new NRMaybeObserver(t2, t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); } MaybeObserver actual = delegate.apply(t1, t2); - if(ignore) return actual; - return t2 instanceof NRMaybeObserver2 ? actual : new NRMaybeObserver2(actual,t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); + return t2 instanceof NRMaybeObserver ? actual : new NRMaybeObserver(actual,t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); } public BiFunction getDelegate() { diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRNextConsumer.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRNextConsumer.java new file mode 100644 index 0000000..506c7d1 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRNextConsumer.java @@ -0,0 +1,20 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import io.reactivex.functions.Consumer; + +public class NRNextConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRNextConsumer(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(T t) throws Exception { + if(holder != null) { + holder.linkToken(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableAssembly.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableAssembly.java new file mode 100644 index 0000000..7ce31bd --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableAssembly.java @@ -0,0 +1,58 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Observable; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.observable.ObservableDoOnEach; +import io.reactivex.internal.operators.observable.ObservableDoOnLifecycle; + +@SuppressWarnings({"rawtypes","unchecked"}) +public class NRObservableAssembly implements Function { + + private Function delegate = null; + private static final String FROM_PREFIX = "ObservableFrom"; + private static final String INTERVAL_PREFIX = "ObservableInterval"; + private static final String NEVER = "ObservableNever"; + + public NRObservableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Observable apply(Observable t) throws Exception { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getObservableIgnores().contains(simpleName)) return t; + + if(t.observableName == null) { + t.observableName = simpleName; + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Observable",t.observableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRNextConsumer nextConsumer = new NRNextConsumer<>(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + Observable result = delegate != null ? delegate.apply(t) : t; + + Observable subscribe = new ObservableDoOnLifecycle<>(result, disposableConsumer, Functions.EMPTY_ACTION); + Observable result2 = new ObservableDoOnEach(subscribe, nextConsumer, errorConsumer, completeAction, terminationAction); + return result2; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableObserver.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableObserver.java new file mode 100644 index 0000000..d5d6f05 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableObserver.java @@ -0,0 +1,65 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +public class NRObservableObserver implements Observer { + + private Observer downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRObservableObserver(Observer downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onNext(T t) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onNext"); + if(downstream != null) { + downstream.onNext(t); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onComplete"); + if(downstream != null) { + downstream.onComplete(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableSubWrapper.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableSubWrapper.java similarity index 58% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableSubWrapper.java rename to rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableSubWrapper.java index 098f53f..cf35cf0 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableSubWrapper.java +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRObservableSubWrapper.java @@ -1,9 +1,8 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava2_0_7; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.functions.BiFunction; -import io.reactivex.internal.operators.observable.ObervableUtils; @SuppressWarnings("rawtypes") public class NRObservableSubWrapper implements BiFunction { @@ -17,15 +16,12 @@ public NRObservableSubWrapper(BiFunction d) { @SuppressWarnings("unchecked") @Override public Observer apply(Observable t1, Observer t2) throws Exception { - boolean ignore = ObervableUtils.ignore(t1); if(delegate == null) { - if(ignore) return t2; - return t2 instanceof NRObservableObserver2 ? t2 : new NRObservableObserver2(t2, t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); + return t2 instanceof NRObservableObserver ? t2 : new NRObservableObserver(t2, t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); } Observer actual = delegate.apply(t1, t2); - if(ignore) return actual; - return t2 instanceof NRObservableObserver2 ? actual : new NRObservableObserver2(actual,t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); + return t2 instanceof NRObservableObserver ? actual : new NRObservableObserver(actual,t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); } public BiFunction getDelegate() { diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java new file mode 100644 index 0000000..7ed386f --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java @@ -0,0 +1,37 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +public class NRRunnable implements Runnable { + + + private Token token = null; + private Runnable delegate = null; + private static boolean isTransformed = false; + + public NRRunnable(Runnable r, Token t) { + token = t; + delegate = r; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass());; + isTransformed = true; + } + } + + @Override + @Trace(async=true) + public void run() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","WrappedRunable", delegate != null ? delegate.getClass().getSimpleName() : "NullRunnable"); + if(token != null) { + token.linkAndExpire(); + token = null; + } + if(delegate != null) { + delegate.run(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java new file mode 100644 index 0000000..94a4683 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java @@ -0,0 +1,34 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; + +import io.reactivex.functions.Function; + +public class NRRunnableDecorator implements Function { + + private Function delegate = null; + + public NRRunnableDecorator(Function f) { + delegate = f; + } + + @Override + public Runnable apply(Runnable r) throws Exception { + Runnable run = null; + if(r instanceof NRRunnable) { + run = delegate != null ? delegate.apply(r) : r; + } else { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + NRRunnable nrRun = new NRRunnable(r, t); + run = delegate != null ? delegate.apply(nrRun) : nrRun; + } else { + t.expire(); + run = delegate != null ? delegate.apply(r) : r; + } + } + return run; + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJava2Holder.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJava2Holder.java new file mode 100644 index 0000000..a3a118a --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJava2Holder.java @@ -0,0 +1,78 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Transaction; + +public class NRRxJava2Holder { + + private Segment segment = null; + private String name = null; + private String rxType = "Unknown"; + private Transaction transaction = null; + private Token token = null; + + public NRRxJava2Holder(String type, String n, Transaction txn) { + name = n; + transaction = txn; + if(type != null && !type.isEmpty()) { + rxType = type; + } + Token t = transaction.getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + + public void startSegment() { + segment = transaction.startSegment("RxJava2/"+rxType+"/TotalTime",name); + } + + public void linkToken() { + if(token != null) { + token.link(); + } + } + + public void linkAndExpireToken() { + if(token != null) { + token.linkAndExpire(); + token = null; + } + } + + public void expireToken() { + if(token != null) { + token.expire(); + token = null; + } + } + + public void endSegment() { + if(segment != null) { + segment.end(); + segment = null; + } + } + + public void ignoreSegment() { + if(segment != null) { + segment.ignore(); + segment = null; + } + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return new String("NRRxJavaHolder:{rxType = "+rxType + ", name = "+name+"}"); + } + + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleAssembly.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleAssembly.java new file mode 100644 index 0000000..91a4cea --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleAssembly.java @@ -0,0 +1,48 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Single; +import io.reactivex.functions.Function; +import io.reactivex.internal.operators.single.SingleDoOnError; +import io.reactivex.internal.operators.single.SingleDoOnSubscribe; +import io.reactivex.internal.operators.single.SingleDoOnSuccess; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NRSingleAssembly implements Function { + + private Function delegate = null; + + public NRSingleAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Single apply(Single t) throws Exception { + if(Utils.useSegments) { + if(t.singleName == null) { + t.singleName = t.getClass().getSimpleName(); + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Single",t.singleName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRDisposableConsumer disposeConsumer = new NRDisposableConsumer(holder); + NRSuccessConsumer sucessConsumer = new NRSuccessConsumer<>(holder); + Single result = delegate != null ? delegate.apply(t) : t; + Single error = new SingleDoOnError<>(result, errorConsumer); + Single success = new SingleDoOnSuccess<>(error, sucessConsumer); + Single subscribe = new SingleDoOnSubscribe<>(success, disposeConsumer); + + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleObserver.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleObserver.java new file mode 100644 index 0000000..2211643 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleObserver.java @@ -0,0 +1,57 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; + +public class NRSingleObserver implements SingleObserver { + + private SingleObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRSingleObserver(SingleObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Single",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Single",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onSuccess(T value) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Single",name,"onSuccess"); + if(downstream != null) { + downstream.onSuccess(value); + } + } + + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleSubWrapper.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleSubWrapper.java new file mode 100644 index 0000000..f7f2479 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSingleSubWrapper.java @@ -0,0 +1,35 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import io.reactivex.Single; +import io.reactivex.SingleObserver; +import io.reactivex.functions.BiFunction; + +@SuppressWarnings("rawtypes") +public class NRSingleSubWrapper implements BiFunction { + + private BiFunction delegate = null; + + public NRSingleSubWrapper(BiFunction d) { + delegate = d; + } + + @SuppressWarnings("unchecked") + @Override + public SingleObserver apply(Single t1, SingleObserver t2) throws Exception { + if(delegate == null) { + return t2 instanceof NRSingleObserver ? t2 : new NRSingleObserver(t2, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); + } + SingleObserver actual = delegate.apply(t1, t2); + return t2 instanceof NRSingleObserver ? actual : new NRSingleObserver(actual, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); + } + + public BiFunction getDelegate() { + return delegate; + } + + public void setDelegate( BiFunction d) { + delegate = d; + } + + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSubscriberConsumer.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSubscriberConsumer.java new file mode 100644 index 0000000..19eea5a --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSubscriberConsumer.java @@ -0,0 +1,22 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import org.reactivestreams.Subscription; + +import io.reactivex.functions.Consumer; + +public class NRSubscriberConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRSubscriberConsumer(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(Subscription subscription) throws Exception { + if(holder != null) { + holder.startSegment(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSuccessConsumer.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSuccessConsumer.java new file mode 100644 index 0000000..6c9ea2c --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRSuccessConsumer.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import io.reactivex.functions.Consumer; + +public class NRSuccessConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRSuccessConsumer(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(T t) throws Exception { + if(holder != null) { + holder.endSegment(); + holder.expireToken(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRTerminationAction.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRTerminationAction.java new file mode 100644 index 0000000..6523045 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRTerminationAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import io.reactivex.functions.Action; + +public class NRTerminationAction implements Action { + + private NRRxJava2Holder holder = null; + + public NRTerminationAction(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.ignoreSegment(); + } + } + +} diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/Utils.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/Utils.java new file mode 100644 index 0000000..c93c351 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/Utils.java @@ -0,0 +1,325 @@ +package com.newrelic.instrumentation.labs.rxjava2_0_7; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; + +import com.newrelic.agent.config.AgentConfig; +import com.newrelic.agent.config.AgentConfigListener; +import com.newrelic.agent.service.ServiceFactory; +import com.newrelic.api.agent.Config; +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.Flowable; +import io.reactivex.Maybe; +import io.reactivex.MaybeObserver; +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.Single; +import io.reactivex.SingleObserver; +import io.reactivex.functions.BiFunction; +import io.reactivex.functions.Function; +import io.reactivex.plugins.RxJavaPlugins; + +public class Utils implements AgentConfigListener { + + public static boolean initialized = false; + public static boolean useSegments = true; + public static boolean useDecorators = true; + private static final String USESEGMENTS = "RxJava2.useSegments"; + private static final String USEDECORATORS = "RxJava2.useDecorators"; + private static final String COMPLETABLE_IGNORES = "RxJava2.Completable.ignores"; + private static final String FLOWABLE_IGNORES = "RxJava2.Flowable.ignores"; + private static final String MAYBE_IGNORES = "RxJava2.Maybe.ignores"; + private static final String OBSERVABLE_IGNORES = "RxJava2.Observable.ignores"; + private static final String SINGLE_IGNORES = "RxJava2.Single.ignores"; + private static Set completable_ignores = new HashSet<>(); + private static Set flowable_ignores = new HashSet<>(); + private static Set maybe_ignores = new HashSet<>(); + private static Set observable_ignores = new HashSet<>(); + private static Set single_ignores = new HashSet<>(); + + private static final Utils INSTANCE = new Utils(); + + private Utils() { + + } + + public static void init() { + boolean lockdown = RxJavaPlugins.isLockdown(); + + if (lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Wrappers because RxJavaPlugins is locked down"); + } else { + NRRunnableDecorator decorator; + Function f = RxJavaPlugins.getScheduleHandler(); + decorator = new NRRunnableDecorator(f); + RxJavaPlugins.setScheduleHandler(decorator); + ServiceFactory.getConfigService().addIAgentConfigListener(INSTANCE); + Config config = NewRelic.getAgent().getConfig(); + if (config != null) { + Boolean b = config.getValue(USESEGMENTS); + + if (b != null && b != useSegments) { + useSegments = b; + removeAssemblyDecorators(useSegments); + } + + b = config.getValue(USEDECORATORS); + if(b != null && b != useDecorators) { + useDecorators = b; + removeSubscribeDecorators(useDecorators); + } + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useSegments is set to {0}", useSegments); + NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useDecorators is set to {0}", useDecorators); + addSubscribeDecorators(useDecorators); + addAssemblyDecorators(useSegments); + + String ignores = config.getValue(COMPLETABLE_IGNORES); + completable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + completable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore completables with these names: {0}", completable_ignores); + } + ignores = config.getValue(FLOWABLE_IGNORES); + flowable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + flowable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore flowables with these names: {0}", flowable_ignores); + } + ignores = config.getValue(MAYBE_IGNORES); + maybe_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + maybe_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore maybes with these names: {0}", maybe_ignores); + } + ignores = config.getValue(OBSERVABLE_IGNORES); + observable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + observable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore observables with these names: {0}", observable_ignores); + } + ignores = config.getValue(SINGLE_IGNORES); + single_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + single_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore singles with these names: {0}", single_ignores); + } + + + } + initialized = true; + } + + public static Set getCompletableIgnores() { + return completable_ignores; + } + + public static Set getFlowableIgnores() { + return flowable_ignores; + } + + public static Set getMaybeIgnores() { + return maybe_ignores; + } + + public static Set getObservableIgnores() { + return observable_ignores; + } + + public static Set getSingleIgnores() { + return single_ignores; + } + + private static void addAssemblyDecorators(boolean add) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(add) { + RxJavaPlugins.setOnSingleAssembly(new NRSingleAssembly()); + RxJavaPlugins.setOnFlowableAssembly(new NRFlowableAssembly()); + RxJavaPlugins.setOnCompletableAssembly(new NRCompletableAssembly()); + RxJavaPlugins.setOnMaybeAssembly(new NRMaybeAssembly()); + RxJavaPlugins.setOnObservableAssembly(new NRObservableAssembly()); + } + } + + private static void addSubscribeDecorators(boolean add) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(add) { + RxJavaPlugins.setOnObservableSubscribe(new NRObservableSubWrapper(null)); + RxJavaPlugins.setOnSingleSubscribe(new NRSingleSubWrapper(null)); + RxJavaPlugins.setOnCompletableSubscribe(new NRCompletableSubWrapper(null)); + RxJavaPlugins.setOnFlowableSubscribe(new NRFlowableSubWrapper(null)); + RxJavaPlugins.setOnMaybeSubscribe(new NRMaybeSubWrapper(null)); + } + } + + @SuppressWarnings("rawtypes") + public static void removeAssemblyDecorators(boolean remove) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava2 Assembly descorators because RxJavaPlugins is locked down"); + return; + } + if(remove) { + Function fSingle = RxJavaPlugins.getOnSingleAssembly(); + if(fSingle != null) { + if(fSingle instanceof NRSingleAssembly) { + NRSingleAssembly singleAssembly = (NRSingleAssembly)fSingle; + Function delegate = singleAssembly.getDelegate(); + RxJavaPlugins.setOnSingleAssembly(delegate); + } + } + Function fCompletable = RxJavaPlugins.getOnCompletableAssembly(); + if(fCompletable != null) { + if(fCompletable instanceof NRCompletableAssembly) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)fCompletable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnCompletableAssembly(delegate); + } + } + Function fFlowable = RxJavaPlugins.getOnFlowableAssembly(); + if(fFlowable != null) { + if(fFlowable instanceof NRFlowableAssembly) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)fFlowable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnFlowableAssembly(delegate); + } + } + Function fMaybe = RxJavaPlugins.getOnMaybeAssembly(); + if(fMaybe != null) { + if(fMaybe instanceof NRMaybeAssembly) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)fMaybe; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnMaybeAssembly(delegate); + } + } + Function fObservable = RxJavaPlugins.getOnObservableAssembly(); + if(fObservable != null) { + if(fObservable instanceof NRObservableAssembly) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)fObservable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnObservableAssembly(delegate); + } + } + } + } + + @SuppressWarnings("rawtypes") + private static void removeSubscribeDecorators(boolean remove) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(remove) { + BiFunction fComp = RxJavaPlugins.getOnCompletableSubscribe(); + if(fComp != null) { + if(fComp instanceof NRCompletableSubWrapper) { + NRCompletableSubWrapper wrapper = (NRCompletableSubWrapper)fComp; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnCompletableSubscribe(delegate); + + } + } + BiFunction fFlow = RxJavaPlugins.getOnFlowableSubscribe(); + if(fFlow != null) { + if(fFlow instanceof NRFlowableSubWrapper) { + NRFlowableSubWrapper wrapper = (NRFlowableSubWrapper)fFlow; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnFlowableSubscribe(delegate); + } + } + BiFunction fMaybe = RxJavaPlugins.getOnMaybeSubscribe(); + if(fMaybe != null) { + if(fMaybe instanceof NRMaybeSubWrapper) { + NRMaybeSubWrapper wrapper = (NRMaybeSubWrapper)fMaybe; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnMaybeSubscribe(delegate); + } + } + BiFunction fObs = RxJavaPlugins.getOnObservableSubscribe(); + if(fObs != null) { + if(fObs instanceof NRObservableSubWrapper) { + NRObservableSubWrapper wrapper = (NRObservableSubWrapper)fObs; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnObservableSubscribe(delegate); + } + } + BiFunction fSingle = RxJavaPlugins.getOnSingleSubscribe(); + if(fSingle != null) { + if(fSingle instanceof NRSingleSubWrapper) { + NRSingleSubWrapper wrapper = (NRSingleSubWrapper)fSingle; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnSingleSubscribe(delegate); + } + } + } + } + + + @Override + public void configChanged(String appName, AgentConfig agentConfig) { + Boolean b = agentConfig.getValue(USESEGMENTS); + if(b != null && b != useSegments) { + useSegments = b; + removeSubscribeDecorators(!useSegments); + addSubscribeDecorators(useSegments); + } + if(useSegments) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Will use segments for RxJava objects"); + } else { + NewRelic.getAgent().getLogger().log(Level.INFO, "Will not use segments for RxJava objects"); + } + String ignores = agentConfig.getValue(COMPLETABLE_IGNORES); + completable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + completable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(FLOWABLE_IGNORES); + flowable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + flowable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(MAYBE_IGNORES); + maybe_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + maybe_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(OBSERVABLE_IGNORES); + observable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + observable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(SINGLE_IGNORES); + single_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + single_ignores.addAll(Arrays.asList(splits)); + } + + } + +} diff --git a/rxjava2-2.0.7/src/main/java/io/reactivex/Completable.java b/rxjava2-2.0.7/src/main/java/io/reactivex/Completable.java new file mode 100644 index 0000000..8c11e59 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/io/reactivex/Completable.java @@ -0,0 +1,13 @@ +package io.reactivex; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; + +@Weave(type=MatchType.BaseClass) +public abstract class Completable implements CompletableSource { + + @NewField + public String completableName = null; + +} diff --git a/rxjava2-2.0.7/src/main/java/io/reactivex/Flowable.java b/rxjava2-2.0.7/src/main/java/io/reactivex/Flowable.java new file mode 100644 index 0000000..1410ecd --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/io/reactivex/Flowable.java @@ -0,0 +1,15 @@ +package io.reactivex; + +import org.reactivestreams.Publisher; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; + +@Weave(type=MatchType.BaseClass) +public abstract class Flowable implements Publisher { + + @NewField + public String flowableName = null; + +} diff --git a/rxjava2-2.0.7/src/main/java/io/reactivex/Maybe.java b/rxjava2-2.0.7/src/main/java/io/reactivex/Maybe.java new file mode 100644 index 0000000..0f0765c --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/io/reactivex/Maybe.java @@ -0,0 +1,12 @@ +package io.reactivex; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; + +@Weave(type=MatchType.BaseClass) +public abstract class Maybe implements MaybeSource { + + @NewField + public String maybeName = null; +} diff --git a/rxjava2-2.0.7/src/main/java/io/reactivex/Observable.java b/rxjava2-2.0.7/src/main/java/io/reactivex/Observable.java new file mode 100644 index 0000000..841a8a7 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/io/reactivex/Observable.java @@ -0,0 +1,13 @@ +package io.reactivex; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; + +@Weave(type=MatchType.BaseClass) +public abstract class Observable implements ObservableSource { + + @NewField + public String observableName = null; + +} diff --git a/rxjava2-2.0.7/src/main/java/io/reactivex/Single.java b/rxjava2-2.0.7/src/main/java/io/reactivex/Single.java new file mode 100644 index 0000000..b859fd9 --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/io/reactivex/Single.java @@ -0,0 +1,19 @@ +package io.reactivex; + +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; + +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; + +@Weave(type=MatchType.BaseClass) +public abstract class Single implements SingleSource { + + @NewField + public String singleName = null; + + public abstract Single doOnError(final Consumer onError) ; + public abstract Single doOnSubscribe(final Consumer onSubscribe); + public abstract Single doOnSuccess(final Consumer onSuccess); +} diff --git a/rxjava2-2.0.7/src/main/java/io/reactivex/plugins/RxJavaPlugins.java b/rxjava2-2.0.7/src/main/java/io/reactivex/plugins/RxJavaPlugins.java new file mode 100644 index 0000000..5b2c7ad --- /dev/null +++ b/rxjava2-2.0.7/src/main/java/io/reactivex/plugins/RxJavaPlugins.java @@ -0,0 +1,480 @@ +package io.reactivex.plugins; + +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; + +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRCompletableAssembly; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRCompletableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRFlowableAssembly; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRFlowableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRMaybeAssembly; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRMaybeSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRObservableAssembly; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRObservableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRRunnableDecorator; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRSingleAssembly; +import com.newrelic.instrumentation.labs.rxjava2_0_7.NRSingleSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2_0_7.Utils; + +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.Flowable; +import io.reactivex.Maybe; +import io.reactivex.MaybeObserver; +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.Single; +import io.reactivex.SingleObserver; +import io.reactivex.functions.BiFunction; +import io.reactivex.functions.Function; + +@SuppressWarnings("rawtypes") +@Weave +public abstract class RxJavaPlugins { + + + static volatile Function onScheduleHandler = Weaver.callOriginal(); + + static volatile BiFunction onObservableSubscribe = Weaver.callOriginal(); + + static volatile BiFunction onSingleSubscribe = Weaver.callOriginal(); + + static volatile BiFunction onCompletableSubscribe = Weaver.callOriginal(); + + static volatile BiFunction onFlowableSubscribe = Weaver.callOriginal(); + + static volatile BiFunction onMaybeSubscribe = Weaver.callOriginal(); + + static volatile Function onSingleAssembly = Weaver.callOriginal(); + + static volatile Function onFlowableAssembly = Weaver.callOriginal(); + + static volatile Function onCompletableAssembly = Weaver.callOriginal(); + + static volatile Function onMaybeAssembly = Weaver.callOriginal(); + + static volatile Function onObservableAssembly = Weaver.callOriginal(); + + public static boolean isLockdown() { + return Weaver.callOriginal(); + } + + public static Runnable onSchedule(Runnable run) { + if(!Utils.initialized) { + Utils.init(); + } + return Weaver.callOriginal(); + } + + public static void setScheduleHandler(Function handler) { + if(!(handler instanceof NRRunnableDecorator)) { + NRRunnableDecorator decorator = new NRRunnableDecorator(handler); + handler = decorator; + if(!Utils.initialized) Utils.initialized = true; + } + Weaver.callOriginal(); + } + + public static Function getScheduleHandler() { + return Weaver.callOriginal(); + } + + public static BiFunction getOnCompletableSubscribe() { + return Weaver.callOriginal(); + } + + public static BiFunction getOnFlowableSubscribe() { + return Weaver.callOriginal(); + } + + public static BiFunction getOnMaybeSubscribe() { + return Weaver.callOriginal(); + } + + public static BiFunction getOnObservableSubscribe() { + return Weaver.callOriginal(); + } + + public static BiFunction getOnSingleSubscribe() { + return Weaver.callOriginal(); + } + + public static Function getOnSingleAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnCompletableAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnFlowableAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnMaybeAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnObservableAssembly() { + return Weaver.callOriginal(); + } + + public static void setOnObservableAssembly(Function onObservableAssembly1) { + if(Utils.useSegments) { + if(onObservableAssembly != null) { + if(onObservableAssembly instanceof NRObservableAssembly) { + if(!(onObservableAssembly1 instanceof NRObservableAssembly)) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)onObservableAssembly; + nrAssembly.setDelegate(nrAssembly); + onObservableAssembly1 = nrAssembly; + } + } else { + if(onObservableAssembly1 instanceof NRObservableAssembly) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)onObservableAssembly1; + nrAssembly.setDelegate(onObservableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnSingleAssembly(Function onSingleAssembly1) { + if(Utils.useSegments) { + if(onSingleAssembly != null) { + if(onSingleAssembly instanceof NRSingleAssembly) { + if(!(onSingleAssembly1 instanceof NRSingleAssembly)) { + NRSingleAssembly nrAssembly = (NRSingleAssembly)onSingleAssembly; + nrAssembly.setDelegate(onSingleAssembly1); + onSingleAssembly1 = nrAssembly; + } + } else { + if(onSingleAssembly1 instanceof NRSingleAssembly) { + NRSingleAssembly nrAssembly = (NRSingleAssembly)onSingleAssembly1; + nrAssembly.setDelegate(onSingleAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnMaybeAssembly(Function onMaybeAssembly1) { + if(Utils.useSegments) { + if(onMaybeAssembly != null) { + if(onMaybeAssembly instanceof NRMaybeAssembly) { + if(!(onMaybeAssembly1 instanceof NRMaybeAssembly)) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)onMaybeAssembly; + nrAssembly.setDelegate(onMaybeAssembly1); + onMaybeAssembly1 = nrAssembly; + } + } else { + if(onMaybeAssembly1 instanceof NRMaybeAssembly) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)onMaybeAssembly1; + nrAssembly.setDelegate(onMaybeAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnCompletableAssembly(Function onCompletableAssembly1) { + if(Utils.useSegments) { + if(onCompletableAssembly != null) { + if(onCompletableAssembly instanceof NRCompletableAssembly) { + if(!(onCompletableAssembly1 instanceof NRCompletableAssembly)) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)onCompletableAssembly; + nrAssembly.setDelegate(onCompletableAssembly1); + onCompletableAssembly1 = nrAssembly; + } + } else { + if(onCompletableAssembly1 instanceof NRCompletableAssembly) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)onCompletableAssembly1; + nrAssembly.setDelegate(onCompletableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnFlowableAssembly(Function onFlowableAssembly1) { + if(Utils.useSegments) { + if(onFlowableAssembly != null) { + if(onFlowableAssembly instanceof NRFlowableAssembly) { + if(!(onFlowableAssembly1 instanceof NRFlowableAssembly)) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)onFlowableAssembly; + nrAssembly.setDelegate(onFlowableAssembly1); + onFlowableAssembly1 = nrAssembly; + } + } else { + if(onFlowableAssembly1 instanceof NRFlowableAssembly) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)onFlowableAssembly1; + nrAssembly.setDelegate(onFlowableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnMaybeSubscribe(BiFunction onMaybeSubscribe1) { + if (Utils.useSegments) { + // only have to manipulate if there is an existing function set + if (onMaybeSubscribe != null) { + if (onMaybeSubscribe instanceof NRMaybeSubWrapper) { + NRMaybeSubWrapper nr2_1 = (NRMaybeSubWrapper) onMaybeSubscribe; + if (onMaybeSubscribe1 instanceof NRMaybeSubWrapper) { + // if incoming and existing are NR then decide which delegate to use + NRMaybeSubWrapper nr2_2 = (NRMaybeSubWrapper) onMaybeSubscribe1; + BiFunction d1 = nr2_1.getDelegate(); + BiFunction d2 = nr2_2.getDelegate(); + if (d2 == null && d1 != null) { + nr2_2.setDelegate(d1); + } + + } else { + nr2_1.setDelegate(onMaybeSubscribe1); + onMaybeSubscribe1 = nr2_1; + } + } else { + if (onMaybeSubscribe1 instanceof NRMaybeSubWrapper) { + NRMaybeSubWrapper nr2_1 = (NRMaybeSubWrapper) onMaybeSubscribe1; + nr2_1.setDelegate(onMaybeSubscribe); + } + + } + } else { + // if not NR then wrap the incoming + if (!(onMaybeSubscribe1 instanceof NRMaybeSubWrapper)) { + NRMaybeSubWrapper nr = new NRMaybeSubWrapper(onMaybeSubscribe1); + onMaybeSubscribe1 = nr; + } + + } + } + Weaver.callOriginal(); + } + + public static void setOnObservableSubscribe(BiFunction onObservableSubscribe1) { + if (Utils.useSegments) { + // only have to manipulate if there is an existing function set + if(onObservableSubscribe != null) { + if(onObservableSubscribe instanceof NRObservableSubWrapper) { + NRObservableSubWrapper nr2_1 = (NRObservableSubWrapper)onObservableSubscribe; + if(onObservableSubscribe1 instanceof NRObservableSubWrapper) { + // if incoming and existing are NR then decide which delegate to use + NRObservableSubWrapper nr2_2 = (NRObservableSubWrapper)onObservableSubscribe1; + BiFunction d1 = nr2_1.getDelegate(); + BiFunction d2 = nr2_2.getDelegate(); + if(d2 == null && d1 != null) { + nr2_2.setDelegate(d1); + } + + } else { + nr2_1.setDelegate(onObservableSubscribe1); + onObservableSubscribe1 = nr2_1; + } + } else { + if(onObservableSubscribe1 instanceof NRObservableSubWrapper) { + NRObservableSubWrapper nr2_1 = (NRObservableSubWrapper)onObservableSubscribe1; + nr2_1.setDelegate(onObservableSubscribe); + } + + } + } else { + // if not NR then wrap the incoming + if(!(onObservableSubscribe1 instanceof NRObservableSubWrapper)) { + NRObservableSubWrapper nr = new NRObservableSubWrapper(onObservableSubscribe1); + onObservableSubscribe1 = nr; + } + + } + } + Weaver.callOriginal(); + } + + public static void setOnSingleSubscribe(BiFunction onSingleSubscribe1) { + if (Utils.useSegments) { + // only have to manipulate if there is an existing function set + if(onSingleSubscribe != null) { + if(onSingleSubscribe instanceof NRSingleSubWrapper) { + NRSingleSubWrapper nr2_1 = (NRSingleSubWrapper)onSingleSubscribe; + if(onSingleSubscribe1 instanceof NRSingleSubWrapper) { + // if incoming and existing are NR then decide which delegate to use + NRSingleSubWrapper nr2_2 = (NRSingleSubWrapper)onSingleSubscribe1; + BiFunction d1 = nr2_1.getDelegate(); + BiFunction d2 = nr2_2.getDelegate(); + if(d2 == null && d1 != null) { + nr2_2.setDelegate(d1); + } + + } else { + nr2_1.setDelegate(onSingleSubscribe1); + onSingleSubscribe1 = nr2_1; + } + } else { + if(onSingleSubscribe1 instanceof NRSingleSubWrapper) { + NRSingleSubWrapper nr2_1 = (NRSingleSubWrapper)onSingleSubscribe1; + nr2_1.setDelegate(onSingleSubscribe); + } + + } + } else { + // if not NR then wrap the incoming + if(!(onSingleSubscribe1 instanceof NRSingleSubWrapper)) { + NRSingleSubWrapper nr = new NRSingleSubWrapper(onSingleSubscribe1); + onSingleSubscribe1 = nr; + } + + } + } + Weaver.callOriginal(); + + } + + public static void setOnCompletableSubscribe(BiFunction onCompletableSubscribe1) { + if (Utils.useSegments) { + // only have to manipulate if there is an existing function set + if(onCompletableSubscribe != null) { + if(onCompletableSubscribe instanceof NRCompletableSubWrapper) { + NRCompletableSubWrapper nr2_1 = (NRCompletableSubWrapper)onCompletableSubscribe; + if(onCompletableSubscribe1 instanceof NRCompletableSubWrapper) { + // if incoming and existing are NR then decide which delegate to use + NRCompletableSubWrapper nr2_2 = (NRCompletableSubWrapper)onCompletableSubscribe1; + BiFunction d1 = nr2_1.getDelegate(); + BiFunction d2 = nr2_2.getDelegate(); + if(d2 == null && d1 != null) { + nr2_2.setDelegate(d1); + } + + } else { + nr2_1.setDelegate(onCompletableSubscribe1); + onCompletableSubscribe1 = nr2_1; + } + } else { + if(onCompletableSubscribe1 instanceof NRCompletableSubWrapper) { + NRCompletableSubWrapper nr2_1 = (NRCompletableSubWrapper)onCompletableSubscribe1; + nr2_1.setDelegate(onCompletableSubscribe); + } + + } + } else { + // if not NR then wrap the incoming + if(!(onCompletableSubscribe1 instanceof NRCompletableSubWrapper)) { + NRCompletableSubWrapper nr = new NRCompletableSubWrapper(onCompletableSubscribe1); + onCompletableSubscribe1 = nr; + } + + } + } + Weaver.callOriginal(); + } + + public static void setOnFlowableSubscribe(BiFunction onFlowableSubscribe1) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to RxJavaPlugins.setOnFlowableSubscribe({0})", onFlowableSubscribe1); + if (Utils.useSegments) { + // only have to manipulate if there is an existing function set + if(onFlowableSubscribe != null) { + NewRelic.getAgent().getLogger().log(Level.FINE, "In RxJavaPlugins.setOnFlowableSubscribe, the value of onFlowableSubscribe has already been set to {0}", onFlowableSubscribe); + if(onFlowableSubscribe instanceof NRFlowableSubWrapper) { + NRFlowableSubWrapper nr2_1 = (NRFlowableSubWrapper)onFlowableSubscribe; + if(onFlowableSubscribe1 instanceof NRFlowableSubWrapper) { + // if incoming and existing are NR then decide which delegate to use + NRFlowableSubWrapper nr2_2 = (NRFlowableSubWrapper)onFlowableSubscribe1; + BiFunction d1 = nr2_1.getDelegate(); + BiFunction d2 = nr2_2.getDelegate(); + if(d2 == null && d1 != null) { + nr2_2.setDelegate(d1); + } + + } else { + nr2_1.setDelegate(onFlowableSubscribe1); + onFlowableSubscribe1 = nr2_1; + } + } else { + if(onFlowableSubscribe1 instanceof NRFlowableSubWrapper) { + NRFlowableSubWrapper nr2_1 = (NRFlowableSubWrapper)onFlowableSubscribe1; + nr2_1.setDelegate(onFlowableSubscribe); + } + + } + } else { + // if not NR then wrap the incoming + if(!(onFlowableSubscribe1 instanceof NRFlowableSubWrapper)) { + NewRelic.getAgent().getLogger().log(Level.FINE, "In RxJavaPlugins.setOnFlowableSubscribe, the value of onFlowableSubscribe has not been set, wrapping with NNRFlowableSubWrapper, {0}", onFlowableSubscribe1); + NRFlowableSubWrapper nr = new NRFlowableSubWrapper(onFlowableSubscribe1); + onFlowableSubscribe1 = nr; + } else { + NewRelic.getAgent().getLogger().log(Level.FINE, "In RxJavaPlugins.setOnFlowableSubscribe, the value of onFlowableSubscribe has not been set and input is NRFlowableSubWrapper"); + } + + } + } + Weaver.callOriginal(); + } + + public static Observable onAssembly(Observable source) { + if(!Utils.initialized) { + Utils.init(); + } + Observable observable = Weaver.callOriginal(); + if(observable.observableName == null) { + observable.observableName = source.getClass().getSimpleName(); + } + + return observable; + } + + public static Single onAssembly(Single source) { + if(!Utils.initialized) { + Utils.init(); + } + Single single = Weaver.callOriginal(); + if(single.singleName == null) { + single.singleName = source.singleName != null ? source.singleName : source.getClass().getName(); + } + + return single; + } + + public static Completable onAssembly(Completable source) { + if(!Utils.initialized) { + Utils.init(); + } + Completable completable = Weaver.callOriginal(); + if(completable.completableName == null) { + completable.completableName = source.getClass().getSimpleName(); + } + + return completable; + } + + public static Flowable onAssembly(Flowable source) { + if(!Utils.initialized) { + Utils.init(); + } + Flowable flowable = Weaver.callOriginal(); + if(flowable.flowableName == null) { + flowable.flowableName = source.flowableName != null ? source.flowableName : source.getClass().getSimpleName(); + } + return flowable; + } + + public static Maybe onAssembly(Maybe source) { + if(!Utils.initialized) { + Utils.init(); + } + Maybe maybe = Weaver.callOriginal(); + if(maybe.maybeName == null) { + maybe.maybeName = source.getClass().getSimpleName(); + } + + return maybe; + } +} diff --git a/rxjava2-2.0/build.gradle b/rxjava2-2.0/build.gradle index 45423d5..5db148b 100644 --- a/rxjava2-2.0/build.gradle +++ b/rxjava2-2.0/build.gradle @@ -9,8 +9,6 @@ dependencies { // New Relic Java Agent dependencies - implementation 'com.newrelic.agent.java:newrelic-agent:6.0.0' - implementation 'com.newrelic.agent.java:newrelic-api:6.0.0' implementation fileTree(include: ['*.jar'], dir: '../libs') testImplementation 'junit:junit:4.12' @@ -19,14 +17,14 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava2-2.0' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' - attributes 'Implementation-Version': 1.0 + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava2-2.0' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 2.0 } } verifyInstrumentation { - passes 'io.reactivex.rxjava2:rxjava:[2.0.0,)' + passes 'io.reactivex.rxjava2:rxjava:[2.0.0,2.0.7)' excludeRegex '.*RC[0-9]' } \ No newline at end of file diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCancelAction.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCancelAction.java new file mode 100644 index 0000000..59e65f9 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCancelAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.functions.Action; + +public class NRCancelAction implements Action { + + private NRRxJava2Holder holder = null; + + public NRCancelAction(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.ignoreSegment(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableAssembly.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableAssembly.java new file mode 100644 index 0000000..acbc78f --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableAssembly.java @@ -0,0 +1,55 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Completable; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.completable.CompletablePeek; + +public class NRCompletableAssembly implements Function { + + private static final String FROM_PREFIX = "CompletableFrom"; + private static final String INTERVAL_PREFIX = "CompletableInterval"; + private static final String NEVER = "CompletableNever"; + + private Function delegate = null; + + public NRCompletableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Completable apply(Completable t) throws Exception { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getCompletableIgnores().contains(simpleName)) return t; + if(t.completableName == null) { + t.completableName = simpleName; + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Completable",t.completableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + + Completable result = delegate != null ? delegate.apply(t) : t; + + Completable subscribe = new CompletablePeek(result, disposableConsumer, errorConsumer, completeAction, terminationAction, Functions.EMPTY_ACTION,Functions.EMPTY_ACTION); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableObserver.java new file mode 100644 index 0000000..0f53000 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableObserver.java @@ -0,0 +1,57 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.CompletableObserver; +import io.reactivex.disposables.Disposable; + +public class NRCompletableObserver implements CompletableObserver { + + private CompletableObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRCompletableObserver(CompletableObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Completable",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Completable",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Completable",name,"onError"); + if(downstream != null) { + downstream.onComplete(); + } + } + + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableSubWrapper.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableSubWrapper.java new file mode 100644 index 0000000..ccef262 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompletableSubWrapper.java @@ -0,0 +1,31 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.functions.BiFunction; + +public class NRCompletableSubWrapper implements BiFunction { + + private BiFunction delegate = null; + + public NRCompletableSubWrapper(BiFunction d) { + delegate = d; + } + + @Override + public CompletableObserver apply(Completable t1, CompletableObserver t2) throws Exception { + if(delegate == null) { + return t2 instanceof NRCompletableObserver ? t2 : new NRCompletableObserver(t2, t1.completableName != null ? t1.completableName : t1.getClass().getSimpleName()); + } + CompletableObserver actual = delegate.apply(t1, t2); + return t2 instanceof NRCompletableObserver ? actual : new NRCompletableObserver(actual, t1.completableName != null ? t1.completableName : t1.getClass().getSimpleName()); + } + + public BiFunction getDelegate() { + return delegate; + } + + public void setDelegate( BiFunction d) { + delegate = d; + } +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompleteAction.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompleteAction.java new file mode 100644 index 0000000..ae60ba0 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRCompleteAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.functions.Action; + +public class NRCompleteAction implements Action { + + private NRRxJava2Holder holder = null; + + public NRCompleteAction(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.endSegment(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRDisposableConsumer.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRDisposableConsumer.java new file mode 100644 index 0000000..366fcd5 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRDisposableConsumer.java @@ -0,0 +1,30 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Trace; + +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; + +public class NRDisposableConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + private static boolean isTransformed = false; + + public NRDisposableConsumer(NRRxJava2Holder h) { + holder = h; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + } + + @Override + @Trace(async = true) + public void accept(Disposable t) throws Exception { + if(holder != null) { + holder.startSegment(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRErrorConsumer.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRErrorConsumer.java new file mode 100644 index 0000000..827434b --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRErrorConsumer.java @@ -0,0 +1,25 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.functions.Consumer; + +public class NRErrorConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRErrorConsumer( NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(Throwable t) throws Exception { + NewRelic.noticeError(t); + if(holder != null) { + holder.ignoreSegment(); + holder.expireToken(); + holder = null; + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableAssembly.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableAssembly.java new file mode 100644 index 0000000..1ca1584 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableAssembly.java @@ -0,0 +1,59 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Flowable; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.flowable.FlowableDoOnEach; +import io.reactivex.internal.operators.flowable.FlowableDoOnLifecycle; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NRFlowableAssembly implements Function { + + private static final String FROM_PREFIX = "FlowableFrom"; + private static final String INTERVAL_PREFIX = "FlowableInterval"; + private static final String NEVER = "FlowableNever"; + + private Function delegate = null; + + public NRFlowableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Flowable apply(Flowable t) throws Exception { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getFlowableIgnores().contains(simpleName)) return t; + if(t.flowableName == null) { + t.flowableName = simpleName; + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Flowable",t.flowableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRNextConsumer nextConsumer = new NRNextConsumer<>(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRSubscriberConsumer subscribeConsumer = new NRSubscriberConsumer(holder); + NRCancelAction cancelAction = new NRCancelAction(holder); + + Flowable result = delegate != null ? delegate.apply(t) : t; + Flowable result2 = new FlowableDoOnEach(result,nextConsumer,errorConsumer,completeAction,terminationAction); + Flowable subscribe = new FlowableDoOnLifecycle<>(result2, subscribeConsumer, Functions.EMPTY_LONG_CONSUMER, cancelAction); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableObserver.java new file mode 100644 index 0000000..ef659ed --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableObserver.java @@ -0,0 +1,97 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.Transaction; + +public class NRFlowableObserver implements Subscriber { + + private Subscriber downstream; + + private String name = null; + private Transaction transaction = null; + + private static boolean isTransformed = false; + + public NRFlowableObserver(Subscriber downstream, String n, Transaction txn) { + transaction = txn; + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Subscription s) { + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onSubscribe"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onSubscribe"); + } + + if(downstream != null) { + downstream.onSubscribe(s); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.noticeError(e); + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onError"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onError"); + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",downstream,name); + if (downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onComplete"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onComplete"); + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserve2.onComplete with subscriber {0}, name {1}",downstream,name); + if (downstream != null) { + downstream.onComplete(); + } + } + + @Override + @Trace(async = true) + public void onNext(T t) { + Token token = transaction.getToken(); + if(token != null && token.isActive()) { + token.linkAndExpire(); + } else if(token != null) { + token.expire(); + } + token = null; + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber",name,"onNext"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Flowable","Subscriber","UnNamed_Flowable","onNext"); + } + if (downstream != null) { + downstream.onNext(t); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableSubWrapper.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableSubWrapper.java new file mode 100644 index 0000000..9e1bd4a --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRFlowableSubWrapper.java @@ -0,0 +1,37 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import org.reactivestreams.Subscriber; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Flowable; +import io.reactivex.functions.BiFunction; + +@SuppressWarnings("rawtypes") +public class NRFlowableSubWrapper implements BiFunction { + + private BiFunction delegate = null; + + public NRFlowableSubWrapper(BiFunction d) { + delegate = d; + } + + @SuppressWarnings("unchecked") + @Override + public Subscriber apply(Flowable t1, Subscriber t2) throws Exception { + + if(delegate == null) { + return t2 instanceof NRFlowableObserver ? t2 : new NRFlowableObserver(t2, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName(),NewRelic.getAgent().getTransaction()); + } + Subscriber actual = delegate.apply(t1, t2); + return t2 instanceof NRFlowableObserver ? actual : new NRFlowableObserver(actual, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName(), NewRelic.getAgent().getTransaction()); + } + + public BiFunction getDelegate() { + return delegate; + } + + public void setDelegate( BiFunction d) { + delegate = d; + } +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeAssembly.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeAssembly.java new file mode 100644 index 0000000..958aa84 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeAssembly.java @@ -0,0 +1,48 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Maybe; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.maybe.MaybePeek; + +@SuppressWarnings({"rawtypes", "unchecked"}) +public class NRMaybeAssembly implements Function { + + private Function delegate = null; + + public NRMaybeAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Maybe apply(Maybe t) throws Exception { + if(Utils.useSegments) { + if(t.maybeName == null) { + t.maybeName = t.getClass().getSimpleName(); + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Maybe",t.maybeName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + NRSuccessConsumer successConsumer = new NRSuccessConsumer<>(holder); + + Maybe result = delegate != null ? delegate.apply(t) : t; + + Maybe subscribe = new MaybePeek(result, disposableConsumer,successConsumer, errorConsumer, completeAction, terminationAction,Functions.EMPTY_ACTION); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeObserver.java new file mode 100644 index 0000000..6865b99 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeObserver.java @@ -0,0 +1,65 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.MaybeObserver; +import io.reactivex.disposables.Disposable; + +public class NRMaybeObserver implements MaybeObserver { + + private MaybeObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRMaybeObserver(MaybeObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onComplete"); + if(downstream != null) { + downstream.onComplete(); + } + } + + @Override + @Trace + public void onSuccess(T value) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Maybe",name,"onSuccess"); + if(downstream != null) { + downstream.onSuccess(value); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeSubWrapper.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeSubWrapper.java new file mode 100644 index 0000000..f1c590d --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRMaybeSubWrapper.java @@ -0,0 +1,35 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.Maybe; +import io.reactivex.MaybeObserver; +import io.reactivex.functions.BiFunction; + +@SuppressWarnings("rawtypes") +public class NRMaybeSubWrapper implements BiFunction { + + private BiFunction delegate = null; + + public NRMaybeSubWrapper(BiFunction d) { + delegate = d; + } + + @SuppressWarnings("unchecked") + @Override + public MaybeObserver apply(Maybe t1, MaybeObserver t2) throws Exception { + if(delegate == null) { + return t2 instanceof NRMaybeObserver ? t2 : new NRMaybeObserver(t2, t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); + } + MaybeObserver actual = delegate.apply(t1, t2); + + return t2 instanceof NRMaybeObserver ? actual : new NRMaybeObserver(actual,t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); + } + + public BiFunction getDelegate() { + return delegate; + } + + public void setDelegate( BiFunction d) { + delegate = d; + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRNextConsumer.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRNextConsumer.java new file mode 100644 index 0000000..ae455b2 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRNextConsumer.java @@ -0,0 +1,20 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.functions.Consumer; + +public class NRNextConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRNextConsumer(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(T t) throws Exception { + if(holder != null) { + holder.linkToken(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableAssembly.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableAssembly.java new file mode 100644 index 0000000..e05d452 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableAssembly.java @@ -0,0 +1,58 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Observable; +import io.reactivex.functions.Function; +import io.reactivex.internal.functions.Functions; +import io.reactivex.internal.operators.observable.ObservableDoOnEach; +import io.reactivex.internal.operators.observable.ObservableDoOnLifecycle; + +@SuppressWarnings({"rawtypes","unchecked"}) +public class NRObservableAssembly implements Function { + + private Function delegate = null; + private static final String FROM_PREFIX = "ObservableFrom"; + private static final String INTERVAL_PREFIX = "ObservableInterval"; + private static final String NEVER = "ObservableNever"; + + public NRObservableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Observable apply(Observable t) throws Exception { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getObservableIgnores().contains(simpleName)) return t; + + if(t.observableName == null) { + t.observableName = simpleName; + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Observable",t.observableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRNextConsumer nextConsumer = new NRNextConsumer<>(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + Observable result = delegate != null ? delegate.apply(t) : t; + + Observable subscribe = new ObservableDoOnLifecycle<>(result, disposableConsumer, Functions.EMPTY_ACTION); + Observable result2 = new ObservableDoOnEach(subscribe, nextConsumer, errorConsumer, completeAction, terminationAction); + return result2; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableObserver.java new file mode 100644 index 0000000..28a9ace --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableObserver.java @@ -0,0 +1,65 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.Observer; +import io.reactivex.disposables.Disposable; + +public class NRObservableObserver implements Observer { + + private Observer downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRObservableObserver(Observer downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onNext(T t) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onNext"); + if(downstream != null) { + downstream.onNext(t); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Observable",name,"onComplete"); + if(downstream != null) { + downstream.onComplete(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableSubWrapper.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableSubWrapper.java new file mode 100644 index 0000000..8c4d8bf --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRObservableSubWrapper.java @@ -0,0 +1,35 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.functions.BiFunction; + +@SuppressWarnings("rawtypes") +public class NRObservableSubWrapper implements BiFunction { + + private BiFunction delegate = null; + + public NRObservableSubWrapper(BiFunction d) { + delegate = d; + } + + @SuppressWarnings("unchecked") + @Override + public Observer apply(Observable t1, Observer t2) throws Exception { + if(delegate == null) { + return t2 instanceof NRObservableObserver ? t2 : new NRObservableObserver(t2, t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); + } + Observer actual = delegate.apply(t1, t2); + + return t2 instanceof NRObservableObserver ? actual : new NRObservableObserver(actual,t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); + } + + public BiFunction getDelegate() { + return delegate; + } + + public void setDelegate( BiFunction d) { + delegate = d; + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRRunnable.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java similarity index 94% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRRunnable.java rename to rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java index ecce1ba..ce18658 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRRunnable.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava2; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRRunnableDecorator.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java similarity index 94% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRRunnableDecorator.java rename to rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java index 8fdd948..189e33d 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRRunnableDecorator.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava2; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Token; diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJava2Holder.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJava2Holder.java new file mode 100644 index 0000000..0f47fae --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJava2Holder.java @@ -0,0 +1,78 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Transaction; + +public class NRRxJava2Holder { + + private Segment segment = null; + private String name = null; + private String rxType = "Unknown"; + private Transaction transaction = null; + private Token token = null; + + public NRRxJava2Holder(String type, String n, Transaction txn) { + name = n; + transaction = txn; + if(type != null && !type.isEmpty()) { + rxType = type; + } + Token t = transaction.getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + + public void startSegment() { + segment = transaction.startSegment("RxJava2/"+rxType+"/TotalTime",name); + } + + public void linkToken() { + if(token != null) { + token.link(); + } + } + + public void linkAndExpireToken() { + if(token != null) { + token.linkAndExpire(); + token = null; + } + } + + public void expireToken() { + if(token != null) { + token.expire(); + token = null; + } + } + + public void endSegment() { + if(segment != null) { + segment.end(); + segment = null; + } + } + + public void ignoreSegment() { + if(segment != null) { + segment.ignore(); + segment = null; + } + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return new String("NRRxJavaHolder:{rxType = "+rxType + ", name = "+name+"}"); + } + + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleAssembly.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleAssembly.java new file mode 100644 index 0000000..1293d5f --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleAssembly.java @@ -0,0 +1,48 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Single; +import io.reactivex.functions.Function; +import io.reactivex.internal.operators.single.SingleDoOnError; +import io.reactivex.internal.operators.single.SingleDoOnSubscribe; +import io.reactivex.internal.operators.single.SingleDoOnSuccess; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NRSingleAssembly implements Function { + + private Function delegate = null; + + public NRSingleAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Single apply(Single t) throws Exception { + if(Utils.useSegments) { + if(t.singleName == null) { + t.singleName = t.getClass().getSimpleName(); + } + NRRxJava2Holder holder = new NRRxJava2Holder<>("Single",t.singleName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRDisposableConsumer disposeConsumer = new NRDisposableConsumer(holder); + NRSuccessConsumer sucessConsumer = new NRSuccessConsumer<>(holder); + Single result = delegate != null ? delegate.apply(t) : t; + Single error = new SingleDoOnError<>(result, errorConsumer); + Single success = new SingleDoOnSuccess<>(error, sucessConsumer); + Single subscribe = new SingleDoOnSubscribe<>(success, disposeConsumer); + + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleObserver.java new file mode 100644 index 0000000..626eabb --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleObserver.java @@ -0,0 +1,57 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; + +public class NRSingleObserver implements SingleObserver { + + private SingleObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRSingleObserver(SingleObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Single",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Single",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onSuccess(T value) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava2","Single",name,"onSuccess"); + if(downstream != null) { + downstream.onSuccess(value); + } + } + + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleSubWrapper.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleSubWrapper.java similarity index 70% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleSubWrapper.java rename to rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleSubWrapper.java index a8e3f5b..06e74eb 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleSubWrapper.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSingleSubWrapper.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava2; import io.reactivex.Single; import io.reactivex.SingleObserver; @@ -17,10 +17,10 @@ public NRSingleSubWrapper(BiFunction d) @Override public SingleObserver apply(Single t1, SingleObserver t2) throws Exception { if(delegate == null) { - return t2 instanceof NRSingleObserver2 ? t2 : new NRSingleObserver2(t2, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); + return t2 instanceof NRSingleObserver ? t2 : new NRSingleObserver(t2, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); } SingleObserver actual = delegate.apply(t1, t2); - return t2 instanceof NRSingleObserver2 ? actual : new NRSingleObserver2(actual, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); + return t2 instanceof NRSingleObserver ? actual : new NRSingleObserver(actual, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); } public BiFunction getDelegate() { diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSubscriberConsumer.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSubscriberConsumer.java new file mode 100644 index 0000000..57c0194 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSubscriberConsumer.java @@ -0,0 +1,22 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import org.reactivestreams.Subscription; + +import io.reactivex.functions.Consumer; + +public class NRSubscriberConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRSubscriberConsumer(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(Subscription subscription) throws Exception { + if(holder != null) { + holder.startSegment(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSuccessConsumer.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSuccessConsumer.java new file mode 100644 index 0000000..4ca7955 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRSuccessConsumer.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.functions.Consumer; + +public class NRSuccessConsumer implements Consumer { + + private NRRxJava2Holder holder = null; + + public NRSuccessConsumer(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void accept(T t) throws Exception { + if(holder != null) { + holder.endSegment(); + holder.expireToken(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRTerminationAction.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRTerminationAction.java new file mode 100644 index 0000000..521fa44 --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRTerminationAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import io.reactivex.functions.Action; + +public class NRTerminationAction implements Action { + + private NRRxJava2Holder holder = null; + + public NRTerminationAction(NRRxJava2Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.ignoreSegment(); + } + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/Utils.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/Utils.java new file mode 100644 index 0000000..baf0fee --- /dev/null +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/Utils.java @@ -0,0 +1,325 @@ +package com.newrelic.instrumentation.labs.rxjava2; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; + +import com.newrelic.agent.config.AgentConfig; +import com.newrelic.agent.config.AgentConfigListener; +import com.newrelic.agent.service.ServiceFactory; +import com.newrelic.api.agent.Config; +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.Completable; +import io.reactivex.CompletableObserver; +import io.reactivex.Flowable; +import io.reactivex.Maybe; +import io.reactivex.MaybeObserver; +import io.reactivex.Observable; +import io.reactivex.Observer; +import io.reactivex.Single; +import io.reactivex.SingleObserver; +import io.reactivex.functions.BiFunction; +import io.reactivex.functions.Function; +import io.reactivex.plugins.RxJavaPlugins; + +public class Utils implements AgentConfigListener { + + public static boolean initialized = false; + public static boolean useSegments = true; + public static boolean useDecorators = true; + private static final String USESEGMENTS = "RxJava2.useSegments"; + private static final String USEDECORATORS = "RxJava2.useDecorators"; + private static final String COMPLETABLE_IGNORES = "RxJava2.Completable.ignores"; + private static final String FLOWABLE_IGNORES = "RxJava2.Flowable.ignores"; + private static final String MAYBE_IGNORES = "RxJava2.Maybe.ignores"; + private static final String OBSERVABLE_IGNORES = "RxJava2.Observable.ignores"; + private static final String SINGLE_IGNORES = "RxJava2.Single.ignores"; + private static Set completable_ignores = new HashSet<>(); + private static Set flowable_ignores = new HashSet<>(); + private static Set maybe_ignores = new HashSet<>(); + private static Set observable_ignores = new HashSet<>(); + private static Set single_ignores = new HashSet<>(); + + private static final Utils INSTANCE = new Utils(); + + private Utils() { + + } + + public static void init() { + boolean lockdown = RxJavaPlugins.isLockdown(); + + if (lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Wrappers because RxJavaPlugins is locked down"); + } else { + NRRunnableDecorator decorator; + Function f = RxJavaPlugins.getScheduleHandler(); + decorator = new NRRunnableDecorator(f); + RxJavaPlugins.setScheduleHandler(decorator); + ServiceFactory.getConfigService().addIAgentConfigListener(INSTANCE); + Config config = NewRelic.getAgent().getConfig(); + if (config != null) { + Boolean b = config.getValue(USESEGMENTS); + + if (b != null && b != useSegments) { + useSegments = b; + removeAssemblyDecorators(useSegments); + } + + b = config.getValue(USEDECORATORS); + if(b != null && b != useDecorators) { + useDecorators = b; + removeSubscribeDecorators(useDecorators); + } + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useSegments is set to {0}", useSegments); + NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useDecorators is set to {0}", useDecorators); + addSubscribeDecorators(useDecorators); + addAssemblyDecorators(useSegments); + + String ignores = config.getValue(COMPLETABLE_IGNORES); + completable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + completable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore completables with these names: {0}", completable_ignores); + } + ignores = config.getValue(FLOWABLE_IGNORES); + flowable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + flowable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore flowables with these names: {0}", flowable_ignores); + } + ignores = config.getValue(MAYBE_IGNORES); + maybe_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + maybe_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore maybes with these names: {0}", maybe_ignores); + } + ignores = config.getValue(OBSERVABLE_IGNORES); + observable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + observable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore observables with these names: {0}", observable_ignores); + } + ignores = config.getValue(SINGLE_IGNORES); + single_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + single_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore singles with these names: {0}", single_ignores); + } + + + } + initialized = true; + } + + public static Set getCompletableIgnores() { + return completable_ignores; + } + + public static Set getFlowableIgnores() { + return flowable_ignores; + } + + public static Set getMaybeIgnores() { + return maybe_ignores; + } + + public static Set getObservableIgnores() { + return observable_ignores; + } + + public static Set getSingleIgnores() { + return single_ignores; + } + + private static void addAssemblyDecorators(boolean add) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(add) { + RxJavaPlugins.setOnSingleAssembly(new NRSingleAssembly()); + RxJavaPlugins.setOnFlowableAssembly(new NRFlowableAssembly()); + RxJavaPlugins.setOnCompletableAssembly(new NRCompletableAssembly()); + RxJavaPlugins.setOnMaybeAssembly(new NRMaybeAssembly()); + RxJavaPlugins.setOnObservableAssembly(new NRObservableAssembly()); + } + } + + private static void addSubscribeDecorators(boolean add) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(add) { + RxJavaPlugins.setOnObservableSubscribe(new NRObservableSubWrapper(null)); + RxJavaPlugins.setOnSingleSubscribe(new NRSingleSubWrapper(null)); + RxJavaPlugins.setOnCompletableSubscribe(new NRCompletableSubWrapper(null)); + RxJavaPlugins.setOnFlowableSubscribe(new NRFlowableSubWrapper(null)); + RxJavaPlugins.setOnMaybeSubscribe(new NRMaybeSubWrapper(null)); + } + } + + @SuppressWarnings("rawtypes") + public static void removeAssemblyDecorators(boolean remove) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava2 Assembly descorators because RxJavaPlugins is locked down"); + return; + } + if(remove) { + Function fSingle = RxJavaPlugins.getOnSingleAssembly(); + if(fSingle != null) { + if(fSingle instanceof NRSingleAssembly) { + NRSingleAssembly singleAssembly = (NRSingleAssembly)fSingle; + Function delegate = singleAssembly.getDelegate(); + RxJavaPlugins.setOnSingleAssembly(delegate); + } + } + Function fCompletable = RxJavaPlugins.getOnCompletableAssembly(); + if(fCompletable != null) { + if(fCompletable instanceof NRCompletableAssembly) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)fCompletable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnCompletableAssembly(delegate); + } + } + Function fFlowable = RxJavaPlugins.getOnFlowableAssembly(); + if(fFlowable != null) { + if(fFlowable instanceof NRFlowableAssembly) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)fFlowable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnFlowableAssembly(delegate); + } + } + Function fMaybe = RxJavaPlugins.getOnMaybeAssembly(); + if(fMaybe != null) { + if(fMaybe instanceof NRMaybeAssembly) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)fMaybe; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnMaybeAssembly(delegate); + } + } + Function fObservable = RxJavaPlugins.getOnObservableAssembly(); + if(fObservable != null) { + if(fObservable instanceof NRObservableAssembly) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)fObservable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnObservableAssembly(delegate); + } + } + } + } + + @SuppressWarnings("rawtypes") + private static void removeSubscribeDecorators(boolean remove) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(remove) { + BiFunction fComp = RxJavaPlugins.getOnCompletableSubscribe(); + if(fComp != null) { + if(fComp instanceof NRCompletableSubWrapper) { + NRCompletableSubWrapper wrapper = (NRCompletableSubWrapper)fComp; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnCompletableSubscribe(delegate); + + } + } + BiFunction fFlow = RxJavaPlugins.getOnFlowableSubscribe(); + if(fFlow != null) { + if(fFlow instanceof NRFlowableSubWrapper) { + NRFlowableSubWrapper wrapper = (NRFlowableSubWrapper)fFlow; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnFlowableSubscribe(delegate); + } + } + BiFunction fMaybe = RxJavaPlugins.getOnMaybeSubscribe(); + if(fMaybe != null) { + if(fMaybe instanceof NRMaybeSubWrapper) { + NRMaybeSubWrapper wrapper = (NRMaybeSubWrapper)fMaybe; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnMaybeSubscribe(delegate); + } + } + BiFunction fObs = RxJavaPlugins.getOnObservableSubscribe(); + if(fObs != null) { + if(fObs instanceof NRObservableSubWrapper) { + NRObservableSubWrapper wrapper = (NRObservableSubWrapper)fObs; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnObservableSubscribe(delegate); + } + } + BiFunction fSingle = RxJavaPlugins.getOnSingleSubscribe(); + if(fSingle != null) { + if(fSingle instanceof NRSingleSubWrapper) { + NRSingleSubWrapper wrapper = (NRSingleSubWrapper)fSingle; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnSingleSubscribe(delegate); + } + } + } + } + + + @Override + public void configChanged(String appName, AgentConfig agentConfig) { + Boolean b = agentConfig.getValue(USESEGMENTS); + if(b != null && b != useSegments) { + useSegments = b; + removeSubscribeDecorators(!useSegments); + addSubscribeDecorators(useSegments); + } + if(useSegments) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Will use segments for RxJava objects"); + } else { + NewRelic.getAgent().getLogger().log(Level.INFO, "Will not use segments for RxJava objects"); + } + String ignores = agentConfig.getValue(COMPLETABLE_IGNORES); + completable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + completable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(FLOWABLE_IGNORES); + flowable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + flowable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(MAYBE_IGNORES); + maybe_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + maybe_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(OBSERVABLE_IGNORES); + observable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + observable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(SINGLE_IGNORES); + single_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + single_ignores.addAll(Arrays.asList(splits)); + } + + } + +} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver.java deleted file mode 100644 index 804c561..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.CompletableObserver; -import io.reactivex.disposables.Disposable; - -public class NRCompletableObserver implements CompletableObserver, Disposable { - - private CompletableObserver downstream; - - private Disposable upstream; - - public Token token = null; - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRCompletableObserver(CompletableObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - upstream.dispose(); - if(segment != null) { - segment.ignore(); - segment = null; - } - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver2.java deleted file mode 100644 index dc9f9bc..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRCompletableObserver2.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.CompletableObserver; -import io.reactivex.disposables.Disposable; - -public class NRCompletableObserver2 implements CompletableObserver { - - private CompletableObserver downstream; - - private Segment segment = null; - private String name = null; - - private static boolean isTransformed = false; - - public NRCompletableObserver2(CompletableObserver downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Completable/"+name : "Completable"); - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java deleted file mode 100644 index 3a75eda..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import java.util.logging.Level; - -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - - -public class NRFlowableObserver implements Subscriber, Subscription, NRObserver { - - private Subscriber downstream; - - Subscription upstream; - public Token token = null; - private Segment segment = null; - - private static boolean isTransformed = false; - - public NRFlowableObserver(Subscriber s) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver. with subscriber {0}",s); - downstream = s; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - public void setSegment(Segment s) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver.setSegment with subscriber {0}, using segment {1}",downstream,s); - segment = s; - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onNext(T t) { - if(token != null) { - token.link(); - } - downstream.onNext(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable t) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver.onError with subscriber {0}",downstream); - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver.onComplete with subscriber {0}",downstream); - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - NewRelic.getAgent().getLogger().log(Level.FINE, "In NRFlowableObserver.onComplete ending segment {0}",segment); - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - public void request(long n) { - upstream.request(n); - } - - @Override - public void cancel() { - upstream.cancel(); - if(segment != null) { - segment.ignore(); - segment = null; - } - if(token != null) { - token.expire(); - token = null; - } - } - - @Override - public void onSubscribe(Subscription s) { - if(upstream != null) { - s.cancel(); - } else { - upstream = s; - downstream.onSubscribe(this); - } - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java deleted file mode 100644 index 8603fd7..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRFlowableObserver2.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import java.util.logging.Level; - -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -public class NRFlowableObserver2 implements Subscriber { - - private Subscriber downstream; - - private Segment segment = null; - private String name = null; - - private static boolean isTransformed = false; - - public NRFlowableObserver2(Subscriber downstream, String n) { - this.downstream = downstream; - name = n; - NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver2. with subscriber {0} and name {1}",this.downstream, name); - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Subscription s) { - if(downstream != null) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Flowable/"+name : "Flowable"); - } - if(downstream != null) { - downstream.onSubscribe(s); - } - } - - - @Override - public void onError(Throwable e) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",downstream,name); - if(segment != null) { - segment.end(); - segment = null; - } - if (downstream != null) { - downstream.onError(e); - } - } - - @Override - public void onComplete() { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserve2.onComplete with subscriber {0}, name {1}",downstream,name); - if(segment != null) { - segment.end(); - segment = null; - } - if (downstream != null) { - downstream.onComplete(); - } - } - - @Override - public void onNext(T t) { - if (downstream != null) { - downstream.onNext(t); - } - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver.java deleted file mode 100644 index ee0f3fb..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.MaybeObserver; -import io.reactivex.disposables.Disposable; - -public class NRMaybeObserver implements MaybeObserver, Disposable { - - private MaybeObserver downstream; - - private Disposable upstream; - - public Token token = null; - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRMaybeObserver(MaybeObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - upstream.dispose(); - if(segment != null) { - segment.ignore(); - segment = null; - } - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - } - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onSuccess(T t) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onSuccess(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver2.java deleted file mode 100644 index 3063b44..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRMaybeObserver2.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.MaybeObserver; -import io.reactivex.disposables.Disposable; - -public class NRMaybeObserver2 implements MaybeObserver { - - private MaybeObserver downstream; - - private Segment segment = null; - - private String name = null; - - private static boolean isTransformed = false; - - public NRMaybeObserver2(MaybeObserver downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Maybe/"+ name : "Maybe"); - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - public void onSuccess(T value) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver.java deleted file mode 100644 index 0a9c9e7..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.Observer; -import io.reactivex.disposables.Disposable; - -public class NRObservableObserver implements Observer, Disposable { - - private Observer downstream; - - private Disposable upstream; - - public Token token = null; - - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRObservableObserver(Observer downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - upstream.dispose(); - if(segment != null) { - segment.ignore(); - segment = null; - } - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onNext(T t) { - if(token != null) { - token.link(); - } - downstream.onNext(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver2.java deleted file mode 100644 index 431ac0f..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObservableObserver2.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.Observer; -import io.reactivex.disposables.Disposable; - -public class NRObservableObserver2 implements Observer { - - private Observer downstream; - - private Segment segment = null; - - private String name = null; - - private static boolean isTransformed = false; - - public NRObservableObserver2(Observer downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Observable/"+ name : "Observable"); - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onNext(T t) { - downstream.onNext(t); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java deleted file mode 100644 index e750451..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRObserver.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -public interface NRObserver { - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleDeferObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleDeferObserver.java deleted file mode 100644 index fdb02a3..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleDeferObserver.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.SingleObserver; -import io.reactivex.disposables.Disposable; - -public class NRSingleDeferObserver implements SingleObserver { - - private SingleObserver downstream; - - private Segment segment = null; - - private static boolean isTransformed = false; - - public NRSingleDeferObserver(SingleObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - downstream.onSubscribe(d); - } - - public void startSegment(String name) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? name : "SingleDefer"); - } - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onSuccess(T value) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onSuccess(value); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java deleted file mode 100644 index e2a9fb2..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import java.util.logging.Level; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.SingleObserver; -import io.reactivex.disposables.Disposable; - -public class NRSingleObserver implements SingleObserver, Disposable, NRObserver { - - private SingleObserver downstream; - - private Disposable upstream; - - private static boolean isTransformed = false; - - public Token token = null; - - public Segment segment = null; - - public NRSingleObserver(SingleObserver downstream) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver. with subscriber {0}",downstream); - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - if(segment != null) { - segment.ignore(); - segment = null; - } - upstream.dispose(); - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onSuccess(T t) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - } - downstream.onSuccess(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - NewRelic.noticeError(e); - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - } - downstream.onError(e); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java deleted file mode 100644 index 9835b4f..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRSingleObserver2.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import java.util.logging.Level; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.SingleObserver; -import io.reactivex.disposables.Disposable; - -public class NRSingleObserver2 implements SingleObserver { - - private SingleObserver downstream; - - private Segment segment = null; - private String name = null; - public boolean ignore = false; - private long start; - - private static boolean isTransformed = false; - - public NRSingleObserver2(SingleObserver downstream, String n) { - this.downstream = downstream; - name = n; - NewRelic.getAgent().getLogger().log(Level.FINE, "Constructed NRFlowableObserver2. with subscriber {0}, name {1}",this.downstream, name); - start = System.currentTimeMillis(); -// if(!ignore) -// startSegment(); - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",this.downstream, name); - if(segment != null) { - segment.end(); - segment = null; - } - NewRelic.recordResponseTimeMetric("Single-"+name, System.currentTimeMillis()-start); - downstream.onError(e); - } - - @Override - public void onSuccess(T value) { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onSuccess with subscriber {0}, name {1}",this.downstream, name); - if(segment != null) { - segment.end(); - segment = null; - } - NewRelic.recordResponseTimeMetric("Single-"+name, System.currentTimeMillis()-start); - downstream.onSuccess(value); - } - - public void startSegment() { - NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.startSegment with subscriber {0}, name {1}",this.downstream, name); - if(!ignore) - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Single/"+name : "Single"); - } - -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/Utils.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/Utils.java deleted file mode 100644 index 38fbfe8..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/Utils.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.newrelic.instrumentation.rxjava2; - -import java.util.logging.Level; - -import org.reactivestreams.Subscriber; - -import com.newrelic.agent.config.AgentConfig; -import com.newrelic.agent.config.AgentConfigListener; -import com.newrelic.agent.service.ServiceFactory; -import com.newrelic.api.agent.Config; -import com.newrelic.api.agent.NewRelic; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; -import io.reactivex.Flowable; -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; -import io.reactivex.Observable; -import io.reactivex.Observer; -import io.reactivex.Single; -import io.reactivex.SingleObserver; -import io.reactivex.functions.BiFunction; -import io.reactivex.functions.Function; -import io.reactivex.plugins.RxJavaPlugins; - -public class Utils implements AgentConfigListener { - - public static boolean initialized = false; - public static boolean useSegments = true; - private static final String USESEGMENTS = "RxJava2.useSegments"; - - private static final Utils INSTANCE = new Utils(); - - private Utils() { - - } - - public static void init() { - boolean lockdown = RxJavaPlugins.isLockdown(); - - if (lockdown) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Wrappers because RxJavaPlugins is locked down"); - } else { - NRRunnableDecorator decorator; - Function f = RxJavaPlugins.getScheduleHandler(); - decorator = new NRRunnableDecorator(f); - RxJavaPlugins.setScheduleHandler(decorator); - ServiceFactory.getConfigService().addIAgentConfigListener(INSTANCE); - Config config = NewRelic.getAgent().getConfig(); - if (config != null) { - Boolean b = config.getValue(USESEGMENTS); - - if (b != null && b != useSegments) { - useSegments = b; - removeSubscribeDecorators(!useSegments); - } - - } - NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useSegments is set to {0}", useSegments); - addSubscribeDecorators(useSegments); - } - initialized = true; - } - - private static void addSubscribeDecorators(boolean add) { - boolean lockdown = RxJavaPlugins.isLockdown(); - if(lockdown) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); - return; - } - if(add) { - RxJavaPlugins.setOnObservableSubscribe(new NRObservableSubWrapper(null)); - RxJavaPlugins.setOnSingleSubscribe(new NRSingleSubWrapper(null)); - RxJavaPlugins.setOnCompletableSubscribe(new NRCompletableSubWrapper(null)); - RxJavaPlugins.setOnFlowableSubscribe(new NRFlowableSubWrapper(null)); - RxJavaPlugins.setOnMaybeSubscribe(new NRMaybeSubWrapper(null)); - } - } - - @SuppressWarnings("rawtypes") - private static void removeSubscribeDecorators(boolean remove) { - boolean lockdown = RxJavaPlugins.isLockdown(); - if(lockdown) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); - return; - } - if(remove) { - BiFunction fComp = RxJavaPlugins.getOnCompletableSubscribe(); - if(fComp != null) { - if(fComp instanceof NRCompletableSubWrapper) { - NRCompletableSubWrapper wrapper = (NRCompletableSubWrapper)fComp; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnCompletableSubscribe(delegate); - - } - } - BiFunction fFlow = RxJavaPlugins.getOnFlowableSubscribe(); - if(fFlow != null) { - if(fFlow instanceof NRFlowableSubWrapper) { - NRFlowableSubWrapper wrapper = (NRFlowableSubWrapper)fFlow; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnFlowableSubscribe(delegate); - } - } - BiFunction fMaybe = RxJavaPlugins.getOnMaybeSubscribe(); - if(fMaybe != null) { - if(fMaybe instanceof NRMaybeSubWrapper) { - NRMaybeSubWrapper wrapper = (NRMaybeSubWrapper)fMaybe; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnMaybeSubscribe(delegate); - } - } - BiFunction fObs = RxJavaPlugins.getOnObservableSubscribe(); - if(fObs != null) { - if(fObs instanceof NRObservableSubWrapper) { - NRObservableSubWrapper wrapper = (NRObservableSubWrapper)fObs; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnObservableSubscribe(delegate); - } - } - BiFunction fSingle = RxJavaPlugins.getOnSingleSubscribe(); - if(fSingle != null) { - if(fSingle instanceof NRSingleSubWrapper) { - NRSingleSubWrapper wrapper = (NRSingleSubWrapper)fSingle; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnSingleSubscribe(delegate); - } - } - } - } - - - @Override - public void configChanged(String appName, AgentConfig agentConfig) { - Boolean b = agentConfig.getValue(USESEGMENTS); - if(b != null && b != useSegments) { - useSegments = b; - removeSubscribeDecorators(!useSegments); - addSubscribeDecorators(useSegments); - } - if(useSegments) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Will use segments for RxJava objects"); - } else { - NewRelic.getAgent().getLogger().log(Level.INFO, "Will not use segments for RxJava objects"); - } - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/Completable.java b/rxjava2-2.0/src/main/java/io/reactivex/Completable.java index ea9c2ad..8c11e59 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/Completable.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/Completable.java @@ -5,7 +5,7 @@ import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Completable { +public abstract class Completable implements CompletableSource { @NewField public String completableName = null; diff --git a/rxjava2-2.0/src/main/java/io/reactivex/Flowable.java b/rxjava2-2.0/src/main/java/io/reactivex/Flowable.java index 69ac32d..1410ecd 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/Flowable.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/Flowable.java @@ -1,13 +1,15 @@ package io.reactivex; +import org.reactivestreams.Publisher; + import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Flowable { +public abstract class Flowable implements Publisher { @NewField public String flowableName = null; - + } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/Maybe.java b/rxjava2-2.0/src/main/java/io/reactivex/Maybe.java index 23fa4cd..0f0765c 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/Maybe.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/Maybe.java @@ -5,7 +5,7 @@ import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Maybe { +public abstract class Maybe implements MaybeSource { @NewField public String maybeName = null; diff --git a/rxjava2-2.0/src/main/java/io/reactivex/NRSingleWrapper.java b/rxjava2-2.0/src/main/java/io/reactivex/NRSingleWrapper.java deleted file mode 100644 index df8ca89..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/NRSingleWrapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; - -public class NRSingleWrapper extends Single { - - private Single delegate = null; - private static boolean isTransformed = false; - - public NRSingleWrapper(Single d) { - delegate = d; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - @Trace(dispatcher=true) - protected void subscribeActual(SingleObserver observer) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","SingleWrapper", delegate != null ? delegate.getClass().getSimpleName() : "Null-Single"); - if(delegate != null) { - delegate.subscribeActual(observer); - } - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/Observable.java b/rxjava2-2.0/src/main/java/io/reactivex/Observable.java index e6f4d49..841a8a7 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/Observable.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/Observable.java @@ -5,7 +5,7 @@ import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Observable { +public abstract class Observable implements ObservableSource { @NewField public String observableName = null; diff --git a/rxjava2-2.0/src/main/java/io/reactivex/Single.java b/rxjava2-2.0/src/main/java/io/reactivex/Single.java index 1da94e5..b859fd9 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/Single.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/Single.java @@ -4,11 +4,16 @@ import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Consumer; + @Weave(type=MatchType.BaseClass) -public abstract class Single { +public abstract class Single implements SingleSource { @NewField public String singleName = null; - protected abstract void subscribeActual(SingleObserver observer); + public abstract Single doOnError(final Consumer onError) ; + public abstract Single doOnSubscribe(final Consumer onSubscribe); + public abstract Single doOnSuccess(final Consumer onSuccess); } diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableCreate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableCreate.java deleted file mode 100644 index 673520f..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableCreate.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableCreate extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDefer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDefer.java deleted file mode 100644 index fd79ff0..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDefer.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableDefer extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDelay.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDelay.java deleted file mode 100644 index a547bb4..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableDelay.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; - -import io.reactivex.CompletableObserver; - -@Weave -public abstract class CompletableDelay { - - - protected void subscribeActual(CompletableObserver s) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableEmpty.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableEmpty.java deleted file mode 100644 index 274f5f5..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableEmpty.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableEmpty extends Completable { - - public void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableError.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableError.java deleted file mode 100644 index fcf7fc2..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableError.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableError extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableErrorSupplier.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableErrorSupplier.java deleted file mode 100644 index 885bd15..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableErrorSupplier.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableErrorSupplier extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromAction.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromAction.java deleted file mode 100644 index 9d2cece..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromAction.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableFromAction extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromCallable.java deleted file mode 100644 index f9ea089..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromCallable.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableFromCallable extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromRunnable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromRunnable.java deleted file mode 100644 index 555e8f5..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableFromRunnable.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Completable; -import io.reactivex.CompletableObserver; - -@Weave -public class CompletableFromRunnable extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableObserveOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableObserveOn.java deleted file mode 100644 index fba3963..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableObserveOn.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; - -import io.reactivex.CompletableObserver; - -@Weave -public abstract class CompletableObserveOn { - - protected void subscribeActual(CompletableObserver s) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableSubscribeOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableSubscribeOn.java deleted file mode 100644 index 68442b8..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableSubscribeOn.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.NewField; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableObserver; - -import io.reactivex.CompletableObserver; -import io.reactivex.CompletableSource; -import io.reactivex.Scheduler; - -@Weave -public abstract class CompletableSubscribeOn { - - @NewField - private Token token = null; - - public CompletableSubscribeOn(CompletableSource source, Scheduler scheduler) { - if(token == null) { - Token t = NewRelic.getAgent().getTransaction().getToken(); - if(t != null && t.isActive()) { - token = t; - } else if(t != null) { - t.expire(); - t = null; - } - } - } - - protected void subscribeActual(CompletableObserver s) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - - Token t = token != null ? token : NewRelic.getAgent().getTransaction().getToken(); - if(t != null) { - if(t.isActive()) { - wrapper.token = t; - } else { - t.expire(); - t = null; - } - } - s = wrapper; - token = null; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableUtils.java deleted file mode 100644 index 2427c2f..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/completable/CompletableUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.reactivex.internal.operators.completable; - -import io.reactivex.Completable; - -public class CompletableUtils { - - public static boolean ignore(Completable completable) { - - if(completable instanceof CompletablePeek) return true; - - String classname = completable.getClass().getSimpleName().toLowerCase(); - - return classname.endsWith("on"); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java deleted file mode 100644 index 100a7ec..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableCreate extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java deleted file mode 100644 index ca0029b..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDefer.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableDefer extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelay.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelay.java deleted file mode 100644 index 560c9d8..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelay.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; - -@Weave -public abstract class FlowableDelay { - - protected void subscribeActual(Subscriber t) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelaySubscriptionOther.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelaySubscriptionOther.java deleted file mode 100644 index 138090c..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableDelaySubscriptionOther.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; - -@Weave -public class FlowableDelaySubscriptionOther { - - - public void subscribeActual(Subscriber child) { - NRFlowableObserver wrapper = new NRFlowableObserver(child); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - child = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java deleted file mode 100644 index 2dfa270..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableEmpty.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableEmpty extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java deleted file mode 100644 index df0b815..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableError.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableError extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java deleted file mode 100644 index a310b87..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromArray.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableFromArray extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java deleted file mode 100644 index c4995bb..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromCallable.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableFromCallable extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java deleted file mode 100644 index 6caf1a2..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromFuture.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableFromFuture extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java deleted file mode 100644 index ec25d0d..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableFromIterable.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableFromIterable extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java deleted file mode 100644 index efb9a57..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableGenerate.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableGenerate extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java deleted file mode 100644 index eeb6a4b..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableInterval.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableInterval extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java deleted file mode 100644 index 794632e..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableIntervalRange.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableIntervalRange extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java deleted file mode 100644 index 749c7bd..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableJust.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableJust extends Flowable { - - - protected void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableObserveOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableObserveOn.java deleted file mode 100644 index 46284d2..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableObserveOn.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; - -@Weave -public abstract class FlowableObserveOn { - - public void subscribeActual(Subscriber t) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java deleted file mode 100644 index 0e36642..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRange.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableRange extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java deleted file mode 100644 index a90a753..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableRangeLong.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Flowable; - -@Weave -public class FlowableRangeLong extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - NRFlowableObserver wrapper = FlowableUtils.getWrapper(t, name); - if(wrapper != null) { - t = wrapper; - } - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableSubscribeOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableSubscribeOn.java deleted file mode 100644 index 6dacf72..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableSubscribeOn.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; - -@Weave -public abstract class FlowableSubscribeOn { - - public void subscribeActual(Subscriber t) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java deleted file mode 100644 index ebaf11f..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/flowable/FlowableUtils.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.reactivex.internal.operators.flowable; - -import java.util.logging.Level; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.instrumentation.rxjava2.NRFlowableObserver; - -import io.reactivex.Flowable; - -public class FlowableUtils { - - public static boolean ignore(Flowable flowable) { - - if(flowable instanceof AbstractFlowableWithUpstream) { - return true; - } - - return false; - } - - public static NRFlowableObserver getWrapper(Subscriber actual, String name) { - if(!(actual instanceof NRFlowableObserver)) { - NRFlowableObserver wrapper = new NRFlowableObserver<>(actual); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.setSegment(segment); - NewRelic.getAgent().getLogger().log(Level.FINE, "Created NRFlowableObserver with subscriber {0} and segment {1} with name {2}", actual, segment, name); - return wrapper; - } - return null; - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeCreate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeCreate.java deleted file mode 100644 index d7c04dd..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeCreate extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDefer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDefer.java deleted file mode 100644 index 01fd229..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDefer.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeDefer extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelay.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelay.java deleted file mode 100644 index 0d95a49..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelay.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; - -import io.reactivex.MaybeObserver; - -@Weave -public abstract class MaybeDelay { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java deleted file mode 100644 index 492fe5d..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; - -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeDelaySubscriptionOtherPublisher { - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeEmpty.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeEmpty.java deleted file mode 100644 index 03e8e35..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeEmpty.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public abstract class MaybeEmpty extends Maybe { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : "MaybeDefer"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeError.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeError.java deleted file mode 100644 index 319a116..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeError.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeError extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeErrorCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeErrorCallable.java deleted file mode 100644 index 98b1cd0..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeErrorCallable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeErrorCallable extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromAction.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromAction.java deleted file mode 100644 index 83aa3de..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromAction.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeFromAction extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromCallable.java deleted file mode 100644 index 40c060b..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromCallable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeFromCallable extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromFuture.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromFuture.java deleted file mode 100644 index f1527b1..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromFuture.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeFromFuture extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromRunnable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromRunnable.java deleted file mode 100644 index 0b1adf4..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeFromRunnable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeFromRunnable extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeJust.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeJust.java deleted file mode 100644 index 23f74f6..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeJust.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Maybe; -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeJust extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeObserveOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeObserveOn.java deleted file mode 100644 index 6194e50..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeObserveOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; - -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeObserveOn { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeSubscribeOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeSubscribeOn.java deleted file mode 100644 index cef9a1e..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeSubscribeOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRMaybeObserver; - -import io.reactivex.MaybeObserver; - -@Weave -public class MaybeSubscribeOn { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeUtils.java deleted file mode 100644 index 297c21d..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/maybe/MaybeUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.reactivex.internal.operators.maybe; - -import io.reactivex.Maybe; - -public class MaybeUtils { - - public static boolean ignore(Maybe maybe) { - - if(maybe instanceof MaybePeek) return true; - - String classname = maybe.getClass().getSimpleName().toLowerCase(); - - return classname.endsWith("on"); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObervableUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObervableUtils.java deleted file mode 100644 index 79bcdc7..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObervableUtils.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import io.reactivex.Observable; - -public class ObervableUtils { - - public static boolean ignore(Observable o) { - if(o instanceof AbstractObservableWithUpstream) return true; - return false; - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableCreate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableCreate.java deleted file mode 100644 index 33770d1..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableCreate extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableCreate"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDefer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDefer.java deleted file mode 100644 index 51cedfb..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDefer.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableDefer extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableDefer"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelay.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelay.java deleted file mode 100644 index 64f0bdb..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelay.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; - -import io.reactivex.Observer; - -@Weave -public abstract class ObservableDelay { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer t) { - NRObservableObserver wrapper = new NRObservableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelaySubscriptionOther.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelaySubscriptionOther.java deleted file mode 100644 index cefdbe8..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableDelaySubscriptionOther.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; - -import io.reactivex.Observer; - -@Weave -public abstract class ObservableDelaySubscriptionOther { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer child) { - NRObservableObserver wrapper = new NRObservableObserver(child); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - child = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableEmpty.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableEmpty.java deleted file mode 100644 index 2f83f3e..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableEmpty.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableEmpty extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableEmpty"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableError.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableError.java deleted file mode 100644 index 4260f4b..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableError.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableError extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableError"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromArray.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromArray.java deleted file mode 100644 index 27b16cd..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromArray.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableFromArray extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromArray"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromCallable.java deleted file mode 100644 index 43d30d1..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromCallable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableFromCallable extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromCallable"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromFuture.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromFuture.java deleted file mode 100644 index 545ad6a..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromFuture.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableFromFuture extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromFuture"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromIterable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromIterable.java deleted file mode 100644 index 04e6eaa..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromIterable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableFromIterable extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromIterable"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromPublisher.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromPublisher.java deleted file mode 100644 index 1e9617a..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableFromPublisher.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableFromPublisher extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromPublisher"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableGenerate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableGenerate.java deleted file mode 100644 index 4323cfc..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableGenerate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableGenerate extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableGenerate"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableInterval.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableInterval.java deleted file mode 100644 index 050924e..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableInterval.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableInterval extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableInterval"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableIntervalRange.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableIntervalRange.java deleted file mode 100644 index 48c8f0f..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableIntervalRange.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableIntervalRange extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableIntervalRange"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableJust.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableJust.java deleted file mode 100644 index d7c9ef6..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableJust.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableJust extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableJust"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableObserveOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableObserveOn.java deleted file mode 100644 index 984f4d2..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableObserveOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; - -import io.reactivex.Observer; - -@Weave -public abstract class ObservableObserveOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRange.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRange.java deleted file mode 100644 index ef72ea9..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRange.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableRange extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableRange"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRangeLong.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRangeLong.java deleted file mode 100644 index 9fc2fcc..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableRangeLong.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Observable; -import io.reactivex.Observer; - -@Weave -public abstract class ObservableRangeLong extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableRangeLong"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableSubscribeOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableSubscribeOn.java deleted file mode 100644 index ed9f088..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableSubscribeOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; - -import io.reactivex.Observer; - -@Weave -public class ObservableSubscribeOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer t) { - NRObservableObserver wrapper = new NRObservableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableTimer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableTimer.java deleted file mode 100644 index 36dcf05..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/observable/ObservableTimer.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRObservableObserver; - -import io.reactivex.Observer; - -@Weave -public abstract class ObservableTimer { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer t) { - NRObservableObserver wrapper = new NRObservableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleCreate.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleCreate.java deleted file mode 100644 index e4ede4a..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Single; -import io.reactivex.SingleObserver; - -@Weave -public class SingleCreate extends Single { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleCreate"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDefer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDefer.java deleted file mode 100644 index 85aa6cf..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDefer.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Single; -import io.reactivex.SingleObserver; - -@Weave -public class SingleDefer extends Single { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleDefer"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDelay.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDelay.java deleted file mode 100644 index 090e782..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleDelay.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; - -import io.reactivex.SingleObserver; - -@Weave -public class SingleDelay { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleError.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleError.java deleted file mode 100644 index c85cbdc..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleError.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Single; -import io.reactivex.SingleObserver; - -@Weave -public class SingleError extends Single { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleError"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromCallable.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromCallable.java deleted file mode 100644 index 5ccd0cd..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromCallable.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Single; -import io.reactivex.SingleObserver; - -@Weave -public class SingleFromCallable extends Single { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleFromCallable"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromPublisher.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromPublisher.java deleted file mode 100644 index 8963cdf..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleFromPublisher.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Single; -import io.reactivex.SingleObserver; - -@Weave -public class SingleFromPublisher extends Single { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleFromPublisher"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleJust.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleJust.java deleted file mode 100644 index 53d1d35..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleJust.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; -import com.newrelic.instrumentation.rxjava2.Utils; - -import io.reactivex.Single; -import io.reactivex.SingleObserver; - -@Weave -public class SingleJust extends Single { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleJust"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleObserveOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleObserveOn.java deleted file mode 100644 index 94505a6..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleObserveOn.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; - -import io.reactivex.SingleObserver; - -@Weave -public abstract class SingleObserveOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleSubscribeOn.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleSubscribeOn.java deleted file mode 100644 index 9cb3fd4..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleSubscribeOn.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; - -import io.reactivex.SingleObserver; - -@Weave -public abstract class SingleSubscribeOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleTimer.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleTimer.java deleted file mode 100644 index aa21161..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleTimer.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; - -import io.reactivex.SingleObserver; - -@SuppressWarnings({ "unchecked", "rawtypes" }) -@Weave -public abstract class SingleTimer { - - - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java b/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java deleted file mode 100644 index 519d4b7..0000000 --- a/rxjava2-2.0/src/main/java/io/reactivex/internal/operators/single/SingleUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.reactivex.internal.operators.single; - -import org.reactivestreams.Subscriber; - -import com.newrelic.instrumentation.rxjava2.NRSingleObserver; - -public class SingleUtils { - - public static NRSingleObserver getWrapper(Subscriber actual, String name) { - - } - -} diff --git a/rxjava2-2.0/src/main/java/io/reactivex/plugins/RxJavaPlugins.java b/rxjava2-2.0/src/main/java/io/reactivex/plugins/RxJavaPlugins.java index af87228..830d12e 100644 --- a/rxjava2-2.0/src/main/java/io/reactivex/plugins/RxJavaPlugins.java +++ b/rxjava2-2.0/src/main/java/io/reactivex/plugins/RxJavaPlugins.java @@ -1,34 +1,36 @@ package io.reactivex.plugins; +import java.util.logging.Level; + import org.reactivestreams.Subscriber; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava2.NRCompletableSubWrapper; -import com.newrelic.instrumentation.rxjava2.NRFlowableSubWrapper; -import com.newrelic.instrumentation.rxjava2.NRMaybeSubWrapper; -import com.newrelic.instrumentation.rxjava2.NRObservableSubWrapper; -import com.newrelic.instrumentation.rxjava2.NRRunnableDecorator; -import com.newrelic.instrumentation.rxjava2.NRSingleSubWrapper; -import com.newrelic.instrumentation.rxjava2.Utils; +import com.newrelic.instrumentation.labs.rxjava2.NRCompletableAssembly; +import com.newrelic.instrumentation.labs.rxjava2.NRCompletableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2.NRFlowableAssembly; +import com.newrelic.instrumentation.labs.rxjava2.NRFlowableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2.NRMaybeAssembly; +import com.newrelic.instrumentation.labs.rxjava2.NRMaybeSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2.NRObservableAssembly; +import com.newrelic.instrumentation.labs.rxjava2.NRObservableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2.NRRunnableDecorator; +import com.newrelic.instrumentation.labs.rxjava2.NRSingleAssembly; +import com.newrelic.instrumentation.labs.rxjava2.NRSingleSubWrapper; +import com.newrelic.instrumentation.labs.rxjava2.Utils; import io.reactivex.Completable; import io.reactivex.CompletableObserver; import io.reactivex.Flowable; import io.reactivex.Maybe; import io.reactivex.MaybeObserver; -import io.reactivex.NRSingleWrapper; import io.reactivex.Observable; import io.reactivex.Observer; import io.reactivex.Single; import io.reactivex.SingleObserver; import io.reactivex.functions.BiFunction; import io.reactivex.functions.Function; -import io.reactivex.internal.operators.completable.CompletableUtils; -import io.reactivex.internal.operators.flowable.FlowableUtils; -import io.reactivex.internal.operators.maybe.MaybeUtils; -import io.reactivex.internal.operators.observable.ObervableUtils; @SuppressWarnings("rawtypes") @Weave @@ -46,7 +48,17 @@ public abstract class RxJavaPlugins { static volatile BiFunction onFlowableSubscribe = Weaver.callOriginal(); static volatile BiFunction onMaybeSubscribe = Weaver.callOriginal(); + + static volatile Function onSingleAssembly = Weaver.callOriginal(); + + static volatile Function onFlowableAssembly = Weaver.callOriginal(); + + static volatile Function onCompletableAssembly = Weaver.callOriginal(); + + static volatile Function onMaybeAssembly = Weaver.callOriginal(); + static volatile Function onObservableAssembly = Weaver.callOriginal(); + public static boolean isLockdown() { return Weaver.callOriginal(); } @@ -82,15 +94,135 @@ public static BiFunction getOnFlowableSubscrib public static BiFunction getOnMaybeSubscribe() { return Weaver.callOriginal(); } - + public static BiFunction getOnObservableSubscribe() { return Weaver.callOriginal(); } - + public static BiFunction getOnSingleSubscribe() { return Weaver.callOriginal(); } + public static Function getOnSingleAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnCompletableAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnFlowableAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnMaybeAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnObservableAssembly() { + return Weaver.callOriginal(); + } + + public static void setOnObservableAssembly(Function onObservableAssembly1) { + if(Utils.useSegments) { + if(onObservableAssembly != null) { + if(onObservableAssembly instanceof NRObservableAssembly) { + if(!(onObservableAssembly1 instanceof NRObservableAssembly)) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)onObservableAssembly; + nrAssembly.setDelegate(nrAssembly); + onObservableAssembly1 = nrAssembly; + } + } else { + if(onObservableAssembly1 instanceof NRObservableAssembly) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)onObservableAssembly1; + nrAssembly.setDelegate(onObservableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnSingleAssembly(Function onSingleAssembly1) { + if(Utils.useSegments) { + if(onSingleAssembly != null) { + if(onSingleAssembly instanceof NRSingleAssembly) { + if(!(onSingleAssembly1 instanceof NRSingleAssembly)) { + NRSingleAssembly nrAssembly = (NRSingleAssembly)onSingleAssembly; + nrAssembly.setDelegate(onSingleAssembly1); + onSingleAssembly1 = nrAssembly; + } + } else { + if(onSingleAssembly1 instanceof NRSingleAssembly) { + NRSingleAssembly nrAssembly = (NRSingleAssembly)onSingleAssembly1; + nrAssembly.setDelegate(onSingleAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnMaybeAssembly(Function onMaybeAssembly1) { + if(Utils.useSegments) { + if(onMaybeAssembly != null) { + if(onMaybeAssembly instanceof NRMaybeAssembly) { + if(!(onMaybeAssembly1 instanceof NRMaybeAssembly)) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)onMaybeAssembly; + nrAssembly.setDelegate(onMaybeAssembly1); + onMaybeAssembly1 = nrAssembly; + } + } else { + if(onMaybeAssembly1 instanceof NRMaybeAssembly) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)onMaybeAssembly1; + nrAssembly.setDelegate(onMaybeAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnCompletableAssembly(Function onCompletableAssembly1) { + if(Utils.useSegments) { + if(onCompletableAssembly != null) { + if(onCompletableAssembly instanceof NRCompletableAssembly) { + if(!(onCompletableAssembly1 instanceof NRCompletableAssembly)) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)onCompletableAssembly; + nrAssembly.setDelegate(onCompletableAssembly1); + onCompletableAssembly1 = nrAssembly; + } + } else { + if(onCompletableAssembly1 instanceof NRCompletableAssembly) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)onCompletableAssembly1; + nrAssembly.setDelegate(onCompletableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnFlowableAssembly(Function onFlowableAssembly1) { + if(Utils.useSegments) { + if(onFlowableAssembly != null) { + if(onFlowableAssembly instanceof NRFlowableAssembly) { + if(!(onFlowableAssembly1 instanceof NRFlowableAssembly)) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)onFlowableAssembly; + nrAssembly.setDelegate(onFlowableAssembly1); + onFlowableAssembly1 = nrAssembly; + } + } else { + if(onFlowableAssembly1 instanceof NRFlowableAssembly) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)onFlowableAssembly1; + nrAssembly.setDelegate(onFlowableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + public static void setOnMaybeSubscribe(BiFunction onMaybeSubscribe1) { if (Utils.useSegments) { // only have to manipulate if there is an existing function set @@ -245,9 +377,11 @@ public static void setOnCompletableSubscribe(BiFunction onFlowableSubscribe1) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to RxJavaPlugins.setOnFlowableSubscribe({0})", onFlowableSubscribe1); if (Utils.useSegments) { // only have to manipulate if there is an existing function set if(onFlowableSubscribe != null) { + NewRelic.getAgent().getLogger().log(Level.FINE, "In RxJavaPlugins.setOnFlowableSubscribe, the value of onFlowableSubscribe has already been set to {0}", onFlowableSubscribe); if(onFlowableSubscribe instanceof NRFlowableSubWrapper) { NRFlowableSubWrapper nr2_1 = (NRFlowableSubWrapper)onFlowableSubscribe; if(onFlowableSubscribe1 instanceof NRFlowableSubWrapper) { @@ -273,8 +407,11 @@ public static void setOnFlowableSubscribe(BiFunction Observable onAssembly(Observable source) { Utils.init(); } Observable observable = Weaver.callOriginal(); - if(!ObervableUtils.ignore(observable) && observable.observableName == null) { - observable.observableName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(observable.observableName == null) { + observable.observableName = source.getClass().getSimpleName(); } return observable; @@ -300,10 +437,10 @@ public static Single onAssembly(Single source) { } Single single = Weaver.callOriginal(); if(single.singleName == null) { - single.singleName = NewRelic.getAgent().getTracedMethod().getMetricName(); + single.singleName = source.singleName != null ? source.singleName : source.getClass().getName(); } - return new NRSingleWrapper(single); + return single; } public static Completable onAssembly(Completable source) { @@ -311,8 +448,8 @@ public static Completable onAssembly(Completable source) { Utils.init(); } Completable completable = Weaver.callOriginal(); - if(!CompletableUtils.ignore(completable) && completable.completableName == null) { - completable.completableName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(completable.completableName == null) { + completable.completableName = source.getClass().getSimpleName(); } return completable; @@ -323,8 +460,8 @@ public static Flowable onAssembly(Flowable source) { Utils.init(); } Flowable flowable = Weaver.callOriginal(); - if(!FlowableUtils.ignore(flowable) && flowable.flowableName == null) { - flowable.flowableName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(flowable.flowableName == null) { + flowable.flowableName = source.flowableName != null ? source.flowableName : source.getClass().getSimpleName(); } return flowable; } @@ -334,8 +471,8 @@ public static Maybe onAssembly(Maybe source) { Utils.init(); } Maybe maybe = Weaver.callOriginal(); - if(!MaybeUtils.ignore(maybe) && maybe.maybeName == null) { - maybe.maybeName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(maybe.maybeName == null) { + maybe.maybeName = source.getClass().getSimpleName(); } return maybe; diff --git a/rxjava2-finder/build.gradle b/rxjava2-finder/build.gradle index dd5a037..17844b3 100644 --- a/rxjava2-finder/build.gradle +++ b/rxjava2-finder/build.gradle @@ -14,10 +14,10 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava2-finder' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' - attributes 'Implementation-Version': 1.0 + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava2-finder' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.1 attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava2.RxJava2PreMain' } } diff --git a/rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2LoaderService.java b/rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2LoaderService.java deleted file mode 100644 index 0220f97..0000000 --- a/rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2LoaderService.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.newrelic.agent.instrumentation.labs.rxjava2.finder; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.logging.Level; - -import com.newrelic.agent.instrumentation.ClassTransformerService; -import com.newrelic.agent.instrumentation.PointCutClassTransformer; -import com.newrelic.agent.service.AbstractService; -import com.newrelic.agent.service.ServiceFactory; -import com.newrelic.api.agent.NewRelic; - -public class RxJava2LoaderService extends AbstractService { - - private ExecutorService executor = null; - - public RxJava2LoaderService() { - super("RxJava2LoaderService"); - } - - @Override - public boolean isEnabled() { - return true; - } - - @Override - protected void doStart() throws Exception { - ClassTransformerService classTransformerService = ServiceFactory.getClassTransformerService(); - if(classTransformerService != null) { - PointCutClassTransformer classTransformer = classTransformerService.getClassTransformer(); - if(classTransformer != null) { - RxJava2PointCut rxjava2Pointcut = new RxJava2PointCut(classTransformer); - boolean b = classTransformerService.addTraceMatcher(rxjava2Pointcut, "RxJava2"); - NewRelic.getAgent().getLogger().log(Level.FINE, "Result of adding RxJava2Pointcut is {0}", b); - } else { - NewRelic.getAgent().getLogger().log(Level.FINE, "Could not load matcher because ClassTransformer is null"); - startExecutor(); - - } - } else { - NewRelic.getAgent().getLogger().log(Level.FINE, "Could not load matcher because ClassTransformerService is null"); - startExecutor(); - } - } - - @Override - protected void doStop() throws Exception { - - } - - private boolean addTraceMatcher(ClassTransformerService classTransformerService) { - PointCutClassTransformer classTransformer = classTransformerService.getClassTransformer(); - RxJava2PointCut rxjava2Pointcut = new RxJava2PointCut(classTransformer); - return classTransformerService.addTraceMatcher(rxjava2Pointcut, "RxJava2"); - } - - private void startExecutor() { - executor = Executors.newSingleThreadExecutor(); - RunCheck runCheck = new RunCheck(); - executor.submit(runCheck); - NewRelic.getAgent().getLogger().log(Level.FINE, "Submit RunCheck to executor"); - } - - private void shutdownExecutor() { - executor.shutdown(); - NewRelic.getAgent().getLogger().log(Level.FINE, "ReactorLoaderService executor has shut down"); - } - - - private class RunCheck implements Runnable { - - @Override - public void run() { - boolean done = false; - while(!done) { - ClassTransformerService classTransformerService = ServiceFactory.getClassTransformerService(); - if(classTransformerService != null) { - PointCutClassTransformer classTransformer = classTransformerService.getClassTransformer(); - if(classTransformer != null) { - done = true; - boolean b = addTraceMatcher(classTransformerService); - NewRelic.getAgent().getLogger().log(Level.FINE, "Result of adding ReactorPointcut is {0}", b); - } - } else { - try { - Thread.sleep(5000L); - } catch (InterruptedException e) { - } - } - } - shutdownExecutor(); - } - - } - -} diff --git a/rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2PointCut.java b/rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2PointCut.java deleted file mode 100644 index f6de46d..0000000 --- a/rxjava2-finder/src/main/java/com/newrelic/agent/instrumentation/labs/rxjava2/finder/RxJava2PointCut.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.newrelic.agent.instrumentation.labs.rxjava2.finder; - -import com.newrelic.agent.MetricNames; -import com.newrelic.agent.Transaction; -import com.newrelic.agent.instrumentation.PointCutClassTransformer; -import com.newrelic.agent.instrumentation.PointCutConfiguration; -import com.newrelic.agent.instrumentation.TracerFactoryPointCut; -import com.newrelic.agent.tracers.ClassMethodSignature; -import com.newrelic.agent.tracers.OtherRootTracer; -import com.newrelic.agent.tracers.Tracer; -import com.newrelic.agent.tracers.metricname.ClassMethodMetricNameFormat; - -public class RxJava2PointCut extends TracerFactoryPointCut { - - public RxJava2PointCut(PointCutClassTransformer classTransformer) { - super(new PointCutConfiguration("rxjava2"),new RxJava2ClassMatcher(), new RxJava2ReturnMethodMatcher()); - } - - - - @Override - public boolean isDispatcher() { - return true; - } - - - - @Override - protected Tracer doGetTracer(Transaction transaction, ClassMethodSignature sig, Object rx, Object[] args) { - return new RxJava2MethodTracer(transaction, sig, rx); - } - - private static class RxJava2MethodTracer extends OtherRootTracer { - - public RxJava2MethodTracer(Transaction transaction, ClassMethodSignature sig, Object rx) { - super(transaction,sig,rx, new ClassMethodMetricNameFormat(sig, rx, MetricNames.OTHER_TRANSACTION+"/RxJava2")); - } - - } -} diff --git a/rxjava3-3.0/build.gradle b/rxjava3-3.0/build.gradle index 037bbad..f609544 100644 --- a/rxjava3-3.0/build.gradle +++ b/rxjava3-3.0/build.gradle @@ -14,9 +14,9 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava3-3.0' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava3-3.0' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' attributes 'Implementation-Version': 1.0 } } diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCancelAction.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCancelAction.java new file mode 100644 index 0000000..0de2147 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCancelAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import io.reactivex.rxjava3.functions.Action; + +public class NRCancelAction implements Action { + + private NRRxJava3Holder holder = null; + + public NRCancelAction(NRRxJava3Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.ignoreSegment(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableAssembly.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableAssembly.java new file mode 100644 index 0000000..9c22c9b --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableAssembly.java @@ -0,0 +1,55 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.internal.functions.Functions; +import io.reactivex.rxjava3.internal.operators.completable.CompletablePeek; + +public class NRCompletableAssembly implements Function { + + private static final String FROM_PREFIX = "CompletableFrom"; + private static final String INTERVAL_PREFIX = "CompletableInterval"; + private static final String NEVER = "CompletableNever"; + + private Function delegate = null; + + public NRCompletableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Completable apply(Completable t) throws Throwable { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getCompletableIgnores().contains(simpleName)) return t; + if(t.completableName == null) { + t.completableName = simpleName; + } + NRRxJava3Holder holder = new NRRxJava3Holder<>("Completable",t.completableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + + Completable result = delegate != null ? delegate.apply(t) : t; + + Completable subscribe = new CompletablePeek(result, disposableConsumer, errorConsumer, completeAction, terminationAction, Functions.EMPTY_ACTION,Functions.EMPTY_ACTION); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableObserver.java new file mode 100644 index 0000000..1420147 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableObserver.java @@ -0,0 +1,57 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.rxjava3.core.CompletableObserver; +import io.reactivex.rxjava3.disposables.Disposable; + +public class NRCompletableObserver implements CompletableObserver { + + private CompletableObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRCompletableObserver(CompletableObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Completable",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Completable",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Completable",name,"onError"); + if(downstream != null) { + downstream.onComplete(); + } + } + + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableSubWrapper.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableSubWrapper.java similarity index 61% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableSubWrapper.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableSubWrapper.java index 296a228..b6911dc 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableSubWrapper.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompletableSubWrapper.java @@ -1,9 +1,8 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava3; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.CompletableObserver; import io.reactivex.rxjava3.functions.BiFunction; -import io.reactivex.rxjava3.internal.operators.completable.CompletableUtils; public class NRCompletableSubWrapper implements BiFunction { @@ -15,14 +14,11 @@ public NRCompletableSubWrapper(BiFunction getDelegate() { diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompleteAction.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompleteAction.java new file mode 100644 index 0000000..80b1b68 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRCompleteAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import io.reactivex.rxjava3.functions.Action; + +public class NRCompleteAction implements Action { + + private NRRxJava3Holder holder = null; + + public NRCompleteAction(NRRxJava3Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.endSegment(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRDisposableConsumer.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRDisposableConsumer.java new file mode 100644 index 0000000..a2a0f73 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRDisposableConsumer.java @@ -0,0 +1,30 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.Trace; + +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.functions.Consumer; + +public class NRDisposableConsumer implements Consumer { + + private NRRxJava3Holder holder = null; + private static boolean isTransformed = false; + + public NRDisposableConsumer(NRRxJava3Holder h) { + holder = h; + if(!isTransformed) { + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + isTransformed = true; + } + } + + @Override + @Trace(async = true) + public void accept(Disposable t) throws Exception { + if(holder != null) { + holder.startSegment(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRErrorConsumer.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRErrorConsumer.java new file mode 100644 index 0000000..40eea9d --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRErrorConsumer.java @@ -0,0 +1,25 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.functions.Consumer; + +public class NRErrorConsumer implements Consumer { + + private NRRxJava3Holder holder = null; + + public NRErrorConsumer( NRRxJava3Holder h) { + holder = h; + } + + @Override + public void accept(Throwable t) throws Exception { + NewRelic.noticeError(t); + if(holder != null) { + holder.ignoreSegment(); + holder.expireToken(); + holder = null; + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableAssembly.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableAssembly.java new file mode 100644 index 0000000..aa656b1 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableAssembly.java @@ -0,0 +1,60 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.internal.functions.Functions; +import io.reactivex.rxjava3.internal.operators.flowable.FlowableDoOnEach; +import io.reactivex.rxjava3.internal.operators.flowable.FlowableDoOnLifecycle; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NRFlowableAssembly implements Function { + + private static final String FROM_PREFIX = "FlowableFrom"; + private static final String INTERVAL_PREFIX = "FlowableInterval"; + private static final String NEVER = "FlowableNever"; + + private Function delegate = null; + + public NRFlowableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Flowable apply(Flowable t) throws Throwable { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getFlowableIgnores().contains(simpleName)) return t; + if(t.flowableName == null) { + t.flowableName = simpleName; + } + NRRxJava3Holder holder = new NRRxJava3Holder<>("Flowable",t.flowableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRNextConsumer nextConsumer = new NRNextConsumer<>(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRSubscriberConsumer subscribeConsumer = new NRSubscriberConsumer(holder); + NRCancelAction cancelAction = new NRCancelAction(holder); + + + Flowable result = delegate != null ? delegate.apply(t) : t; + Flowable result2 = new FlowableDoOnEach<>(result, nextConsumer , errorConsumer, completeAction, terminationAction); + Flowable subscribe = new FlowableDoOnLifecycle<>(result2, subscribeConsumer, Functions.EMPTY_LONG_CONSUMER, cancelAction); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableObserver.java new file mode 100644 index 0000000..50a77f2 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableObserver.java @@ -0,0 +1,97 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.Transaction; + +public class NRFlowableObserver implements Subscriber { + + private Subscriber downstream; + + private String name = null; + private Transaction transaction = null; + + private static boolean isTransformed = false; + + public NRFlowableObserver(Subscriber downstream, String n, Transaction txn) { + transaction = txn; + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Subscription s) { + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber",name,"onSubscribe"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber","UnNamed_Flowable","onSubscribe"); + } + + if(downstream != null) { + downstream.onSubscribe(s); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.noticeError(e); + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber",name,"onError"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber","UnNamed_Flowable","onError"); + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserver2.onError with subscriber {0}, name {1}",downstream,name); + if (downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber",name,"onComplete"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber","UnNamed_Flowable","onComplete"); + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to NRFlowableObserve2.onComplete with subscriber {0}, name {1}",downstream,name); + if (downstream != null) { + downstream.onComplete(); + } + } + + @Override + @Trace(async = true) + public void onNext(T t) { + Token token = transaction.getToken(); + if(token != null && token.isActive()) { + token.linkAndExpire(); + } else if(token != null) { + token.expire(); + } + token = null; + if(name != null && !name.isEmpty()) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber",name,"onNext"); + } else { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Flowable","Subscriber","UnNamed_Flowable","onNext"); + } + if (downstream != null) { + downstream.onNext(t); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableSubWrapper.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableSubWrapper.java similarity index 60% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableSubWrapper.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableSubWrapper.java index 95f4650..423aa28 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableSubWrapper.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRFlowableSubWrapper.java @@ -1,10 +1,11 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava3; import org.reactivestreams.Subscriber; +import com.newrelic.api.agent.NewRelic; + import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.functions.BiFunction; -import io.reactivex.rxjava3.internal.operators.flowable.FlowableUtils; @SuppressWarnings("rawtypes") public class NRFlowableSubWrapper implements BiFunction { @@ -18,14 +19,12 @@ public NRFlowableSubWrapper(BiFunction d) { @SuppressWarnings("unchecked") @Override public Subscriber apply(Flowable t1, Subscriber t2) throws Throwable { - boolean ignore = FlowableUtils.ignore(t1); + if(delegate == null) { - if(ignore) return t2; - return t2 instanceof NRFlowableObserver2 ? t2 : new NRFlowableObserver2(t2, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName()); + return t2 instanceof NRFlowableObserver ? t2 : new NRFlowableObserver(t2, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName(),NewRelic.getAgent().getTransaction()); } Subscriber actual = delegate.apply(t1, t2); - if(ignore) return actual; - return t2 instanceof NRFlowableObserver2 ? actual : new NRFlowableObserver2(actual, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName()); + return t2 instanceof NRFlowableObserver ? actual : new NRFlowableObserver(actual, t1.flowableName != null ? t1.flowableName : t1.getClass().getSimpleName(), NewRelic.getAgent().getTransaction()); } public BiFunction getDelegate() { diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeAssembly.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeAssembly.java new file mode 100644 index 0000000..8366fdc --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeAssembly.java @@ -0,0 +1,48 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.core.Maybe; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.internal.functions.Functions; +import io.reactivex.rxjava3.internal.operators.maybe.MaybePeek; + +@SuppressWarnings({"rawtypes", "unchecked"}) +public class NRMaybeAssembly implements Function { + + private Function delegate = null; + + public NRMaybeAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Maybe apply(Maybe t) throws Throwable { + if(Utils.useSegments) { + if(t.maybeName == null) { + t.maybeName = t.getClass().getSimpleName(); + } + NRRxJava3Holder holder = new NRRxJava3Holder<>("Maybe",t.maybeName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + NRSuccessConsumer successConsumer = new NRSuccessConsumer<>(holder); + + Maybe result = delegate != null ? delegate.apply(t) : t; + + Maybe subscribe = new MaybePeek(result, disposableConsumer,successConsumer, errorConsumer, completeAction, terminationAction,Functions.EMPTY_ACTION); + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeObserver.java new file mode 100644 index 0000000..d31da8e --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeObserver.java @@ -0,0 +1,65 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.rxjava3.core.MaybeObserver; +import io.reactivex.rxjava3.disposables.Disposable; + +public class NRMaybeObserver implements MaybeObserver { + + private MaybeObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRMaybeObserver(MaybeObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Maybe",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Maybe",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Maybe",name,"onComplete"); + if(downstream != null) { + downstream.onComplete(); + } + } + + @Override + @Trace + public void onSuccess(T value) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Maybe",name,"onSuccess"); + if(downstream != null) { + downstream.onSuccess(value); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeSubWrapper.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeSubWrapper.java similarity index 62% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeSubWrapper.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeSubWrapper.java index 12b1ef6..45c79cb 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeSubWrapper.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRMaybeSubWrapper.java @@ -1,9 +1,8 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava3; import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.MaybeObserver; import io.reactivex.rxjava3.functions.BiFunction; -import io.reactivex.rxjava3.internal.operators.maybe.MaybeUtils; @SuppressWarnings("rawtypes") public class NRMaybeSubWrapper implements BiFunction { @@ -17,15 +16,12 @@ public NRMaybeSubWrapper(BiFunction d) { @SuppressWarnings("unchecked") @Override public MaybeObserver apply(Maybe t1, MaybeObserver t2) throws Throwable { - boolean ignore = MaybeUtils.ignore(t1); if(delegate == null) { - if(ignore) return t2; - return t2 instanceof NRMaybeObserver2 ? t2 : new NRMaybeObserver2(t2, t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); + return t2 instanceof NRMaybeObserver ? t2 : new NRMaybeObserver(t2, t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); } MaybeObserver actual = delegate.apply(t1, t2); - if(ignore) return actual; - return t2 instanceof NRMaybeObserver2 ? actual : new NRMaybeObserver2(actual,t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); + return t2 instanceof NRMaybeObserver ? actual : new NRMaybeObserver(actual,t1.maybeName != null ? t1.maybeName : t1.getClass().getSimpleName()); } public BiFunction getDelegate() { diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRNextConsumer.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRNextConsumer.java new file mode 100644 index 0000000..76e0614 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRNextConsumer.java @@ -0,0 +1,20 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import io.reactivex.rxjava3.functions.Consumer; + +public class NRNextConsumer implements Consumer { + + private NRRxJava3Holder holder = null; + + public NRNextConsumer(NRRxJava3Holder h) { + holder = h; + } + + @Override + public void accept(T t) throws Exception { + if(holder != null) { + holder.linkToken(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableAssembly.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableAssembly.java new file mode 100644 index 0000000..f3abbb3 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableAssembly.java @@ -0,0 +1,58 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.internal.functions.Functions; +import io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnEach; +import io.reactivex.rxjava3.internal.operators.observable.ObservableDoOnLifecycle; + +@SuppressWarnings({"rawtypes","unchecked"}) +public class NRObservableAssembly implements Function { + + private Function delegate = null; + private static final String FROM_PREFIX = "ObservableFrom"; + private static final String INTERVAL_PREFIX = "ObservableInterval"; + private static final String NEVER = "ObservableNever"; + + public NRObservableAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Observable apply(Observable t) throws Throwable { + if(Utils.useSegments) { + String simpleName = t.getClass().getSimpleName(); + if(simpleName.startsWith(FROM_PREFIX)) return t; + if(simpleName.startsWith(INTERVAL_PREFIX)) return t; + if(simpleName.equals(NEVER)) return t; + if(Utils.getObservableIgnores().contains(simpleName)) return t; + + if(t.observableName == null) { + t.observableName = simpleName; + } + NRRxJava3Holder holder = new NRRxJava3Holder<>("Observable",t.observableName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRCompleteAction completeAction = new NRCompleteAction(holder); + NRTerminationAction terminationAction = new NRTerminationAction(holder); + NRNextConsumer nextConsumer = new NRNextConsumer<>(holder); + NRDisposableConsumer disposableConsumer = new NRDisposableConsumer(holder); + Observable result = delegate != null ? delegate.apply(t) : t; + + Observable subscribe = new ObservableDoOnLifecycle<>(result, disposableConsumer, Functions.EMPTY_ACTION); + Observable result2 = new ObservableDoOnEach(subscribe, nextConsumer, errorConsumer, completeAction, terminationAction); + return result2; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableObserver.java new file mode 100644 index 0000000..c71d7b7 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableObserver.java @@ -0,0 +1,65 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.disposables.Disposable; + +public class NRObservableObserver implements Observer { + + private Observer downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRObservableObserver(Observer downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Observable",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Observable",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onNext(T t) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Observable",name,"onNext"); + if(downstream != null) { + downstream.onNext(t); + } + } + + @Override + @Trace + public void onComplete() { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Observable",name,"onComplete"); + if(downstream != null) { + downstream.onComplete(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableSubWrapper.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableSubWrapper.java similarity index 59% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableSubWrapper.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableSubWrapper.java index 63e9b72..c694b42 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableSubWrapper.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRObservableSubWrapper.java @@ -1,9 +1,8 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava3; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.functions.BiFunction; -import io.reactivex.rxjava3.internal.operators.observable.ObervableUtils; @SuppressWarnings("rawtypes") public class NRObservableSubWrapper implements BiFunction { @@ -17,15 +16,12 @@ public NRObservableSubWrapper(BiFunction d) { @SuppressWarnings("unchecked") @Override public Observer apply(Observable t1, Observer t2) throws Throwable { - boolean ignore = ObervableUtils.ignore(t1); if(delegate == null) { - if(ignore) return t2; - return t2 instanceof NRObservableObserver2 ? t2 : new NRObservableObserver2(t2, t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); + return t2 instanceof NRObservableObserver ? t2 : new NRObservableObserver(t2, t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); } Observer actual = delegate.apply(t1, t2); - if(ignore) return actual; - return t2 instanceof NRObservableObserver2 ? actual : new NRObservableObserver2(actual,t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); + return t2 instanceof NRObservableObserver ? actual : new NRObservableObserver(actual,t1.observableName != null ? t1.observableName : t1.getClass().getSimpleName()); } public BiFunction getDelegate() { diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRRunnable.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java similarity index 94% rename from rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRRunnable.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java index 8a05a2a..ea23a8d 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/rxjava2/NRRunnable.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.rxjava2; +package com.newrelic.instrumentation.labs.rxjava3; import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRRunnableDecorator.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java similarity index 94% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRRunnableDecorator.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java index d2b22d6..17275eb 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRRunnableDecorator.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava3; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.Token; diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJava3Holder.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJava3Holder.java new file mode 100644 index 0000000..6127ec0 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJava3Holder.java @@ -0,0 +1,78 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Transaction; + +public class NRRxJava3Holder { + + private Segment segment = null; + private String name = null; + private String rxType = "Unknown"; + private Transaction transaction = null; + private Token token = null; + + public NRRxJava3Holder(String type, String n, Transaction txn) { + name = n; + transaction = txn; + if(type != null && !type.isEmpty()) { + rxType = type; + } + Token t = transaction.getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + + public void startSegment() { + segment = transaction.startSegment("RxJava3/"+rxType+"/TotalTime",name); + } + + public void linkToken() { + if(token != null) { + token.link(); + } + } + + public void linkAndExpireToken() { + if(token != null) { + token.linkAndExpire(); + token = null; + } + } + + public void expireToken() { + if(token != null) { + token.expire(); + token = null; + } + } + + public void endSegment() { + if(segment != null) { + segment.end(); + segment = null; + } + } + + public void ignoreSegment() { + if(segment != null) { + segment.ignore(); + segment = null; + } + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return new String("NRRxJavaHolder:{rxType = "+rxType + ", name = "+name+"}"); + } + + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleAssembly.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleAssembly.java new file mode 100644 index 0000000..3dc7daf --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleAssembly.java @@ -0,0 +1,48 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.internal.operators.single.SingleDoOnError; +import io.reactivex.rxjava3.internal.operators.single.SingleDoOnSubscribe; +import io.reactivex.rxjava3.internal.operators.single.SingleDoOnSuccess; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NRSingleAssembly implements Function { + + private Function delegate = null; + + public NRSingleAssembly() { + + } + + public void setDelegate(Function d) { + delegate = d; + } + + public Function getDelegate() { + return delegate; + } + + @Override + public Single apply(Single t) throws Throwable { + if(Utils.useSegments) { + if(t.singleName == null) { + t.singleName = t.getClass().getSimpleName(); + } + NRRxJava3Holder holder = new NRRxJava3Holder<>("Single",t.singleName, NewRelic.getAgent().getTransaction()); + NRErrorConsumer errorConsumer = new NRErrorConsumer(holder); + NRDisposableConsumer disposeConsumer = new NRDisposableConsumer(holder); + NRSuccessConsumer sucessConsumer = new NRSuccessConsumer<>(holder); + Single result = delegate != null ? delegate.apply(t) : t; + Single error = new SingleDoOnError<>(result, errorConsumer); + Single success = new SingleDoOnSuccess<>(error, sucessConsumer); + Single subscribe = new SingleDoOnSubscribe<>(success, disposeConsumer); + + return subscribe; + } + return delegate != null ? delegate.apply(t) : t; + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleObserver.java new file mode 100644 index 0000000..c5850b0 --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleObserver.java @@ -0,0 +1,57 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; + +import io.reactivex.rxjava3.core.SingleObserver; +import io.reactivex.rxjava3.disposables.Disposable; + +public class NRSingleObserver implements SingleObserver { + + private SingleObserver downstream; + + private String name = null; + + private static boolean isTransformed = false; + + public NRSingleObserver(SingleObserver downstream, String n) { + this.downstream = downstream; + name = n; + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace + public void onSubscribe(Disposable d) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Single",name,"onSubscribe"); + if(downstream != null) { + downstream.onSubscribe(d); + } + } + + + @Override + @Trace + public void onError(Throwable e) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Single",name,"onError"); + NewRelic.noticeError(e); + if(downstream != null) { + downstream.onError(e); + } + } + + @Override + @Trace + public void onSuccess(T value) { + NewRelic.getAgent().getTracedMethod().setMetricName("Custom","RxJava3","Single",name,"onSuccess"); + if(downstream != null) { + downstream.onSuccess(value); + } + } + + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleSubWrapper.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleSubWrapper.java similarity index 71% rename from rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleSubWrapper.java rename to rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleSubWrapper.java index 522b9f9..2b24663 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleSubWrapper.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSingleSubWrapper.java @@ -1,4 +1,4 @@ -package com.newrelic.instrumentation.rxjava3; +package com.newrelic.instrumentation.labs.rxjava3; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.core.SingleObserver; @@ -17,10 +17,10 @@ public NRSingleSubWrapper(BiFunction d) @Override public SingleObserver apply(Single t1, SingleObserver t2) throws Throwable { if(delegate == null) { - return t2 instanceof NRSingleObserver2 ? t2 : new NRSingleObserver2(t2, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); + return t2 instanceof NRSingleObserver ? t2 : new NRSingleObserver(t2, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); } SingleObserver actual = delegate.apply(t1, t2); - return t2 instanceof NRSingleObserver2 ? actual : new NRSingleObserver2(actual, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); + return t2 instanceof NRSingleObserver ? actual : new NRSingleObserver(actual, t1.singleName != null ? t1.singleName : t1.getClass().getSimpleName()); } public BiFunction getDelegate() { diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSubscriberConsumer.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSubscriberConsumer.java new file mode 100644 index 0000000..7523abf --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSubscriberConsumer.java @@ -0,0 +1,22 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import org.reactivestreams.Subscription; + +import io.reactivex.rxjava3.functions.Consumer; + +public class NRSubscriberConsumer implements Consumer { + + private NRRxJava3Holder holder = null; + + public NRSubscriberConsumer(NRRxJava3Holder h) { + holder = h; + } + + @Override + public void accept(Subscription subscription) throws Exception { + if(holder != null) { + holder.startSegment(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSuccessConsumer.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSuccessConsumer.java new file mode 100644 index 0000000..637eaec --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRSuccessConsumer.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import io.reactivex.rxjava3.functions.Consumer; + +public class NRSuccessConsumer implements Consumer { + + private NRRxJava3Holder holder = null; + + public NRSuccessConsumer(NRRxJava3Holder h) { + holder = h; + } + + @Override + public void accept(T t) throws Exception { + if(holder != null) { + holder.endSegment(); + holder.expireToken(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRTerminationAction.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRTerminationAction.java new file mode 100644 index 0000000..3d1dd2e --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRTerminationAction.java @@ -0,0 +1,21 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import io.reactivex.rxjava3.functions.Action; + +public class NRTerminationAction implements Action { + + private NRRxJava3Holder holder = null; + + public NRTerminationAction(NRRxJava3Holder h) { + holder = h; + } + + @Override + public void run() throws Exception { + if(holder != null) { + holder.expireToken(); + holder.ignoreSegment(); + } + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/Utils.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/Utils.java new file mode 100644 index 0000000..979ecff --- /dev/null +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/Utils.java @@ -0,0 +1,325 @@ +package com.newrelic.instrumentation.labs.rxjava3; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; + +import org.reactivestreams.Subscriber; + +import com.newrelic.agent.config.AgentConfig; +import com.newrelic.agent.config.AgentConfigListener; +import com.newrelic.agent.service.ServiceFactory; +import com.newrelic.api.agent.Config; +import com.newrelic.api.agent.NewRelic; + +import io.reactivex.rxjava3.core.Completable; +import io.reactivex.rxjava3.core.CompletableObserver; +import io.reactivex.rxjava3.core.Flowable; +import io.reactivex.rxjava3.core.Maybe; +import io.reactivex.rxjava3.core.MaybeObserver; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.core.Observer; +import io.reactivex.rxjava3.core.Single; +import io.reactivex.rxjava3.core.SingleObserver; +import io.reactivex.rxjava3.functions.BiFunction; +import io.reactivex.rxjava3.functions.Function; +import io.reactivex.rxjava3.plugins.RxJavaPlugins; + +public class Utils implements AgentConfigListener { + + public static boolean initialized = false; + public static boolean useSegments = true; + public static boolean useDecorators = true; + private static final String USESEGMENTS = "RxJava3.useSegments"; + private static final String USEDECORATORS = "RxJava3.useDecorators"; + private static final String COMPLETABLE_IGNORES = "RxJava3.Completable.ignores"; + private static final String FLOWABLE_IGNORES = "RxJava3.Flowable.ignores"; + private static final String MAYBE_IGNORES = "RxJava3.Maybe.ignores"; + private static final String OBSERVABLE_IGNORES = "RxJava3.Observable.ignores"; + private static final String SINGLE_IGNORES = "RxJava3.Single.ignores"; + private static Set completable_ignores = new HashSet<>(); + private static Set flowable_ignores = new HashSet<>(); + private static Set maybe_ignores = new HashSet<>(); + private static Set observable_ignores = new HashSet<>(); + private static Set single_ignores = new HashSet<>(); + + private static final Utils INSTANCE = new Utils(); + + private Utils() { + + } + + public static void init() { + boolean lockdown = RxJavaPlugins.isLockdown(); + + if (lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava3 Wrappers because RxJavaPlugins is locked down"); + } else { + NRRunnableDecorator decorator; + Function f = RxJavaPlugins.getScheduleHandler(); + decorator = new NRRunnableDecorator(f); + RxJavaPlugins.setScheduleHandler(decorator); + ServiceFactory.getConfigService().addIAgentConfigListener(INSTANCE); + Config config = NewRelic.getAgent().getConfig(); + if (config != null) { + Boolean b = config.getValue(USESEGMENTS); + + if (b != null && b != useSegments) { + useSegments = b; + removeAssemblyDecorators(useSegments); + } + + b = config.getValue(USEDECORATORS); + if(b != null && b != useDecorators) { + useDecorators = b; + removeSubscribeDecorators(useDecorators); + } + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useSegments is set to {0}", useSegments); + NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useDecorators is set to {0}", useDecorators); + addSubscribeDecorators(useDecorators); + addAssemblyDecorators(useSegments); + + String ignores = config.getValue(COMPLETABLE_IGNORES); + completable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + completable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore completables with these names: {0}", completable_ignores); + } + ignores = config.getValue(FLOWABLE_IGNORES); + flowable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + flowable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore flowables with these names: {0}", flowable_ignores); + } + ignores = config.getValue(MAYBE_IGNORES); + maybe_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + maybe_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore maybes with these names: {0}", maybe_ignores); + } + ignores = config.getValue(OBSERVABLE_IGNORES); + observable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + observable_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore observables with these names: {0}", observable_ignores); + } + ignores = config.getValue(SINGLE_IGNORES); + single_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + single_ignores.addAll(Arrays.asList(splits)); + NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore singles with these names: {0}", single_ignores); + } + + + } + initialized = true; + } + + public static Set getCompletableIgnores() { + return completable_ignores; + } + + public static Set getFlowableIgnores() { + return flowable_ignores; + } + + public static Set getMaybeIgnores() { + return maybe_ignores; + } + + public static Set getObservableIgnores() { + return observable_ignores; + } + + public static Set getSingleIgnores() { + return single_ignores; + } + + private static void addAssemblyDecorators(boolean add) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava3 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(add) { + RxJavaPlugins.setOnSingleAssembly(new NRSingleAssembly()); + RxJavaPlugins.setOnFlowableAssembly(new NRFlowableAssembly()); + RxJavaPlugins.setOnCompletableAssembly(new NRCompletableAssembly()); + RxJavaPlugins.setOnMaybeAssembly(new NRMaybeAssembly()); + RxJavaPlugins.setOnObservableAssembly(new NRObservableAssembly()); + } + } + + private static void addSubscribeDecorators(boolean add) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava3 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(add) { + RxJavaPlugins.setOnObservableSubscribe(new NRObservableSubWrapper(null)); + RxJavaPlugins.setOnSingleSubscribe(new NRSingleSubWrapper(null)); + RxJavaPlugins.setOnCompletableSubscribe(new NRCompletableSubWrapper(null)); + RxJavaPlugins.setOnFlowableSubscribe(new NRFlowableSubWrapper(null)); + RxJavaPlugins.setOnMaybeSubscribe(new NRMaybeSubWrapper(null)); + } + } + + @SuppressWarnings("rawtypes") + public static void removeAssemblyDecorators(boolean remove) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava3 Assembly descorators because RxJavaPlugins is locked down"); + return; + } + if(remove) { + Function fSingle = RxJavaPlugins.getOnSingleAssembly(); + if(fSingle != null) { + if(fSingle instanceof NRSingleAssembly) { + NRSingleAssembly singleAssembly = (NRSingleAssembly)fSingle; + Function delegate = singleAssembly.getDelegate(); + RxJavaPlugins.setOnSingleAssembly(delegate); + } + } + Function fCompletable = RxJavaPlugins.getOnCompletableAssembly(); + if(fCompletable != null) { + if(fCompletable instanceof NRCompletableAssembly) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)fCompletable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnCompletableAssembly(delegate); + } + } + Function fFlowable = RxJavaPlugins.getOnFlowableAssembly(); + if(fFlowable != null) { + if(fFlowable instanceof NRFlowableAssembly) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)fFlowable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnFlowableAssembly(delegate); + } + } + Function fMaybe = RxJavaPlugins.getOnMaybeAssembly(); + if(fMaybe != null) { + if(fMaybe instanceof NRMaybeAssembly) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)fMaybe; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnMaybeAssembly(delegate); + } + } + Function fObservable = RxJavaPlugins.getOnObservableAssembly(); + if(fObservable != null) { + if(fObservable instanceof NRObservableAssembly) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)fObservable; + Function delegate = nrAssembly.getDelegate(); + RxJavaPlugins.setOnObservableAssembly(delegate); + } + } + } + } + + @SuppressWarnings("rawtypes") + private static void removeSubscribeDecorators(boolean remove) { + boolean lockdown = RxJavaPlugins.isLockdown(); + if(lockdown) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava3 Subscribe descorators because RxJavaPlugins is locked down"); + return; + } + if(remove) { + BiFunction fComp = RxJavaPlugins.getOnCompletableSubscribe(); + if(fComp != null) { + if(fComp instanceof NRCompletableSubWrapper) { + NRCompletableSubWrapper wrapper = (NRCompletableSubWrapper)fComp; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnCompletableSubscribe(delegate); + + } + } + BiFunction fFlow = RxJavaPlugins.getOnFlowableSubscribe(); + if(fFlow != null) { + if(fFlow instanceof NRFlowableSubWrapper) { + NRFlowableSubWrapper wrapper = (NRFlowableSubWrapper)fFlow; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnFlowableSubscribe(delegate); + } + } + BiFunction fMaybe = RxJavaPlugins.getOnMaybeSubscribe(); + if(fMaybe != null) { + if(fMaybe instanceof NRMaybeSubWrapper) { + NRMaybeSubWrapper wrapper = (NRMaybeSubWrapper)fMaybe; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnMaybeSubscribe(delegate); + } + } + BiFunction fObs = RxJavaPlugins.getOnObservableSubscribe(); + if(fObs != null) { + if(fObs instanceof NRObservableSubWrapper) { + NRObservableSubWrapper wrapper = (NRObservableSubWrapper)fObs; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnObservableSubscribe(delegate); + } + } + BiFunction fSingle = RxJavaPlugins.getOnSingleSubscribe(); + if(fSingle != null) { + if(fSingle instanceof NRSingleSubWrapper) { + NRSingleSubWrapper wrapper = (NRSingleSubWrapper)fSingle; + BiFunction delegate = wrapper.getDelegate(); + RxJavaPlugins.setOnSingleSubscribe(delegate); + } + } + } + } + + + @Override + public void configChanged(String appName, AgentConfig agentConfig) { + Boolean b = agentConfig.getValue(USESEGMENTS); + if(b != null && b != useSegments) { + useSegments = b; + removeSubscribeDecorators(!useSegments); + addSubscribeDecorators(useSegments); + } + if(useSegments) { + NewRelic.getAgent().getLogger().log(Level.INFO, "Will use segments for RxJava objects"); + } else { + NewRelic.getAgent().getLogger().log(Level.INFO, "Will not use segments for RxJava objects"); + } + String ignores = agentConfig.getValue(COMPLETABLE_IGNORES); + completable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + completable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(FLOWABLE_IGNORES); + flowable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + flowable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(MAYBE_IGNORES); + maybe_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + maybe_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(OBSERVABLE_IGNORES); + observable_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + observable_ignores.addAll(Arrays.asList(splits)); + } + ignores = agentConfig.getValue(SINGLE_IGNORES); + single_ignores.clear(); + if(ignores != null && !ignores.isEmpty()) { + String[] splits = ignores.split(","); + single_ignores.addAll(Arrays.asList(splits)); + } + + } + +} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver.java deleted file mode 100644 index 47638c8..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.rxjava3.core.CompletableObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRCompletableObserver implements CompletableObserver, Disposable { - - private CompletableObserver downstream; - - private Disposable upstream; - - public Token token = null; - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRCompletableObserver(CompletableObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - upstream.dispose(); - if(segment != null) { - segment.ignore(); - segment = null; - } - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver2.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver2.java deleted file mode 100644 index 295b9b8..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRCompletableObserver2.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.rxjava3.core.CompletableObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRCompletableObserver2 implements CompletableObserver { - - private CompletableObserver downstream; - - private Segment segment = null; - private String name = null; - - private static boolean isTransformed = false; - - public NRCompletableObserver2(CompletableObserver downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Completable/"+name : "Completable"); - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver.java deleted file mode 100644 index bfd01fd..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - - -public class NRFlowableObserver implements Subscriber, Subscription { - - private Subscriber downstream; - - Subscription upstream; - public Token token = null; - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRFlowableObserver(Subscriber s) { - downstream = s; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onNext(T t) { - if(token != null) { - token.link(); - } - downstream.onNext(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable t) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - public void request(long n) { - upstream.request(n); - } - - @Override - public void cancel() { - upstream.cancel(); - if(segment != null) { - segment.ignore(); - segment = null; - } - if(token != null) { - token.expire(); - token = null; - } - } - - @Override - public void onSubscribe(Subscription s) { - if(upstream != null) { - s.cancel(); - } else { - upstream = s; - downstream.onSubscribe(this); - } - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver2.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver2.java deleted file mode 100644 index 9e8abb0..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRFlowableObserver2.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import org.reactivestreams.Subscriber; -import org.reactivestreams.Subscription; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -public class NRFlowableObserver2 implements Subscriber { - - private Subscriber downstream; - - private Segment segment = null; - private String name = null; - - private static boolean isTransformed = false; - - public NRFlowableObserver2(Subscriber downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Subscription s) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Flowable/"+name : "Flowable"); - downstream.onSubscribe(s); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - public void onNext(T t) { - downstream.onNext(t); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver.java deleted file mode 100644 index 31facf8..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.rxjava3.core.MaybeObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRMaybeObserver implements MaybeObserver, Disposable { - - private MaybeObserver downstream; - - private Disposable upstream; - - public Token token = null; - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRMaybeObserver(MaybeObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - upstream.dispose(); - if(segment != null) { - segment.ignore(); - segment = null; - } - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(token == null) { - token = NewRelic.getAgent().getTransaction().getToken(); - } - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onSuccess(T t) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onSuccess(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver2.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver2.java deleted file mode 100644 index b08265c..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRMaybeObserver2.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.rxjava3.core.MaybeObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRMaybeObserver2 implements MaybeObserver { - - private MaybeObserver downstream; - - private Segment segment = null; - - private String name = null; - - private static boolean isTransformed = false; - - public NRMaybeObserver2(MaybeObserver downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Maybe/"+ name : "Maybe"); - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - - @Override - public void onSuccess(T value) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver.java deleted file mode 100644 index 596cb79..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRObservableObserver implements Observer, Disposable { - - private Observer downstream; - - private Disposable upstream; - - public Token token = null; - - public Segment segment = null; - - private static boolean isTransformed = false; - - public NRObservableObserver(Observer downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - upstream.dispose(); - if(segment != null) { - segment.ignore(); - segment = null; - } - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onNext(T t) { - if(token != null) { - token.link(); - } - downstream.onNext(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onComplete() { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver2.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver2.java deleted file mode 100644 index 7c27f94..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRObservableObserver2.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRObservableObserver2 implements Observer { - - private Observer downstream; - - private Segment segment = null; - - private String name = null; - - private static boolean isTransformed = false; - - public NRObservableObserver2(Observer downstream, String n) { - this.downstream = downstream; - name = n; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Observable/"+ name : "Observable"); - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onNext(T t) { - downstream.onNext(t); - } - - @Override - public void onComplete() { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onComplete(); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleDeferObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleDeferObserver.java deleted file mode 100644 index 523c7e2..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleDeferObserver.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.rxjava3.core.SingleObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRSingleDeferObserver implements SingleObserver { - - private SingleObserver downstream; - - private Segment segment = null; - - private static boolean isTransformed = false; - - public NRSingleDeferObserver(SingleObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - downstream.onSubscribe(d); - } - - public void startSegment(String name) { - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? name : "SingleDefer"); - } - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onError(e); - } - - @Override - public void onSuccess(T value) { - if(segment != null) { - segment.end(); - segment = null; - } - downstream.onSuccess(value); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleLift.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleLift.java deleted file mode 100644 index c71d540..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleLift.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import io.reactivex.rxjava3.core.SingleObserver; -import io.reactivex.rxjava3.core.SingleOperator; - -public class NRSingleLift implements SingleOperator { - - @Override - public SingleObserver apply(SingleObserver observer) throws Exception { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver.java deleted file mode 100644 index 58e9db8..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.Trace; - -import io.reactivex.rxjava3.core.SingleObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRSingleObserver implements SingleObserver, Disposable { - - private SingleObserver downstream; - - private Disposable upstream; - - private static boolean isTransformed = false; - - public Token token = null; - - public Segment segment = null; - - public NRSingleObserver(SingleObserver downstream) { - this.downstream = downstream; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void dispose() { - if(segment != null) { - segment.ignore(); - segment = null; - } - upstream.dispose(); - } - - @Override - public boolean isDisposed() { - return upstream.isDisposed(); - } - - @Override - public void onSubscribe(Disposable d) { - if(upstream != null) { - d.dispose(); - } else { - upstream = d; - downstream.onSubscribe(this); - } - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onSuccess(T t) { - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - } - downstream.onSuccess(t); - } - - @Override - @Trace(async=true,excludeFromTransactionTrace=true) - public void onError(Throwable e) { - NewRelic.noticeError(e); - if(token != null) { - token.linkAndExpire(); - token = null; - } - if(segment != null) { - segment.end(); - } - downstream.onError(e); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver2.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver2.java deleted file mode 100644 index 28caea6..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/NRSingleObserver2.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; - -import io.reactivex.rxjava3.core.SingleObserver; -import io.reactivex.rxjava3.disposables.Disposable; - -public class NRSingleObserver2 implements SingleObserver { - - private SingleObserver downstream; - - private Segment segment = null; - private String name = null; - public boolean ignore = false; - private long start; - - private static boolean isTransformed = false; - - public NRSingleObserver2(SingleObserver downstream, String n) { - this.downstream = downstream; - name = n; - start = System.currentTimeMillis(); -// if(!ignore) -// startSegment(); - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - public void onSubscribe(Disposable d) { - downstream.onSubscribe(d); - } - - - @Override - public void onError(Throwable e) { - if(segment != null) { - segment.end(); - segment = null; - } - NewRelic.recordResponseTimeMetric("Single-"+name, System.currentTimeMillis()-start); - downstream.onError(e); - } - - @Override - public void onSuccess(T value) { - if(segment != null) { - segment.end(); - segment = null; - } - NewRelic.recordResponseTimeMetric("Single-"+name, System.currentTimeMillis()-start); - downstream.onSuccess(value); - } - - public void startSegment() { - if(!ignore) - segment = NewRelic.getAgent().getTransaction().startSegment(name != null ? "Single/"+name : "Single"); - } - -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/Utils.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/Utils.java deleted file mode 100644 index 499e3bd..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/rxjava3/Utils.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import java.util.logging.Level; - -import org.reactivestreams.Subscriber; - -import com.newrelic.agent.config.AgentConfig; -import com.newrelic.agent.config.AgentConfigListener; -import com.newrelic.agent.service.ServiceFactory; -import com.newrelic.api.agent.Config; -import com.newrelic.api.agent.NewRelic; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; -import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; -import io.reactivex.rxjava3.functions.BiFunction; -import io.reactivex.rxjava3.functions.Function; -import io.reactivex.rxjava3.plugins.RxJavaPlugins; - -public class Utils implements AgentConfigListener { - - public static boolean initialized = false; - public static boolean useSegments = true; - private static final String USESEGMENTS = "RxJava2.useSegments"; - - private static final Utils INSTANCE = new Utils(); - - private Utils() { - - } - - public static void init() { - boolean lockdown = RxJavaPlugins.isLockdown(); - - if (lockdown) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Wrappers because RxJavaPlugins is locked down"); - } else { - NRRunnableDecorator decorator; - Function f = RxJavaPlugins.getScheduleHandler(); - decorator = new NRRunnableDecorator(f); - RxJavaPlugins.setScheduleHandler(decorator); - ServiceFactory.getConfigService().addIAgentConfigListener(INSTANCE); - Config config = NewRelic.getAgent().getConfig(); - if (config != null) { - Boolean b = config.getValue(USESEGMENTS); - - if (b != null && b != useSegments) { - useSegments = b; - removeSubscribeDecorators(!useSegments); - } - - } - NewRelic.getAgent().getLogger().log(Level.FINE, "Value of useSegments is set to {0}", useSegments); - addSubscribeDecorators(useSegments); - } - initialized = true; - } - - private static void addSubscribeDecorators(boolean add) { - boolean lockdown = RxJavaPlugins.isLockdown(); - if(lockdown) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to add New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); - return; - } - if(add) { - RxJavaPlugins.setOnObservableSubscribe(new NRObservableSubWrapper(null)); - RxJavaPlugins.setOnSingleSubscribe(new NRSingleSubWrapper(null)); - RxJavaPlugins.setOnCompletableSubscribe(new NRCompletableSubWrapper(null)); - RxJavaPlugins.setOnFlowableSubscribe(new NRFlowableSubWrapper(null)); - RxJavaPlugins.setOnMaybeSubscribe(new NRMaybeSubWrapper(null)); - } - } - - @SuppressWarnings("rawtypes") - private static void removeSubscribeDecorators(boolean remove) { - boolean lockdown = RxJavaPlugins.isLockdown(); - if(lockdown) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Unable to remove New Relic RxJava2 Subscribe descorators because RxJavaPlugins is locked down"); - return; - } - if(remove) { - BiFunction fComp = RxJavaPlugins.getOnCompletableSubscribe(); - if(fComp != null) { - if(fComp instanceof NRCompletableSubWrapper) { - NRCompletableSubWrapper wrapper = (NRCompletableSubWrapper)fComp; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnCompletableSubscribe(delegate); - - } - } - BiFunction fFlow = RxJavaPlugins.getOnFlowableSubscribe(); - if(fFlow != null) { - if(fFlow instanceof NRFlowableSubWrapper) { - NRFlowableSubWrapper wrapper = (NRFlowableSubWrapper)fFlow; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnFlowableSubscribe(delegate); - } - } - BiFunction fMaybe = RxJavaPlugins.getOnMaybeSubscribe(); - if(fMaybe != null) { - if(fMaybe instanceof NRMaybeSubWrapper) { - NRMaybeSubWrapper wrapper = (NRMaybeSubWrapper)fMaybe; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnMaybeSubscribe(delegate); - } - } - BiFunction fObs = RxJavaPlugins.getOnObservableSubscribe(); - if(fObs != null) { - if(fObs instanceof NRObservableSubWrapper) { - NRObservableSubWrapper wrapper = (NRObservableSubWrapper)fObs; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnObservableSubscribe(delegate); - } - } - BiFunction fSingle = RxJavaPlugins.getOnSingleSubscribe(); - if(fSingle != null) { - if(fSingle instanceof NRSingleSubWrapper) { - NRSingleSubWrapper wrapper = (NRSingleSubWrapper)fSingle; - BiFunction delegate = wrapper.getDelegate(); - RxJavaPlugins.setOnSingleSubscribe(delegate); - } - } - } - } - - - @Override - public void configChanged(String appName, AgentConfig agentConfig) { - Boolean b = agentConfig.getValue(USESEGMENTS); - if(b != null && b != useSegments) { - useSegments = b; - removeSubscribeDecorators(!useSegments); - addSubscribeDecorators(useSegments); - } - if(useSegments) { - NewRelic.getAgent().getLogger().log(Level.INFO, "Will use segments for RxJava objects"); - } else { - NewRelic.getAgent().getLogger().log(Level.INFO, "Will not use segments for RxJava objects"); - } - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Completable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Completable.java index d58413c..3ed93a8 100644 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Completable.java +++ b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Completable.java @@ -5,7 +5,7 @@ import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Completable { +public abstract class Completable implements CompletableSource { @NewField public String completableName = null; diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Flowable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Flowable.java index 35a2f4d..02ac9ac 100644 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Flowable.java +++ b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Flowable.java @@ -1,13 +1,15 @@ package io.reactivex.rxjava3.core; +import org.reactivestreams.Publisher; + import com.newrelic.api.agent.weaver.MatchType; import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Flowable { +public abstract class Flowable implements Publisher { @NewField public String flowableName = null; - + } diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Maybe.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Maybe.java index 98b35a9..4ad29a3 100644 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Maybe.java +++ b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Maybe.java @@ -5,7 +5,7 @@ import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Maybe { +public abstract class Maybe implements MaybeSource { @NewField public String maybeName = null; diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/NRSingleWrapper.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/NRSingleWrapper.java deleted file mode 100644 index 58c55cb..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/NRSingleWrapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.reactivex.rxjava3.core; - -import com.newrelic.agent.bridge.AgentBridge; -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Trace; - -import io.reactivex.rxjava3.core.SingleObserver; - -public class NRSingleWrapper extends Single { - - private Single delegate = null; - private static boolean isTransformed = false; - - public NRSingleWrapper(Single d) { - delegate = d; - if(!isTransformed) { - isTransformed = true; - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); - } - } - - @Override - @Trace(dispatcher=true) - protected void subscribeActual(SingleObserver observer) { - NewRelic.getAgent().getTracedMethod().setMetricName("Custom","SingleWrapper", delegate != null ? delegate.getClass().getSimpleName() : "Null-Single"); - if(delegate != null) { - delegate.subscribeActual(observer); - } - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Observable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Observable.java index a498fbb..bce303b 100644 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Observable.java +++ b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Observable.java @@ -5,7 +5,7 @@ import com.newrelic.api.agent.weaver.Weave; @Weave(type=MatchType.BaseClass) -public abstract class Observable { +public abstract class Observable implements ObservableSource { @NewField public String observableName = null; diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Single.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Single.java index bc7d8c5..3a7f917 100644 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Single.java +++ b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/core/Single.java @@ -4,13 +4,16 @@ import com.newrelic.api.agent.weaver.NewField; import com.newrelic.api.agent.weaver.Weave; -import io.reactivex.rxjava3.core.SingleObserver; +import io.reactivex.rxjava3.disposables.Disposable; +import io.reactivex.rxjava3.functions.Consumer; @Weave(type=MatchType.BaseClass) -public abstract class Single { +public abstract class Single implements SingleSource { @NewField public String singleName = null; - protected abstract void subscribeActual(SingleObserver observer); + public abstract Single doOnError(final Consumer onError) ; + public abstract Single doOnSubscribe(final Consumer onSubscribe); + public abstract Single doOnSuccess(final Consumer onSuccess); } diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableCreate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableCreate.java deleted file mode 100644 index 30caa6d..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableCreate.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableCreate extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDefer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDefer.java deleted file mode 100644 index 7f8892a..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDefer.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableDefer extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDelay.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDelay.java deleted file mode 100644 index c20124f..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableDelay.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; - -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public abstract class CompletableDelay { - - - protected void subscribeActual(CompletableObserver s) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableEmpty.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableEmpty.java deleted file mode 100644 index 7e15bb5..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableEmpty.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableEmpty extends Completable { - - public void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableError.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableError.java deleted file mode 100644 index 6434b48..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableError.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableError extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableErrorSupplier.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableErrorSupplier.java deleted file mode 100644 index 2e01a6b..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableErrorSupplier.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableErrorSupplier extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromAction.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromAction.java deleted file mode 100644 index 6daf6c9..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromAction.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableFromAction extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromCallable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromCallable.java deleted file mode 100644 index f263e8b..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromCallable.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableFromCallable extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromRunnable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromRunnable.java deleted file mode 100644 index acd92ee..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableFromRunnable.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public class CompletableFromRunnable extends Completable { - - protected void subscribeActual(CompletableObserver s) { - if(Utils.useSegments) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - String name = "Completable/" + completableName != null ? completableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableObserveOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableObserveOn.java deleted file mode 100644 index fb37bfe..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableObserveOn.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; - -import io.reactivex.rxjava3.core.CompletableObserver; - -@Weave -public abstract class CompletableObserveOn { - - protected void subscribeActual(CompletableObserver s) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableSubscribeOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableSubscribeOn.java deleted file mode 100644 index 6b59899..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableSubscribeOn.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.NewField; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableObserver; - -import io.reactivex.rxjava3.core.CompletableObserver; -import io.reactivex.rxjava3.core.CompletableSource; -import io.reactivex.rxjava3.core.Scheduler; - -@Weave -public abstract class CompletableSubscribeOn { - - @NewField - private Token token = null; - - public CompletableSubscribeOn(CompletableSource source, Scheduler scheduler) { - if(token == null) { - Token t = NewRelic.getAgent().getTransaction().getToken(); - if(t != null && t.isActive()) { - token = t; - } else if(t != null) { - t.expire(); - t = null; - } - } - } - - protected void subscribeActual(CompletableObserver s) { - NRCompletableObserver wrapper = new NRCompletableObserver(s); - - Token t = token != null ? token : NewRelic.getAgent().getTransaction().getToken(); - if(t != null) { - if(t.isActive()) { - wrapper.token = t; - } else { - t.expire(); - t = null; - } - } - s = wrapper; - token = null; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableUtils.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableUtils.java deleted file mode 100644 index 9de181c..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/completable/CompletableUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.completable; - -import io.reactivex.rxjava3.core.Completable; - -public class CompletableUtils { - - public static boolean ignore(Completable completable) { - - if(completable instanceof CompletablePeek) return true; - - String classname = completable.getClass().getSimpleName().toLowerCase(); - - return classname.endsWith("on"); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableCreate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableCreate.java deleted file mode 100644 index 029cbb3..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableCreate.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableCreate extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDefer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDefer.java deleted file mode 100644 index 684f91d..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDefer.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableDefer extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelay.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelay.java deleted file mode 100644 index 8030c88..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelay.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; - -@Weave -public abstract class FlowableDelay { - - protected void subscribeActual(Subscriber t) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelaySubscriptionOther.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelaySubscriptionOther.java deleted file mode 100644 index b4f33f2..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableDelaySubscriptionOther.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; - -@Weave -public class FlowableDelaySubscriptionOther { - - - public void subscribeActual(Subscriber child) { - NRFlowableObserver wrapper = new NRFlowableObserver(child); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - child = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableEmpty.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableEmpty.java deleted file mode 100644 index 36c1544..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableEmpty.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableEmpty extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableError.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableError.java deleted file mode 100644 index b5287d1..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableError.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableError extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromArray.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromArray.java deleted file mode 100644 index fb9dcb0..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromArray.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableFromArray extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromCallable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromCallable.java deleted file mode 100644 index c07876e..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromCallable.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableFromCallable extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture.java deleted file mode 100644 index 1c4fe8b..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromFuture.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableFromFuture extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromIterable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromIterable.java deleted file mode 100644 index 287927c..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableFromIterable.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableFromIterable extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableGenerate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableGenerate.java deleted file mode 100644 index 26d526b..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableGenerate.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableGenerate extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableInterval.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableInterval.java deleted file mode 100644 index 9c68cec..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableInterval.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableInterval extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableIntervalRange.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableIntervalRange.java deleted file mode 100644 index 9a087ab..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableIntervalRange.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableIntervalRange extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableJust.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableJust.java deleted file mode 100644 index 4a2da26..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableJust.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableJust extends Flowable { - - - protected void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn.java deleted file mode 100644 index 3f6eb81..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; - -@Weave -public abstract class FlowableObserveOn { - - public void subscribeActual(Subscriber t) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRange.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRange.java deleted file mode 100644 index 76739f6..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRange.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableRange extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRangeLong.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRangeLong.java deleted file mode 100644 index 2ade36d..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableRangeLong.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Flowable; - -@Weave -public class FlowableRangeLong extends Flowable { - - - public void subscribeActual(Subscriber t) { - if(Utils.useSegments) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - String name = "Flowable/" + flowableName != null ? flowableName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - t = wrapper; - - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn.java deleted file mode 100644 index 0fd151f..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableSubscribeOn.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import org.reactivestreams.Subscriber; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRFlowableObserver; - -@Weave -public abstract class FlowableSubscribeOn { - - public void subscribeActual(Subscriber t) { - NRFlowableObserver wrapper = new NRFlowableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableUtils.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableUtils.java deleted file mode 100644 index 63fc2eb..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/flowable/FlowableUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.flowable; - -import io.reactivex.rxjava3.core.Flowable; - -public class FlowableUtils { - - public static boolean ignore(Flowable flowable) { - - if(flowable instanceof AbstractFlowableWithUpstream) return true; - - return false; - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeCreate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeCreate.java deleted file mode 100644 index e1e22f2..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeCreate extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDefer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDefer.java deleted file mode 100644 index f0184e4..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDefer.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeDefer extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelay.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelay.java deleted file mode 100644 index a0d4777..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelay.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; - -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public abstract class MaybeDelay { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java deleted file mode 100644 index a2aaedd..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeDelaySubscriptionOtherPublisher.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; - -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeDelaySubscriptionOtherPublisher { - - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty.java deleted file mode 100644 index 31176ff..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public abstract class MaybeEmpty extends Maybe { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : "MaybeDefer"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeError.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeError.java deleted file mode 100644 index a5ae6ca..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeError.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeError extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeErrorCallable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeErrorCallable.java deleted file mode 100644 index c5108c9..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeErrorCallable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeErrorCallable extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromAction.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromAction.java deleted file mode 100644 index a162081..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromAction.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeFromAction extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable.java deleted file mode 100644 index df060c1..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeFromCallable extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromFuture.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromFuture.java deleted file mode 100644 index 5214f06..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromFuture.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeFromFuture extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromRunnable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromRunnable.java deleted file mode 100644 index b45d3af..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeFromRunnable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeFromRunnable extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeJust.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeJust.java deleted file mode 100644 index 85ac32f..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeJust.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeJust extends Maybe { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(MaybeObserver observer) { - if(Utils.useSegments) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - String name = "Maybe/" + maybeName != null ? maybeName : getClass().getSimpleName(); - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn.java deleted file mode 100644 index b12464a..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; - -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeObserveOn { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeSubscribeOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeSubscribeOn.java deleted file mode 100644 index 8ea816a..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeSubscribeOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRMaybeObserver; - -import io.reactivex.rxjava3.core.MaybeObserver; - -@Weave -public class MaybeSubscribeOn { - - @SuppressWarnings({ "unchecked", "rawtypes" }) - protected void subscribeActual(MaybeObserver observer) { - NRMaybeObserver wrapper = new NRMaybeObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeUtils.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeUtils.java deleted file mode 100644 index b3215f5..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/maybe/MaybeUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.maybe; - -import io.reactivex.rxjava3.core.Maybe; - -public class MaybeUtils { - - public static boolean ignore(Maybe maybe) { - - if(maybe instanceof MaybePeek) return true; - - String classname = maybe.getClass().getSimpleName().toLowerCase(); - - return classname.endsWith("on"); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObervableUtils.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObervableUtils.java deleted file mode 100644 index 8d50277..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObervableUtils.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import io.reactivex.rxjava3.core.Observable; - -public class ObervableUtils { - - public static boolean ignore(Observable o) { - if(o instanceof AbstractObservableWithUpstream) return true; - return false; - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableCreate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableCreate.java deleted file mode 100644 index 3330a27..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableCreate extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableCreate"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDefer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDefer.java deleted file mode 100644 index b87e4eb..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDefer.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableDefer extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableDefer"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelay.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelay.java deleted file mode 100644 index 91902e2..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelay.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; - -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableDelay { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer t) { - NRObservableObserver wrapper = new NRObservableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelaySubscriptionOther.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelaySubscriptionOther.java deleted file mode 100644 index 56c8f74..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableDelaySubscriptionOther.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; - -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableDelaySubscriptionOther { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer child) { - NRObservableObserver wrapper = new NRObservableObserver(child); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - child = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableEmpty.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableEmpty.java deleted file mode 100644 index c97d4c7..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableEmpty.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableEmpty extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableEmpty"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableError.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableError.java deleted file mode 100644 index 87df3d2..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableError.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableError extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableError"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromArray.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromArray.java deleted file mode 100644 index 9dd6c76..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromArray.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableFromArray extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromArray"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromCallable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromCallable.java deleted file mode 100644 index 05f50d8..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromCallable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableFromCallable extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromCallable"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture.java deleted file mode 100644 index 2aa9049..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableFromFuture extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromFuture"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromIterable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromIterable.java deleted file mode 100644 index a1a1dc9..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromIterable.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableFromIterable extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromIterable"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher.java deleted file mode 100644 index 0dd5bdf..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableFromPublisher extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableFromPublisher"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableGenerate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableGenerate.java deleted file mode 100644 index c4c9091..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableGenerate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableGenerate extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableGenerate"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableInterval.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableInterval.java deleted file mode 100644 index c9a4490..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableInterval.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableInterval extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableInterval"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableIntervalRange.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableIntervalRange.java deleted file mode 100644 index b182875..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableIntervalRange.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableIntervalRange extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableIntervalRange"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableJust.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableJust.java deleted file mode 100644 index e15ad87..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableJust.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableJust extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableJust"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn.java deleted file mode 100644 index d392118..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; - -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableObserveOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - observer = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRange.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRange.java deleted file mode 100644 index 3f5444a..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRange.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableRange extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableRange"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRangeLong.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRangeLong.java deleted file mode 100644 index c93e829..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableRangeLong.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Observable; -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableRangeLong extends Observable { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(Observer observer) { - if (Utils.useSegments) { - NRObservableObserver wrapper = new NRObservableObserver(observer); - String name = "Observable/" + observableName != null ? observableName : "ObservableRangeLong"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - observer = wrapper; - } - - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn.java deleted file mode 100644 index 025446f..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableSubscribeOn.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; - -import io.reactivex.rxjava3.core.Observer; - -@Weave -public class ObservableSubscribeOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer t) { - NRObservableObserver wrapper = new NRObservableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableTimer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableTimer.java deleted file mode 100644 index efded4c..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/observable/ObservableTimer.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.observable; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRObservableObserver; - -import io.reactivex.rxjava3.core.Observer; - -@Weave -public abstract class ObservableTimer { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public void subscribeActual(Observer t) { - NRObservableObserver wrapper = new NRObservableObserver(t); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null) { - if(token.isActive()) { - wrapper.token = token; - } else { - token.expire(); - token = null; - } - } - t = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleCreate.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleCreate.java deleted file mode 100644 index 820b6dc..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleCreate.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleCreate extends Single { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleCreate"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDefer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDefer.java deleted file mode 100644 index 17a1c29..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDefer.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleDefer extends Single { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleDefer"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDelay.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDelay.java deleted file mode 100644 index 45f6f6d..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleDelay.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; - -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleDelay { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleError.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleError.java deleted file mode 100644 index 495cedb..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleError.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleError extends Single { - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleError"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromCallable.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromCallable.java deleted file mode 100644 index 5baa0eb..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromCallable.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleFromCallable extends Single { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleFromCallable"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromPublisher.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromPublisher.java deleted file mode 100644 index 34fd959..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleFromPublisher.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleFromPublisher extends Single { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleFromPublisher"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleJust.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleJust.java deleted file mode 100644 index 21cb2ba..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleJust.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Segment; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; -import com.newrelic.instrumentation.rxjava3.Utils; - -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public class SingleJust extends Single { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - if (Utils.useSegments) { - NRSingleObserver wrapper = new NRSingleObserver(s); - String name = "Single/" + singleName != null ? singleName : "SingleJust"; - Segment segment = NewRelic.getAgent().getTransaction().startSegment(name); - wrapper.segment = segment; - s = wrapper; - } - Weaver.callOriginal(); - } - -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleObserveOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleObserveOn.java deleted file mode 100644 index f188d83..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleObserveOn.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; - -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public abstract class SingleObserveOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn.java deleted file mode 100644 index 81f324b..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleSubscribeOn.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; - -import io.reactivex.rxjava3.core.SingleObserver; - -@Weave -public abstract class SingleSubscribeOn { - - - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleTimer.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleTimer.java deleted file mode 100644 index 4c36c5d..0000000 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/internal/operators/single/SingleTimer.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.reactivex.rxjava3.internal.operators.single; - -import com.newrelic.api.agent.NewRelic; -import com.newrelic.api.agent.Token; -import com.newrelic.api.agent.weaver.Weave; -import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRSingleObserver; - -import io.reactivex.rxjava3.core.SingleObserver; - -@SuppressWarnings({ "unchecked", "rawtypes" }) -@Weave -public abstract class SingleTimer { - - - protected void subscribeActual(SingleObserver s) { - NRSingleObserver wrapper = new NRSingleObserver(s); - Token token = NewRelic.getAgent().getTransaction().getToken(); - if(token != null && token.isActive()) { - wrapper.token = token; - } - s = wrapper; - Weaver.callOriginal(); - } -} diff --git a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/plugins/RxJavaPlugins.java b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/plugins/RxJavaPlugins.java index 7c7c703..86c3796 100644 --- a/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/plugins/RxJavaPlugins.java +++ b/rxjava3-3.0/src/main/java/io/reactivex/rxjava3/plugins/RxJavaPlugins.java @@ -1,34 +1,36 @@ package io.reactivex.rxjava3.plugins; +import java.util.logging.Level; + import org.reactivestreams.Subscriber; import com.newrelic.api.agent.NewRelic; import com.newrelic.api.agent.weaver.Weave; import com.newrelic.api.agent.weaver.Weaver; -import com.newrelic.instrumentation.rxjava3.NRCompletableSubWrapper; -import com.newrelic.instrumentation.rxjava3.NRFlowableSubWrapper; -import com.newrelic.instrumentation.rxjava3.NRMaybeSubWrapper; -import com.newrelic.instrumentation.rxjava3.NRObservableSubWrapper; -import com.newrelic.instrumentation.rxjava3.NRRunnableDecorator; -import com.newrelic.instrumentation.rxjava3.NRSingleSubWrapper; -import com.newrelic.instrumentation.rxjava3.Utils; +import com.newrelic.instrumentation.labs.rxjava3.NRCompletableAssembly; +import com.newrelic.instrumentation.labs.rxjava3.NRCompletableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava3.NRFlowableAssembly; +import com.newrelic.instrumentation.labs.rxjava3.NRFlowableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava3.NRMaybeAssembly; +import com.newrelic.instrumentation.labs.rxjava3.NRMaybeSubWrapper; +import com.newrelic.instrumentation.labs.rxjava3.NRObservableAssembly; +import com.newrelic.instrumentation.labs.rxjava3.NRObservableSubWrapper; +import com.newrelic.instrumentation.labs.rxjava3.NRRunnableDecorator; +import com.newrelic.instrumentation.labs.rxjava3.NRSingleAssembly; +import com.newrelic.instrumentation.labs.rxjava3.NRSingleSubWrapper; +import com.newrelic.instrumentation.labs.rxjava3.Utils; import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.CompletableObserver; import io.reactivex.rxjava3.core.Flowable; import io.reactivex.rxjava3.core.Maybe; import io.reactivex.rxjava3.core.MaybeObserver; -import io.reactivex.rxjava3.core.NRSingleWrapper; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.core.Observer; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.core.SingleObserver; import io.reactivex.rxjava3.functions.BiFunction; import io.reactivex.rxjava3.functions.Function; -import io.reactivex.rxjava3.internal.operators.completable.CompletableUtils; -import io.reactivex.rxjava3.internal.operators.flowable.FlowableUtils; -import io.reactivex.rxjava3.internal.operators.maybe.MaybeUtils; -import io.reactivex.rxjava3.internal.operators.observable.ObervableUtils; @SuppressWarnings("rawtypes") @Weave @@ -46,7 +48,17 @@ public abstract class RxJavaPlugins { static volatile BiFunction onFlowableSubscribe = Weaver.callOriginal(); static volatile BiFunction onMaybeSubscribe = Weaver.callOriginal(); + + static volatile Function onSingleAssembly = Weaver.callOriginal(); + + static volatile Function onFlowableAssembly = Weaver.callOriginal(); + + static volatile Function onCompletableAssembly = Weaver.callOriginal(); + + static volatile Function onMaybeAssembly = Weaver.callOriginal(); + static volatile Function onObservableAssembly = Weaver.callOriginal(); + public static boolean isLockdown() { return Weaver.callOriginal(); } @@ -82,15 +94,135 @@ public static BiFunction getOnFlowableSubscrib public static BiFunction getOnMaybeSubscribe() { return Weaver.callOriginal(); } - + public static BiFunction getOnObservableSubscribe() { return Weaver.callOriginal(); } - + public static BiFunction getOnSingleSubscribe() { return Weaver.callOriginal(); } + public static Function getOnSingleAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnCompletableAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnFlowableAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnMaybeAssembly() { + return Weaver.callOriginal(); + } + + public static Function getOnObservableAssembly() { + return Weaver.callOriginal(); + } + + public static void setOnObservableAssembly(Function onObservableAssembly1) { + if(Utils.useSegments) { + if(onObservableAssembly != null) { + if(onObservableAssembly instanceof NRObservableAssembly) { + if(!(onObservableAssembly1 instanceof NRObservableAssembly)) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)onObservableAssembly; + nrAssembly.setDelegate(nrAssembly); + onObservableAssembly1 = nrAssembly; + } + } else { + if(onObservableAssembly1 instanceof NRObservableAssembly) { + NRObservableAssembly nrAssembly = (NRObservableAssembly)onObservableAssembly1; + nrAssembly.setDelegate(onObservableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnSingleAssembly(Function onSingleAssembly1) { + if(Utils.useSegments) { + if(onSingleAssembly != null) { + if(onSingleAssembly instanceof NRSingleAssembly) { + if(!(onSingleAssembly1 instanceof NRSingleAssembly)) { + NRSingleAssembly nrAssembly = (NRSingleAssembly)onSingleAssembly; + nrAssembly.setDelegate(onSingleAssembly1); + onSingleAssembly1 = nrAssembly; + } + } else { + if(onSingleAssembly1 instanceof NRSingleAssembly) { + NRSingleAssembly nrAssembly = (NRSingleAssembly)onSingleAssembly1; + nrAssembly.setDelegate(onSingleAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnMaybeAssembly(Function onMaybeAssembly1) { + if(Utils.useSegments) { + if(onMaybeAssembly != null) { + if(onMaybeAssembly instanceof NRMaybeAssembly) { + if(!(onMaybeAssembly1 instanceof NRMaybeAssembly)) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)onMaybeAssembly; + nrAssembly.setDelegate(onMaybeAssembly1); + onMaybeAssembly1 = nrAssembly; + } + } else { + if(onMaybeAssembly1 instanceof NRMaybeAssembly) { + NRMaybeAssembly nrAssembly = (NRMaybeAssembly)onMaybeAssembly1; + nrAssembly.setDelegate(onMaybeAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnCompletableAssembly(Function onCompletableAssembly1) { + if(Utils.useSegments) { + if(onCompletableAssembly != null) { + if(onCompletableAssembly instanceof NRCompletableAssembly) { + if(!(onCompletableAssembly1 instanceof NRCompletableAssembly)) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)onCompletableAssembly; + nrAssembly.setDelegate(onCompletableAssembly1); + onCompletableAssembly1 = nrAssembly; + } + } else { + if(onCompletableAssembly1 instanceof NRCompletableAssembly) { + NRCompletableAssembly nrAssembly = (NRCompletableAssembly)onCompletableAssembly1; + nrAssembly.setDelegate(onCompletableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + + public static void setOnFlowableAssembly(Function onFlowableAssembly1) { + if(Utils.useSegments) { + if(onFlowableAssembly != null) { + if(onFlowableAssembly instanceof NRFlowableAssembly) { + if(!(onFlowableAssembly1 instanceof NRFlowableAssembly)) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)onFlowableAssembly; + nrAssembly.setDelegate(onFlowableAssembly1); + onFlowableAssembly1 = nrAssembly; + } + } else { + if(onFlowableAssembly1 instanceof NRFlowableAssembly) { + NRFlowableAssembly nrAssembly = (NRFlowableAssembly)onFlowableAssembly1; + nrAssembly.setDelegate(onFlowableAssembly); + } + } + } + } + Weaver.callOriginal(); + } + public static void setOnMaybeSubscribe(BiFunction onMaybeSubscribe1) { if (Utils.useSegments) { // only have to manipulate if there is an existing function set @@ -245,9 +377,11 @@ public static void setOnCompletableSubscribe(BiFunction onFlowableSubscribe1) { + NewRelic.getAgent().getLogger().log(Level.FINE, "Call to RxJavaPlugins.setOnFlowableSubscribe({0})", onFlowableSubscribe1); if (Utils.useSegments) { // only have to manipulate if there is an existing function set if(onFlowableSubscribe != null) { + NewRelic.getAgent().getLogger().log(Level.FINE, "In RxJavaPlugins.setOnFlowableSubscribe, the value of onFlowableSubscribe has already been set to {0}", onFlowableSubscribe); if(onFlowableSubscribe instanceof NRFlowableSubWrapper) { NRFlowableSubWrapper nr2_1 = (NRFlowableSubWrapper)onFlowableSubscribe; if(onFlowableSubscribe1 instanceof NRFlowableSubWrapper) { @@ -273,8 +407,11 @@ public static void setOnFlowableSubscribe(BiFunction Observable onAssembly(Observable source) { Utils.init(); } Observable observable = Weaver.callOriginal(); - if(!ObervableUtils.ignore(observable) && observable.observableName == null) { - observable.observableName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(observable.observableName == null) { + observable.observableName = source.getClass().getSimpleName(); } return observable; @@ -300,10 +437,10 @@ public static Single onAssembly(Single source) { } Single single = Weaver.callOriginal(); if(single.singleName == null) { - single.singleName = NewRelic.getAgent().getTracedMethod().getMetricName(); + single.singleName = source.singleName != null ? source.singleName : source.getClass().getName(); } - return new NRSingleWrapper(single); + return single; } public static Completable onAssembly(Completable source) { @@ -311,8 +448,8 @@ public static Completable onAssembly(Completable source) { Utils.init(); } Completable completable = Weaver.callOriginal(); - if(!CompletableUtils.ignore(completable) && completable.completableName == null) { - completable.completableName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(completable.completableName == null) { + completable.completableName = source.getClass().getSimpleName(); } return completable; @@ -323,8 +460,8 @@ public static Flowable onAssembly(Flowable source) { Utils.init(); } Flowable flowable = Weaver.callOriginal(); - if(!FlowableUtils.ignore(flowable) && flowable.flowableName == null) { - flowable.flowableName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(flowable.flowableName == null) { + flowable.flowableName = source.flowableName != null ? source.flowableName : source.getClass().getSimpleName(); } return flowable; } @@ -334,8 +471,8 @@ public static Maybe onAssembly(Maybe source) { Utils.init(); } Maybe maybe = Weaver.callOriginal(); - if(!MaybeUtils.ignore(maybe) && maybe.maybeName == null) { - maybe.maybeName = NewRelic.getAgent().getTracedMethod().getMetricName(); + if(maybe.maybeName == null) { + maybe.maybeName = source.getClass().getSimpleName(); } return maybe; diff --git a/rxjava3-finder/build.gradle b/rxjava3-finder/build.gradle index 0f1b513..b52bf43 100644 --- a/rxjava3-finder/build.gradle +++ b/rxjava3-finder/build.gradle @@ -14,11 +14,11 @@ dependencies { jar { manifest { - attributes 'Implementation-Title': 'com.newrelic.instrumentation.rxjava3-finder' - attributes 'Implementation-Vendor': 'New Relic' - attributes 'Implementation-Vendor-Id': 'com.newrelic' - attributes 'Implementation-Version': 1.0 - attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava3.RxJava3PreMain' + attributes 'Implementation-Title': 'com.newrelic.instrumentation.labs.rxjava3-finder' + attributes 'Implementation-Vendor': 'New Relic Labs' + attributes 'Implementation-Vendor-Id': 'com.newrelic.labs' + attributes 'Implementation-Version': 1.1 + attributes 'Agent-Class': 'com.newrelic.agent.instrumentation.labs.rxjava3.finder.RxJava3PreMain' } } diff --git a/settings.gradle b/settings.gradle index b697fe8..e8ca636 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ rootProject.name = 'java-instrumentation-template' include 'rxjava1-1.1' include 'rxjava1-1.2' include 'rxjava2-2.0' +include 'rxjava2-2.0.7' include 'rxjava2-finder' include 'rxjava1-finder' include 'rxjava3-3.0' From 27382a6fc15b9779ee85575f17009d661475d1b9 Mon Sep 17 00:00:00 2001 From: Doug Hilpipre Date: Fri, 10 Jan 2025 11:30:35 -0600 Subject: [PATCH 4/4] updated runnables --- .../labs/rxjava2_0_7/NRRunnable.java | 8 +-- .../labs/rxjava2_0_7/NRRunnableDecorator.java | 8 ++- .../labs/rxjava2_0_7/NRRxJavaHeaders.java | 62 ------------------- .../labs/rxjava2/NRRunnable.java | 19 +++--- .../labs/rxjava2/NRRunnableDecorator.java | 16 +++-- .../labs/rxjava2/NRRxJavaHeaders.java | 62 ------------------- .../labs/rxjava3/NRRunnable.java | 18 +++--- .../labs/rxjava3/NRRunnableDecorator.java | 14 +++-- .../labs/rxjava3/NRRxJavaHeaders.java | 62 ------------------- 9 files changed, 42 insertions(+), 227 deletions(-) delete mode 100644 rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJavaHeaders.java delete mode 100644 rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJavaHeaders.java delete mode 100644 rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJavaHeaders.java diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java index 7ed386f..27b8397 100644 --- a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnable.java @@ -5,9 +5,9 @@ import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; + public class NRRunnable implements Runnable { - - + private Token token = null; private Runnable delegate = null; private static boolean isTransformed = false; @@ -16,13 +16,13 @@ public NRRunnable(Runnable r, Token t) { token = t; delegate = r; if(!isTransformed) { - AgentBridge.instrumentation.retransformUninstrumentedClass(getClass());; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); isTransformed = true; } } @Override - @Trace(async=true) + @Trace(dispatcher=true) public void run() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","WrappedRunable", delegate != null ? delegate.getClass().getSimpleName() : "NullRunnable"); if(token != null) { diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java index 94a4683..22fcea6 100644 --- a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java +++ b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRunnableDecorator.java @@ -6,9 +6,9 @@ import io.reactivex.functions.Function; public class NRRunnableDecorator implements Function { - + private Function delegate = null; - + public NRRunnableDecorator(Function f) { delegate = f; } @@ -24,7 +24,9 @@ public Runnable apply(Runnable r) throws Exception { NRRunnable nrRun = new NRRunnable(r, t); run = delegate != null ? delegate.apply(nrRun) : nrRun; } else { - t.expire(); + if(t != null) { + t.expire(); + } run = delegate != null ? delegate.apply(r) : r; } } diff --git a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJavaHeaders.java b/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJavaHeaders.java deleted file mode 100644 index c77b5fa..0000000 --- a/rxjava2-2.0.7/src/main/java/com/newrelic/instrumentation/labs/rxjava2_0_7/NRRxJavaHeaders.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.newrelic.instrumentation.labs.rxjava2_0_7; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class NRRxJavaHeaders implements Headers { - - private HashMap headers = new HashMap<>(); - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public String getHeader(String name) { - return headers.get(name); - } - - @Override - public Collection getHeaders(String name) { - String value = headers.get(name); - List list = new ArrayList<>(); - if(value != null) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - headers.put(name, value); - } - - @Override - public void addHeader(String name, String value) { - headers.put(name, value); - } - - @Override - public Collection getHeaderNames() { - return headers.keySet(); - } - - @Override - public boolean containsHeader(String name) { - return headers.containsKey(name); - } - - public boolean isEmpty() { - return headers.isEmpty(); - } - - public void clear() { - headers.clear(); - } -} diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java index aef7478..662e5f7 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnable.java @@ -2,20 +2,18 @@ import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.Transaction; -import com.newrelic.api.agent.TransportType; public class NRRunnable implements Runnable { - - public NRRxJavaHeaders nrHeaders = null; + private Token token = null; private Runnable delegate = null; private static boolean isTransformed = false; - public NRRunnable(Runnable r, NRRxJavaHeaders hr) { - nrHeaders = hr; + public NRRunnable(Runnable r, Token t) { + token = t; delegate = r; if(!isTransformed) { AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); @@ -27,12 +25,9 @@ public NRRunnable(Runnable r, NRRxJavaHeaders hr) { @Trace(dispatcher=true) public void run() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","WrappedRunable", delegate != null ? delegate.getClass().getSimpleName() : "NullRunnable"); - - Transaction transaction = NewRelic.getAgent().getTransaction(); - if (transaction != null) { - if (nrHeaders != null && !nrHeaders.isEmpty()) { - transaction.acceptDistributedTraceHeaders(TransportType.Other, nrHeaders); - } + if(token != null) { + token.linkAndExpire(); + token = null; } if(delegate != null) { delegate.run(); diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java index 8168f0c..4aef997 100644 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java +++ b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRunnableDecorator.java @@ -1,6 +1,7 @@ package com.newrelic.instrumentation.labs.rxjava2; import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import io.reactivex.functions.Function; @@ -18,13 +19,16 @@ public Runnable apply(Runnable r) throws Exception { if(r instanceof NRRunnable) { run = delegate != null ? delegate.apply(r) : r; } else { - NRRxJavaHeaders hr = new NRRxJavaHeaders(); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(hr); - - if(hr != null ) { - NRRunnable nrRun = new NRRunnable(r, hr); - run = delegate != null ? delegate.apply(nrRun) : nrRun; + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + NRRunnable nrRun = new NRRunnable(r, t); + run = delegate != null ? delegate.apply(nrRun) : nrRun; + } else { + if(t != null) { + t.expire(); } + run = delegate != null ? delegate.apply(r) : r; + } } return run; } diff --git a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJavaHeaders.java b/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJavaHeaders.java deleted file mode 100644 index 0fcea94..0000000 --- a/rxjava2-2.0/src/main/java/com/newrelic/instrumentation/labs/rxjava2/NRRxJavaHeaders.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.newrelic.instrumentation.labs.rxjava2; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class NRRxJavaHeaders implements Headers { - - private HashMap headers = new HashMap<>(); - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public String getHeader(String name) { - return headers.get(name); - } - - @Override - public Collection getHeaders(String name) { - String value = headers.get(name); - List list = new ArrayList<>(); - if(value != null) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - headers.put(name, value); - } - - @Override - public void addHeader(String name, String value) { - headers.put(name, value); - } - - @Override - public Collection getHeaderNames() { - return headers.keySet(); - } - - @Override - public boolean containsHeader(String name) { - return headers.containsKey(name); - } - - public boolean isEmpty() { - return headers.isEmpty(); - } - - public void clear() { - headers.clear(); - } -} diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java index 0887b2c..73b8e2b 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnable.java @@ -2,20 +2,18 @@ import com.newrelic.agent.bridge.AgentBridge; import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import com.newrelic.api.agent.Trace; -import com.newrelic.api.agent.Transaction; -import com.newrelic.api.agent.TransportType; public class NRRunnable implements Runnable { - - public NRRxJavaHeaders nrHeaders = null; + private Token token = null; private Runnable delegate = null; private static boolean isTransformed = false; - public NRRunnable(Runnable r, NRRxJavaHeaders hr) { - nrHeaders = hr; + public NRRunnable(Runnable r, Token t) { + token = t; delegate = r; if(!isTransformed) { AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); @@ -27,11 +25,9 @@ public NRRunnable(Runnable r, NRRxJavaHeaders hr) { @Trace(dispatcher=true) public void run() { NewRelic.getAgent().getTracedMethod().setMetricName("Custom","WrappedRunable", delegate != null ? delegate.getClass().getSimpleName() : "NullRunnable"); - Transaction transaction = NewRelic.getAgent().getTransaction(); - if (transaction != null) { - if (nrHeaders != null && !nrHeaders.isEmpty()) { - transaction.acceptDistributedTraceHeaders(TransportType.Other, nrHeaders); - } + if(token != null) { + token.linkAndExpire(); + token = null; } if(delegate != null) { delegate.run(); diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java index d1f8c47..e1ad96f 100644 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java +++ b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRunnableDecorator.java @@ -1,6 +1,7 @@ package com.newrelic.instrumentation.labs.rxjava3; import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; import io.reactivex.rxjava3.functions.Function; @@ -18,12 +19,15 @@ public Runnable apply(Runnable r) throws Throwable { if(r instanceof NRRunnable) { run = delegate != null ? delegate.apply(r) : r; } else { - NRRxJavaHeaders hr = new NRRxJavaHeaders(); - NewRelic.getAgent().getTransaction().insertDistributedTraceHeaders(hr); - - if(hr != null ) { - NRRunnable nrRun = new NRRunnable(r, hr); + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + NRRunnable nrRun = new NRRunnable(r, t); run = delegate != null ? delegate.apply(nrRun) : nrRun; + } else { + if(t != null) { + t.expire(); + } + run = delegate != null ? delegate.apply(r) : r; } } return run; diff --git a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJavaHeaders.java b/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJavaHeaders.java deleted file mode 100644 index 1e77bb8..0000000 --- a/rxjava3-3.0/src/main/java/com/newrelic/instrumentation/labs/rxjava3/NRRxJavaHeaders.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.newrelic.instrumentation.rxjava3; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; - -import com.newrelic.api.agent.HeaderType; -import com.newrelic.api.agent.Headers; - -public class NRRxJavaHeaders implements Headers { - - private HashMap headers = new HashMap<>(); - - @Override - public HeaderType getHeaderType() { - return HeaderType.MESSAGE; - } - - @Override - public String getHeader(String name) { - return headers.get(name); - } - - @Override - public Collection getHeaders(String name) { - String value = headers.get(name); - List list = new ArrayList<>(); - if(value != null) { - list.add(value); - } - return list; - } - - @Override - public void setHeader(String name, String value) { - headers.put(name, value); - } - - @Override - public void addHeader(String name, String value) { - headers.put(name, value); - } - - @Override - public Collection getHeaderNames() { - return headers.keySet(); - } - - @Override - public boolean containsHeader(String name) { - return headers.containsKey(name); - } - - public boolean isEmpty() { - return headers.isEmpty(); - } - - public void clear() { - headers.clear(); - } -}