From 1870842beb139059cafc604e3569ea8f39860d8a Mon Sep 17 00:00:00 2001 From: Mrproliu Date: Sat, 18 Apr 2020 21:58:57 +0800 Subject: [PATCH 1/6] support v3 extend header --- .../agent/core/context/ContextCarrier.java | 4 +- .../agent/core/context/ContextSnapshot.java | 5 +- .../agent/core/context/ExtensionContext.java | 100 ++++++++++++++++++ .../core/context/IgnoredTracerContext.java | 2 +- .../core/context/SW8ExtensionCarrierItem.java | 35 ++++++ .../agent/core/context/TracingContext.java | 10 +- .../core/context/trace/AbstractSpan.java | 5 + .../context/trace/AbstractTracingSpan.java | 11 ++ .../agent/core/context/trace/NoopSpan.java | 4 + .../context/ContextCarrierV3HeaderTest.java | 15 +++ .../v4/HttpClientExecuteInterceptorTest.java | 8 +- .../motan/MotanConsumerInterceptorTest.java | 4 +- .../core/context/MockContextSnapshot.java | 2 +- test/plugin/agent-test-tools/pom.xml | 2 +- .../containers/jvm-container/docker/run.sh | 2 +- .../plugin/test/helper/ConfigurationImpl.java | 15 +++ .../plugin/test/helper/IConfiguration.java | 2 + .../test/helper/vo/CaseConfiguration.java | 1 + .../plugin/test/helper/vo/RequestHeader.java | 30 ++++++ .../resources/container-start-script.template | 1 + .../main/resources/docker-compose.template | 1 + .../configuration.yml | 5 + 22 files changed, 251 insertions(+), 13 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ExtensionContext.java create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8ExtensionCarrierItem.java create mode 100644 test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/RequestHeader.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java index 53812d7fa765..e288c1b3667c 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java @@ -42,9 +42,11 @@ public class ContextCarrier implements Serializable { private String addressUsedAtClient; private CorrelationContext correlationContext = new CorrelationContext(); + private ExtensionContext extensionContext = new ExtensionContext(); public CarrierItem items() { - SW8CorrelationCarrierItem sw8CorrelationCarrierItem = new SW8CorrelationCarrierItem(correlationContext, null); + SW8ExtensionCarrierItem sw8ExtensionCarrierItem = new SW8ExtensionCarrierItem(extensionContext, null); + SW8CorrelationCarrierItem sw8CorrelationCarrierItem = new SW8CorrelationCarrierItem(correlationContext, sw8ExtensionCarrierItem); SW8CarrierItem sw8CarrierItem = new SW8CarrierItem(this, sw8CorrelationCarrierItem); return new CarrierItemHead(sw8CarrierItem); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java index 82e0b8dc1984..dde36c5d3802 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextSnapshot.java @@ -33,17 +33,20 @@ public class ContextSnapshot { private String parentEndpoint; private CorrelationContext correlationContext; + private ExtensionContext extensionContext; ContextSnapshot(String traceSegmentId, int spanId, DistributedTraceId primaryTraceId, String parentEndpoint, - CorrelationContext correlationContext) { + CorrelationContext correlationContext, + ExtensionContext extensionContext) { this.traceSegmentId = traceSegmentId; this.spanId = spanId; this.traceId = primaryTraceId; this.parentEndpoint = parentEndpoint; this.correlationContext = correlationContext.clone(); + this.extensionContext = extensionContext.clone(); } public boolean isFromCurrent() { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ExtensionContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ExtensionContext.java new file mode 100644 index 000000000000..8106fa65069d --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ExtensionContext.java @@ -0,0 +1,100 @@ +/* + * 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; + +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; + +import java.util.Objects; + +/** + * Extension context, It provides the interaction capabilities between the agents + * deployed in upstream and downstream services. + */ +public class ExtensionContext { + + /** + * Tracing Mode. If true means represents all spans generated in this context should skip analysis. + */ + private boolean skipAnalysis; + + /** + * Serialize this {@link ExtensionContext} to a {@link String} + * + * @return the serialization string. + */ + String serialize() { + return skipAnalysis ? "1" : "0"; + } + + /** + * Deserialize data from {@link String} + */ + void deserialize(String value) { + this.skipAnalysis = Objects.equals(value, "1"); + } + + /** + * Prepare for the cross-process propagation. + */ + void inject(ContextCarrier carrier) { + carrier.getExtensionContext().skipAnalysis = this.skipAnalysis; + } + + /** + * Extra the {@link ContextCarrier#getExtensionContext()} into this context. + */ + void extract(ContextCarrier carrier) { + this.skipAnalysis = carrier.getExtensionContext().skipAnalysis; + } + + /** + * Handle the tracing span. + */ + void handle(AbstractSpan span) { + if (this.skipAnalysis) { + span.skipAnalysis(); + } + } + + /** + * Clone the context data, work for capture to cross-thread. + */ + public ExtensionContext clone() { + final ExtensionContext context = new ExtensionContext(); + context.skipAnalysis = this.skipAnalysis; + return context; + } + + void continued(ContextSnapshot snapshot) { + this.skipAnalysis = snapshot.getExtensionContext().skipAnalysis; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ExtensionContext that = (ExtensionContext) o; + return skipAnalysis == that.skipAnalysis; + } + + @Override + public int hashCode() { + return Objects.hash(skipAnalysis); + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java index 9e4ac5f31372..8bfcd230e3fb 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java @@ -53,7 +53,7 @@ public void extract(ContextCarrier carrier) { @Override public ContextSnapshot capture() { - return new ContextSnapshot(null, -1, null, null, correlationContext); + return new ContextSnapshot(null, -1, null, null, correlationContext, new ExtensionContext()); } @Override diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8ExtensionCarrierItem.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8ExtensionCarrierItem.java new file mode 100644 index 000000000000..b2cb60c11d6c --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/SW8ExtensionCarrierItem.java @@ -0,0 +1,35 @@ +/* + * 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; + +public class SW8ExtensionCarrierItem extends CarrierItem { + public static final String HEADER_NAME = "sw8-x"; + private final ExtensionContext extensionContext; + + public SW8ExtensionCarrierItem(ExtensionContext extensionContext, CarrierItem next) { + super(HEADER_NAME, extensionContext.serialize(), next); + this.extensionContext = extensionContext; + } + + @Override + public void setHeadValue(String headValue) { + this.extensionContext.deserialize(headValue); + } + +} 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 aa43b67d339c..a108ed19271f 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 @@ -111,6 +111,7 @@ public class TracingContext implements AbstractTracerContext { private final ProfileStatusReference profileStatus; private final CorrelationContext correlationContext; + private final ExtensionContext extensionContext; /** * Initialize all fields with default value. @@ -134,6 +135,7 @@ public class TracingContext implements AbstractTracerContext { this, segment.getTraceSegmentId(), firstOPName); this.correlationContext = new CorrelationContext(); + this.extensionContext = new ExtensionContext(); } /** @@ -177,6 +179,7 @@ public void inject(AbstractSpan exitSpan, ContextCarrier carrier) { carrier.setAddressUsedAtClient(peer); this.correlationContext.inject(carrier); + this.extensionContext.inject(carrier); } /** @@ -195,6 +198,8 @@ public void extract(ContextCarrier carrier) { } this.correlationContext.extract(carrier); + this.extensionContext.extract(carrier); + this.extensionContext.handle(span); } /** @@ -209,7 +214,8 @@ public ContextSnapshot capture() { activeSpan().getSpanId(), getPrimaryTraceId(), first().getOperationName(), - this.correlationContext + this.correlationContext, + this.extensionContext ); return snapshot; @@ -228,6 +234,7 @@ public void continued(ContextSnapshot snapshot) { this.activeSpan().ref(segmentRef); this.segment.relatedGlobalTraces(snapshot.getTraceId()); this.correlationContext.continued(snapshot); + this.extensionContext.continued(snapshot); } } @@ -529,6 +536,7 @@ private AbstractSpan push(AbstractSpan span) { firstSpan = span; } activeSpanStack.addLast(span); + this.extensionContext.handle(span); return span; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java index 0c43b93dd2cb..91a8c79432f6 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractSpan.java @@ -119,4 +119,9 @@ public interface AbstractSpan extends AsyncSpan { * @return true if the span's owner(tracing context main thread) is been profiled. */ boolean isProfiling(); + + /** + * Should skip analysis in the backend. + */ + void skipAnalysis(); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java index 53d3d55d4d80..a572ed227968 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java @@ -85,6 +85,11 @@ public abstract class AbstractTracingSpan implements AbstractSpan { */ protected List refs; + /** + * Tracing Mode. If true means represents all spans generated in this context should skip analysis. + */ + protected boolean skipAnalysis; + protected AbstractTracingSpan(int spanId, int parentSpanId, String operationName, TracingContext owner) { this.operationName = operationName; this.spanId = spanId; @@ -246,6 +251,7 @@ public SpanObject.Builder transform() { spanBuilder.setStartTime(startTime); spanBuilder.setEndTime(endTime); spanBuilder.setOperationName(operationName); + spanBuilder.setSkipAnalysis(skipAnalysis); if (isEntry()) { spanBuilder.setSpanType(SpanType.Entry); } else if (isExit()) { @@ -317,4 +323,9 @@ public AbstractSpan asyncFinish() { public boolean isProfiling() { return this.owner.profileStatus().isProfiling(); } + + @Override + public void skipAnalysis() { + this.skipAnalysis = true; + } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java index 41ba09a76e83..c67148abeaa3 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/NoopSpan.java @@ -119,6 +119,10 @@ public boolean isProfiling() { return false; } + @Override + public void skipAnalysis() { + } + @Override public AbstractSpan prepareForAsync() { return this; diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java index 56488d4fb1ae..f45e0936190a 100644 --- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ContextCarrierV3HeaderTest.java @@ -37,6 +37,8 @@ public void testDeserializeV3Header() { next.setHeadValue("1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA="); } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) { next.setHeadValue("dGVzdA==:dHJ1ZQ=="); + } else if (next.getHeadKey().equals(SW8ExtensionCarrierItem.HEADER_NAME)) { + next.setHeadValue("1"); } else { throw new IllegalArgumentException("Unknown Header: " + next.getHeadKey()); } @@ -61,6 +63,8 @@ public void testSerializeV3Header() { contextCarrier.getCorrelationContext().put("test", "true"); + contextCarrier.getExtensionContext().deserialize("1"); + CarrierItem next = contextCarrier.items(); while (next.hasNext()) { next = next.next(); @@ -73,6 +77,8 @@ public void testSerializeV3Header() { * "test:true" */ Assert.assertEquals("dGVzdA==:dHJ1ZQ==", next.getHeadValue()); + } else if (next.getHeadKey().equals(SW8ExtensionCarrierItem.HEADER_NAME)) { + Assert.assertEquals("1", next.getHeadValue()); } else { throw new IllegalArgumentException("Unknown Header: " + next.getHeadKey()); } @@ -85,6 +91,8 @@ public void testSerializeV3Header() { Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA=", next.getHeadValue()); } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) { Assert.assertEquals("dGVzdA==:dHJ1ZQ==", next.getHeadValue()); + } else if (next.getHeadKey().equals(SW8ExtensionCarrierItem.HEADER_NAME)) { + Assert.assertEquals("1", next.getHeadValue()); } else { throw new IllegalArgumentException("Unknown Header: " + next.getHeadKey()); } @@ -109,16 +117,20 @@ public void testV2HeaderAccurate() { contextCarrier.setParentEndpoint("/app"); contextCarrier.getCorrelationContext().put("test", "true"); + contextCarrier.getExtensionContext().deserialize("1"); CarrierItem next = contextCarrier.items(); String sw6HeaderValue = null; String correlationHeaderValue = null; + String extensionHeaderValue = null; while (next.hasNext()) { next = next.next(); if (next.getHeadKey().equals(SW8CarrierItem.HEADER_NAME)) { sw6HeaderValue = next.getHeadValue(); } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) { correlationHeaderValue = next.getHeadValue(); + } else if (next.getHeadKey().equals(SW8ExtensionCarrierItem.HEADER_NAME)) { + extensionHeaderValue = next.getHeadValue(); } else { throw new IllegalArgumentException("Unknown Header: " + next.getHeadKey()); } @@ -132,6 +144,8 @@ public void testV2HeaderAccurate() { next.setHeadValue(sw6HeaderValue); } else if (next.getHeadKey().equals(SW8CorrelationCarrierItem.HEADER_NAME)) { next.setHeadValue(correlationHeaderValue); + } else if (next.getHeadKey().equals(SW8ExtensionCarrierItem.HEADER_NAME)) { + next.setHeadValue(extensionHeaderValue); } else { throw new IllegalArgumentException("Unknown Header: " + next.getHeadKey()); } @@ -146,5 +160,6 @@ public void testV2HeaderAccurate() { Assert.assertEquals(contextCarrier.getParentServiceInstance(), contextCarrier2.getParentServiceInstance()); Assert.assertEquals(contextCarrier.getParentEndpoint(), contextCarrier2.getParentEndpoint()); Assert.assertEquals(contextCarrier.getCorrelationContext(), contextCarrier2.getCorrelationContext()); + Assert.assertEquals(contextCarrier.getExtensionContext(), contextCarrier2.getExtensionContext()); } } diff --git a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java index 9f491cfa4df5..7270989837eb 100644 --- a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java @@ -133,7 +133,7 @@ public void testHttpClient() throws Throwable { List spans = SegmentHelper.getSpans(traceSegment); assertHttpSpan(spans.get(0)); - verify(request, times(2)).setHeader(anyString(), anyString()); + verify(request, times(3)).setHeader(anyString(), anyString()); } @Test @@ -154,7 +154,7 @@ public void testStatusCodeNotEquals200() throws Throwable { assertHttpSpan(spans.get(0)); assertThat(SpanHelper.getErrorOccurred(spans.get(0)), is(true)); - verify(request, times(2)).setHeader(anyString(), anyString()); + verify(request, times(3)).setHeader(anyString(), anyString()); } @Test @@ -172,7 +172,7 @@ public void testHttpClientWithException() throws Throwable { assertHttpSpan(span); assertThat(SpanHelper.getErrorOccurred(span), is(true)); assertHttpSpanErrorLog(SpanHelper.getLogs(span)); - verify(request, times(2)).setHeader(anyString(), anyString()); + verify(request, times(3)).setHeader(anyString(), anyString()); } @@ -202,7 +202,7 @@ public String getUri() { List spans = SegmentHelper.getSpans(traceSegment); assertHttpSpan(spans.get(0)); - verify(request, times(2)).setHeader(anyString(), anyString()); + verify(request, times(3)).setHeader(anyString(), anyString()); } private void assertHttpSpanErrorLog(List logs) { diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanConsumerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanConsumerInterceptorTest.java index 11d2b83158c6..8b5a7f630d2b 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanConsumerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanConsumerInterceptorTest.java @@ -93,7 +93,7 @@ public void testInvokeInterceptor() throws Throwable { TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); List spans = SegmentHelper.getSpans(traceSegment); assertMotanConsumerSpan(spans.get(0)); - verify(request, times(2)).setAttachment(anyString(), anyString()); + verify(request, times(3)).setAttachment(anyString(), anyString()); } @Test @@ -111,7 +111,7 @@ public void testResponseWithException() throws Throwable { private void assertTraceSegmentWhenOccurException(AbstractTracingSpan tracingSpan) { assertMotanConsumerSpan(tracingSpan); - verify(request, times(2)).setAttachment(anyString(), anyString()); + verify(request, times(3)).setAttachment(anyString(), anyString()); List logDataEntities = SpanHelper.getLogs(tracingSpan); assertThat(logDataEntities.size(), is(1)); SpanAssert.assertException(logDataEntities.get(0), RuntimeException.class); diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java index 117485f678dd..ea59be9a3082 100644 --- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java +++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/core/context/MockContextSnapshot.java @@ -33,7 +33,7 @@ public enum MockContextSnapshot { distributedTraceIds.add(new NewDistributedTraceId()); contextSnapshot = new ContextSnapshot( - "1, 2, 3", 1, new NewDistributedTraceId(), "/for-test-entryOperationName", new CorrelationContext()); + "1, 2, 3", 1, new NewDistributedTraceId(), "/for-test-entryOperationName", new CorrelationContext(), new ExtensionContext()); } public ContextSnapshot mockContextSnapshot() { diff --git a/test/plugin/agent-test-tools/pom.xml b/test/plugin/agent-test-tools/pom.xml index 062e0f1d6c32..b2fc8ca5a372 100644 --- a/test/plugin/agent-test-tools/pom.xml +++ b/test/plugin/agent-test-tools/pom.xml @@ -35,7 +35,7 @@ pom - 1f009d692b99896c08cf9f26440f92287f0364e7 + da281e9c0340ca68f9bf25512701cb463aa20f12 ${project.basedir}/target/agent-test-tools https://github.com/apache/skywalking-agent-test-tool.git diff --git a/test/plugin/containers/jvm-container/docker/run.sh b/test/plugin/containers/jvm-container/docker/run.sh index 121eb732a054..236a1630fed3 100644 --- a/test/plugin/containers/jvm-container/docker/run.sh +++ b/test/plugin/containers/jvm-container/docker/run.sh @@ -79,7 +79,7 @@ exec /var/run/${SCENARIO_NAME}/${SCENARIO_START_SCRIPT} 1>/dev/null & healthCheck ${SCENARIO_HEALTH_CHECK_URL} echo "To visit entry service" -curl -s --max-time 3 ${SCENARIO_ENTRY_SERVICE} +curl ${SCENARIO_EXTEND_ENTRY_HEADER} -s --max-time 3 ${SCENARIO_ENTRY_SERVICE} sleep 5 echo "To receive actual data" diff --git a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java index 1ad38ad34104..e7d88b7642f6 100644 --- a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java +++ b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java @@ -31,6 +31,7 @@ import org.apache.skywalking.plugin.test.helper.vo.CaseConfiguration; import org.apache.skywalking.plugin.test.helper.vo.DependencyComponent; import org.apache.skywalking.plugin.test.helper.vo.DockerService; +import org.apache.skywalking.plugin.test.helper.vo.RequestHeader; import org.yaml.snakeyaml.Yaml; public class ConfigurationImpl implements IConfiguration { @@ -183,6 +184,7 @@ public Map toMap() { root.put("network_name", dockerNetworkName()); root.put("services", convertDockerServices(scenarioVersion(), caseConfiguration().getDependencies())); + root.put("extend_entry_header", extendEntryHeader()); root.put("docker_compose_file", outputDir() + File.separator + "docker-compose.yml"); root.put("build_id", dockerImageVersion()); @@ -206,6 +208,19 @@ public Map toMap() { return root; } + @Override + public String extendEntryHeader() { + final List headers = this.configuration.getExtendEntryHeader(); + if (headers == null || headers.isEmpty()) { + return ""; + } + StringBuilder headerString = new StringBuilder("\""); + for (RequestHeader header : headers) { + headerString.append(" --header ").append("\'").append(header.getKey()).append(": ").append(header.getValue()).append("\'").append(" "); + } + return headerString.append("\"").toString(); + } + protected List convertDockerServices(final String version, Map componentMap) { final ArrayList services = Lists.newArrayList(); diff --git a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/IConfiguration.java b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/IConfiguration.java index 70d278fbbf5e..2d6e45a914f8 100644 --- a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/IConfiguration.java +++ b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/IConfiguration.java @@ -57,4 +57,6 @@ public interface IConfiguration { String jacocoHome(); Map toMap(); + + String extendEntryHeader(); } diff --git a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/CaseConfiguration.java b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/CaseConfiguration.java index 274157694a37..b0dc410c63ed 100644 --- a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/CaseConfiguration.java +++ b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/CaseConfiguration.java @@ -37,4 +37,5 @@ public class CaseConfiguration { private List depends_on; private String runningMode; private String withPlugins; + private List extendEntryHeader; } diff --git a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/RequestHeader.java b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/RequestHeader.java new file mode 100644 index 000000000000..84f9383a2073 --- /dev/null +++ b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/vo/RequestHeader.java @@ -0,0 +1,30 @@ +/* + * 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.plugin.test.helper.vo; + +import lombok.Data; + +/** + * Extension header when starting request to entry service. + */ +@Data +public class RequestHeader { + private String key; + private String value; +} diff --git a/test/plugin/runner-helper/src/main/resources/container-start-script.template b/test/plugin/runner-helper/src/main/resources/container-start-script.template index 5b410526c156..f25f631b083c 100644 --- a/test/plugin/runner-helper/src/main/resources/container-start-script.template +++ b/test/plugin/runner-helper/src/main/resources/container-start-script.template @@ -26,6 +26,7 @@ docker run \ --env SCENARIO_ENTRY_SERVICE=${entry_service} \ --env SCENARIO_HEALTH_CHECK_URL=${health_check} \ + --env SCENARIO_EXTEND_ENTRY_HEADER=${extend_entry_header} \ <#if catalina_opts??> --env CATALINA_OPTS=${catalina_opts} \ diff --git a/test/plugin/runner-helper/src/main/resources/docker-compose.template b/test/plugin/runner-helper/src/main/resources/docker-compose.template index 35d53e8e78ad..5fc96d664f04 100644 --- a/test/plugin/runner-helper/src/main/resources/docker-compose.template +++ b/test/plugin/runner-helper/src/main/resources/docker-compose.template @@ -45,6 +45,7 @@ services: - SCENARIO_VERSION=${scenario_version} - SCENARIO_ENTRY_SERVICE=${entry_service} - SCENARIO_HEALTH_CHECK_URL=${health_check} + - SCENARIO_EXTEND_ENTRY_HEADER=${extend_entry_header} volumes: - ${agent_home}:/usr/local/skywalking/scenario/agent - ${scenario_home}:/usr/local/skywalking/scenario diff --git a/test/plugin/scenarios/apm-toolkit-trace-scenario/configuration.yml b/test/plugin/scenarios/apm-toolkit-trace-scenario/configuration.yml index 59bdec800ddd..d9e771d221e3 100644 --- a/test/plugin/scenarios/apm-toolkit-trace-scenario/configuration.yml +++ b/test/plugin/scenarios/apm-toolkit-trace-scenario/configuration.yml @@ -18,3 +18,8 @@ type: jvm entryService: http://localhost:8080/apm-toolkit-trace-scenario/case/tool-kit healthCheck: http://localhost:8080/apm-toolkit-trace-scenario/case/healthCheck startScript: ./bin/startup.sh +extendEntryHeader: + - key: sw8-x + value: 1 + - key: sw8 + value: 1-My40LjU=-MS4yLjM=-4-c2VydmljZQ==-aW5zdGFuY2U=-L2FwcA==-MTI3LjAuMC4xOjgwODA= From 17c9488b1f660579a632370caa01031224b9ebdf Mon Sep 17 00:00:00 2001 From: Mrproliu Date: Sat, 18 Apr 2020 22:24:41 +0800 Subject: [PATCH 2/6] fix UT --- .../httpasyncclient/v4/HttpAsyncClientInterceptorTest.java | 2 +- .../servicecomb/ProducerOperationHandlerInterceptorTest.java | 2 +- .../servicecomb/TransportClientHandlerInterceptorTest.java | 2 +- .../servicecomb/v1/ProducerOperationHandlerInterceptorTest.java | 2 +- .../servicecomb/v1/TransportClientHandlerInterceptorTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpasyncclient/v4/HttpAsyncClientInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpasyncclient/v4/HttpAsyncClientInterceptorTest.java index 15032d827c9a..d2efaa13a406 100644 --- a/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpasyncclient/v4/HttpAsyncClientInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/httpasyncclient/v4/HttpAsyncClientInterceptorTest.java @@ -191,7 +191,7 @@ public void testSuccess() throws Throwable { List spans = SegmentHelper.getSpans(findNeedSegemnt()); assertHttpSpan(spans.get(0)); - verify(requestWrapper, times(2)).setHeader(anyString(), anyString()); + verify(requestWrapper, times(3)).setHeader(anyString(), anyString()); } diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java index 82cb9e7dd4fb..05d191bab086 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java @@ -119,7 +119,7 @@ public void testConsumer() throws Throwable { List spans = SegmentHelper.getSpans(traceSegment); assertCombSpan(spans.get(0)); - verify(invocation, times(2)).getContext(); + verify(invocation, times(3)).getContext(); } private void assertCombSpan(AbstractTracingSpan span) { diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java index a7c0aa024f4f..3a352baaddd5 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java @@ -114,7 +114,7 @@ public void testConsumer() throws Throwable { TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); List spans = SegmentHelper.getSpans(traceSegment); assertCombSpan(spans.get(0)); - verify(invocation, times(2)).getContext(); + verify(invocation, times(3)).getContext(); } private void assertCombSpan(AbstractTracingSpan span) { diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java index d3147c24b96d..4e1b29530764 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java @@ -119,7 +119,7 @@ public void testConsumer() throws Throwable { List spans = SegmentHelper.getSpans(traceSegment); assertCombSpan(spans.get(0)); - verify(invocation, times(2)).getContext(); + verify(invocation, times(3)).getContext(); } private void assertCombSpan(AbstractTracingSpan span) { diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java index fac11617c982..595e49df904e 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java @@ -114,7 +114,7 @@ public void testConsumer() throws Throwable { TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0); List spans = SegmentHelper.getSpans(traceSegment); assertCombSpan(spans.get(0)); - verify(invocation, times(2)).getContext(); + verify(invocation, times(3)).getContext(); } private void assertCombSpan(AbstractTracingSpan span) { From 6bd3b079964ef75715e455037890b584e37879db Mon Sep 17 00:00:00 2001 From: Mrproliu Date: Sat, 18 Apr 2020 23:54:38 +0800 Subject: [PATCH 3/6] fix plugin test --- .../containers/jvm-container/docker/run.sh | 2 +- .../plugin/test/helper/ConfigurationImpl.java | 2 +- .../config/expectedData.yaml | 28 +++++++++++-------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/test/plugin/containers/jvm-container/docker/run.sh b/test/plugin/containers/jvm-container/docker/run.sh index 236a1630fed3..3cc793055df7 100644 --- a/test/plugin/containers/jvm-container/docker/run.sh +++ b/test/plugin/containers/jvm-container/docker/run.sh @@ -79,7 +79,7 @@ exec /var/run/${SCENARIO_NAME}/${SCENARIO_START_SCRIPT} 1>/dev/null & healthCheck ${SCENARIO_HEALTH_CHECK_URL} echo "To visit entry service" -curl ${SCENARIO_EXTEND_ENTRY_HEADER} -s --max-time 3 ${SCENARIO_ENTRY_SERVICE} +`echo curl ${SCENARIO_EXTEND_ENTRY_HEADER} -s --max-time 3 ${SCENARIO_ENTRY_SERVICE}` sleep 5 echo "To receive actual data" diff --git a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java index e7d88b7642f6..14ce76838519 100644 --- a/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java +++ b/test/plugin/runner-helper/src/main/java/org/apache/skywalking/plugin/test/helper/ConfigurationImpl.java @@ -216,7 +216,7 @@ public String extendEntryHeader() { } StringBuilder headerString = new StringBuilder("\""); for (RequestHeader header : headers) { - headerString.append(" --header ").append("\'").append(header.getKey()).append(": ").append(header.getValue()).append("\'").append(" "); + headerString.append(" -H ").append(header.getKey()).append(":").append(header.getValue()).append(" "); } return headerString.append("\"").toString(); } diff --git a/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml b/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml index e240df13bd53..7f743084ac37 100644 --- a/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml @@ -32,7 +32,7 @@ segmentItems: peer: '' tags: - {key: key, value: value} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testInfo(java.lang.String) operationId: 0 parentSpanId: 0 @@ -50,7 +50,7 @@ segmentItems: - {key: message, value: TestInfoMsg} tags: - {key: testTag, value: testInfoParam} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testDebug() operationId: 0 parentSpanId: 0 @@ -66,11 +66,11 @@ segmentItems: - logEvent: - {key: event, value: debug} - {key: message, value: TestDebugMsg} - skipAnalysis: 'false' + skipAnalysis: 'true' - {operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testError(), operationId: 0, parentSpanId: 0, spanId: 4, spanLayer: Unknown, startTime: nq 0, endTime: nq 0, componentId: 0, isError: true, spanType: Local, peer: '', - skipAnalysis: 'false'} + skipAnalysis: 'true'} - operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testErrorMsg() operationId: 0 parentSpanId: 0 @@ -86,7 +86,7 @@ segmentItems: - logEvent: - {key: event, value: error} - {key: message, value: TestErrorMsg} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testErrorThrowable() operationId: 0 parentSpanId: 0 @@ -104,7 +104,7 @@ segmentItems: - {key: error.kind, value: java.lang.RuntimeException} - {key: message, value: Test-Exception} - {key: stack, value: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testTagAnnotation(java.lang.String,java.lang.String) operationId: 0 parentSpanId: 0 @@ -119,7 +119,7 @@ segmentItems: tags: - {key: p1, value: testTagAnnotationParam1} - {key: p2, value: testTagAnnotationParam2} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: test.org.apache.skywalking.apm.testcase.toolkit.controller.TestService.testTagAnnotationReturnInfo(java.lang.String,java.lang.Integer) operationId: 0 parentSpanId: 0 @@ -133,7 +133,7 @@ segmentItems: peer: '' tags: - {key: username, value: zhangsan} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: /case/tool-kit operationId: 0 parentSpanId: -1 @@ -148,7 +148,11 @@ segmentItems: tags: - {key: url, value: 'http://localhost:8080/apm-toolkit-trace-scenario/case/tool-kit'} - {key: http.method, value: GET} - skipAnalysis: 'false' + skipAnalysis: 'true' + refs: + - {parentEndpoint: /app, networkAddress: '127.0.0.1:8080', refType: CrossProcess, + parentSpanId: 4, parentTraceSegmentId: 1.2.3, parentServiceInstance: instance, + parentService: service, traceId: 3.4.5} - segmentId: not null spans: - operationName: /case/asyncVisit/callable @@ -171,7 +175,7 @@ segmentItems: networkAddress: 'localhost:8080', refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, parentServiceInstance: not null, parentService: not null, traceId: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' - segmentId: not null spans: - operationName: /apm-toolkit-trace-scenario/case/asyncVisit/runnable @@ -188,7 +192,7 @@ segmentItems: tags: - {key: url, value: 'http://localhost:8080/apm-toolkit-trace-scenario/case/asyncVisit/runnable'} - {key: http.method, value: GET} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: Thread/org.apache.skywalking.apm.toolkit.trace.RunnableWrapper/run operationId: 0 parentSpanId: -1 @@ -221,7 +225,7 @@ segmentItems: tags: - {key: url, value: 'http://localhost:8080/apm-toolkit-trace-scenario/case/asyncVisit/callable'} - {key: http.method, value: GET} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: Thread/org.apache.skywalking.apm.toolkit.trace.CallableWrapper/call operationId: 0 parentSpanId: -1 From 87b128233afa3cf22ffa9fd26210ad4a70c5e193 Mon Sep 17 00:00:00 2001 From: Mrproliu Date: Sun, 19 Apr 2020 00:49:57 +0800 Subject: [PATCH 4/6] fix missing extension header handle when cross thread continue --- .../apm/agent/core/context/TracingContext.java | 1 + .../config/expectedData.yaml | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) 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 a108ed19271f..d80308477d6a 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 @@ -235,6 +235,7 @@ public void continued(ContextSnapshot snapshot) { this.segment.relatedGlobalTraces(snapshot.getTraceId()); this.correlationContext.continued(snapshot); this.extensionContext.continued(snapshot); + this.extensionContext.handle(this.activeSpan()); } } diff --git a/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml b/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml index 7f743084ac37..b61a3c5f228d 100644 --- a/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/apm-toolkit-trace-scenario/config/expectedData.yaml @@ -208,7 +208,7 @@ segmentItems: - {parentEndpoint: /case/tool-kit, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, parentServiceInstance: not null, parentService: not null, traceId: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' - segmentId: not null spans: - operationName: /apm-toolkit-trace-scenario/case/asyncVisit/callable @@ -241,7 +241,7 @@ segmentItems: - {parentEndpoint: /case/tool-kit, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, parentServiceInstance: not null, parentService: not null, traceId: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' - segmentId: not null spans: - operationName: /case/asyncVisit/runnable @@ -264,7 +264,7 @@ segmentItems: networkAddress: 'localhost:8080', refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, parentServiceInstance: not null, parentService: not null, traceId: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' - segmentId: not null spans: - operationName: /apm-toolkit-trace-scenario/case/asyncVisit/supplier @@ -281,7 +281,7 @@ segmentItems: tags: - {key: url, value: 'http://localhost:8080/apm-toolkit-trace-scenario/case/asyncVisit/supplier'} - {key: http.method, value: GET} - skipAnalysis: 'false' + skipAnalysis: 'true' - operationName: Thread/org.apache.skywalking.apm.toolkit.trace.SupplierWrapper/get operationId: 0 parentSpanId: -1 @@ -297,7 +297,7 @@ segmentItems: - {parentEndpoint: /case/tool-kit, networkAddress: '', refType: CrossThread, parentSpanId: 0, parentTraceSegmentId: not null, parentServiceInstance: not null, parentService: not null, traceId: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' - segmentId: not null spans: - operationName: /case/asyncVisit/supplier @@ -320,4 +320,4 @@ segmentItems: networkAddress: 'localhost:8080', refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, parentServiceInstance: not null, parentService: not null, traceId: not null} - skipAnalysis: 'false' + skipAnalysis: 'true' From 08063147fb88bf11a6afbac719e6bf0cb5b2f7d8 Mon Sep 17 00:00:00 2001 From: Mrproliu Date: Sun, 19 Apr 2020 01:03:53 +0800 Subject: [PATCH 5/6] add ExtentionContext UT --- .../core/context/ExtensionContextTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ExtensionContextTest.java diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ExtensionContextTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ExtensionContextTest.java new file mode 100644 index 000000000000..c69c3c4a1431 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/ExtensionContextTest.java @@ -0,0 +1,75 @@ +/* + * 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; + +import org.apache.skywalking.apm.agent.core.context.trace.NoopSpan; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +public class ExtensionContextTest { + + @Test + public void testSerialize() { + final ExtensionContext context = new ExtensionContext(); + Assert.assertEquals(context.serialize(), "0"); + + context.deserialize("1"); + Assert.assertEquals(context.serialize(), "1"); + } + + @Test + public void testDeSerialize() { + final ExtensionContext context = new ExtensionContext(); + context.deserialize(""); + Assert.assertEquals(context.serialize(), "0"); + + context.deserialize("0"); + Assert.assertEquals(context.serialize(), "0"); + + context.deserialize("test"); + Assert.assertEquals(context.serialize(), "0"); + } + + @Test + public void testClone() { + final ExtensionContext context = new ExtensionContext(); + Assert.assertEquals(context, context.clone()); + + context.deserialize("1"); + Assert.assertEquals(context, context.clone()); + } + + @Test + public void testHandle() { + final ExtensionContext context = new ExtensionContext(); + context.deserialize("1"); + NoopSpan span = Mockito.mock(NoopSpan.class); + context.handle(span); + verify(span, times(1)).skipAnalysis(); + + context.deserialize("0"); + span = Mockito.mock(NoopSpan.class); + context.handle(span); + verify(span, times(0)).skipAnalysis(); + } +} From 3bf3f197215100964e9b75d2af2e0fc163dea773 Mon Sep 17 00:00:00 2001 From: Mrproliu Date: Tue, 21 Apr 2020 09:55:09 +0800 Subject: [PATCH 6/6] create new field to save the extension context, can propagate it when capture the ignored context --- .../apm/agent/core/context/IgnoredTracerContext.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java index 8bfcd230e3fb..3e0568fc6ef2 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContext.java @@ -33,12 +33,14 @@ public class IgnoredTracerContext implements AbstractTracerContext { private static final NoopSpan NOOP_SPAN = new NoopSpan(); private final CorrelationContext correlationContext; + private final ExtensionContext extensionContext; private int stackDepth; public IgnoredTracerContext() { this.stackDepth = 0; this.correlationContext = new CorrelationContext(); + this.extensionContext = new ExtensionContext(); } @Override @@ -53,7 +55,7 @@ public void extract(ContextCarrier carrier) { @Override public ContextSnapshot capture() { - return new ContextSnapshot(null, -1, null, null, correlationContext, new ExtensionContext()); + return new ContextSnapshot(null, -1, null, null, correlationContext, extensionContext); } @Override