Skip to content
This repository was archived by the owner on Dec 2, 2025. It is now read-only.

Commit 5af9488

Browse files
committed
fixed problems with ignores
1 parent 99f9791 commit 5af9488

File tree

37 files changed

+425
-490
lines changed

37 files changed

+425
-490
lines changed

Kotlin-Coroutines-Suspends/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/SuspendIgnores.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@
1010
public class SuspendIgnores {
1111

1212
private static final List<String> ignoredSuspends = new ArrayList<String>();
13-
private static final String CREATEMETHOD1 = "Continuation at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$4";
14-
private static final String CREATEMETHOD2 = "Continuation at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$3";
1513
private static final String SUSPENDSIGNORECONFIG = "Coroutines.ignores.suspends";
1614

1715
static {
18-
ignoredSuspends.add(CREATEMETHOD1);
19-
ignoredSuspends.add(CREATEMETHOD2);
2016
Config config = NewRelic.getAgent().getConfig();
2117
String value = config.getValue(SUSPENDSIGNORECONFIG);
2218
init(value);
@@ -34,8 +30,6 @@ private static void init(String value) {
3430

3531
public static void reset(Config config) {
3632
ignoredSuspends.clear();
37-
ignoredSuspends.add(CREATEMETHOD1);
38-
ignoredSuspends.add(CREATEMETHOD2);
3933
String value = config.getValue(SUSPENDSIGNORECONFIG);
4034
init(value);
4135
}

Kotlin-Coroutines-Suspends/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/Utils.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,34 @@
88

99
public class Utils implements AgentConfigListener {
1010

11-
private static final String SUSPENDSIGNORECONFIG = "Coroutines.ignores.suspends";
12-
1311
private static final Utils INSTANCE = new Utils();
14-
12+
public static final String CREATEMETHOD1 = "Continuation at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$4";
13+
public static final String CREATEMETHOD2 = "Continuation at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$3";
14+
public static String sub = "createCoroutineFromSuspendFunction";
15+
private static final String CONT_LOC = "Continuation at";
1516

1617
static {
1718
ServiceFactory.getConfigService().addIAgentConfigListener(INSTANCE);
1819
Config config = NewRelic.getAgent().getConfig();
19-
loadConfig(config);
20-
21-
}
22-
23-
private static void loadConfig(Config config) {
24-
String ignores = config.getValue(SUSPENDSIGNORECONFIG);
25-
if (ignores != null && !ignores.isEmpty()) {
26-
SuspendIgnores.reset(config);
27-
}
20+
SuspendIgnores.reset(config);
2821
}
29-
30-
public static String sub = "createCoroutineFromSuspendFunction";
3122

3223
@Override
3324
public void configChanged(String appName, AgentConfig agentConfig) {
34-
loadConfig(agentConfig);
25+
SuspendIgnores.reset(agentConfig);
26+
}
27+
28+
public static String getSuspendString(String cont_string, Object obj) {
29+
if(cont_string.equals(CREATEMETHOD1) || cont_string.equals(CREATEMETHOD2)) return sub;
30+
if(cont_string.startsWith(CONT_LOC)) {
31+
return cont_string;
32+
}
3533

34+
int index = cont_string.indexOf('@');
35+
if(index > -1) {
36+
return cont_string.substring(0, index);
37+
}
38+
39+
return obj.getClass().getName();
3640
}
37-
3841
}

Kotlin-Coroutines-Suspends/src/main/java/com/newrelic/instrumentation/kotlin/coroutines/tracing/SuspendTracerFactory.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import com.newrelic.agent.tracers.Tracer;
77
import com.newrelic.agent.tracers.TracerFactory;
88
import com.newrelic.agent.tracers.metricname.SimpleMetricNameFormat;
9-
import com.newrelic.api.agent.NewRelic;
109
import com.newrelic.instrumentation.kotlin.coroutines.SuspendIgnores;
10+
import com.newrelic.instrumentation.kotlin.coroutines.Utils;
1111

1212
public class SuspendTracerFactory implements TracerFactory {
1313

@@ -17,10 +17,9 @@ public class SuspendTracerFactory implements TracerFactory {
1717
public Tracer getTracer(Transaction transaction, ClassMethodSignature sig, Object object, Object[] args) {
1818

1919
if(SuspendIgnores.ignoreSuspend(object)) {
20-
NewRelic.incrementCounter("SuspendTracerFactory/ignored/"+object.toString());
2120
return null;
2221
}
23-
return new DefaultTracer(transaction, sig, object, new SimpleMetricNameFormat("Custom/SuspendFunction/"+object.toString()));
22+
return new DefaultTracer(transaction, sig, object, new SimpleMetricNameFormat("Custom/SuspendFunction/"+Utils.getSuspendString(object.toString(), object)));
2423
}
2524

2625
}
Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
package com.newrelic.instrumentation.kotlin.coroutines_14;
22

3-
import static com.newrelic.instrumentation.kotlin.coroutines_14.Utils.CREATEMETHOD1;
4-
import static com.newrelic.instrumentation.kotlin.coroutines_14.Utils.CREATEMETHOD2;
5-
import static com.newrelic.instrumentation.kotlin.coroutines_14.Utils.sub;
6-
7-
import java.lang.reflect.Method;
83
import java.util.ArrayList;
9-
import java.util.Hashtable;
104
import java.util.List;
115
import java.util.logging.Level;
126

@@ -15,9 +9,7 @@
159

1610
public class DispatchedTaskIgnores {
1711

18-
private static Class<?> dispatchedTaskClass = null;
1912
private static List<String> ignoredTasks = new ArrayList<>();
20-
private static Hashtable<Class<?>,Method> methodMappings = new Hashtable<>();
2113
private static final String DISPATCHEDIGNORECONFIG = "Coroutines.ignores.dispatched";
2214

2315
static {
@@ -27,9 +19,15 @@ public class DispatchedTaskIgnores {
2719

2820
}
2921

22+
23+
public static boolean ignoreDispatchedTask(String contString) {
24+
return ignoredTasks.contains(contString);
25+
}
26+
3027
public static void addIgnore(String ignore) {
3128
if(!ignoredTasks.contains(ignore)) {
3229
ignoredTasks.add(ignore);
30+
NewRelic.getAgent().getLogger().log(Level.FINE, "Will ignore DispatchedTasks with continuation string {0}", ignore);
3331
}
3432
}
3533

@@ -38,51 +36,11 @@ public static void reset() {
3836
}
3937

4038
protected static void configure(String result) {
39+
if(result == null || result.isEmpty()) return;
4140
String[] ignores = result.split(",");
4241
for(String ignore : ignores) {
4342
addIgnore(ignore);
4443
}
4544
}
4645

47-
public static boolean ignoreDispatchedTask(Object obj) {
48-
String result = invoke(obj);
49-
if(result.equals(CREATEMETHOD1) || result.equals(CREATEMETHOD2)) {
50-
result = sub;
51-
}
52-
if(result != null) {
53-
return ignoredTasks.contains(result);
54-
}
55-
return false;
56-
}
57-
58-
public static String invoke(Object obj) {
59-
Class<?> clazz = obj.getClass();
60-
if(!methodMappings.containsKey(clazz)) {
61-
initialize(obj);
62-
}
63-
Method toUse = methodMappings.get(clazz);
64-
65-
if(toUse != null) {
66-
try {
67-
Object value = toUse.invoke(obj, new Object[] {});
68-
if(value != null) {
69-
return value.toString();
70-
}
71-
} catch (Exception e) {
72-
NewRelic.getAgent().getLogger().log(Level.FINE, e, "Failed to invoke method on DispatchedTask");
73-
}
74-
}
75-
return null;
76-
}
77-
78-
private static void initialize(Object obj) {
79-
try {
80-
dispatchedTaskClass = obj.getClass();
81-
Method method = dispatchedTaskClass.getMethod("getDelegate$kotlinx_coroutines_core", new Class<?>[] {} );
82-
method.setAccessible(true);
83-
methodMappings.put(obj.getClass(), method);
84-
} catch (Exception e) {
85-
NewRelic.getAgent().getLogger().log(Level.FINE, e, "Failed to get DispatchedTask class and method");
86-
}
87-
}
8846
}

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ public class NRContinuationWrapper<T> implements Continuation<T> {
1313
private Continuation<T> delegate = null;
1414
private String name = null;
1515
private static boolean isTransformed = false;
16-
private Token token = null;
1716

1817
public NRContinuationWrapper(Continuation<T> d, String n) {
1918
delegate = d;
@@ -24,10 +23,6 @@ public NRContinuationWrapper(Continuation<T> d, String n) {
2423
}
2524
}
2625

27-
public void setToken(Token t) {
28-
token = t;
29-
}
30-
3126
@Override
3227
public CoroutineContext getContext() {
3328
return delegate.getContext();
@@ -39,14 +34,18 @@ public void resumeWith(Object p0) {
3934
String contString = Utils.getContinuationString(delegate);
4035
if(contString != null && !contString.isEmpty()) {
4136
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",contString);
37+
} else if(name != null) {
38+
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",name);
4239
} else {
43-
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",name != null ? name : Utils.getCoroutineName(getContext(), delegate));
40+
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","ContinuationWrapper","resumeWith",p0.getClass().getName());
4441
}
45-
Token t = token != null ? token : Utils.getToken(getContext());
42+
Token t = Utils.getToken(getContext());
4643
if(t != null) {
4744
t.link();
4845
}
49-
delegate.resumeWith(p0);
46+
if(delegate != null) {
47+
delegate.resumeWith(p0);
48+
}
5049
}
5150

5251
}

Kotlin-Coroutines_1.4/src/main/java/com/newrelic/instrumentation/kotlin/coroutines_14/NRFunction1Wrapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public R invoke(P1 p1) {
2525
if(p1 instanceof Continuation && !(p1 instanceof SuspendFunction)) {
2626
// wrap if needed
2727
if(!(p1 instanceof NRContinuationWrapper)) {
28-
NRContinuationWrapper wrapper = new NRContinuationWrapper<>((Continuation)p1, p1.toString());
28+
String cont_string = Utils.getContinuationString((Continuation)p1);
29+
NRContinuationWrapper wrapper = new NRContinuationWrapper<>((Continuation)p1, cont_string);
2930
p1 = (P1) wrapper;
3031
}
3132
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ public R invoke(P1 p1, P2 p2) {
2525

2626
if(p2 instanceof Continuation && !(p2 instanceof SuspendFunction)) {
2727
// wrap if needed
28-
if(!(p2 instanceof NRContinuationWrapper)) {
29-
NRContinuationWrapper wrapper = new NRContinuationWrapper<>((Continuation)p2, p2.toString());
28+
String cont_string = Utils.getContinuationString((Continuation)p2);
29+
if(!(p2 instanceof NRContinuationWrapper) && !Utils.ignoreContinuation(cont_string)) {
30+
NRContinuationWrapper wrapper = new NRContinuationWrapper<>((Continuation)p2, cont_string);
3031
p2 = (P2) wrapper;
3132
}
3233
}

Kotlin-Coroutines_1.4/src/main/java/com/newrelic/instrumentation/kotlin/coroutines_14/NRRunnable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public void run() {
3131
DispatchedTask<?> task = (DispatchedTask<?>)delegate;
3232
Continuation<?> cont_delegate = task.getDelegate$kotlinx_coroutines_core();
3333
if(cont_delegate != null) {
34+
String cont_string = Utils.getContinuationString(cont_delegate);
35+
if(cont_string == null) cont_string = cont_delegate.getClass().getName();
3436
NewRelic.getAgent().getTracedMethod().setMetricName("Custom","DispatchedTask",Utils.getContinuationString(cont_delegate));
3537
nameSet = true;
3638
}

Kotlin-Coroutines_1.4/src/main/java/com/newrelic/instrumentation/kotlin/coroutines_14/SuspendIgnores.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

0 commit comments

Comments
 (0)