Add `trace_segment_ref_limit_per_span` configuration mechanism to avoid OOM (#6715)
This commit is contained in:
parent
a3d60a7d06
commit
b472703154
|
|
@ -8,6 +8,7 @@ Release Notes.
|
|||
|
||||
|
||||
#### Java Agent
|
||||
* Add `trace_segment_ref_limit_per_span` configuration mechanism to avoid OOM.
|
||||
|
||||
|
||||
#### OAP-Backend
|
||||
|
|
|
|||
|
|
@ -66,6 +66,11 @@ public class Config {
|
|||
*/
|
||||
public static String IGNORE_SUFFIX = ".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg";
|
||||
|
||||
/**
|
||||
* The max number of TraceSegmentRef in a single span to keep memory cost estimatable.
|
||||
*/
|
||||
public static int TRACE_SEGMENT_REF_LIMIT_PER_SPAN = 500;
|
||||
|
||||
/**
|
||||
* The max number of spans in a single segment. Through this config item, SkyWalking keep your application
|
||||
* memory cost estimated.
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ public class TracingContext implements AbstractTracerContext {
|
|||
public void extract(ContextCarrier carrier) {
|
||||
TraceSegmentRef ref = new TraceSegmentRef(carrier);
|
||||
this.segment.ref(ref);
|
||||
this.segment.relatedGlobalTraces(new PropagatedTraceId(carrier.getTraceId()));
|
||||
this.segment.relatedGlobalTrace(new PropagatedTraceId(carrier.getTraceId()));
|
||||
AbstractSpan span = this.activeSpan();
|
||||
if (span instanceof EntrySpan) {
|
||||
span.ref(ref);
|
||||
|
|
@ -229,7 +229,7 @@ public class TracingContext implements AbstractTracerContext {
|
|||
TraceSegmentRef segmentRef = new TraceSegmentRef(snapshot);
|
||||
this.segment.ref(segmentRef);
|
||||
this.activeSpan().ref(segmentRef);
|
||||
this.segment.relatedGlobalTraces(snapshot.getTraceId());
|
||||
this.segment.relatedGlobalTrace(snapshot.getTraceId());
|
||||
this.correlationContext.continued(snapshot);
|
||||
this.extensionContext.continued(snapshot);
|
||||
this.extensionContext.handle(this.activeSpan());
|
||||
|
|
@ -245,7 +245,7 @@ public class TracingContext implements AbstractTracerContext {
|
|||
}
|
||||
|
||||
private DistributedTraceId getPrimaryTraceId() {
|
||||
return segment.getRelatedGlobalTraces().get(0);
|
||||
return segment.getRelatedGlobalTrace();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -1,44 +0,0 @@
|
|||
/*
|
||||
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
* contributor license agreements. See the NOTICE file distributed with
|
||||
* this work for additional information regarding copyright ownership.
|
||||
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
* (the "License"); you may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.skywalking.apm.agent.core.context.ids;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class DistributedTraceIds {
|
||||
private LinkedList<DistributedTraceId> relatedGlobalTraces;
|
||||
|
||||
public DistributedTraceIds() {
|
||||
relatedGlobalTraces = new LinkedList<>();
|
||||
}
|
||||
|
||||
public List<DistributedTraceId> getRelatedGlobalTraces() {
|
||||
return Collections.unmodifiableList(relatedGlobalTraces);
|
||||
}
|
||||
|
||||
public void append(DistributedTraceId distributedTraceId) {
|
||||
if (relatedGlobalTraces.size() > 0 && relatedGlobalTraces.getFirst() instanceof NewDistributedTraceId) {
|
||||
relatedGlobalTraces.removeFirst();
|
||||
}
|
||||
if (!relatedGlobalTraces.contains(distributedTraceId)) {
|
||||
relatedGlobalTraces.add(distributedTraceId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -23,6 +23,7 @@ import java.util.LinkedList;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
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.context.ContextManager;
|
||||
import org.apache.skywalking.apm.agent.core.context.TracingContext;
|
||||
import org.apache.skywalking.apm.agent.core.context.status.StatusCheckService;
|
||||
|
|
@ -301,6 +302,12 @@ public abstract class AbstractTracingSpan implements AbstractSpan {
|
|||
if (refs == null) {
|
||||
refs = new LinkedList<>();
|
||||
}
|
||||
/*
|
||||
* Provide the OOM protection if the entry span hosts too many references.
|
||||
*/
|
||||
if (refs.size() == Config.Agent.TRACE_SEGMENT_REF_LIMIT_PER_SPAN) {
|
||||
return;
|
||||
}
|
||||
if (!refs.contains(ref)) {
|
||||
refs.add(ref);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ import java.util.LinkedList;
|
|||
import java.util.List;
|
||||
import org.apache.skywalking.apm.agent.core.conf.Config;
|
||||
import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceId;
|
||||
import org.apache.skywalking.apm.agent.core.context.ids.DistributedTraceIds;
|
||||
import org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator;
|
||||
import org.apache.skywalking.apm.agent.core.context.ids.NewDistributedTraceId;
|
||||
import org.apache.skywalking.apm.network.language.agent.v3.SegmentObject;
|
||||
|
|
@ -39,13 +38,13 @@ public class TraceSegment {
|
|||
private String traceSegmentId;
|
||||
|
||||
/**
|
||||
* The refs of parent trace segments, except the primary one. For most RPC call, {@link #refs} contains only one
|
||||
* The refs of parent trace segments, except the primary one. For most RPC call, {@link #ref} contains only one
|
||||
* element, but if this segment is a start span of batch process, the segment faces multi parents, at this moment,
|
||||
* we use this {@code #refs} to link them.
|
||||
* we only cache the first parent segment reference.
|
||||
* <p>
|
||||
* This field will not be serialized. Keeping this field is only for quick accessing.
|
||||
*/
|
||||
private List<TraceSegmentRef> refs;
|
||||
private TraceSegmentRef ref;
|
||||
|
||||
/**
|
||||
* The spans belong to this trace segment. They all have finished. All active spans are hold and controlled by
|
||||
|
|
@ -54,14 +53,11 @@ public class TraceSegment {
|
|||
private List<AbstractTracingSpan> spans;
|
||||
|
||||
/**
|
||||
* The <code>relatedGlobalTraces</code> represent a set of all related trace. Most time it contains only one
|
||||
* The <code>relatedGlobalTraceId</code> represent the related trace. Most time it related only one
|
||||
* element, because only one parent {@link TraceSegment} exists, but, in batch scenario, the num becomes greater
|
||||
* than 1, also meaning multi-parents {@link TraceSegment}. <p> The difference between
|
||||
* <code>relatedGlobalTraces</code> and {@link #refs} is: {@link #refs} targets this {@link TraceSegment}'s direct
|
||||
* parent, <p> and <p> <code>relatedGlobalTraces</code> targets this {@link TraceSegment}'s related call chain, a
|
||||
* call chain contains multi {@link TraceSegment}s, only using {@link #refs} is not enough for analysis and ui.
|
||||
* than 1, also meaning multi-parents {@link TraceSegment}. But we only related the first parent TraceSegment.
|
||||
*/
|
||||
private DistributedTraceIds relatedGlobalTraces;
|
||||
private DistributedTraceId relatedGlobalTraceId;
|
||||
|
||||
private boolean ignore = false;
|
||||
|
||||
|
|
@ -75,8 +71,7 @@ public class TraceSegment {
|
|||
public TraceSegment() {
|
||||
this.traceSegmentId = GlobalIdGenerator.generate();
|
||||
this.spans = new LinkedList<>();
|
||||
this.relatedGlobalTraces = new DistributedTraceIds();
|
||||
this.relatedGlobalTraces.append(new NewDistributedTraceId());
|
||||
this.relatedGlobalTraceId = new NewDistributedTraceId();
|
||||
this.createTime = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
|
|
@ -86,19 +81,18 @@ public class TraceSegment {
|
|||
* @param refSegment {@link TraceSegmentRef}
|
||||
*/
|
||||
public void ref(TraceSegmentRef refSegment) {
|
||||
if (refs == null) {
|
||||
refs = new LinkedList<>();
|
||||
}
|
||||
if (!refs.contains(refSegment)) {
|
||||
refs.add(refSegment);
|
||||
if (null == ref) {
|
||||
this.ref = refSegment;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Establish the line between this segment and all relative global trace ids.
|
||||
* Establish the line between this segment and the relative global trace id.
|
||||
*/
|
||||
public void relatedGlobalTraces(DistributedTraceId distributedTraceId) {
|
||||
relatedGlobalTraces.append(distributedTraceId);
|
||||
public void relatedGlobalTrace(DistributedTraceId distributedTraceId) {
|
||||
if (relatedGlobalTraceId instanceof NewDistributedTraceId) {
|
||||
this.relatedGlobalTraceId = distributedTraceId;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -121,16 +115,15 @@ public class TraceSegment {
|
|||
return traceSegmentId;
|
||||
}
|
||||
|
||||
public boolean hasRef() {
|
||||
return !(refs == null || refs.size() == 0);
|
||||
/**
|
||||
* Get the first parent segment reference.
|
||||
*/
|
||||
public TraceSegmentRef getRef() {
|
||||
return ref;
|
||||
}
|
||||
|
||||
public List<TraceSegmentRef> getRefs() {
|
||||
return refs;
|
||||
}
|
||||
|
||||
public List<DistributedTraceId> getRelatedGlobalTraces() {
|
||||
return relatedGlobalTraces.getRelatedGlobalTraces();
|
||||
public DistributedTraceId getRelatedGlobalTrace() {
|
||||
return relatedGlobalTraceId;
|
||||
}
|
||||
|
||||
public boolean isSingleSpanSegment() {
|
||||
|
|
@ -152,7 +145,7 @@ public class TraceSegment {
|
|||
*/
|
||||
public SegmentObject transform() {
|
||||
SegmentObject.Builder traceSegmentBuilder = SegmentObject.newBuilder();
|
||||
traceSegmentBuilder.setTraceId(getRelatedGlobalTraces().get(0).getId());
|
||||
traceSegmentBuilder.setTraceId(getRelatedGlobalTrace().getId());
|
||||
/*
|
||||
* Trace Segment
|
||||
*/
|
||||
|
|
@ -172,7 +165,7 @@ public class TraceSegment {
|
|||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TraceSegment{" + "traceSegmentId='" + traceSegmentId + '\'' + ", refs=" + refs + ", spans=" + spans + ", relatedGlobalTraces=" + relatedGlobalTraces + '}';
|
||||
return "TraceSegment{" + "traceSegmentId='" + traceSegmentId + '\'' + ", ref=" + ref + ", spans=" + spans + "}";
|
||||
}
|
||||
|
||||
public long createTime() {
|
||||
|
|
|
|||
|
|
@ -54,6 +54,7 @@ import org.junit.runner.RunWith;
|
|||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
|
|
@ -90,7 +91,7 @@ public class ContextManagerTest {
|
|||
ContextManager.stopSpan();
|
||||
|
||||
TraceSegment actualSegment = tracingData.getTraceSegments().get(0);
|
||||
assertNull(actualSegment.getRefs());
|
||||
assertNull(actualSegment.getRef());
|
||||
|
||||
List<AbstractTracingSpan> spanList = SegmentHelper.getSpan(actualSegment);
|
||||
assertThat(Objects.requireNonNull(spanList).size(), is(1));
|
||||
|
|
@ -134,9 +135,9 @@ public class ContextManagerTest {
|
|||
assertThat(tracingData.getTraceSegments().size(), is(1));
|
||||
|
||||
TraceSegment actualSegment = tracingData.getTraceSegments().get(0);
|
||||
assertThat(actualSegment.getRefs().size(), is(1));
|
||||
assertNotNull(actualSegment.getRef());
|
||||
|
||||
TraceSegmentRef ref = actualSegment.getRefs().get(0);
|
||||
TraceSegmentRef ref = actualSegment.getRef();
|
||||
MatcherAssert.assertThat(TraceSegmentRefHelper.getPeerHost(ref), is("127.0.0.1:8080"));
|
||||
|
||||
List<AbstractTracingSpan> spanList = SegmentHelper.getSpan(actualSegment);
|
||||
|
|
@ -192,7 +193,7 @@ public class ContextManagerTest {
|
|||
|
||||
assertThat(tracingData.getTraceSegments().size(), is(1));
|
||||
TraceSegment actualSegment = tracingData.getTraceSegments().get(0);
|
||||
assertNull(actualSegment.getRefs());
|
||||
assertNull(actualSegment.getRef());
|
||||
|
||||
List<AbstractTracingSpan> spanList = SegmentHelper.getSpan(actualSegment);
|
||||
assertThat(Objects.requireNonNull(spanList).size(), is(2));
|
||||
|
|
|
|||
|
|
@ -194,7 +194,7 @@ public class DubboInterceptorTest {
|
|||
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
|
||||
assertThat(SegmentHelper.getSpans(traceSegment).size(), is(1));
|
||||
assertProviderSpan(SegmentHelper.getSpans(traceSegment).get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
private void assertTraceSegmentRef(TraceSegmentRef actual) {
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ public class DubboInterceptorTest {
|
|||
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
|
||||
assertThat(SegmentHelper.getSpans(traceSegment).size(), is(1));
|
||||
assertProviderSpan(SegmentHelper.getSpans(traceSegment).get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
private void assertTraceSegmentRef(TraceSegmentRef actual) {
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ public class ServerTracingFilterInterceptorTest extends AbstractTracingFilterTes
|
|||
|
||||
private void assertServer() {
|
||||
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
|
||||
TraceSegmentRef actual = traceSegment.getRefs().get(0);
|
||||
TraceSegmentRef actual = traceSegment.getRef();
|
||||
assertThat(SegmentRefHelper.getSpanId(actual), is(3));
|
||||
assertThat(SegmentRefHelper.getParentServiceInstance(actual), is("instance"));
|
||||
assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("3.4.5"));
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ public class HandleInterceptorTest {
|
|||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
|
||||
assertHttpSpan(spans.get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
|
|||
import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
|
||||
import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
|
||||
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
|
@ -122,7 +123,7 @@ public class CallbackInterceptorTest {
|
|||
|
||||
assertCallbackSpan(abstractSpans.get(0));
|
||||
|
||||
assertCallbackSegmentRef(traceSegment.getRefs());
|
||||
assertCallbackSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -139,7 +140,7 @@ public class CallbackInterceptorTest {
|
|||
|
||||
assertCallbackSpanWithException(abstractSpans.get(0));
|
||||
|
||||
assertCallbackSegmentRef(traceSegment.getRefs());
|
||||
assertCallbackSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -170,11 +171,10 @@ public class CallbackInterceptorTest {
|
|||
assertThat(SpanHelper.getErrorOccurred(span), is(true));
|
||||
}
|
||||
|
||||
private void assertCallbackSegmentRef(List<TraceSegmentRef> refs) {
|
||||
assertThat(refs.size(), is(1));
|
||||
private void assertCallbackSegmentRef(TraceSegmentRef traceSegmentRef) {
|
||||
Assert.assertNotNull(traceSegmentRef);
|
||||
|
||||
TraceSegmentRef segmentRef = refs.get(0);
|
||||
SegmentRefAssert.assertSpanId(segmentRef, 1);
|
||||
SegmentRefAssert.assertSpanId(traceSegmentRef, 1);
|
||||
}
|
||||
|
||||
private void assertCallbackSpan(AbstractTracingSpan span) {
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ import org.powermock.modules.junit4.PowerMockRunnerDelegate;
|
|||
|
||||
import static org.apache.skywalking.apm.network.trace.component.ComponentsDefine.KAFKA_CONSUMER;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
|
|
@ -125,9 +126,8 @@ public class KafkaConsumerInterceptorTest {
|
|||
assertThat(traceSegments.size(), is(1));
|
||||
|
||||
TraceSegment traceSegment = traceSegments.get(0);
|
||||
List<TraceSegmentRef> refs = traceSegment.getRefs();
|
||||
assertThat(refs.size(), is(1));
|
||||
assertTraceSegmentRef(refs.get(0));
|
||||
assertNotNull(traceSegment.getRef());
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
assertThat(spans.size(), is(1));
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@ import org.powermock.modules.junit4.PowerMockRunnerDelegate;
|
|||
|
||||
import static org.apache.skywalking.apm.agent.test.tools.SpanAssert.assertComponent;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
|
|
@ -100,8 +100,7 @@ public class MotanProviderInterceptorTest {
|
|||
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
assertMotanProviderSpan(spans.get(0));
|
||||
assertTrue(traceSegment.getRefs() == null);
|
||||
|
||||
assertNull(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -120,7 +119,7 @@ public class MotanProviderInterceptorTest {
|
|||
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
assertMotanProviderSpan(spans.get(0));
|
||||
assertRefSegment(traceSegment.getRefs().get(0));
|
||||
assertRefSegment(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ import java.util.List;
|
|||
|
||||
import static org.apache.skywalking.apm.network.trace.component.ComponentsDefine.PULSAR_CONSUMER;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
|
|
@ -107,9 +108,8 @@ public class PulsarConsumerInterceptorTest {
|
|||
assertThat(traceSegments.size(), is(1));
|
||||
|
||||
TraceSegment traceSegment = traceSegments.get(0);
|
||||
List<TraceSegmentRef> refs = traceSegment.getRefs();
|
||||
assertThat(refs.size(), is(1));
|
||||
assertTraceSegmentRef(refs.get(0));
|
||||
assertNotNull(traceSegment.getRef());
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
assertThat(spans.size(), is(1));
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
|
|||
import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
|
||||
import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
|
||||
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
|
|
@ -104,7 +105,7 @@ public class SendCallbackInterceptorTest {
|
|||
|
||||
assertCallbackSpan(abstractSpans.get(0));
|
||||
|
||||
assertCallbackSegmentRef(traceSegment.getRefs());
|
||||
assertCallbackSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -121,7 +122,7 @@ public class SendCallbackInterceptorTest {
|
|||
|
||||
assertCallbackSpanWithException(abstractSpans.get(0));
|
||||
|
||||
assertCallbackSegmentRef(traceSegment.getRefs());
|
||||
assertCallbackSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
private void assertCallbackSpanWithException(AbstractTracingSpan span) {
|
||||
|
|
@ -131,11 +132,10 @@ public class SendCallbackInterceptorTest {
|
|||
assertThat(SpanHelper.getErrorOccurred(span), is(true));
|
||||
}
|
||||
|
||||
private void assertCallbackSegmentRef(List<TraceSegmentRef> refs) {
|
||||
assertThat(refs.size(), is(1));
|
||||
private void assertCallbackSegmentRef(TraceSegmentRef traceSegmentRef) {
|
||||
Assert.assertNotNull(traceSegmentRef);
|
||||
|
||||
TraceSegmentRef segmentRef = refs.get(0);
|
||||
SegmentRefAssert.assertSpanId(segmentRef, 1);
|
||||
SegmentRefAssert.assertSpanId(traceSegmentRef, 1);
|
||||
}
|
||||
|
||||
private void assertCallbackSpan(AbstractTracingSpan span) {
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ public class SynchronousDispatcherInterceptorTest {
|
|||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
|
||||
AssertTools.assertHttpSpan(spans.get(0));
|
||||
AssertTools.assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
AssertTools.assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -132,8 +132,8 @@ public class InterceptorTest {
|
|||
assertThat(segmentStorage.getTraceSegments().size(), is(2));
|
||||
TraceSegment segment0 = segmentStorage.getTraceSegments().get(0);
|
||||
TraceSegment segment1 = segmentStorage.getTraceSegments().get(1);
|
||||
assertThat(segment0.getRefs().size(), is(1));
|
||||
assertNull(segment1.getRefs());
|
||||
assertNotNull(segment0.getRef());
|
||||
assertNull(segment1.getRef());
|
||||
List<AbstractTracingSpan> spans0 = SegmentHelper.getSpans(segment0);
|
||||
assertNotNull(spans0);
|
||||
assertThat(spans0.size(), is(1));
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ public class SofaRpcProviderInterceptorTest {
|
|||
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
|
||||
assertThat(SegmentHelper.getSpans(traceSegment).size(), is(1));
|
||||
assertProviderSpan(SegmentHelper.getSpans(traceSegment).get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
private void assertTraceSegmentRef(TraceSegmentRef actual) {
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ public class Struts2InterceptorTest {
|
|||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
|
||||
assertHttpSpan(spans.get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ import org.apache.tomcat.util.http.Parameters;
|
|||
|
||||
/**
|
||||
* {@link TomcatInvokeInterceptor} fetch the serialized context data by using {@link
|
||||
* HttpServletRequest#getHeader(String)}. The {@link TraceSegment#refs} of current trace segment will reference to the
|
||||
* HttpServletRequest#getHeader(String)}. The {@link TraceSegment#ref} of current trace segment will reference to the
|
||||
* trace segment id of the previous level if the serialized context is not null.
|
||||
*/
|
||||
public class TomcatInvokeInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
|
@ -58,7 +58,7 @@ public class TomcatInvokeInterceptor implements InstanceMethodsAroundInterceptor
|
|||
}
|
||||
|
||||
/**
|
||||
* * The {@link TraceSegment#refs} of current trace segment will reference to the trace segment id of the previous
|
||||
* * The {@link TraceSegment#ref} of current trace segment will reference to the trace segment id of the previous
|
||||
* level if the serialized context is not null.
|
||||
*
|
||||
* @param result change this result, if you want to truncate the method.
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ public class TomcatInvokeInterceptorTest {
|
|||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
|
||||
assertHttpSpan(spans.get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ public class TracingHandlerTest {
|
|||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
|
||||
|
||||
assertHttpSpan(spans.get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRefs().get(0));
|
||||
assertTraceSegmentRef(traceSegment.getRef());
|
||||
}
|
||||
|
||||
private HttpServerExchange buildExchange() {
|
||||
|
|
|
|||
|
|
@ -66,6 +66,7 @@ import org.powermock.modules.junit4.PowerMockRunnerDelegate;
|
|||
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
|
|
@ -266,8 +267,8 @@ public class SkywalkingSpanActivationTest {
|
|||
|
||||
TraceSegment tracingSegment = assertTraceSemgnets();
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(tracingSegment);
|
||||
assertThat(tracingSegment.getRefs().size(), is(1));
|
||||
TraceSegmentRef ref = tracingSegment.getRefs().get(0);
|
||||
assertNotNull(tracingSegment.getRef());
|
||||
TraceSegmentRef ref = tracingSegment.getRef();
|
||||
SegmentRefAssert.assertSegmentId(ref, "3.4.5");
|
||||
SegmentRefAssert.assertSpanId(ref, 3);
|
||||
assertThat(SegmentRefHelper.getParentServiceInstance(ref), is("instance"));
|
||||
|
|
@ -307,7 +308,7 @@ public class SkywalkingSpanActivationTest {
|
|||
|
||||
TraceSegment tracingSegment = assertTraceSemgnets();
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(tracingSegment);
|
||||
assertNull(tracingSegment.getRefs());
|
||||
assertNull(tracingSegment.getRef());
|
||||
assertSpanCommonsAttribute(spans.get(0));
|
||||
}
|
||||
|
||||
|
|
@ -342,10 +343,10 @@ public class SkywalkingSpanActivationTest {
|
|||
List<TraceSegment> segments = storage.getTraceSegments();
|
||||
assertThat(segments.size(), is(2));
|
||||
TraceSegment traceSegment = segments.get(0);
|
||||
assertThat(traceSegment.getRefs().size(), is(1));
|
||||
assertNotNull(traceSegment.getRef());
|
||||
|
||||
traceSegment = segments.get(1);
|
||||
assertNull(traceSegment.getRefs());
|
||||
assertNull(traceSegment.getRef());
|
||||
}
|
||||
|
||||
private void assertSpanCommonsAttribute(AbstractTracingSpan span) {
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ property key | Description | Default |
|
|||
`agent.service_name` | The service name to represent a logic group providing the same capabilities/logic. Suggestion: set a unique name for every logic service group, service instance nodes share the same code, Max length is 50(UTF-8 char). Optional, once `service_name` follows `<group name>::<logic name>` format, OAP server assigns the group name to the service metadata.| `Your_ApplicationName` |
|
||||
`agent.sample_n_per_3_secs`|Negative or zero means off, by default.SAMPLE_N_PER_3_SECS means sampling N TraceSegment in 3 seconds tops.|Not set|
|
||||
`agent.authentication`|Authentication active is based on backend setting, see application.yml for more details.For most scenarios, this needs backend extensions, only basic match auth provided in default implementation.|Not set|
|
||||
`agent.trace_segment_ref_limit_per_span`|The max number of TraceSegmentRef in a single span to keep memory cost estimatable.|500 |
|
||||
`agent.span_limit_per_segment`|The max number of spans in a single segment. Through this config item, SkyWalking keep your application memory cost estimated.|300 |
|
||||
`agent.ignore_suffix`|If the operation name of the first span is included in this set, this segment should be ignored.|Not set|
|
||||
`agent.is_open_debugging_class`|If true, skywalking agent will save all instrumented classes files in `/debugging` folder. SkyWalking team may ask for these files in order to resolve compatible problem.|Not set|
|
||||
|
|
|
|||
Loading…
Reference in New Issue