Skip to content

Commit f2ea53e

Browse files
committed
Delay starting JMX related services in agent bootstrap
Defaults to 15 seconds, can be configured with `-Ddd.jmxfetch.start-delay` or `DD_JMXFETCH_START_DELAY`
1 parent 27c6dc4 commit f2ea53e

6 files changed

Lines changed: 161 additions & 43 deletions

File tree

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java

Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static datadog.trace.util.AgentThreadFactory.AgentThread.TRACE_STARTUP;
99
import static datadog.trace.util.AgentThreadFactory.newAgentThread;
1010

11+
import datadog.trace.util.AgentTaskScheduler;
1112
import datadog.trace.util.AgentThreadFactory.AgentThread;
1213
import java.lang.instrument.Instrumentation;
1314
import java.lang.management.ManagementFactory;
@@ -16,6 +17,8 @@
1617
import java.lang.reflect.Method;
1718
import java.net.URL;
1819
import java.util.EnumSet;
20+
import java.util.concurrent.TimeUnit;
21+
import java.util.concurrent.atomic.AtomicBoolean;
1922
import org.slf4j.Logger;
2023
import org.slf4j.LoggerFactory;
2124

@@ -39,6 +42,8 @@ public class Agent {
3942
private static final String SIMPLE_LOGGER_DEFAULT_LOG_LEVEL_PROPERTY =
4043
"datadog.slf4j.simpleLogger.defaultLogLevel";
4144

45+
private static final int DEFAULT_JMX_FETCH_START_DELAY = 15; // seconds
46+
4247
// We cannot use lombok here because we need to configure logger first
4348
private static final Logger log;
4449

@@ -48,6 +53,8 @@ public class Agent {
4853
log = LoggerFactory.getLogger(Agent.class);
4954
}
5055

56+
private static final AtomicBoolean jmxStarting = new AtomicBoolean();
57+
5158
// fields must be managed under class lock
5259
private static ClassLoader PARENT_CLASSLOADER = null;
5360
private static ClassLoader BOOTSTRAP_PROXY = null;
@@ -88,14 +95,17 @@ public static void start(final Instrumentation inst, final URL bootstrapURL) {
8895
* JMXFetch until we detect the custom MBeanServerBuilder is being used. This takes precedence over the custom
8996
* log manager check because any custom log manager will be installed before any custom MBeanServerBuilder.
9097
*/
98+
int jmxStartDelay = getJmxStartDelay();
9199
if (appUsingCustomJMXBuilder) {
92100
log.debug("Custom JMX builder detected. Delaying JMXFetch initialization.");
93-
registerMBeanServerBuilderCallback(new StartJmxCallback(bootstrapURL));
101+
registerMBeanServerBuilderCallback(new StartJmxCallback(bootstrapURL, jmxStartDelay));
102+
// one minute fail-safe in case nothing touches JMX and and callback isn't triggered
103+
scheduleJmxStart(bootstrapURL, 60 + jmxStartDelay);
94104
} else if (appUsingCustomLogManager) {
95105
log.debug("Custom logger detected. Delaying JMXFetch initialization.");
96-
registerLogManagerCallback(new StartJmxCallback(bootstrapURL));
106+
registerLogManagerCallback(new StartJmxCallback(bootstrapURL, jmxStartDelay));
97107
} else {
98-
startJmx(bootstrapURL);
108+
scheduleJmxStart(bootstrapURL, jmxStartDelay);
99109
}
100110

101111
/*
@@ -184,8 +194,11 @@ public void run() {
184194
}
185195

186196
protected static class StartJmxCallback extends ClassLoadCallBack {
187-
StartJmxCallback(final URL bootstrapURL) {
197+
private final int jmxStartDelay;
198+
199+
StartJmxCallback(final URL bootstrapURL, final int jmxStartDelay) {
188200
super(bootstrapURL);
201+
this.jmxStartDelay = jmxStartDelay;
189202
}
190203

191204
@Override
@@ -195,7 +208,9 @@ public AgentThread agentThread() {
195208

196209
@Override
197210
public void execute() {
198-
startJmx(bootstrapURL);
211+
// finish building platform JMX from context of custom builder before starting JMXFetch
212+
ManagementFactory.getPlatformMBeanServer();
213+
scheduleJmxStart(bootstrapURL, jmxStartDelay);
199214
}
200215
}
201216

@@ -291,17 +306,31 @@ private static synchronized void installDatadogTracer() {
291306
}
292307
}
293308

294-
private static synchronized void startJmx(final URL bootstrapURL) {
295-
// load core JMX using the inherited thread-context-classloader
296-
ManagementFactory.getPlatformMBeanServer();
309+
private static void scheduleJmxStart(final URL bootstrapURL, final int jmxStartDelay) {
310+
if (jmxStartDelay > 0) {
311+
AgentTaskScheduler.INSTANCE.scheduleWithJitter(
312+
new JmxStartTask(), bootstrapURL, jmxStartDelay, TimeUnit.SECONDS);
313+
} else {
314+
startJmx(bootstrapURL);
315+
}
316+
}
297317

298-
startJmxFetch(bootstrapURL);
318+
static final class JmxStartTask implements AgentTaskScheduler.Task<URL> {
319+
@Override
320+
public void run(final URL bootstrapURL) {
321+
startJmx(bootstrapURL);
322+
}
323+
}
299324

325+
private static synchronized void startJmx(final URL bootstrapURL) {
300326
if (AGENT_CLASSLOADER == null) {
301327
throw new IllegalStateException("Datadog agent should have been started already");
302328
}
329+
if (jmxStarting.getAndSet(true)) {
330+
return; // another thread is already in startJmx
331+
}
332+
startJmxFetch(bootstrapURL);
303333
initializeJmxSystemAccessProvider(AGENT_CLASSLOADER);
304-
305334
registerDeadlockDetectionEvent(bootstrapURL);
306335
}
307336

@@ -491,6 +520,23 @@ private static boolean isStartupLogsEnabled() {
491520
return !"false".equalsIgnoreCase(startupLogsEnabled);
492521
}
493522

523+
/** @return configured JMX start delay in seconds */
524+
private static int getJmxStartDelay() {
525+
final String jmxStartDelaySysprop = "dd.jmxfetch.start-delay";
526+
String jmxStartDelay = System.getProperty(jmxStartDelaySysprop);
527+
if (jmxStartDelay == null) {
528+
jmxStartDelay = ddGetEnv(jmxStartDelaySysprop);
529+
}
530+
if (jmxStartDelay != null) {
531+
try {
532+
return Integer.parseInt(jmxStartDelay);
533+
} catch (NumberFormatException e) {
534+
// fall back to default delay
535+
}
536+
}
537+
return DEFAULT_JMX_FETCH_START_DELAY;
538+
}
539+
494540
/**
495541
* Search for java or datadog-tracer sysprops which indicate that a custom log manager will be
496542
* used. Also search for any app classes known to set a custom log manager.
@@ -548,10 +594,9 @@ private static boolean isAppUsingCustomJMXBuilder(final EnumSet<Library> librari
548594
|| Boolean.parseBoolean(customJMXBuilderEnv);
549595
}
550596

551-
// FIXME: uncomment this when we add delayed JMX startup
552-
// if (libraries.contains(WILDFLY)) {
553-
// return true; // Wildfly is known to set a custom JMX builder after startup.
554-
// }
597+
if (libraries.contains(WILDFLY)) {
598+
return true; // Wildfly is known to set a custom JMX builder after startup.
599+
}
555600

556601
final String jmxBuilderProp = System.getProperty("javax.management.builder.initial");
557602
if (jmxBuilderProp != null) {
@@ -570,7 +615,7 @@ private static boolean isAppUsingCustomJMXBuilder(final EnumSet<Library> librari
570615

571616
/** Looks for the "DD_" environment variable equivalent of the given "dd." system property. */
572617
private static String ddGetEnv(final String sysProp) {
573-
return System.getenv(sysProp.replace('.', '_').toUpperCase());
618+
return System.getenv(sysProp.replace('.', '_').replace('-', '_').toUpperCase());
574619
}
575620

576621
private static boolean isJavaBefore9WithJFR() {

dd-java-agent/src/test/groovy/datadog/trace/agent/CustomLogManagerTest.groovy

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ class CustomLogManagerTest extends Specification {
1818
def "agent services starts up in premain with no custom log manager set"() {
1919
expect:
2020
IntegrationTestUtils.runOnSeparateJvm(LogManagerSetter.getName()
21-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL"] as String[]
21+
, ["-Ddd.jmxfetch.enabled=true",
22+
"-Ddd.jmxfetch.start-delay=0",
23+
"-Ddd.jmxfetch.refresh-beans-period=1",
24+
"-Ddd.profiling.enabled=true",
25+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL"] as String[]
2226
, "" as String[]
2327
, ["DD_API_KEY": API_KEY]
2428
, true) == 0
@@ -27,7 +31,12 @@ class CustomLogManagerTest extends Specification {
2731
def "agent services starts up in premain if configured log manager on system classpath"() {
2832
expect:
2933
IntegrationTestUtils.runOnSeparateJvm(LogManagerSetter.getName()
30-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Djava.util.logging.manager=jvmbootstraptest.CustomLogManager"] as String[]
34+
, ["-Ddd.jmxfetch.enabled=true",
35+
"-Ddd.jmxfetch.start-delay=0",
36+
"-Ddd.jmxfetch.refresh-beans-period=1",
37+
"-Ddd.profiling.enabled=true",
38+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
39+
"-Djava.util.logging.manager=jvmbootstraptest.CustomLogManager"] as String[]
3140
, "" as String[]
3241
, ["DD_API_KEY": API_KEY]
3342
, true) == 0
@@ -36,7 +45,12 @@ class CustomLogManagerTest extends Specification {
3645
def "agent services startup is delayed with java.util.logging.manager sysprop"() {
3746
expect:
3847
IntegrationTestUtils.runOnSeparateJvm(LogManagerSetter.getName()
39-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Djava.util.logging.manager=jvmbootstraptest.MissingLogManager"] as String[]
48+
, ["-Ddd.jmxfetch.enabled=true",
49+
"-Ddd.jmxfetch.start-delay=0",
50+
"-Ddd.jmxfetch.refresh-beans-period=1",
51+
"-Ddd.profiling.enabled=true",
52+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
53+
"-Djava.util.logging.manager=jvmbootstraptest.MissingLogManager"] as String[]
4054
, "" as String[]
4155
, ["DD_API_KEY": API_KEY]
4256
, true) == 0
@@ -45,7 +59,12 @@ class CustomLogManagerTest extends Specification {
4559
def "agent services startup delayed with tracer custom log manager setting"() {
4660
expect:
4761
IntegrationTestUtils.runOnSeparateJvm(LogManagerSetter.getName()
48-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Ddd.app.customlogmanager=true"] as String[]
62+
, ["-Ddd.jmxfetch.enabled=true",
63+
"-Ddd.jmxfetch.start-delay=0",
64+
"-Ddd.jmxfetch.refresh-beans-period=1",
65+
"-Ddd.profiling.enabled=true",
66+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
67+
"-Ddd.app.customlogmanager=true"] as String[]
4968
, "" as String[]
5069
, ["DD_API_KEY": API_KEY]
5170
, true) == 0
@@ -54,7 +73,12 @@ class CustomLogManagerTest extends Specification {
5473
def "agent services startup delayed with JBOSS_HOME environment variable"() {
5574
expect:
5675
IntegrationTestUtils.runOnSeparateJvm(LogManagerSetter.getName()
57-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL"] as String[]
76+
, ["-Ddd.jmxfetch.enabled=true",
77+
"-Ddd.jmxfetch.start-delay=0",
78+
"-Ddd.jmxfetch.refresh-beans-period=1",
79+
"-Ddd.profiling.enabled=true",
80+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
81+
"-Ddd.app.customjmxbuilder=false"] as String[]
5882
, "" as String[]
5983
, ["JBOSS_HOME": "/", "DD_API_KEY": API_KEY]
6084
, true) == 0
@@ -63,7 +87,14 @@ class CustomLogManagerTest extends Specification {
6387
def "agent services startup in premain forced by customlogmanager=false"() {
6488
expect:
6589
IntegrationTestUtils.runOnSeparateJvm(LogManagerSetter.getName()
66-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Ddd.app.customlogmanager=false", "-Djava.util.logging.manager=jvmbootstraptest.CustomLogManager"] as String[]
90+
, ["-Ddd.jmxfetch.enabled=true",
91+
"-Ddd.jmxfetch.start-delay=0",
92+
"-Ddd.jmxfetch.refresh-beans-period=1",
93+
"-Ddd.profiling.enabled=true",
94+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
95+
"-Ddd.app.customlogmanager=false",
96+
"-Ddd.app.customjmxbuilder=false",
97+
"-Djava.util.logging.manager=jvmbootstraptest.CustomLogManager"] as String[]
6798
, "" as String[]
6899
, ["JBOSS_HOME": "/", "DD_API_KEY": API_KEY]
69100
, true) == 0

dd-java-agent/src/test/groovy/datadog/trace/agent/CustomMBeanServerBuilderTest.groovy

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ class CustomMBeanServerBuilderTest extends Specification {
1515
def "JMXFetch starts up in premain with no custom MBeanServerBuilder set"() {
1616
expect:
1717
IntegrationTestUtils.runOnSeparateJvm(MBeanServerBuilderSetter.getName()
18-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL"] as String[]
18+
, ["-Ddd.jmxfetch.enabled=true",
19+
"-Ddd.jmxfetch.start-delay=0",
20+
"-Ddd.jmxfetch.refresh-beans-period=1",
21+
"-Ddd.profiling.enabled=true",
22+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL"] as String[]
1923
, "" as String[]
2024
, ["DD_API_KEY": API_KEY]
2125
, true) == 0
@@ -24,7 +28,12 @@ class CustomMBeanServerBuilderTest extends Specification {
2428
def "JMXFetch starts up in premain if configured MBeanServerBuilder on system classpath"() {
2529
expect:
2630
IntegrationTestUtils.runOnSeparateJvm(MBeanServerBuilderSetter.getName()
27-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Djavax.management.builder.initial=jvmbootstraptest.CustomMBeanServerBuilder"] as String[]
31+
, ["-Ddd.jmxfetch.enabled=true",
32+
"-Ddd.jmxfetch.start-delay=0",
33+
"-Ddd.jmxfetch.refresh-beans-period=1",
34+
"-Ddd.profiling.enabled=true",
35+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
36+
"-Djavax.management.builder.initial=jvmbootstraptest.CustomMBeanServerBuilder"] as String[]
2837
, "" as String[]
2938
, ["DD_API_KEY": API_KEY]
3039
, true) == 0
@@ -33,7 +42,12 @@ class CustomMBeanServerBuilderTest extends Specification {
3342
def "JMXFetch startup is delayed with javax.management.builder.initial sysprop"() {
3443
expect:
3544
IntegrationTestUtils.runOnSeparateJvm(MBeanServerBuilderSetter.getName()
36-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Djavax.management.builder.initial=jvmbootstraptest.MissingMBeanServerBuilder"] as String[]
45+
, ["-Ddd.jmxfetch.enabled=true",
46+
"-Ddd.jmxfetch.start-delay=0",
47+
"-Ddd.jmxfetch.refresh-beans-period=1",
48+
"-Ddd.profiling.enabled=true",
49+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
50+
"-Djavax.management.builder.initial=jvmbootstraptest.MissingMBeanServerBuilder"] as String[]
3751
, "" as String[]
3852
, ["DD_API_KEY": API_KEY]
3953
, true) == 0
@@ -42,7 +56,12 @@ class CustomMBeanServerBuilderTest extends Specification {
4256
def "JMXFetch startup is delayed with tracer custom JMX builder setting"() {
4357
expect:
4458
IntegrationTestUtils.runOnSeparateJvm(MBeanServerBuilderSetter.getName()
45-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Ddd.app.customjmxbuilder=true"] as String[]
59+
, ["-Ddd.jmxfetch.enabled=true",
60+
"-Ddd.jmxfetch.start-delay=0",
61+
"-Ddd.jmxfetch.refresh-beans-period=1",
62+
"-Ddd.profiling.enabled=true",
63+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
64+
"-Ddd.app.customjmxbuilder=true"] as String[]
4665
, "" as String[]
4766
, ["DD_API_KEY": API_KEY]
4867
, true) == 0
@@ -51,7 +70,13 @@ class CustomMBeanServerBuilderTest extends Specification {
5170
def "JMXFetch starts up in premain forced by customjmxbuilder=false"() {
5271
expect:
5372
IntegrationTestUtils.runOnSeparateJvm(MBeanServerBuilderSetter.getName()
54-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.refresh-beans-period=1", "-Ddd.profiling.enabled=true", "-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL", "-Ddd.app.customjmxbuilder=false", "-Djavax.management.builder.initial=jvmbootstraptest.CustomMBeanServerBuilder"] as String[]
73+
, ["-Ddd.jmxfetch.enabled=true",
74+
"-Ddd.jmxfetch.start-delay=0",
75+
"-Ddd.jmxfetch.refresh-beans-period=1",
76+
"-Ddd.profiling.enabled=true",
77+
"-Ddatadog.slf4j.simpleLogger.defaultLogLevel=$DEFAULT_LOG_LEVEL",
78+
"-Ddd.app.customjmxbuilder=false",
79+
"-Djavax.management.builder.initial=jvmbootstraptest.CustomMBeanServerBuilder"] as String[]
5580
, "" as String[]
5681
, ["DD_API_KEY": API_KEY]
5782
, true) == 0

dd-java-agent/src/test/groovy/datadog/trace/agent/JMXFetchTest.groovy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class JMXFetchTest extends Specification {
2222
DatagramSocket socket = new DatagramSocket(0)
2323

2424
System.setProperty("dd.jmxfetch.enabled", "true")
25+
System.setProperty("dd.jmxfetch.start-delay", "0")
2526
System.setProperty("dd.jmxfetch.statsd.port", Integer.toString(socket.localPort))
2627
// Overwrite writer type to disable console jmxfetch reporter
2728
System.setProperty("dd.writer.type", "DDAgentWriter")
@@ -56,7 +57,9 @@ class JMXFetchTest extends Specification {
5657
// verify the agent starts up correctly with a bogus address.
5758
expect:
5859
IntegrationTestUtils.runOnSeparateJvm(AgentLoadedChecker.getName()
59-
, ["-Ddd.jmxfetch.enabled=true", "-Ddd.jmxfetch.statsd.host=example.local"] as String[]
60+
, ["-Ddd.jmxfetch.enabled=true",
61+
"-Ddd.jmxfetch.start-delay=0",
62+
"-Ddd.jmxfetch.statsd.host=example.local"] as String[]
6063
, "" as String[]
6164
, [:]
6265
, true) == 0

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
import java.util.ServiceLoader;
5454
import java.util.SortedSet;
5555
import java.util.concurrent.ConcurrentSkipListSet;
56-
import java.util.concurrent.ThreadLocalRandom;
5756
import java.util.concurrent.TimeUnit;
5857
import lombok.Builder;
5958
import lombok.extern.slf4j.Slf4j;
@@ -245,28 +244,19 @@ private CoreTracer(
245244
this.writer.start();
246245

247246
metricsAggregator = createMetricsAggregator(config);
248-
// schedule to start after geometrically distributed number of seconds expressed in
249-
// milliseconds, with p = 0.25, meaning the probability that the aggregator will not
250-
// have started by the nth second is 0.25(0.75)^n-1 (or a 1% chance of not having
251-
// started within 10 seconds, where a cap is applied) This avoids a fleet of traced
252-
// applications starting at the same time and sending metrics in sync
253-
long delayMillis =
254-
Math.min(
255-
(long)
256-
(1000D
257-
* (Math.log(ThreadLocalRandom.current().nextDouble()) / Math.log(1 - 0.25)
258-
+ 1)),
259-
10_000);
260-
AgentTaskScheduler.INSTANCE.schedule(
247+
// Schedule the metrics aggregator to begin reporting after a random delay of 1 to 10 seconds
248+
// (using milliseconds granularity.) This avoids a fleet of traced applications starting at the
249+
// same time from sending metrics in sync.
250+
AgentTaskScheduler.INSTANCE.scheduleWithJitter(
261251
new AgentTaskScheduler.Task<MetricsAggregator>() {
262252
@Override
263253
public void run(MetricsAggregator target) {
264254
target.start();
265255
}
266256
},
267257
metricsAggregator,
268-
delayMillis,
269-
TimeUnit.MILLISECONDS);
258+
1,
259+
TimeUnit.SECONDS);
270260

271261
this.tagInterceptor =
272262
null == tagInterceptor ? new TagInterceptor(new RuleFlags(config)) : tagInterceptor;

0 commit comments

Comments
 (0)