This is an automated email from the ASF dual-hosted git repository. tanjian pushed a commit to branch cds_span_limit in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 8e1667146670f8db4bde670bb44fefaa3e74636e Author: JaredTan95 <[email protected]> AuthorDate: Thu Mar 4 12:06:23 2021 +0800 CDS: Support config `agent.span_limit_per_segment` --- CHANGES.md | 1 + .../watcher}/IgnoreSuffixPatternsWatcher.java | 3 ++- .../dynamic/watcher}/SamplingRateWatcher.java | 3 ++- .../dynamic/watcher/SpanLimitWatcher.java} | 29 ++++++++-------------- .../core/context/ContextManagerExtendService.java | 3 ++- .../apm/agent/core/context/TracingContext.java | 9 +++++-- .../apm/agent/core/sampling/SamplingService.java | 3 ++- .../watcher}/IgnoreSuffixPatternsWatcherTest.java | 4 ++- .../watcher}/SamplingRateWatcherTest.java | 4 ++- .../watcher/SpanLimitWatcherTest.java} | 25 ++++++++----------- .../java-agent/configuration-discovery.md | 1 + 11 files changed, 44 insertions(+), 41 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 15c0760..adb6452 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -17,6 +17,7 @@ Release Notes. * Fix apm-dubbo-2.7.x-plugin memory leak due to some Dubbo RpcExceptions. * Fix lettuce-5.x-plugin get null host in redis sentinel mode. * Fix ClassCastException by making CallbackAdapterInterceptor to implement EnhancedInstance interface in the spring-kafka plugin. +* Support config `agent.span_limit_per_segment` can be changed in the runtime. #### OAP-Backend * Allow user-defined `JAVA_OPTS` in the startup script. diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoreSuffixPatternsWatcher.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/IgnoreSuffixPatternsWatcher.java similarity index 94% rename from apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoreSuffixPatternsWatcher.java rename to apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/IgnoreSuffixPatternsWatcher.java index cb488f5..5b31241 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoreSuffixPatternsWatcher.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/IgnoreSuffixPatternsWatcher.java @@ -16,10 +16,11 @@ * */ -package org.apache.skywalking.apm.agent.core.context; +package org.apache.skywalking.apm.agent.core.conf.dynamic.watcher; import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.conf.dynamic.AgentConfigChangeWatcher; +import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService; import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcher.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/SamplingRateWatcher.java similarity index 95% copy from apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcher.java copy to apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/SamplingRateWatcher.java index 9a5f346..9dcce2a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcher.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/SamplingRateWatcher.java @@ -16,13 +16,14 @@ * */ -package org.apache.skywalking.apm.agent.core.sampling; +package org.apache.skywalking.apm.agent.core.conf.dynamic.watcher; import java.util.concurrent.atomic.AtomicInteger; import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.conf.dynamic.AgentConfigChangeWatcher; import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; +import org.apache.skywalking.apm.agent.core.sampling.SamplingService; public class SamplingRateWatcher extends AgentConfigChangeWatcher { private static final ILog LOGGER = LogManager.getLogger(SamplingRateWatcher.class); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcher.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/SpanLimitWatcher.java similarity index 67% rename from apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcher.java rename to apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/SpanLimitWatcher.java index 9a5f346..79d834b 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcher.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/dynamic/watcher/SpanLimitWatcher.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.apm.agent.core.sampling; +package org.apache.skywalking.apm.agent.core.conf.dynamic.watcher; import java.util.concurrent.atomic.AtomicInteger; import org.apache.skywalking.apm.agent.core.conf.Config; @@ -24,16 +24,14 @@ import org.apache.skywalking.apm.agent.core.conf.dynamic.AgentConfigChangeWatche import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; -public class SamplingRateWatcher extends AgentConfigChangeWatcher { - private static final ILog LOGGER = LogManager.getLogger(SamplingRateWatcher.class); +public class SpanLimitWatcher extends AgentConfigChangeWatcher { + private static final ILog LOGGER = LogManager.getLogger(SpanLimitWatcher.class); - private final AtomicInteger samplingRate; - private final SamplingService samplingService; + private final AtomicInteger spanLimit; - public SamplingRateWatcher(final String propertyKey, SamplingService samplingService) { + public SpanLimitWatcher(final String propertyKey) { super(propertyKey); - this.samplingRate = new AtomicInteger(getDefaultValue()); - this.samplingService = samplingService; + this.spanLimit = new AtomicInteger(getDefaultValue()); } private void activeSetting(String config) { @@ -41,12 +39,7 @@ public class SamplingRateWatcher extends AgentConfigChangeWatcher { LOGGER.debug("Updating using new static config: {}", config); } try { - this.samplingRate.set(Integer.parseInt(config)); - - /* - * We need to notify samplingService the samplingRate changed. - */ - samplingService.handleSamplingRateChanged(); + this.spanLimit.set(Integer.parseInt(config)); } catch (NumberFormatException ex) { LOGGER.error(ex, "Cannot load {} from: {}", getPropertyKey(), config); } @@ -63,14 +56,14 @@ public class SamplingRateWatcher extends AgentConfigChangeWatcher { @Override public String value() { - return String.valueOf(samplingRate.get()); + return String.valueOf(spanLimit.get()); } private int getDefaultValue() { - return Config.Agent.SAMPLE_N_PER_3_SECS; + return Config.Agent.SPAN_LIMIT_PER_SEGMENT; } - public int getSamplingRate() { - return samplingRate.get(); + public int getSpanLimit() { + return spanLimit.get(); } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java index f91d2c4..4f9b7db 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManagerExtendService.java @@ -24,6 +24,7 @@ import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.conf.dynamic.ConfigurationDiscoveryService; +import org.apache.skywalking.apm.agent.core.conf.dynamic.watcher.IgnoreSuffixPatternsWatcher; import org.apache.skywalking.apm.agent.core.remote.GRPCChannelListener; import org.apache.skywalking.apm.agent.core.remote.GRPCChannelManager; import org.apache.skywalking.apm.agent.core.remote.GRPCChannelStatus; @@ -93,7 +94,7 @@ public class ContextManagerExtendService implements BootService, GRPCChannelList this.status = status; } - void handleIgnoreSuffixPatternsChanged() { + public void handleIgnoreSuffixPatternsChanged() { if (StringUtil.isNotBlank(ignoreSuffixPatternsWatcher.getIgnoreSuffixPatterns())) { ignoreSuffixArray = ignoreSuffixPatternsWatcher.getIgnoreSuffixPatterns().split(","); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java index b0c04f0..df62347 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java @@ -26,6 +26,7 @@ import lombok.AccessLevel; import lombok.Getter; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.Config; +import org.apache.skywalking.apm.agent.core.conf.dynamic.watcher.SpanLimitWatcher; import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId; import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; @@ -110,6 +111,9 @@ public class TracingContext implements AbstractTracerContext { @Getter(AccessLevel.PACKAGE) private final ExtensionContext extensionContext; + //CDS watcher + private final SpanLimitWatcher spanLimitWatcher; + /** * Initialize all fields with default value. */ @@ -129,6 +133,7 @@ public class TracingContext implements AbstractTracerContext { this.correlationContext = new CorrelationContext(); this.extensionContext = new ExtensionContext(); + this.spanLimitWatcher = new SpanLimitWatcher("agent.span_limit_per_segment"); } /** @@ -541,12 +546,12 @@ public class TracingContext implements AbstractTracerContext { } private boolean isLimitMechanismWorking() { - if (spanIdGenerator >= Config.Agent.SPAN_LIMIT_PER_SEGMENT) { + if (spanIdGenerator >= spanLimitWatcher.getSpanLimit()) { long currentTimeMillis = System.currentTimeMillis(); if (currentTimeMillis - lastWarningTimestamp > 30 * 1000) { LOGGER.warn( new RuntimeException("Shadow tracing context. Thread dump"), - "More than {} spans required to create", Config.Agent.SPAN_LIMIT_PER_SEGMENT + "More than {} spans required to create", spanLimitWatcher.getSpanLimit() ); lastWarningTimestamp = currentTimeMillis; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingService.java index 8ca63e9..5777a04 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/sampling/SamplingService.java @@ -29,6 +29,7 @@ import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.conf.dynamic.ConfigurationDiscoveryService; +import org.apache.skywalking.apm.agent.core.conf.dynamic.watcher.SamplingRateWatcher; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; @@ -109,7 +110,7 @@ public class SamplingService implements BootService { /** * Handle the samplingRate changed. */ - void handleSamplingRateChanged() { + public void handleSamplingRateChanged() { if (samplingRateWatcher.getSamplingRate() > 0) { if (!on) { on = true; diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoreSuffixPatternsWatcherTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/IgnoreSuffixPatternsWatcherTest.java similarity index 92% rename from apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoreSuffixPatternsWatcherTest.java rename to apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/IgnoreSuffixPatternsWatcherTest.java index a0b2ede..a2e7108 100644 --- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoreSuffixPatternsWatcherTest.java +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/IgnoreSuffixPatternsWatcherTest.java @@ -16,10 +16,12 @@ * */ -package org.apache.skywalking.apm.agent.core.context; +package org.apache.skywalking.apm.agent.core.conf.watcher; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.dynamic.AgentConfigChangeWatcher; +import org.apache.skywalking.apm.agent.core.conf.dynamic.watcher.IgnoreSuffixPatternsWatcher; +import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService; import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule; import org.junit.AfterClass; import org.junit.Assert; diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcherTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/SamplingRateWatcherTest.java similarity index 92% copy from apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcherTest.java copy to apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/SamplingRateWatcherTest.java index cf5393f..ab30946 100644 --- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcherTest.java +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/SamplingRateWatcherTest.java @@ -16,10 +16,12 @@ * */ -package org.apache.skywalking.apm.agent.core.sampling; +package org.apache.skywalking.apm.agent.core.conf.watcher; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.dynamic.AgentConfigChangeWatcher; +import org.apache.skywalking.apm.agent.core.conf.dynamic.watcher.SamplingRateWatcher; +import org.apache.skywalking.apm.agent.core.sampling.SamplingService; import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule; import org.junit.AfterClass; import org.junit.Assert; diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcherTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/SpanLimitWatcherTest.java similarity index 63% rename from apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcherTest.java rename to apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/SpanLimitWatcherTest.java index cf5393f..9efb11a 100644 --- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/sampling/SamplingRateWatcherTest.java +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/conf/watcher/SpanLimitWatcherTest.java @@ -16,28 +16,27 @@ * */ -package org.apache.skywalking.apm.agent.core.sampling; +package org.apache.skywalking.apm.agent.core.conf.watcher; import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.dynamic.AgentConfigChangeWatcher; +import org.apache.skywalking.apm.agent.core.conf.dynamic.watcher.SpanLimitWatcher; import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.powermock.reflect.Whitebox; -public class SamplingRateWatcherTest { +public class SpanLimitWatcherTest { @Rule public AgentServiceRule agentServiceRule = new AgentServiceRule(); - private SamplingService samplingService; + private final SpanLimitWatcher spanLimitWatcher = new SpanLimitWatcher("agent.span_limit_per_segment"); @Before public void setUp() { - samplingService = ServiceManager.INSTANCE.findService(SamplingService.class); } @AfterClass @@ -47,24 +46,20 @@ public class SamplingRateWatcherTest { @Test public void testConfigModifyEvent() { - SamplingRateWatcher samplingRateWatcher = Whitebox.getInternalState( - samplingService, "samplingRateWatcher"); - samplingRateWatcher.notify(new AgentConfigChangeWatcher.ConfigChangeEvent( - "10", + spanLimitWatcher.notify(new AgentConfigChangeWatcher.ConfigChangeEvent( + "400", AgentConfigChangeWatcher.EventType.MODIFY )); - Assert.assertEquals(10, samplingRateWatcher.getSamplingRate()); - Assert.assertEquals("agent.sample_n_per_3_secs", samplingRateWatcher.getPropertyKey()); + Assert.assertEquals(400, spanLimitWatcher.getSpanLimit()); + Assert.assertEquals("agent.span_limit_per_segment", spanLimitWatcher.getPropertyKey()); } @Test public void testConfigDeleteEvent() { - SamplingRateWatcher samplingRateWatcher = Whitebox.getInternalState( - samplingService, "samplingRateWatcher"); - samplingRateWatcher.notify(new AgentConfigChangeWatcher.ConfigChangeEvent( + spanLimitWatcher.notify(new AgentConfigChangeWatcher.ConfigChangeEvent( null, AgentConfigChangeWatcher.EventType.DELETE )); - Assert.assertEquals("agent.sample_n_per_3_secs", samplingRateWatcher.getPropertyKey()); + Assert.assertEquals("agent.span_limit_per_segment", spanLimitWatcher.getPropertyKey()); } } diff --git a/docs/en/setup/service-agent/java-agent/configuration-discovery.md b/docs/en/setup/service-agent/java-agent/configuration-discovery.md index 65423f6..d48b524 100644 --- a/docs/en/setup/service-agent/java-agent/configuration-discovery.md +++ b/docs/en/setup/service-agent/java-agent/configuration-discovery.md @@ -27,5 +27,6 @@ Java agent supports the following dynamic configurations. | agent.sample_n_per_3_secs | The number of sampled traces per 3 seconds | -1 | - | | agent.ignore_suffix | If the operation name of the first span is included in this set, this segment should be ignored. Multiple values should be separated by `,` | `.txt,.log` | - | | agent.trace.ignore_path | The value is the path that you need to ignore, multiple paths should be separated by `,` [more details](./agent-optional-plugins/trace-ignore-plugin.md) | `/your/path/1/**,/your/path/2/**` | `apm-trace-ignore-plugin` | +| agent.span_limit_per_segment | The max number of span per segment. | `300` | - | * `Required plugin(s)`, the configuration affects only when the required plugins activated.
