Skip to content

Commit 76a8379

Browse files
committed
cleanup
1 parent 7fa5f5f commit 76a8379

File tree

12 files changed

+128
-30
lines changed

12 files changed

+128
-30
lines changed

Kotlin-Coroutines_1.2/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/NRContinuationWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public CoroutineContext getContext() {
3232
@Trace(async=true)
3333
public void resumeWith(Object p0) {
3434

35-
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",name != null ? name : Utils.getCoroutineName(getContext(), delegate.getClass()));
35+
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",name != null ? name : Utils.getCoroutineName(getContext(), delegate));
3636
Token token = Utils.getToken(getContext());
3737
if(token != null) {
3838
token.link();

Kotlin-Coroutines_1.2/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/NRFunction2Wrapper.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
import com.newrelic.api.agent.Trace;
77

88
import kotlin.coroutines.Continuation;
9+
import kotlin.coroutines.CoroutineContext;
910
import kotlin.jvm.functions.Function2;
11+
import kotlinx.coroutines.CoroutineScope;
1012

1113
public class NRFunction2Wrapper<P1, P2, R> implements Function2<P1, P2, R> {
1214

1315
private Function2<P1, P2, R> delegate = null;
1416
private String name = null;
1517
private static boolean isTransformed = false;
16-
public Token token = null;
1718

1819
public NRFunction2Wrapper(Function2<P1, P2, R> d,String n) {
1920
delegate = d;
@@ -28,16 +29,43 @@ public NRFunction2Wrapper(Function2<P1, P2, R> d,String n) {
2829
@Override
2930
@Trace(async=true)
3031
public R invoke(P1 p1, P2 p2) {
31-
if(token != null) {
32-
token.linkAndExpire();
33-
token = null;
34-
}
3532
String nameStr = null;
33+
boolean linked = false;
34+
if(p1 instanceof CoroutineContext) {
35+
CoroutineContext ctx = (CoroutineContext)p1;
36+
nameStr = Utils.getCoroutineName(ctx);
37+
Token token = Utils.getToken(ctx);
38+
if(token != null) {
39+
token.link();
40+
linked = true;
41+
}
42+
}
43+
if(p1 instanceof CoroutineScope) {
44+
CoroutineScope scope = (CoroutineScope)p1;
45+
nameStr = Utils.getCoroutineName(scope.getCoroutineContext());
46+
if (!linked) {
47+
Token token = Utils.getToken(scope.getCoroutineContext());
48+
if (token != null) {
49+
token.link();
50+
linked = true;
51+
}
52+
}
53+
}
3654
if(p2 instanceof Continuation) {
3755
Continuation continuation = (Continuation)p2;
56+
if(nameStr == null) nameStr = Utils.getCoroutineName(continuation.getContext(), continuation);
57+
if(nameStr == null || nameStr.equals(Utils.CREATEMETHOD1) || nameStr.equals(Utils.CREATEMETHOD2)) nameStr = name;
58+
59+
if(!linked) {
60+
Token token = Utils.getToken(continuation.getContext());
61+
if (token != null) {
62+
token.link();
63+
linked = true;
64+
}
65+
}
3866

3967
if (!Utils.ignoreContinuation(name) && !Utils.ignoreContinuation(continuation.getClass(), continuation.getContext())) {
40-
NRContinuationWrapper wrapper = new NRContinuationWrapper(continuation, name);
68+
NRContinuationWrapper wrapper = new NRContinuationWrapper(continuation, nameStr);
4169
p2 = (P2) wrapper;
4270
}
4371
}

Kotlin-Coroutines_1.2/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/Utils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import com.newrelic.api.agent.NewRelic;
1313
import com.newrelic.api.agent.Token;
1414

15+
import kotlin.coroutines.Continuation;
1516
import kotlin.coroutines.CoroutineContext;
17+
import kotlinx.coroutines.AbstractCoroutine;
1618
import kotlinx.coroutines.CoroutineName;
1719

1820
public class Utils implements AgentConfigListener {
@@ -167,6 +169,22 @@ public static void expireToken(CoroutineContext context) {
167169
context.minusKey(NRCoroutineToken.key);
168170
}
169171
}
172+
173+
@SuppressWarnings("unchecked")
174+
public static <T> String getCoroutineName(CoroutineContext context, Continuation<T> continuation, Class<?> clazz) {
175+
if(continuation instanceof AbstractCoroutine) {
176+
return ((AbstractCoroutine<T>)continuation).nameString$kotlinx_coroutines_core();
177+
}
178+
return getCoroutineName(context,clazz);
179+
}
180+
181+
@SuppressWarnings("unchecked")
182+
public static <T> String getCoroutineName(CoroutineContext context, Continuation<T> continuation) {
183+
if(continuation instanceof AbstractCoroutine) {
184+
return ((AbstractCoroutine<T>)continuation).nameString$kotlinx_coroutines_core();
185+
}
186+
return getCoroutineName(context,continuation.getClass());
187+
}
170188

171189
public static String getCoroutineName(CoroutineContext context, Class<?> clazz) {
172190
String name = getCoroutineName(context);

Kotlin-Coroutines_1.2/src/main/java/kotlinx/coroutines/AbstractCoroutine.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
public abstract class AbstractCoroutine<T> {
1212

1313
public abstract CoroutineContext getContext();
14+
public abstract String nameString$kotlinx_coroutines_core();
1415

1516
protected void onCompleted(T value) {
1617
Utils.expireToken(getContext());

Kotlin-Coroutines_1.2/src/main/java/kotlinx/coroutines/BuildersKt.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public static final <T> Deferred<T> async(CoroutineScope scope, CoroutineContext
5757
public static final <T> Object invoke(CoroutineDispatcher dispatcher, Function2<? super CoroutineScope, ? super Continuation<? super T>, ? extends Object> block, Continuation<? super T> c) {
5858
if(!Utils.ignoreSuspend(block.getClass(), null)) {
5959
if(!(block instanceof NRFunction2Wrapper)) {
60-
NRFunction2Wrapper<? super CoroutineScope, ? super Continuation<? super T>, ? extends Object> wrapper = new NRFunction2Wrapper(block,block.getClass().getName());
60+
NRFunction2Wrapper<? super CoroutineScope, ? super Continuation<? super T>, ? extends Object> wrapper = new NRFunction2Wrapper(block,Utils.getCoroutineName(null, c));
6161
block = wrapper;
6262
}
6363
}
@@ -89,8 +89,7 @@ public static final kotlinx.coroutines.Job launch(CoroutineScope scope, Coroutin
8989

9090
@Trace
9191
public static final <T> Object withContext(CoroutineContext context,Function2<? super CoroutineScope, ? super Continuation<? super T>, ? extends Object> block, Continuation<? super T> completion) {
92-
String name = Utils.getCoroutineName(context);
93-
if(name == null) name = block.getClass().getName();
92+
String name = Utils.getCoroutineName(context,completion,block.getClass());
9493
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","Builders","withContext",name);
9594
if(!Utils.ignoreSuspend(block.getClass(),context)) {
9695

Kotlin-Coroutines_1.2/src/main/java/kotlinx/coroutines/DispatchedTask.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,9 @@ public void run() {
2525
DispatchedContinuation<T> dispatched = (DispatchedContinuation<T>)continuation;
2626
continuation = dispatched.continuation;
2727
}
28-
String cName = Utils.getCoroutineName(context, continuation.getClass());
29-
if(cName.equals(Utils.CREATEMETHOD1) || cName.equals(Utils.CREATEMETHOD2)) {
30-
cName = "CoroutineFromSuspendFunction";
31-
}
28+
String cName = Utils.getCoroutineName(context, continuation);
3229

33-
if(context != null && !Utils.ignoreDispatched(cName)) {
30+
if(!notCreated(cName) && context != null && !Utils.ignoreDispatched(cName)) {
3431
Token t = Utils.getToken(context);
3532
if(t != null) t.link();
3633
if(cName != null)
@@ -40,4 +37,9 @@ public void run() {
4037
Weaver.callOriginal();
4138
}
4239

40+
private boolean notCreated(String cName) {
41+
if(cName.equals(Utils.CREATEMETHOD1)) return true;
42+
if(cName.equals(Utils.CREATEMETHOD2)) return true;
43+
return false;
44+
}
4345
}

Kotlin-Coroutines_1.4/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/NRContinuationWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public CoroutineContext getContext() {
3232
@Trace(async=true)
3333
public void resumeWith(Object p0) {
3434

35-
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",name != null ? name : Utils.getCoroutineName(getContext(), delegate.getClass()));
35+
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",name != null ? name : Utils.getCoroutineName(getContext(), delegate));
3636
Token token = Utils.getToken(getContext());
3737
if(token != null) {
3838
token.link();

Kotlin-Coroutines_1.4/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/NRFunction2Wrapper.java

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
import com.newrelic.api.agent.Trace;
77

88
import kotlin.coroutines.Continuation;
9+
import kotlin.coroutines.CoroutineContext;
910
import kotlin.jvm.functions.Function2;
11+
import kotlinx.coroutines.CoroutineScope;
1012

1113
public class NRFunction2Wrapper<P1, P2, R> implements Function2<P1, P2, R> {
1214

1315
private Function2<P1, P2, R> delegate = null;
1416
private String name = null;
1517
private static boolean isTransformed = false;
16-
public Token token = null;
1718

1819
public NRFunction2Wrapper(Function2<P1, P2, R> d,String n) {
1920
delegate = d;
@@ -28,16 +29,43 @@ public NRFunction2Wrapper(Function2<P1, P2, R> d,String n) {
2829
@Override
2930
@Trace(async=true)
3031
public R invoke(P1 p1, P2 p2) {
31-
if(token != null) {
32-
token.linkAndExpire();
33-
token = null;
34-
}
3532
String nameStr = null;
33+
boolean linked = false;
34+
if(p1 instanceof CoroutineContext) {
35+
CoroutineContext ctx = (CoroutineContext)p1;
36+
nameStr = Utils.getCoroutineName(ctx);
37+
Token token = Utils.getToken(ctx);
38+
if(token != null) {
39+
token.link();
40+
linked = true;
41+
}
42+
}
43+
if(p1 instanceof CoroutineScope) {
44+
CoroutineScope scope = (CoroutineScope)p1;
45+
nameStr = Utils.getCoroutineName(scope.getCoroutineContext());
46+
if (!linked) {
47+
Token token = Utils.getToken(scope.getCoroutineContext());
48+
if (token != null) {
49+
token.link();
50+
linked = true;
51+
}
52+
}
53+
}
3654
if(p2 instanceof Continuation) {
3755
Continuation continuation = (Continuation)p2;
56+
if(nameStr == null) nameStr = Utils.getCoroutineName(continuation.getContext(), continuation);
57+
if(nameStr == null || nameStr.equals(Utils.CREATEMETHOD1) || nameStr.equals(Utils.CREATEMETHOD2)) nameStr = name;
58+
59+
if(!linked) {
60+
Token token = Utils.getToken(continuation.getContext());
61+
if (token != null) {
62+
token.link();
63+
linked = true;
64+
}
65+
}
3866

3967
if (!Utils.ignoreContinuation(name) && !Utils.ignoreContinuation(continuation.getClass(), continuation.getContext())) {
40-
NRContinuationWrapper wrapper = new NRContinuationWrapper(continuation, name);
68+
NRContinuationWrapper wrapper = new NRContinuationWrapper(continuation, nameStr);
4169
p2 = (P2) wrapper;
4270
}
4371
}

Kotlin-Coroutines_1.4/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/Utils.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
import com.newrelic.api.agent.NewRelic;
1313
import com.newrelic.api.agent.Token;
1414

15+
import kotlin.coroutines.Continuation;
1516
import kotlin.coroutines.CoroutineContext;
17+
import kotlinx.coroutines.AbstractCoroutine;
1618
import kotlinx.coroutines.CoroutineName;
1719

1820
public class Utils implements AgentConfigListener {
@@ -167,6 +169,22 @@ public static void expireToken(CoroutineContext context) {
167169
context.minusKey(NRCoroutineToken.key);
168170
}
169171
}
172+
173+
@SuppressWarnings("unchecked")
174+
public static <T> String getCoroutineName(CoroutineContext context, Continuation<T> continuation, Class<?> clazz) {
175+
if(continuation instanceof AbstractCoroutine) {
176+
return ((AbstractCoroutine<T>)continuation).nameString$kotlinx_coroutines_core();
177+
}
178+
return getCoroutineName(context,clazz);
179+
}
180+
181+
@SuppressWarnings("unchecked")
182+
public static <T> String getCoroutineName(CoroutineContext context, Continuation<T> continuation) {
183+
if(continuation instanceof AbstractCoroutine) {
184+
return ((AbstractCoroutine<T>)continuation).nameString$kotlinx_coroutines_core();
185+
}
186+
return getCoroutineName(context,continuation.getClass());
187+
}
170188

171189
public static String getCoroutineName(CoroutineContext context, Class<?> clazz) {
172190
String name = getCoroutineName(context);

Kotlin-Coroutines_1.4/src/main/java/kotlinx/coroutines/AbstractCoroutine.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
public abstract class AbstractCoroutine<T> {
1212

1313
public abstract CoroutineContext getContext();
14+
public abstract String nameString$kotlinx_coroutines_core();
1415

1516
protected void onCompleted(T value) {
1617
Utils.expireToken(getContext());

0 commit comments

Comments
 (0)