Skip to content

Commit 2b9c91b

Browse files
committed
Move simple delay parsing to shared internal utility
1 parent 6642a3b commit 2b9c91b

4 files changed

Lines changed: 100 additions & 40 deletions

File tree

dd-java-agent/agent-builder/src/main/java/datadog/trace/agent/tooling/CombiningMatcher.java

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import datadog.trace.agent.tooling.bytebuddy.matcher.CustomExcludes;
77
import datadog.trace.agent.tooling.bytebuddy.matcher.ProxyClassIgnores;
88
import datadog.trace.api.InstrumenterConfig;
9+
import datadog.trace.api.time.TimeUtils;
910
import datadog.trace.util.AgentTaskScheduler;
1011
import java.lang.instrument.Instrumentation;
1112
import java.security.ProtectionDomain;
@@ -15,8 +16,6 @@
1516
import java.util.List;
1617
import java.util.Set;
1718
import java.util.concurrent.TimeUnit;
18-
import java.util.regex.Matcher;
19-
import java.util.regex.Pattern;
2019
import net.bytebuddy.agent.builder.AgentBuilder;
2120
import net.bytebuddy.description.type.TypeDescription;
2221
import net.bytebuddy.utility.JavaModule;
@@ -101,32 +100,18 @@ public boolean matches(
101100
/** Arranges for any deferred matching to resume at the requested trigger point. */
102101
private void scheduleResumeMatching(Instrumentation instrumentation, String untilTrigger) {
103102
if (null != untilTrigger && !untilTrigger.isEmpty()) {
104-
Pattern delayPattern = Pattern.compile("(\\d+)([HhMmSs]?)");
105-
Matcher delayMatcher = delayPattern.matcher(untilTrigger);
106-
if (delayMatcher.matches()) {
107-
long delay = Integer.parseInt(delayMatcher.group(1));
108-
String unit = delayMatcher.group(2);
109-
if ("H".equalsIgnoreCase(unit)) {
110-
delay = TimeUnit.HOURS.toSeconds(delay);
111-
} else if ("M".equalsIgnoreCase(unit)) {
112-
delay = TimeUnit.MINUTES.toSeconds(delay);
113-
} else {
114-
// already in seconds
115-
}
116-
117-
if (delay < 5) {
118-
return; // don't bother deferring small delays
119-
}
103+
long delay = TimeUtils.parseSimpleDelay(untilTrigger);
104+
if (delay < 0) {
105+
log.info(
106+
"Unrecognized value for dd.{}: {}",
107+
EXPERIMENTAL_DEFER_INTEGRATIONS_UNTIL,
108+
untilTrigger);
109+
} else if (delay >= 5) { // don't bother deferring small delays
120110

121111
new AgentTaskScheduler(RETRANSFORMER)
122112
.schedule(this::resumeMatching, instrumentation, delay, TimeUnit.SECONDS);
123113

124114
deferring = true;
125-
} else {
126-
log.info(
127-
"Unrecognized value for dd.{}: {}",
128-
EXPERIMENTAL_DEFER_INTEGRATIONS_UNTIL,
129-
untilTrigger);
130115
}
131116
}
132117
}

dd-trace-core/src/main/java/datadog/trace/core/flare/TracerFlareService.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import datadog.trace.api.Config;
77
import datadog.trace.api.DynamicConfig;
88
import datadog.trace.api.flare.TracerFlare;
9+
import datadog.trace.api.time.TimeUtils;
910
import datadog.trace.core.CoreTracer;
1011
import datadog.trace.core.DDTraceCoreInfo;
1112
import datadog.trace.logging.GlobalLogLevelSwitcher;
@@ -27,8 +28,6 @@
2728
import java.time.ZonedDateTime;
2829
import java.util.Collections;
2930
import java.util.concurrent.TimeUnit;
30-
import java.util.regex.Matcher;
31-
import java.util.regex.Pattern;
3231
import java.util.zip.ZipOutputStream;
3332
import okhttp3.HttpUrl;
3433
import okhttp3.MediaType;
@@ -49,8 +48,6 @@ final class TracerFlareService {
4948

5049
private static final MediaType OCTET_STREAM = MediaType.get("application/octet-stream");
5150

52-
private static final Pattern DELAY_TRIGGER = Pattern.compile("(\\d+)([HhMmSs]?)");
53-
5451
private final AgentTaskScheduler scheduler = new AgentTaskScheduler(TRACER_FLARE);
5552

5653
private final Config config;
@@ -81,20 +78,11 @@ final class TracerFlareService {
8178

8279
private void applyTriageReportTrigger(String triageTrigger) {
8380
if (null != triageTrigger && !triageTrigger.isEmpty()) {
84-
Matcher delayMatcher = DELAY_TRIGGER.matcher(triageTrigger);
85-
if (delayMatcher.matches()) {
86-
long delay = Integer.parseInt(delayMatcher.group(1));
87-
String unit = delayMatcher.group(2);
88-
if ("H".equalsIgnoreCase(unit)) {
89-
delay = TimeUnit.HOURS.toSeconds(delay);
90-
} else if ("M".equalsIgnoreCase(unit)) {
91-
delay = TimeUnit.MINUTES.toSeconds(delay);
92-
} else {
93-
// already in seconds
94-
}
95-
scheduleTriageReport(delay);
96-
} else {
81+
long delay = TimeUtils.parseSimpleDelay(triageTrigger);
82+
if (delay < 0) {
9783
log.info("Unrecognized triage trigger {}", triageTrigger);
84+
} else {
85+
scheduleTriageReport(delay);
9886
}
9987
}
10088
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package datadog.trace.api.time;
2+
3+
import java.util.concurrent.TimeUnit;
4+
import java.util.regex.Matcher;
5+
import java.util.regex.Pattern;
6+
7+
public abstract class TimeUtils {
8+
9+
/** Number followed by an optional time unit of hours (h), minutes (m), or seconds (s). */
10+
private static final Pattern SIMPLE_DELAY_PATTERN = Pattern.compile("(\\d+)([HhMmSs]?)");
11+
12+
/**
13+
* Parses the string as a simple delay, such as "30s" or "10m".
14+
*
15+
* @param delayString number followed by an optional time unit
16+
* @return delay in seconds; -1 if the string cannot be parsed
17+
*/
18+
public static long parseSimpleDelay(String delayString) {
19+
if (null != delayString) {
20+
Matcher delayMatcher = SIMPLE_DELAY_PATTERN.matcher(delayString);
21+
if (delayMatcher.matches()) {
22+
long delay = Integer.parseInt(delayMatcher.group(1));
23+
String unit = delayMatcher.group(2);
24+
if ("H".equalsIgnoreCase(unit)) {
25+
return TimeUnit.HOURS.toSeconds(delay);
26+
} else if ("M".equalsIgnoreCase(unit)) {
27+
return TimeUnit.MINUTES.toSeconds(delay);
28+
} else {
29+
return delay; // already in seconds
30+
}
31+
}
32+
}
33+
return -1; // unrecognized
34+
}
35+
36+
private TimeUtils() {}
37+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package datadog.trace.api.time
2+
3+
import datadog.trace.test.util.DDSpecification
4+
5+
class TimeUtilsTest extends DDSpecification {
6+
7+
def "test simple delay parsing"() {
8+
when:
9+
long delay = TimeUtils.parseSimpleDelay(delayString)
10+
11+
then:
12+
delay == expected
13+
14+
where:
15+
delayString | expected
16+
null | -1
17+
"" | -1
18+
"foo" | -1
19+
"-8" | -1
20+
"-1" | -1
21+
"0" | 0
22+
"1" | 1
23+
"2" | 2
24+
"3" | 3
25+
"0s" | 0
26+
"1s" | 1
27+
"2s" | 2
28+
"3s" | 3
29+
"0m" | 0
30+
"1m" | 60
31+
"2m" | 120
32+
"3m" | 180
33+
"0h" | 0
34+
"1h" | 3600
35+
"2h" | 7200
36+
"3h" | 10800
37+
"0S" | 0
38+
"1S" | 1
39+
"2S" | 2
40+
"3S" | 3
41+
"0M" | 0
42+
"1M" | 60
43+
"2M" | 120
44+
"3M" | 180
45+
"0H" | 0
46+
"1H" | 3600
47+
"2H" | 7200
48+
"3H" | 10800
49+
}
50+
}

0 commit comments

Comments
 (0)