Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,54 @@
import com.newrelic.agent.config.AgentConfigListener;
import com.newrelic.agent.service.ServiceFactory;
import com.newrelic.agent.tracers.*;
import com.newrelic.api.agent.Config;
import com.newrelic.api.agent.NewRelic;
import kotlin.coroutines.Continuation;
import kotlinx.coroutines.AbstractCoroutine;

import java.util.Arrays;
import java.util.HashSet;
import java.util.logging.Level;
import java.util.regex.Pattern;

public class SuspendsUtils implements AgentConfigListener {

private static final HashSet<String> ignoredSuspends = new HashSet<>();
private static final HashSet<Pattern> ignoredRegexSuspends = new HashSet<>();
public static final String CREATE_METHOD1 = "Continuation at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$4";
public static final String CREATE_METHOD2 = "Continuation at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$3";
private static final String CONT_LOC = "Continuation at";
public static String sub = "createCoroutineFromSuspendFunction";
public static final String KOTLIN_PACKAGE = "kotlin";
private static final String SUSPEND_FUNCTION_METRIC_NAME_PREFIX = "Custom/Kotlin/Coroutines/SuspendFunction/";
private static final String SUSPENDSIGNORECONFIG = "Coroutines.ignores.suspends";
private static final String SUSPENDSIGNORECONFIG = "coroutines.suspends.ignore";
private static final String SUSPENDSREGEXIGNORECONFIG = "coroutines.suspends.ignoreRegex";

static {
ServiceFactory.getConfigService().addIAgentConfigListener(new SuspendsUtils());
Config agentConfig = NewRelic.getAgent().getConfig();
String value = agentConfig.getValue(SUSPENDSIGNORECONFIG);
NewRelic.getAgent().getLogger().log(Level.FINE,"Value of {0} is {1}", SUSPENDSIGNORECONFIG, value);
if(value != null) {
ignoredSuspends.clear();
String[] split = value.split(",");
if(split.length > 0) {
ignoredSuspends.addAll(Arrays.asList(split));
}
}
value = agentConfig.getValue(SUSPENDSREGEXIGNORECONFIG);
NewRelic.getAgent().getLogger().log(Level.FINE,"Value of {0} is {1}", SUSPENDSREGEXIGNORECONFIG, value);
if (value != null) {
ignoredRegexSuspends.clear();
String[] split = value.split(",");
if(split.length > 0) {
for(String ignoredRegex : split) {
NewRelic.getAgent().getLogger().log(Level.FINE,"Will ignore suspends matching {0}", ignoredRegex);
ignoredRegexSuspends.add(Pattern.compile(ignoredRegex));
}
}
}

}

private SuspendsUtils() {}
Expand All @@ -38,8 +67,10 @@ public static ExitTracer getSuspendTracer(Continuation<?> continuation) {
// ignore if can't determine continuation string
if(continuationString == null || continuationString.isEmpty()) { return null; }

for(String ignoredSuspend : ignoredSuspends) {
if(continuationString.matches(ignoredSuspend) || className.matches(ignoredSuspend)) { return null; }
for(Pattern ignoredSuspend : ignoredRegexSuspends) {
if(ignoredSuspend.matcher(continuationString).matches() || ignoredSuspend.matcher(className).matches()) {
return null;
}
}
if (ignoredSuspends.contains(continuationString) || ignoredSuspends.contains(className)) {
return null;
Expand Down Expand Up @@ -83,11 +114,25 @@ public static <T> String getContinuationString(Continuation<T> continuation) {
@Override
public void configChanged(String s, AgentConfig agentConfig) {
String value = agentConfig.getValue(SUSPENDSIGNORECONFIG);
NewRelic.getAgent().getLogger().log(Level.FINE,"Value of {0} is {1}", SUSPENDSIGNORECONFIG, value);
if(value != null) {
ignoredSuspends.clear();
String[] split = value.split(",");
if(split.length > 0) {
ignoredSuspends.addAll(Arrays.asList(split));
}
}
value = agentConfig.getValue(SUSPENDSREGEXIGNORECONFIG);
NewRelic.getAgent().getLogger().log(Level.FINE,"Value of {0} is {1}", SUSPENDSREGEXIGNORECONFIG, value);
if (value != null) {
ignoredRegexSuspends.clear();
String[] split = value.split(",");
if(split.length > 0) {
for(String ignoredRegex : split) {
NewRelic.getAgent().getLogger().log(Level.FINE,"Will ignore suspends matching {0}", ignoredRegex);
ignoredRegexSuspends.add(Pattern.compile(ignoredRegex));
}
}
}
}
}
Loading