未验证 提交 019af3e3 编写于 作者: K kezhenxu94 提交者: GitHub

Drop support of protocol v1 (sw3) (#4244)

* Drop support of protocol v1 (sw3)

* Remove versioning logic further

* Remove more version5-only classes

* Commit missing files

* Update submodule and address review comment

* Fix failed tests
上级 738e4975
...@@ -16,14 +16,23 @@ ...@@ -16,14 +16,23 @@
* *
*/ */
package org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.rest.reader; package org.apache.skywalking.apm.network;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
/** /**
* @author peng-yongsheng * The version of the protocol between agent and backend.
*
* @author kezhenxu94
*/ */
public interface StreamJsonReader<T> { public enum ProtocolVersion {
T read(JsonReader reader) throws IOException; V2(2);
private final int number;
ProtocolVersion(final int number) {
this.number = number;
}
public int number() {
return number;
}
} }
Subproject commit 7ccf1cf6eb8001f61a76e2c8d200629a4807fc53 Subproject commit eebd016e32b0808416923acf04dcd31d9eb86c09
...@@ -26,9 +26,9 @@ import io.grpc.StatusRuntimeException; ...@@ -26,9 +26,9 @@ import io.grpc.StatusRuntimeException;
import io.grpc.internal.DnsNameResolverProvider; import io.grpc.internal.DnsNameResolverProvider;
import io.grpc.netty.NettyChannelBuilder; import io.grpc.netty.NettyChannelBuilder;
import io.grpc.stub.StreamObserver; import io.grpc.stub.StreamObserver;
import org.apache.skywalking.apm.network.common.Commands;
import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc;
import org.junit.Assert; import org.junit.Assert;
import org.apache.skywalking.apm.network.language.agent.Downstream;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentServiceGrpc;
import org.apache.skywalking.apm.network.language.agent.UpstreamSegment; import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
/** /**
...@@ -42,10 +42,10 @@ public class GRPCNoServerTest { ...@@ -42,10 +42,10 @@ public class GRPCNoServerTest {
.maxInboundMessageSize(1024 * 1024 * 50) .maxInboundMessageSize(1024 * 1024 * 50)
.usePlaintext(); .usePlaintext();
ManagedChannel channel = channelBuilder.build(); ManagedChannel channel = channelBuilder.build();
TraceSegmentServiceGrpc.TraceSegmentServiceStub serviceStub = TraceSegmentServiceGrpc.newStub(channel); TraceSegmentReportServiceGrpc.TraceSegmentReportServiceStub serviceStub = TraceSegmentReportServiceGrpc.newStub(channel);
final Status[] status = {null}; final Status[] status = {null};
StreamObserver<UpstreamSegment> streamObserver = serviceStub.collect(new StreamObserver<Downstream>() { StreamObserver<UpstreamSegment> streamObserver = serviceStub.collect(new StreamObserver<Commands>() {
@Override public void onNext(Downstream value) { @Override public void onNext(Commands value) {
} }
......
...@@ -53,7 +53,7 @@ public class Config { ...@@ -53,7 +53,7 @@ public class Config {
public static String AUTHENTICATION = ""; public static String AUTHENTICATION = "";
/** /**
* Negative or zero means off, by default. {@link #SAMPLE_N_PER_3_SECS} means sampling N {@link TraceSegment} in * Negative or zero means off, by default. {@code #SAMPLE_N_PER_3_SECS} means sampling N {@link TraceSegment} in
* 3 seconds tops. * 3 seconds tops.
*/ */
public static int SAMPLE_N_PER_3_SECS = -1; public static int SAMPLE_N_PER_3_SECS = -1;
...@@ -64,29 +64,19 @@ public class Config { ...@@ -64,29 +64,19 @@ public class Config {
public static String IGNORE_SUFFIX = ".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg"; public static String IGNORE_SUFFIX = ".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg";
/** /**
* The max number of spans in a single segment. Through this config item, skywalking keep your application * The max number of spans in a single segment. Through this config item, SkyWalking keep your application
* memory cost estimated. * memory cost estimated.
*/ */
public static int SPAN_LIMIT_PER_SEGMENT = 300; public static int SPAN_LIMIT_PER_SEGMENT = 300;
/** /**
* If true, skywalking agent will save all instrumented classes files in `/debugging` folder. Skywalking team * 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. * may ask for these files in order to resolve compatible problem.
*/ */
public static boolean IS_OPEN_DEBUGGING_CLASS = false; public static boolean IS_OPEN_DEBUGGING_CLASS = false;
/** /**
* Active V2 header in default * The identifier of the instance
*/
public static boolean ACTIVE_V2_HEADER = true;
/**
* Deactive V1 header in default
*/
public static boolean ACTIVE_V1_HEADER = false;
/**
* The identify of the instance
*/ */
public static String INSTANCE_UUID = ""; public static String INSTANCE_UUID = "";
...@@ -95,7 +85,7 @@ public class Config { ...@@ -95,7 +85,7 @@ public class Config {
* e.g. * e.g.
* agent.instance_properties[org]=apache * agent.instance_properties[org]=apache
*/ */
public static Map<String, String> INSTANCE_PROPERTIES = new HashMap<String, String>(); public static Map<String, String> INSTANCE_PROPERTIES = new HashMap<>();
/** /**
* How depth the agent goes, when log cause exceptions. * How depth the agent goes, when log cause exceptions.
...@@ -260,7 +250,7 @@ public class Config { ...@@ -260,7 +250,7 @@ public class Config {
* Some information after custom enhancements, this configuration is used by the custom enhancement plugin. * Some information after custom enhancements, this configuration is used by the custom enhancement plugin.
* And using Map CONTEXT for avoiding classloader isolation issue. * And using Map CONTEXT for avoiding classloader isolation issue.
*/ */
public static Map<String, Object> CONTEXT = new HashMap<String, Object>(); public static Map<String, Object> CONTEXT = new HashMap<>();
} }
public static class Tomcat { public static class Tomcat {
...@@ -341,7 +331,7 @@ public class Config { ...@@ -341,7 +331,7 @@ public class Config {
* Operation name group rules * Operation name group rules
*/ */
public static class OPGroup { public static class OPGroup {
/** /*
* Since 6.6.0, exit span is not requesting endpoint register, * Since 6.6.0, exit span is not requesting endpoint register,
* this group rule is not required. * this group rule is not required.
* *
......
...@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.agent.core.context; ...@@ -21,7 +21,6 @@ package org.apache.skywalking.apm.agent.core.context;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import org.apache.skywalking.apm.agent.core.base64.Base64; import org.apache.skywalking.apm.agent.core.base64.Base64;
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.DistributedTraceId;
import org.apache.skywalking.apm.agent.core.context.ids.ID; import org.apache.skywalking.apm.agent.core.context.ids.ID;
import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId; import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
...@@ -77,21 +76,8 @@ public class ContextCarrier implements Serializable { ...@@ -77,21 +76,8 @@ public class ContextCarrier implements Serializable {
private DistributedTraceId primaryDistributedTraceId; private DistributedTraceId primaryDistributedTraceId;
public CarrierItem items() { public CarrierItem items() {
CarrierItemHead head; SW6CarrierItem sw6CarrierItem = new SW6CarrierItem(this, null);
if (Config.Agent.ACTIVE_V2_HEADER && Config.Agent.ACTIVE_V1_HEADER) { return new CarrierItemHead(sw6CarrierItem);
SW3CarrierItem carrierItem = new SW3CarrierItem(this, null);
SW6CarrierItem sw6CarrierItem = new SW6CarrierItem(this, carrierItem);
head = new CarrierItemHead(sw6CarrierItem);
} else if (Config.Agent.ACTIVE_V2_HEADER) {
SW6CarrierItem sw6CarrierItem = new SW6CarrierItem(this, null);
head = new CarrierItemHead(sw6CarrierItem);
} else if (Config.Agent.ACTIVE_V1_HEADER) {
SW3CarrierItem carrierItem = new SW3CarrierItem(this, null);
head = new CarrierItemHead(carrierItem);
} else {
throw new IllegalArgumentException("At least active v1 or v2 header.");
}
return head;
} }
/** /**
...@@ -101,36 +87,16 @@ public class ContextCarrier implements Serializable { ...@@ -101,36 +87,16 @@ public class ContextCarrier implements Serializable {
*/ */
String serialize(HeaderVersion version) { String serialize(HeaderVersion version) {
if (this.isValid(version)) { if (this.isValid(version)) {
if (HeaderVersion.v1.equals(version)) { return StringUtil.join('-',
if (Config.Agent.ACTIVE_V1_HEADER) { "1",
return StringUtil.join('|', Base64.encode(this.getPrimaryDistributedTraceId().encode()),
this.getTraceSegmentId().encode(), Base64.encode(this.getTraceSegmentId().encode()),
this.getSpanId() + "", this.getSpanId() + "",
this.getParentServiceInstanceId() + "", this.getParentServiceInstanceId() + "",
this.getEntryServiceInstanceId() + "", this.getEntryServiceInstanceId() + "",
this.getPeerHost(), Base64.encode(this.getPeerHost()),
this.getEntryEndpointName(), Base64.encode(this.getEntryEndpointName()),
this.getParentEndpointName(), Base64.encode(this.getParentEndpointName()));
this.getPrimaryDistributedTraceId().encode());
} else {
return "";
}
} else {
if (Config.Agent.ACTIVE_V2_HEADER) {
return StringUtil.join('-',
"1",
Base64.encode(this.getPrimaryDistributedTraceId().encode()),
Base64.encode(this.getTraceSegmentId().encode()),
this.getSpanId() + "",
this.getParentServiceInstanceId() + "",
this.getEntryServiceInstanceId() + "",
Base64.encode(this.getPeerHost()),
Base64.encode(this.getEntryEndpointName()),
Base64.encode(this.getParentEndpointName()));
} else {
return "";
}
}
} else { } else {
return ""; return "";
} }
......
/*
* 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;
/**
* @author wusheng
*/
public class SW3CarrierItem extends CarrierItem {
public static final String HEADER_NAME = "sw3";
private ContextCarrier carrier;
public SW3CarrierItem(ContextCarrier carrier, CarrierItem next) {
super(HEADER_NAME, carrier.serialize(ContextCarrier.HeaderVersion.v1), next);
this.carrier = carrier;
}
@Override
public void setHeadValue(String headValue) {
carrier.deserialize(headValue, ContextCarrier.HeaderVersion.v1);
}
}
...@@ -20,7 +20,6 @@ package org.apache.skywalking.apm.agent.core.context; ...@@ -20,7 +20,6 @@ package org.apache.skywalking.apm.agent.core.context;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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.DistributedTraceId;
import org.apache.skywalking.apm.agent.core.context.ids.ID; import org.apache.skywalking.apm.agent.core.context.ids.ID;
import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId; import org.apache.skywalking.apm.agent.core.context.ids.PropagatedTraceId;
...@@ -28,30 +27,6 @@ import org.junit.Assert; ...@@ -28,30 +27,6 @@ import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
public class ContextCarrierV2HeaderTest { public class ContextCarrierV2HeaderTest {
@Test
public void testCompatibleHeaderKeys() {
Config.Agent.ACTIVE_V1_HEADER = true;
ContextCarrier contextCarrier = new ContextCarrier();
CarrierItem next = contextCarrier.items();
boolean hasSW3 = false;
boolean hasSW6 = false;
try {
while (next.hasNext()) {
next = next.next();
if (next.getHeadKey().equals("sw3")) {
hasSW3 = true;
} else if (next.getHeadKey().equals("sw6")) {
hasSW6 = true;
} else {
Assert.fail("unexpected key");
}
}
} finally {
Config.Agent.ACTIVE_V1_HEADER = false;
}
Assert.assertTrue(hasSW3);
Assert.assertTrue(hasSW6);
}
@Test @Test
public void testDeserializeV2Header() { public void testDeserializeV2Header() {
...@@ -59,31 +34,7 @@ public class ContextCarrierV2HeaderTest { ...@@ -59,31 +34,7 @@ public class ContextCarrierV2HeaderTest {
CarrierItem next = contextCarrier.items(); CarrierItem next = contextCarrier.items();
while (next.hasNext()) { while (next.hasNext()) {
next = next.next(); next = next.next();
if (next.getHeadKey().equals("sw3")) { next.setHeadValue("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw--");
} else if (next.getHeadKey().equals("sw6")) {
next.setHeadValue("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw--");
} else {
Assert.fail("unexpected key");
}
}
Assert.assertTrue(contextCarrier.isValid());
Config.Agent.ACTIVE_V1_HEADER = true;
try {
contextCarrier = new ContextCarrier();
next = contextCarrier.items();
while (next.hasNext()) {
next = next.next();
if (next.getHeadKey().equals("sw3")) {
next.setHeadValue("1.2343.234234234|1|1|1|#127.0.0.1:8080|#/portal/|#/testEntrySpan|1.2343.234234234");
} else if (next.getHeadKey().equals("sw6")) {
} else {
Assert.fail("unexpected key");
}
}
} finally {
Config.Agent.ACTIVE_V1_HEADER = false;
} }
Assert.assertTrue(contextCarrier.isValid()); Assert.assertTrue(contextCarrier.isValid());
...@@ -91,7 +42,7 @@ public class ContextCarrierV2HeaderTest { ...@@ -91,7 +42,7 @@ public class ContextCarrierV2HeaderTest {
@Test @Test
public void testSerializeV2Header() { public void testSerializeV2Header() {
List<DistributedTraceId> distributedTraceIds = new ArrayList<DistributedTraceId>(); List<DistributedTraceId> distributedTraceIds = new ArrayList<>();
distributedTraceIds.add(new PropagatedTraceId("3.4.5")); distributedTraceIds.add(new PropagatedTraceId("3.4.5"));
ContextCarrier contextCarrier = new ContextCarrier(); ContextCarrier contextCarrier = new ContextCarrier();
...@@ -107,37 +58,18 @@ public class ContextCarrierV2HeaderTest { ...@@ -107,37 +58,18 @@ public class ContextCarrierV2HeaderTest {
CarrierItem next = contextCarrier.items(); CarrierItem next = contextCarrier.items();
while (next.hasNext()) { while (next.hasNext()) {
next = next.next(); next = next.next();
if (next.getHeadKey().equals("sw3")) { /*
Assert.assertEquals("", next.getHeadValue()); * sampleFlag-traceId-segmentId-spanId-parentAppInstId-entryAppInstId-peerHost-entryEndpoint-parentEndpoint
} else if (next.getHeadKey().equals("sw6")) { *
/** * "1-3.4.5-1.2.3-4-1-1-#127.0.0.1:8080-#/portal-123"
* sampleFlag-traceId-segmentId-spanId-parentAppInstId-entryAppInstId-peerHost-entryEndpoint-parentEndpoint */
* Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWw=-MTIz", next.getHeadValue());
* "1-3.4.5-1.2.3-4-1-1-#127.0.0.1:8080-#/portal-123"
*/
Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWw=-MTIz", next.getHeadValue());
} else {
Assert.fail("unexpected key");
}
} }
Config.Agent.ACTIVE_V1_HEADER = true; next = contextCarrier.items();
try { while (next.hasNext()) {
next = contextCarrier.items(); next = next.next();
while (next.hasNext()) { Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWw=-MTIz", next.getHeadValue());
next = next.next();
if (next.getHeadKey().equals("sw3")) {
Assert.assertEquals("1.2.3|4|1|1|#127.0.0.1:8080|#/portal|123|3.4.5", next.getHeadValue());
} else if (next.getHeadKey().equals("sw6")) {
//TODO, no BASE64
Assert.assertEquals("1-My40LjU=-MS4yLjM=-4-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWw=-MTIz", next.getHeadValue());
} else {
Assert.fail("unexpected key");
}
}
} finally {
Config.Agent.ACTIVE_V1_HEADER = false;
} }
Assert.assertTrue(contextCarrier.isValid()); Assert.assertTrue(contextCarrier.isValid());
...@@ -145,7 +77,7 @@ public class ContextCarrierV2HeaderTest { ...@@ -145,7 +77,7 @@ public class ContextCarrierV2HeaderTest {
@Test @Test
public void testV2HeaderAccurate() { public void testV2HeaderAccurate() {
List<DistributedTraceId> distributedTraceIds = new ArrayList<DistributedTraceId>(); List<DistributedTraceId> distributedTraceIds = new ArrayList<>();
distributedTraceIds.add(new PropagatedTraceId("3.4.5")); distributedTraceIds.add(new PropagatedTraceId("3.4.5"));
ContextCarrier contextCarrier = new ContextCarrier(); ContextCarrier contextCarrier = new ContextCarrier();
...@@ -162,25 +94,14 @@ public class ContextCarrierV2HeaderTest { ...@@ -162,25 +94,14 @@ public class ContextCarrierV2HeaderTest {
String headerValue = null; String headerValue = null;
while (next.hasNext()) { while (next.hasNext()) {
next = next.next(); next = next.next();
if (next.getHeadKey().equals("sw3")) { headerValue = next.getHeadValue();
Assert.assertEquals("", next.getHeadValue());
} else if (next.getHeadKey().equals("sw6")) {
headerValue = next.getHeadValue();
} else {
Assert.fail("unexpected key");
}
} }
ContextCarrier contextCarrier2 = new ContextCarrier(); ContextCarrier contextCarrier2 = new ContextCarrier();
next = contextCarrier2.items(); next = contextCarrier2.items();
while (next.hasNext()) { while (next.hasNext()) {
next = next.next(); next = next.next();
if (next.getHeadKey().equals("sw3")) { next.setHeadValue(headerValue);
} else if (next.getHeadKey().equals("sw6")) {
next.setHeadValue(headerValue);
} else {
Assert.fail("unexpected key");
}
} }
Assert.assertTrue(contextCarrier2.isValid()); Assert.assertTrue(contextCarrier2.isValid());
......
...@@ -30,6 +30,11 @@ import org.apache.skywalking.apm.agent.core.context.util.SegmentHelper; ...@@ -30,6 +30,11 @@ import org.apache.skywalking.apm.agent.core.context.util.SegmentHelper;
import org.apache.skywalking.apm.agent.core.context.util.TraceSegmentRefHelper; import org.apache.skywalking.apm.agent.core.context.util.TraceSegmentRefHelper;
import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule; import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule;
import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner;
import org.apache.skywalking.apm.network.common.KeyStringValuePair;
import org.apache.skywalking.apm.network.language.agent.v2.Log;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
import org.hamcrest.MatcherAssert; import org.hamcrest.MatcherAssert;
import org.junit.*; import org.junit.*;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -43,12 +48,7 @@ import org.apache.skywalking.apm.agent.core.context.util.SpanHelper; ...@@ -43,12 +48,7 @@ import org.apache.skywalking.apm.agent.core.context.util.SpanHelper;
import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil;
import org.apache.skywalking.apm.agent.core.test.tools.SegmentStorage; import org.apache.skywalking.apm.agent.core.test.tools.SegmentStorage;
import org.apache.skywalking.apm.agent.core.test.tools.SegmentStoragePoint; import org.apache.skywalking.apm.agent.core.test.tools.SegmentStoragePoint;
import org.apache.skywalking.apm.network.language.agent.KeyWithStringValue;
import org.apache.skywalking.apm.network.language.agent.LogMessage;
import org.apache.skywalking.apm.network.language.agent.SpanObject;
import org.apache.skywalking.apm.network.language.agent.SpanType; import org.apache.skywalking.apm.network.language.agent.SpanType;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentObject;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentReference;
import org.apache.skywalking.apm.network.language.agent.UpstreamSegment; import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
...@@ -256,19 +256,18 @@ public class ContextManagerTest { ...@@ -256,19 +256,18 @@ public class ContextManagerTest {
UpstreamSegment upstreamSegment = actualSegment.transform(); UpstreamSegment upstreamSegment = actualSegment.transform();
assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1)); assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1));
TraceSegmentObject traceSegmentObject = TraceSegmentObject.parseFrom(upstreamSegment.getSegment()); SegmentObject traceSegmentObject = SegmentObject.parseFrom(upstreamSegment.getSegment());
TraceSegmentReference reference = traceSegmentObject.getSpans(1).getRefs(0); SegmentReference reference = traceSegmentObject.getSpans(1).getRefs(0);
assertThat(reference.getEntryServiceName(), is("/portal/"));
assertThat(reference.getNetworkAddress(), is("127.0.0.1:8080")); assertThat(reference.getNetworkAddress(), is("127.0.0.1:8080"));
assertThat(reference.getParentSpanId(), is(3)); assertThat(reference.getParentSpanId(), is(3));
assertThat(traceSegmentObject.getApplicationId(), is(1)); assertThat(traceSegmentObject.getServiceId(), is(1));
assertThat(traceSegmentObject.getSpans(1).getRefsCount(), is(1)); assertThat(traceSegmentObject.getSpans(1).getRefsCount(), is(1));
assertThat(traceSegmentObject.getSpansCount(), is(2)); assertThat(traceSegmentObject.getSpansCount(), is(2));
SpanObject actualSpan = traceSegmentObject.getSpans(1); SpanObjectV2 actualSpan = traceSegmentObject.getSpans(1);
assertThat(actualSpan.getComponentId(), is(3)); assertThat(actualSpan.getComponentId(), is(3));
assertThat(actualSpan.getComponent(), is("")); assertThat(actualSpan.getComponent(), is(""));
...@@ -277,7 +276,7 @@ public class ContextManagerTest { ...@@ -277,7 +276,7 @@ public class ContextManagerTest {
assertThat(actualSpan.getSpanId(), is(0)); assertThat(actualSpan.getSpanId(), is(0));
assertThat(actualSpan.getSpanType(), is(SpanType.Entry)); assertThat(actualSpan.getSpanType(), is(SpanType.Entry));
SpanObject exitSpanObject = traceSegmentObject.getSpans(0); SpanObjectV2 exitSpanObject = traceSegmentObject.getSpans(0);
assertThat(exitSpanObject.getComponentId(), is(2)); assertThat(exitSpanObject.getComponentId(), is(2));
assertThat(exitSpanObject.getComponent(), is("")); assertThat(exitSpanObject.getComponent(), is(""));
assertThat(exitSpanObject.getSpanType(), is(SpanType.Exit)); assertThat(exitSpanObject.getSpanType(), is(SpanType.Exit));
...@@ -287,9 +286,9 @@ public class ContextManagerTest { ...@@ -287,9 +286,9 @@ public class ContextManagerTest {
assertThat(exitSpanObject.getSpanId(), is(1)); assertThat(exitSpanObject.getSpanId(), is(1));
assertThat(exitSpanObject.getLogsCount(), is(1)); assertThat(exitSpanObject.getLogsCount(), is(1));
LogMessage logMessage = exitSpanObject.getLogs(0); Log logMessage = exitSpanObject.getLogs(0);
assertThat(logMessage.getDataCount(), is(4)); assertThat(logMessage.getDataCount(), is(4));
List<KeyWithStringValue> values = logMessage.getDataList(); List<KeyStringValuePair> values = logMessage.getDataList();
assertThat(values.get(0).getValue(), is("error")); assertThat(values.get(0).getValue(), is("error"));
assertThat(values.get(1).getValue(), is(RuntimeException.class.getName())); assertThat(values.get(1).getValue(), is(RuntimeException.class.getName()));
......
...@@ -23,7 +23,6 @@ import org.apache.activemq.command.Message; ...@@ -23,7 +23,6 @@ import org.apache.activemq.command.Message;
import org.apache.activemq.command.MessageDispatch; import org.apache.activemq.command.MessageDispatch;
import org.apache.activemq.command.Response; import org.apache.activemq.command.Response;
import org.apache.activemq.state.CommandVisitor; import org.apache.activemq.state.CommandVisitor;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule; import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
...@@ -126,7 +125,6 @@ public class ActiveMQConsumerInterceptorTest { ...@@ -126,7 +125,6 @@ public class ActiveMQConsumerInterceptorTest {
@Before @Before
public void setUp() throws IOException { public void setUp() throws IOException {
Config.Agent.ACTIVE_V1_HEADER = true;
activeMQConsumerInterceptor = new ActiveMQConsumerInterceptor(); activeMQConsumerInterceptor = new ActiveMQConsumerInterceptor();
messageDispatch = new MessageDispatch(); messageDispatch = new MessageDispatch();
...@@ -134,17 +132,11 @@ public class ActiveMQConsumerInterceptorTest { ...@@ -134,17 +132,11 @@ public class ActiveMQConsumerInterceptorTest {
des.setPhysicalName("test"); des.setPhysicalName("test");
messageDispatch.setDestination(des); messageDispatch.setDestination(des);
Message msg = new Msg(); Message msg = new Msg();
msg.setProperty("sw3", "");
messageDispatch.setMessage(msg); messageDispatch.setMessage(msg);
arguments = new Object[] {messageDispatch}; arguments = new Object[] {messageDispatch};
argumentType = null; argumentType = null;
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testConsumerWithoutMessage() throws Throwable { public void testConsumerWithoutMessage() throws Throwable {
activeMQConsumerInterceptor.beforeMethod(enhancedInstance, null, arguments, null, null); activeMQConsumerInterceptor.beforeMethod(enhancedInstance, null, arguments, null, null);
......
...@@ -27,7 +27,7 @@ import java.util.List; ...@@ -27,7 +27,7 @@ import java.util.List;
import org.apache.skywalking.apm.agent.core.boot.ServiceManager; 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.Config;
import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService; import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity; import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
...@@ -45,7 +45,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint; ...@@ -45,7 +45,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.apache.skywalking.apm.plugin.asf.dubbo.DubboInterceptor; import org.apache.skywalking.apm.plugin.asf.dubbo.DubboInterceptor;
import org.hamcrest.CoreMatchers; import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -95,7 +94,6 @@ public class DubboInterceptorTest { ...@@ -95,7 +94,6 @@ public class DubboInterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
dubboInterceptor = new DubboInterceptor(); dubboInterceptor = new DubboInterceptor();
PowerMockito.mockStatic(RpcContext.class); PowerMockito.mockStatic(RpcContext.class);
...@@ -111,11 +109,6 @@ public class DubboInterceptorTest { ...@@ -111,11 +109,6 @@ public class DubboInterceptorTest {
Config.Agent.SERVICE_NAME = "DubboTestCases-APP"; Config.Agent.SERVICE_NAME = "DubboTestCases-APP";
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testServiceFromPlugin() { public void testServiceFromPlugin() {
PluginBootService service = ServiceManager.INSTANCE.findService(PluginBootService.class); PluginBootService service = ServiceManager.INSTANCE.findService(PluginBootService.class);
...@@ -167,7 +160,7 @@ public class DubboInterceptorTest { ...@@ -167,7 +160,7 @@ public class DubboInterceptorTest {
@Test @Test
public void testProviderWithAttachment() throws Throwable { public void testProviderWithAttachment() throws Throwable {
when(rpcContext.isConsumerSide()).thenReturn(false); when(rpcContext.isConsumerSide()).thenReturn(false);
when(rpcContext.getAttachment(SW3CarrierItem.HEADER_NAME)).thenReturn("1.323.4433|3|1|1|#192.168.1.8 :18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); when(rpcContext.getAttachment(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
dubboInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult); dubboInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult);
dubboInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, result); dubboInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, result);
......
...@@ -27,7 +27,7 @@ import java.util.List; ...@@ -27,7 +27,7 @@ import java.util.List;
import org.apache.skywalking.apm.agent.core.boot.ServiceManager; 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.Config;
import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService; import org.apache.skywalking.apm.agent.core.context.ContextManagerExtendService;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity; import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
...@@ -44,7 +44,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; ...@@ -44,7 +44,6 @@ 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.SegmentStoragePoint;
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.hamcrest.CoreMatchers; import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -94,7 +93,6 @@ public class DubboInterceptorTest { ...@@ -94,7 +93,6 @@ public class DubboInterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
dubboInterceptor = new DubboInterceptor(); dubboInterceptor = new DubboInterceptor();
PowerMockito.mockStatic(RpcContext.class); PowerMockito.mockStatic(RpcContext.class);
...@@ -110,11 +108,6 @@ public class DubboInterceptorTest { ...@@ -110,11 +108,6 @@ public class DubboInterceptorTest {
Config.Agent.SERVICE_NAME = "DubboTestCases-APP"; Config.Agent.SERVICE_NAME = "DubboTestCases-APP";
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testServiceFromPlugin() { public void testServiceFromPlugin() {
PluginBootService service = ServiceManager.INSTANCE.findService(PluginBootService.class); PluginBootService service = ServiceManager.INSTANCE.findService(PluginBootService.class);
...@@ -166,7 +159,7 @@ public class DubboInterceptorTest { ...@@ -166,7 +159,7 @@ public class DubboInterceptorTest {
@Test @Test
public void testProviderWithAttachment() throws Throwable { public void testProviderWithAttachment() throws Throwable {
when(rpcContext.isConsumerSide()).thenReturn(false); when(rpcContext.isConsumerSide()).thenReturn(false);
when(rpcContext.getAttachment(SW3CarrierItem.HEADER_NAME)).thenReturn("1.323.4433|3|1|1|#192.168.1.8 :18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); when(rpcContext.getAttachment(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
dubboInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult); dubboInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult);
dubboInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, result); dubboInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, result);
......
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
package org.apache.skywalking.apm.plugin.jetty.v9.server; package org.apache.skywalking.apm.plugin.jetty.v9.server;
import java.util.List; import java.util.List;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity; import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
...@@ -45,7 +44,6 @@ import org.eclipse.jetty.server.HttpInput; ...@@ -45,7 +44,6 @@ import org.eclipse.jetty.server.HttpInput;
import org.eclipse.jetty.server.HttpTransport; import org.eclipse.jetty.server.HttpTransport;
import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Response;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -86,7 +84,6 @@ public class HandleInterceptorTest { ...@@ -86,7 +84,6 @@ public class HandleInterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
jettyInvokeInterceptor = new HandleInterceptor(); jettyInvokeInterceptor = new HandleInterceptor();
when(request.getRequestURI()).thenReturn("/test/testRequestURL"); when(request.getRequestURI()).thenReturn("/test/testRequestURL");
when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL")); when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL"));
...@@ -98,11 +95,6 @@ public class HandleInterceptorTest { ...@@ -98,11 +95,6 @@ public class HandleInterceptorTest {
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testWithoutSerializedContextData() throws Throwable { public void testWithoutSerializedContextData() throws Throwable {
jettyInvokeInterceptor.beforeMethod(service, null, arguments, argumentType, methodInterceptResult); jettyInvokeInterceptor.beforeMethod(service, null, arguments, argumentType, methodInterceptResult);
...@@ -116,7 +108,7 @@ public class HandleInterceptorTest { ...@@ -116,7 +108,7 @@ public class HandleInterceptorTest {
@Test @Test
public void testWithSerializedContextData() throws Throwable { public void testWithSerializedContextData() throws Throwable {
when(request.getHeader(SW3CarrierItem.HEADER_NAME)).thenReturn("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); when(request.getHeader(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
jettyInvokeInterceptor.beforeMethod(service, null, arguments, argumentType, methodInterceptResult); jettyInvokeInterceptor.beforeMethod(service, null, arguments, argumentType, methodInterceptResult);
jettyInvokeInterceptor.afterMethod(service, null, arguments, argumentType, null); jettyInvokeInterceptor.afterMethod(service, null, arguments, argumentType, null);
......
...@@ -20,7 +20,7 @@ package org.apache.skywalking.apm.plugin.kafka; ...@@ -20,7 +20,7 @@ package org.apache.skywalking.apm.plugin.kafka;
import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.TopicPartition; import org.apache.kafka.common.TopicPartition;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
...@@ -30,7 +30,6 @@ import org.apache.skywalking.apm.agent.test.helper.SegmentHelper; ...@@ -30,7 +30,6 @@ import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
import org.apache.skywalking.apm.agent.test.helper.SegmentRefHelper; import org.apache.skywalking.apm.agent.test.helper.SegmentRefHelper;
import org.apache.skywalking.apm.agent.test.tools.*; import org.apache.skywalking.apm.agent.test.tools.*;
import org.hamcrest.MatcherAssert; import org.hamcrest.MatcherAssert;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -75,7 +74,6 @@ public class KafkaConsumerInterceptorTest { ...@@ -75,7 +74,6 @@ public class KafkaConsumerInterceptorTest {
@Before @Before
public void setUp() { public void setUp() {
Config.Agent.ACTIVE_V1_HEADER = true;
consumerInterceptor = new KafkaConsumerInterceptor(); consumerInterceptor = new KafkaConsumerInterceptor();
consumerEnhanceRequiredInfo = new ConsumerEnhanceRequiredInfo(); consumerEnhanceRequiredInfo = new ConsumerEnhanceRequiredInfo();
...@@ -93,16 +91,11 @@ public class KafkaConsumerInterceptorTest { ...@@ -93,16 +91,11 @@ public class KafkaConsumerInterceptorTest {
TopicPartition topicPartition = new TopicPartition("test", 1); TopicPartition topicPartition = new TopicPartition("test", 1);
List<ConsumerRecord> records = new ArrayList<ConsumerRecord>(); List<ConsumerRecord> records = new ArrayList<ConsumerRecord>();
ConsumerRecord consumerRecord = new ConsumerRecord("test", 1, 0, "1", "1"); ConsumerRecord consumerRecord = new ConsumerRecord("test", 1, 0, "1", "1");
consumerRecord.headers().add("sw3", "1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#testEntrySpan|#AQA*#AQA*Et0We0tQNQA*".getBytes()); consumerRecord.headers().add(SW6CarrierItem.HEADER_NAME, "1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-I3Rlc3RFbnRyeVNwYW4=".getBytes());
records.add(consumerRecord); records.add(consumerRecord);
messages.put(topicPartition, records); messages.put(topicPartition, records);
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testConsumerWithoutMessage() throws Throwable { public void testConsumerWithoutMessage() throws Throwable {
consumerInterceptor.beforeMethod(consumerInstance, null, new Object[0], new Class[0], null); consumerInterceptor.beforeMethod(consumerInstance, null, new Object[0], new Class[0], null);
......
...@@ -24,8 +24,7 @@ import com.weibo.api.motan.rpc.Response; ...@@ -24,8 +24,7 @@ import com.weibo.api.motan.rpc.Response;
import com.weibo.api.motan.rpc.URL; import com.weibo.api.motan.rpc.URL;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
...@@ -38,7 +37,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint; ...@@ -38,7 +37,6 @@ 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.SpanAssert;
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
import org.hamcrest.MatcherAssert; import org.hamcrest.MatcherAssert;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -83,7 +81,6 @@ public class MotanProviderInterceptorTest { ...@@ -83,7 +81,6 @@ public class MotanProviderInterceptorTest {
@Before @Before
public void setUp() { public void setUp() {
Config.Agent.ACTIVE_V1_HEADER = true;
invokeInterceptor = new MotanProviderInterceptor(); invokeInterceptor = new MotanProviderInterceptor();
url = URL.valueOf("motan://127.0.0.1:34000/org.apache.skywalking.apm.test.TestService"); url = URL.valueOf("motan://127.0.0.1:34000/org.apache.skywalking.apm.test.TestService");
...@@ -96,11 +93,6 @@ public class MotanProviderInterceptorTest { ...@@ -96,11 +93,6 @@ public class MotanProviderInterceptorTest {
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testInvokerWithoutRefSegment() throws Throwable { public void testInvokerWithoutRefSegment() throws Throwable {
invokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, null); invokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, null);
...@@ -117,7 +109,7 @@ public class MotanProviderInterceptorTest { ...@@ -117,7 +109,7 @@ public class MotanProviderInterceptorTest {
@Test @Test
public void testInvokerWithRefSegment() throws Throwable { public void testInvokerWithRefSegment() throws Throwable {
HashMap attachments = new HashMap(); HashMap attachments = new HashMap();
attachments.put(SW3CarrierItem.HEADER_NAME, "1.123.456|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); attachments.put(SW6CarrierItem.HEADER_NAME, "1-MC4wLjA=-MS4xMjMuNDU2-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
when(request.getAttachments()).thenReturn(attachments); when(request.getAttachments()).thenReturn(attachments);
invokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, null); invokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, null);
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
package org.apache.skywalking.apm.plugin.pulsar; package org.apache.skywalking.apm.plugin.pulsar;
import org.apache.pulsar.common.api.proto.PulsarApi; import org.apache.pulsar.common.api.proto.PulsarApi;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
...@@ -33,7 +33,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint; ...@@ -33,7 +33,6 @@ 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.SpanAssert;
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.hamcrest.MatcherAssert; import org.hamcrest.MatcherAssert;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -75,7 +74,6 @@ public class PulsarConsumerInterceptorTest { ...@@ -75,7 +74,6 @@ public class PulsarConsumerInterceptorTest {
@Before @Before
public void setUp() { public void setUp() {
Config.Agent.ACTIVE_V1_HEADER = true;
consumerInterceptor = new PulsarConsumerInterceptor(); consumerInterceptor = new PulsarConsumerInterceptor();
consumerEnhanceRequiredInfo = new ConsumerEnhanceRequiredInfo(); consumerEnhanceRequiredInfo = new ConsumerEnhanceRequiredInfo();
...@@ -84,13 +82,8 @@ public class PulsarConsumerInterceptorTest { ...@@ -84,13 +82,8 @@ public class PulsarConsumerInterceptorTest {
consumerEnhanceRequiredInfo.setSubscriptionName("my-sub"); consumerEnhanceRequiredInfo.setSubscriptionName("my-sub");
msg = new MockMessage(); msg = new MockMessage();
msg.getMessageBuilder().addProperties(PulsarApi.KeyValue.newBuilder() msg.getMessageBuilder().addProperties(PulsarApi.KeyValue.newBuilder()
.setKey("sw3") .setKey(SW6CarrierItem.HEADER_NAME)
.setValue("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#testEntrySpan|#AQA*#AQA*Et0We0tQNQA*")); .setValue("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-I3Rlc3RFbnRyeVNwYW4="));
}
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
} }
@Test @Test
......
...@@ -20,6 +20,7 @@ package org.apache.skywalking.apm.plugin.rabbitmq; ...@@ -20,6 +20,7 @@ package org.apache.skywalking.apm.plugin.rabbitmq;
import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Envelope; import com.rabbitmq.client.Envelope;
import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule; import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
...@@ -72,7 +73,7 @@ public class RabbitMQConsumerInterceptorTest { ...@@ -72,7 +73,7 @@ public class RabbitMQConsumerInterceptorTest {
public void TestRabbitMQConsumerInterceptor() throws Throwable { public void TestRabbitMQConsumerInterceptor() throws Throwable {
Envelope envelope = new Envelope(1111,false,"","rabbitmq-test"); Envelope envelope = new Envelope(1111,false,"","rabbitmq-test");
Map<String, Object> headers = new HashMap<String, Object>(); Map<String, Object> headers = new HashMap<String, Object>();
headers.put("sw6","1-MS4xLjE1NDM5NzU1OTEwMTQwMDAx-MS4xLjE1NDM5NzU1OTA5OTcwMDAw-0-1-1-IzEyNy4wLjAuMTo1Mjcy-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI="); headers.put(SW6CarrierItem.HEADER_NAME,"1-MS4xLjE1NDM5NzU1OTEwMTQwMDAx-MS4xLjE1NDM5NzU1OTA5OTcwMDAw-0-1-1-IzEyNy4wLjAuMTo1Mjcy-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=-I1JhYmJpdE1RL1RvcGljL1F1ZXVlL3JhYmJpdG1xLXRlc3QvUHJvZHVjZXI=");
AMQP.BasicProperties.Builder propsBuilder = new AMQP.BasicProperties.Builder(); AMQP.BasicProperties.Builder propsBuilder = new AMQP.BasicProperties.Builder();
Object[] arguments = new Object[] {0,envelope,propsBuilder.headers(headers).build()}; Object[] arguments = new Object[] {0,envelope,propsBuilder.headers(headers).build()};
......
...@@ -18,8 +18,6 @@ ...@@ -18,8 +18,6 @@
package org.apache.skywalking.apm.plugin.resteasy.v3.server; package org.apache.skywalking.apm.plugin.resteasy.v3.server;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem;
import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity; import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
...@@ -136,28 +134,6 @@ public class SynchronousDispatcherInterceptorTest { ...@@ -136,28 +134,6 @@ public class SynchronousDispatcherInterceptorTest {
AssertTools.assertTraceSegmentRef(traceSegment.getRefs().get(0)); AssertTools.assertTraceSegmentRef(traceSegment.getRefs().get(0));
} }
@Test
public void testWithSW3SerializedContextData() throws Throwable {
Config.Agent.ACTIVE_V1_HEADER = true;
Config.Agent.ACTIVE_V2_HEADER = false;
MultivaluedMapImpl<String, String> multivaluedMap = new MultivaluedMapImpl<String, String>();
multivaluedMap.putSingle(SW3CarrierItem.HEADER_NAME, "1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*");
when(request.getHttpHeaders()).thenReturn(new ResteasyHttpHeaders(multivaluedMap));
synchronousDispatcherInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
synchronousDispatcherInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
Config.Agent.ACTIVE_V1_HEADER = false;
Config.Agent.ACTIVE_V2_HEADER = true;
assertThat(segmentStorage.getTraceSegments().size(), is(1));
TraceSegment traceSegment = segmentStorage.getTraceSegments().get(0);
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(traceSegment);
AssertTools.assertHttpSpan(spans.get(0));
AssertTools.assertTraceSegmentRef(traceSegment.getRefs().get(0));
}
@Test @Test
public void testWithOccurException() throws Throwable { public void testWithOccurException() throws Throwable {
synchronousDispatcherInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); synchronousDispatcherInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
......
...@@ -25,7 +25,7 @@ import com.alipay.sofa.rpc.core.response.SofaResponse; ...@@ -25,7 +25,7 @@ import com.alipay.sofa.rpc.core.response.SofaResponse;
import com.alipay.sofa.rpc.filter.ProviderInvoker; import com.alipay.sofa.rpc.filter.ProviderInvoker;
import java.util.List; import java.util.List;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
...@@ -41,7 +41,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; ...@@ -41,7 +41,6 @@ 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.SegmentStoragePoint;
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.hamcrest.CoreMatchers; import org.hamcrest.CoreMatchers;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -92,7 +91,6 @@ public class SofaRpcProviderInterceptorTest { ...@@ -92,7 +91,6 @@ public class SofaRpcProviderInterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
sofaRpcProviderInterceptor = new SofaRpcProviderInterceptor(); sofaRpcProviderInterceptor = new SofaRpcProviderInterceptor();
PowerMockito.mockStatic(RpcInternalContext.class); PowerMockito.mockStatic(RpcInternalContext.class);
...@@ -112,16 +110,11 @@ public class SofaRpcProviderInterceptorTest { ...@@ -112,16 +110,11 @@ public class SofaRpcProviderInterceptorTest {
Config.Agent.SERVICE_NAME = "SOFARPC-TestCases-APP"; Config.Agent.SERVICE_NAME = "SOFARPC-TestCases-APP";
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testProviderWithAttachment() throws Throwable { public void testProviderWithAttachment() throws Throwable {
when(rpcContext.isConsumerSide()).thenReturn(false); when(rpcContext.isConsumerSide()).thenReturn(false);
when(sofaRequest.getRequestProp(SKYWALKING_PREFIX + SW3CarrierItem.HEADER_NAME)).thenReturn( when(sofaRequest.getRequestProp(SKYWALKING_PREFIX + SW6CarrierItem.HEADER_NAME)).thenReturn(
"1.323.4433|3|1|1|#192.168.1.8 :18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); "1-MC4wLjA=-MS4zMjMuNDQzMw==-3-1-1-IzE5Mi4xNjguMS44IDoxODAwMg==-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
sofaRpcProviderInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult); sofaRpcProviderInterceptor.beforeMethod(enhancedInstance, null, allArguments, argumentTypes, methodInterceptResult);
sofaRpcProviderInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, sofaResponse); sofaRpcProviderInterceptor.afterMethod(enhancedInstance, null, allArguments, argumentTypes, sofaResponse);
......
...@@ -23,9 +23,8 @@ import com.opensymphony.xwork2.ActionContext; ...@@ -23,9 +23,8 @@ import com.opensymphony.xwork2.ActionContext;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.struts2.StrutsStatics; import org.apache.struts2.StrutsStatics;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -34,7 +33,6 @@ import org.mockito.Mock; ...@@ -34,7 +33,6 @@ import org.mockito.Mock;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate; import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity; import org.apache.skywalking.apm.agent.core.context.trace.LogDataEntity;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
...@@ -94,7 +92,6 @@ public class Struts2InterceptorTest { ...@@ -94,7 +92,6 @@ public class Struts2InterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
struts2Interceptor = new Struts2Interceptor(); struts2Interceptor = new Struts2Interceptor();
when(request.getRequestURI()).thenReturn("/test/testRequestURL"); when(request.getRequestURI()).thenReturn("/test/testRequestURL");
when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL")); when(request.getRequestURL()).thenReturn(new StringBuffer("http://localhost:8080/test/testRequestURL"));
...@@ -113,11 +110,6 @@ public class Struts2InterceptorTest { ...@@ -113,11 +110,6 @@ public class Struts2InterceptorTest {
exceptionArgumentType = new Class[] {request.getClass(), response.getClass(), new RuntimeException().getClass()}; exceptionArgumentType = new Class[] {request.getClass(), response.getClass(), new RuntimeException().getClass()};
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testWithoutSerializedContextData() throws Throwable { public void testWithoutSerializedContextData() throws Throwable {
struts2Interceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); struts2Interceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
...@@ -131,7 +123,7 @@ public class Struts2InterceptorTest { ...@@ -131,7 +123,7 @@ public class Struts2InterceptorTest {
@Test @Test
public void testWithSerializedContextData() throws Throwable { public void testWithSerializedContextData() throws Throwable {
when(request.getHeader(SW3CarrierItem.HEADER_NAME)).thenReturn("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); when(request.getHeader(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
struts2Interceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); struts2Interceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
struts2Interceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); struts2Interceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
......
...@@ -22,8 +22,7 @@ import java.util.List; ...@@ -22,8 +22,7 @@ import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Request;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
...@@ -32,7 +31,6 @@ import org.apache.skywalking.apm.agent.test.helper.SpanHelper; ...@@ -32,7 +31,6 @@ import org.apache.skywalking.apm.agent.test.helper.SpanHelper;
import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; 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.SegmentStoragePoint;
import org.apache.skywalking.apm.agent.test.tools.SpanAssert; import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -84,8 +82,6 @@ public class TomcatInvokeInterceptorTest { ...@@ -84,8 +82,6 @@ public class TomcatInvokeInterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
tomcatInvokeInterceptor = new TomcatInvokeInterceptor(); tomcatInvokeInterceptor = new TomcatInvokeInterceptor();
tomcatExceptionInterceptor = new TomcatExceptionInterceptor(); tomcatExceptionInterceptor = new TomcatExceptionInterceptor();
when(request.getRequestURI()).thenReturn("/test/testRequestURL"); when(request.getRequestURI()).thenReturn("/test/testRequestURL");
...@@ -98,11 +94,6 @@ public class TomcatInvokeInterceptorTest { ...@@ -98,11 +94,6 @@ public class TomcatInvokeInterceptorTest {
exceptionArgumentType = new Class[] {request.getClass(), response.getClass(), new RuntimeException().getClass()}; exceptionArgumentType = new Class[] {request.getClass(), response.getClass(), new RuntimeException().getClass()};
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testWithoutSerializedContextData() throws Throwable { public void testWithoutSerializedContextData() throws Throwable {
tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
...@@ -116,7 +107,7 @@ public class TomcatInvokeInterceptorTest { ...@@ -116,7 +107,7 @@ public class TomcatInvokeInterceptorTest {
@Test @Test
public void testWithSerializedContextData() throws Throwable { public void testWithSerializedContextData() throws Throwable {
when(request.getHeader(SW3CarrierItem.HEADER_NAME)).thenReturn("1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); when(request.getHeader(SW6CarrierItem.HEADER_NAME)).thenReturn("1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult); tomcatInvokeInterceptor.beforeMethod(enhancedInstance, null, arguments, argumentType, methodInterceptResult);
tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null); tomcatInvokeInterceptor.afterMethod(enhancedInstance, null, arguments, argumentType, null);
......
...@@ -22,7 +22,6 @@ import io.undertow.Undertow; ...@@ -22,7 +22,6 @@ import io.undertow.Undertow;
import io.undertow.server.HttpHandler; import io.undertow.server.HttpHandler;
import io.undertow.server.RoutingHandler; import io.undertow.server.RoutingHandler;
import io.undertow.util.Methods; import io.undertow.util.Methods;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule; import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
...@@ -30,7 +29,6 @@ import org.apache.skywalking.apm.agent.test.tools.SegmentStorage; ...@@ -30,7 +29,6 @@ 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.SegmentStoragePoint;
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner; import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
import org.apache.skywalking.apm.plugin.undertow.v2x.handler.TracingHandler; import org.apache.skywalking.apm.plugin.undertow.v2x.handler.TracingHandler;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -71,15 +69,9 @@ public class RootHandlerInterceptorTest { ...@@ -71,15 +69,9 @@ public class RootHandlerInterceptorTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
Config.Agent.ACTIVE_V1_HEADER = true;
rootHandlerInterceptor = new RootHandlerInterceptor(); rootHandlerInterceptor = new RootHandlerInterceptor();
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testBindTracingHandler() throws Throwable { public void testBindTracingHandler() throws Throwable {
Object[] arguments = new Object[]{httpHandler}; Object[] arguments = new Object[]{httpHandler};
......
...@@ -24,8 +24,7 @@ import io.undertow.util.HeaderMap; ...@@ -24,8 +24,7 @@ import io.undertow.util.HeaderMap;
import io.undertow.util.HttpString; import io.undertow.util.HttpString;
import io.undertow.util.Methods; import io.undertow.util.Methods;
import io.undertow.util.StatusCodes; import io.undertow.util.StatusCodes;
import org.apache.skywalking.apm.agent.core.conf.Config; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
...@@ -102,10 +101,9 @@ public class TracingHandlerTest { ...@@ -102,10 +101,9 @@ public class TracingHandlerTest {
@Test @Test
public void testWithSerializedContextData() throws Throwable { public void testWithSerializedContextData() throws Throwable {
Config.Agent.ACTIVE_V1_HEADER = true;
TracingHandler handler = new TracingHandler(httpHandler); TracingHandler handler = new TracingHandler(httpHandler);
HttpServerExchange exchange = buildExchange(); HttpServerExchange exchange = buildExchange();
exchange.getRequestHeaders().put(HttpString.tryFromString(SW3CarrierItem.HEADER_NAME), "1.234.111|3|1|1|#192.168.1.8:18002|#/portal/|#/testEntrySpan|#AQA*#AQA*Et0We0tQNQA*"); exchange.getRequestHeaders().put(HttpString.tryFromString(SW6CarrierItem.HEADER_NAME), "1-MC4wLjA=-MS4yMzQuMTEx-3-1-1-IzE5Mi4xNjguMS44OjE4MDAy-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
handler.handleRequest(exchange); handler.handleRequest(exchange);
exchange.endExchange(); exchange.endExchange();
...@@ -115,7 +113,6 @@ public class TracingHandlerTest { ...@@ -115,7 +113,6 @@ public class TracingHandlerTest {
assertHttpSpan(spans.get(0)); assertHttpSpan(spans.get(0));
assertTraceSegmentRef(traceSegment.getRefs().get(0)); assertTraceSegmentRef(traceSegment.getRefs().get(0));
Config.Agent.ACTIVE_V1_HEADER = false;
} }
private HttpServerExchange buildExchange() { private HttpServerExchange buildExchange() {
......
...@@ -26,9 +26,10 @@ import java.util.HashMap; ...@@ -26,9 +26,10 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.base64.Base64;
import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
import org.apache.skywalking.apm.agent.core.context.SW3CarrierItem; import org.apache.skywalking.apm.agent.core.context.SW6CarrierItem;
import org.apache.skywalking.apm.agent.core.context.ids.ID; import org.apache.skywalking.apm.agent.core.context.ids.ID;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan; import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment; import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
...@@ -53,7 +54,6 @@ import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingContinuation; ...@@ -53,7 +54,6 @@ import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingContinuation;
import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingSpan; import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingSpan;
import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingSpanBuilder; import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingSpanBuilder;
import org.apache.skywalking.apm.toolkit.opentracing.TextMapContext; import org.apache.skywalking.apm.toolkit.opentracing.TextMapContext;
import org.junit.After;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
...@@ -105,7 +105,6 @@ public class SkywalkingSpanActivationTest { ...@@ -105,7 +105,6 @@ public class SkywalkingSpanActivationTest {
@Before @Before
public void setUp() { public void setUp() {
Config.Agent.ACTIVE_V1_HEADER = true;
spanBuilder = new SkywalkingSpanBuilder("test").withTag(Tags.COMPONENT.getKey(), "test"); spanBuilder = new SkywalkingSpanBuilder("test").withTag(Tags.COMPONENT.getKey(), "test");
constructorWithSpanBuilderInterceptor = new ConstructorWithSpanBuilderInterceptor(); constructorWithSpanBuilderInterceptor = new ConstructorWithSpanBuilderInterceptor();
spanLogInterceptor = new SpanLogInterceptor(); spanLogInterceptor = new SpanLogInterceptor();
...@@ -125,11 +124,6 @@ public class SkywalkingSpanActivationTest { ...@@ -125,11 +124,6 @@ public class SkywalkingSpanActivationTest {
activateInterceptor = new ActivateInterceptor(); activateInterceptor = new ActivateInterceptor();
} }
@After
public void clear() {
Config.Agent.ACTIVE_V1_HEADER = false;
}
@Test @Test
public void testCreateLocalSpan() throws Throwable { public void testCreateLocalSpan() throws Throwable {
startSpan(); startSpan();
...@@ -214,10 +208,10 @@ public class SkywalkingSpanActivationTest { ...@@ -214,10 +208,10 @@ public class SkywalkingSpanActivationTest {
injectInterceptor.afterMethod(enhancedInstance, null, injectInterceptor.afterMethod(enhancedInstance, null,
new Object[] {new TextMapContext(), Format.Builtin.TEXT_MAP, carrier}, null, null); new Object[] {new TextMapContext(), Format.Builtin.TEXT_MAP, carrier}, null, null);
String[] parts = values.get(SW3CarrierItem.HEADER_NAME).split("\\|", 8); String[] parts = values.get(SW6CarrierItem.HEADER_NAME).split("-", 9);
Assert.assertEquals("0", parts[1]); Assert.assertEquals("0", parts[3]);
Assert.assertEquals("#127.0.0.1:8080", parts[4]); Assert.assertEquals(Base64.encode("#127.0.0.1:8080"), parts[6]);
Assert.assertTrue(new ID(parts[7]).isValid()); Assert.assertTrue(new ID(Base64.decode2UTFString(parts[1])).isValid());
stopSpan(); stopSpan();
} }
...@@ -240,7 +234,7 @@ public class SkywalkingSpanActivationTest { ...@@ -240,7 +234,7 @@ public class SkywalkingSpanActivationTest {
}; };
values.put(SW3CarrierItem.HEADER_NAME, "1.343.222|3|1|1|#127.0.0.1:8080|#/portal/|#/testEntrySpan|434.12.12123"); values.put(SW6CarrierItem.HEADER_NAME, "1-NDM0LjEyLjEyMTIz-MS4zNDMuMjIy-3-1-1-IzEyNy4wLjAuMTo4MDgw-Iy9wb3J0YWwv-Iy90ZXN0RW50cnlTcGFu");
extractInterceptor.afterMethod(enhancedInstance, null, extractInterceptor.afterMethod(enhancedInstance, null,
new Object[] {Format.Builtin.TEXT_MAP, carrier}, new Class[] {}, null); new Object[] {Format.Builtin.TEXT_MAP, carrier}, new Class[] {}, null);
...@@ -278,7 +272,7 @@ public class SkywalkingSpanActivationTest { ...@@ -278,7 +272,7 @@ public class SkywalkingSpanActivationTest {
}; };
values.put(SW3CarrierItem.HEADER_NAME, "aaaaaaaa|3|#192.168.1.8:18002|#/portal/|#/testEntrySpan|1.234.444"); values.put(SW6CarrierItem.HEADER_NAME, "aaaaaaaa|3|#192.168.1.8:18002|#/portal/|#/testEntrySpan|1.234.444");
extractInterceptor.afterMethod(enhancedInstance, null, extractInterceptor.afterMethod(enhancedInstance, null,
new Object[] {Format.Builtin.TEXT_MAP, carrier}, new Class[] {}, null); new Object[] {Format.Builtin.TEXT_MAP, carrier}, new Class[] {}, null);
......
...@@ -28,15 +28,11 @@ with this specific request. ...@@ -28,15 +28,11 @@ with this specific request.
1. **Trace Data Protocol** is out of wire data, agent/SDK uses this to send traces and metrics to skywalking or other 1. **Trace Data Protocol** is out of wire data, agent/SDK uses this to send traces and metrics to skywalking or other
compatible backend. compatible backend.
Header protocol have two formats for compatible. Using v2 in default. [Cross Process Propagation Headers Protocol v2](Skywalking-Cross-Process-Propagation-Headers-Protocol-v2.md) is the new protocol for
* [Cross Process Propagation Headers Protocol v2](Skywalking-Cross-Process-Propagation-Headers-Protocol-v2.md) is the new protocol for in-wire context propagation, started in 6.0.0-beta release, older protocol is no longer supported.
in-wire context propagation, started in 6.0.0-beta release. It will replace the old **SW3** protocol in the future, now both of them are supported.
* [Cross Process Propagation Headers Protocol v1](Skywalking-Cross-Process-Propagation-Headers-Protocol-v1.md) is for in-wire propagation. Since SkyWalking v6.0.0-beta, SkyWalking agent and backend are using Trace Data Protocol v2.
By following this protocol, the trace segments in different processes could be linked. [SkyWalking Trace Data Protocol v2](Trace-Data-Protocol-v2.md) define the communication way and format between agent and backend.
Since SkyWalking v6.0.0-beta, SkyWalking agent and backend are using Trace Data Protocol v2, and v1 is still supported in backend.
* [SkyWalking Trace Data Protocol v2](Trace-Data-Protocol-v2.md) define the communication way and format between agent and backend
* [SkyWalking Trace Data Protocol v1](Trace-Data-Protocol-v1.md). This protocol is used in old version. Still supported.
### Service Mesh probe protocol ### Service Mesh probe protocol
......
# Skywalking Cross Process Propagation Headers Protocol
* Version 1.0
SkyWalking is more likely an APM system, rather than common distributed tracing system.
The Headers is much more complex than them in order to improving analysis performance of collector.
You can find many similar mechanism in other commercial APM system.(Some even much more complex than us)
# Header Item
* Header Name: `sw3`
* Header Value: Split by `|`, the parts are following.
_The header protocol came from SkyWalking 3, back to 2017. So sw3 header name keeps now._
## Values
* Trace Segment Id
The trace segment id is the unique id for the part of the distributed trace. Each id is only used in a single thread. The id includes three parts(Long), e.g. `"1.2343.234234234`
1) The first one represents application instance id, which assigned by collector. (most likely just an integer value, would be helpful in protobuf)
2) The second one represents thread id. (In Java most likely just an integer value, would be helpful in protobuf)
3) The third one also has two parts
1) A timestamp, measured in milliseconds
2) A seq, in current thread, between 0(included) and 9999(included)
If you are using other language, you can generate your own id, but make sure it is unique and combined by three longs.
* Span Id
An integer, unique in a trace segment. Start with 0;
* Parent Application Instance
The instance id of the parent node, e.g. for a server of RPC, this id is from the client application instance id.
* Entry Application Instance
The instance id of the entry application. e.g. A distributed trace `A->B->C`, the id is from `A`.
* Peer Host
The peer-host/peer-id from client side. e.g. client uses `182.14.39.1:9080` to access server, this ip:port is the peer host.
_This value can use exchange/compress collector service to get the id(integer) to represent the string. If you use the string, it must start with `#`, others use integer directly._
* Entry Span Operation Name of First Trace Segment
The operation name/id of entry span propagates from `Entry Application Instance`.
_This value can use exchange/compress collector service to get the id(integer) to represent the string. If you use the string, it must start with `#`, others use integer directly._
* Entry Span Operation Name of Parent Trace Segment
The operation name/id of entry span propagates from `Parent Application Instance`.
_This value can use exchange/compress collector service to get the id(integer) to represent the string. If you use the string, it must start with `#`, others use integer directly._
* Distributed Trace Id
The distributed trace id of the whole trace, if in a batch process, it comes from the trace of first batch producer. The rule is as same as `Trace Segment Id` with three Longs.
### Sample value
1. `1.2343.234234234|1|1|1|#127.0.0.1:8080|#/portal/|#/testEntrySpan|1.2343.234234234`
1. `1.2343.234234234|1|1|1|#127.0.0.1:8080|#/portal/|1038|1.2343.234234234`
\ No newline at end of file
# SkyWalking Cross Process Propagation Headers Protocol # SkyWalking Cross Process Propagation Headers Protocol
* Version 2.0 * Version 2.0
SkyWalking is more likely an APM system, rather than common distributed tracing system.
The Headers is much more complex than them in order to improving analysis performance of collector.
You can find many similar mechanism in other commercial APM system. (Some are even much more complex than our's)
## Abstract ## Abstract
SkyWalking Cross Process Propagation Headers Protocol v2 is also named as sw6 protocol. This protocol keeps the same purposes SkyWalking Cross Process Propagation Headers Protocol v2 is also named as sw6 protocol, which is for context propagation.
of [v1(a.k.a. sw3)](Skywalking-Cross-Process-Propagation-Headers-Protocol-v1.md), which is keep context propagation works.
## Differences from v1 ## Differences from v1
The major differences of v2 and v1, comes from SkyWalking's evolution, including The major differences of v2 and v1, comes from SkyWalking's evolution, including
......
# Trace Data Protocol
Trace Data Protocol describes the data format between SkyWalking agent/sniffer and backend.
## Abstract
This protocol includes the downstream and upstream data format. Other languages agents/SDKs can use this protocol to
uplink data to the SkyWalking backend.
- Other services, includes Register, Trace, etc., provided by HTTP/JSON and gRPC both.
### Version
v1
#### gRPC proto files
[gRPC proto files](https://github.com/apache/skywalking-data-collect-protocol/tree/v2.0)
## Trace Segment Service
[gRPC service define](https://github.com/apache/skywalking-data-collect-protocol/blob/v2.0/TraceSegmentService.proto)
- UniqueId represents segmentId and globalTraceId. It have 3 parts(Longs), 1) applicationInstanceId, 2) ThreadId, 3) Timestamp + 10000 + seq(seq is in [0, 100000) )
- Span data please refs to [Plugin Development Guide](../guides/Java-Plugin-Development-Guide.md)
- Id and name both exist, please use id if possible.
- operationNameId/endpointName
- networkAddress/networkAddressId
- entryServiceName/entryServiceId
- parentServiceName/parentServiceId
- peerId/peer
- componentIds are defined in backend, [here](../../../apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java)
HTTP format:
Input:
```
[
{
"gt": [[230150, 185809, 24040000]],
"sg": { //TraceSegmentObject
"ts": [137150, 185809, 48780000],
"ai": 2, //serviceId
"ii": 3, //applicationInstanceId
"ss": [ //SpanObject
{
"si": 0, //spanId
"tv": 0, //SpanType
"lv": 2, //SpanLayer
"ps": -1, //parentSpanId
"st": 1501858094726, //startTime
"et": 1501858096804, //endTime
"ci": 3, //componentId
"cn": "", //component
"oi": 0, //operationNameId
"on": "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()", //endpointName
"pi": 0, //peerId
"pn": "", //peer
"ie": false, //isError
"rs": [ //TraceSegmentReference
{
"pts": [230150, 185809, 24040000], //parentTraceSegmentId
"pii": 2, //parentServiceInstanceId
"psp": 1, //parentSpanId
"psi": 0, //parentServiceId
"psn": "/dubbox-case/case/dubbox-rest", //parentServiceName
"ni": 0, //networkAddressId
"nn": "172.25.0.4:20880", //networkAddress
"eii": 2, //entryServiceInstanceId
"esi": 0, //entryServiceId
"esn": "/dubbox-case/case/dubbox-rest", //entryServiceName
"rv": 0 //RefTypeValue
}
],
"to": [ //KeyWithStringValue
{
"k": "url", //key
"v": "rest://172.25.0.4:20880/org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()" //value
},
{
"k": "http.method",
"v": "GET"
}
],
"lo": [{
"ti": 1501858094726,
"ld": [{
"k": "NullPointException",
"v": "Error Stack"
}]
}]
},
{
"si": 1,
"tv": 1,
"lv": 1,
"ps": 0,
"st": 1501858094726,
"et": 1501858095804,
"ci": 9,
"cn": "",
"oi": 0,
"on": "mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]",
"pi": 0,
"pn": "localhost:27017",
"ie": false,
"to": [],
"lo": []
}
]
}
}
]
```
## Deprecated services
**Deprecated service**(s) are the gRPC services SkyWalking used before. In SkyWalking v6, in order to match the common
concepts in CloudNative world, these services are deprecated.
Although there services are still supported at this moment, but it will keep in supported at least before the end of 2019.
## ~~Application Register Service~~
**Deprecated service**
### Abstract
Register Application Code to the backend, and receive an integer represents the application.
[gRPC service define](https://github.com/apache/skywalking-data-collect-protocol/blob/v2.0/ApplicationRegisterService.proto)
- applicationCode is the config in your `agent.config`.
- The return id is **ApplicationId** as the value in `KeyWithIntegerValue`, which will be used in further data uplink.
## ~~Discovery Services~~
**Deprecated services**
### ~~Register Instance Service~~
[gRPC service define](https://github.com/apache/skywalking-data-collect-protocol/blob/v2.0/DiscoveryService.proto#L29)
- agentUUID generated by agent, should be unique. Stay same before reboot, at least.
- **ApplicationInstanceId** will be used in further data uplink.
HTTP format http://ip:port/instance/register(default: localhost:12800)
Input:
```
{
ai: x, #serviceId
au: "", #agentUUID
rt: x, #registerTime
oi: "", #osinfo
}
```
Output:
```
{
ai: x, #serviceId
ii: x, #applicationInstanceId
}
```
### ~~Heart beat service~~
[gRPC service define](https://github.com/apache/skywalking-data-collect-protocol/blob/v2.0/DiscoveryService.proto#L32)
- Recommend to report heart beat every 20-60 seconds.
- Java agent don't use this, because JVM metrics upstream replace the capabilities of this.
HTTP format http://ip:port/instance/heartbeat(default: localhost:12800)
Input:
```
{
"ii": x, #applicationInstanceId
"ht": x #heartbeatTime, java timestamp format
}
```
## ~~Service Name Discovery Service~~
**Deprecated services**
### Abstract
Replace the literal String service(operation) name by an id(integer)
[gRPC service define](.https://github.com/apache/skywalking-data-collect-protocol/blob/v2.0/DiscoveryService.proto#L70)
- Optional service, reduce the network cost but use more memory as a buffer mapping.
HTTP format http://ip:port/servicename/discovery(default: localhost:12800)
Input:
```
{
ai: x, #serviceId
sn: "", #serviceName
st: x, #srcSpanType
}
```
Output:
```
{
si: x, #osinfo
el: { #element
ai: x, #serviceId
sn: "", #serviceName
st: x, #srcSpanType
}
}
```
## ~~Network Address Register Service~~
### Abstract
Network Address includes all remove service address, includes ip, port, hostname, etc., which used in RPC framework, MQ, DB, etc.
[gRPC service define](https://github.com/apache/skywalking-data-collect-protocol/blob/v2.0/NetworkAddressRegisterService.proto)
- Optional service, reduce the network cost but use more memory as a buffer mapping.
...@@ -18,7 +18,7 @@ Namespace is the proposal from this.It is used for tracing and monitoring isolat ...@@ -18,7 +18,7 @@ Namespace is the proposal from this.It is used for tracing and monitoring isolat
The default value of `agent.namespace` is empty. The default value of `agent.namespace` is empty.
**Influence** **Influence**
The default header key of SkyWalking is `sw3`, more in this [document](../../../protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v1.md). The default header key of SkyWalking is `sw6`, more in this [document](../../../protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v2.md).
After `agent.namespace` set, the key changes to `namespace-sw3`. After `agent.namespace` is set, the key changes to `namespace-sw6`.
The across process propagation chain breaks, when the two sides are using different namespace. The across process propagation chain breaks, when the two sides are using different namespace.
...@@ -78,11 +78,9 @@ property key | Description | Default | ...@@ -78,11 +78,9 @@ property key | Description | Default |
`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.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.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| `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|
`agent.active_v2_header`|Active V2 header in default.|`true`|
`agent.instance_uuid` |Instance uuid is the identity of an instance, SkyWalking treat same instance uuid as one instance.if empty, SkyWalking agent will generate an 32-bit uuid. Using `NAME:` as UUID prefix could set the customized instance name. Such as, set it as `NAME:SVR-INSTANCE-A`, `SVR-INSTANCE-A` is the instance name. Otherwise, use `ServiceName`-pid:`id`@`hostname` as the instance name. |`""`| `agent.instance_uuid` |Instance uuid is the identity of an instance, SkyWalking treat same instance uuid as one instance.if empty, SkyWalking agent will generate an 32-bit uuid. Using `NAME:` as UUID prefix could set the customized instance name. Such as, set it as `NAME:SVR-INSTANCE-A`, `SVR-INSTANCE-A` is the instance name. Otherwise, use `ServiceName`-pid:`id`@`hostname` as the instance name. |`""`|
`agent.instance_properties[key]=value` | Add service instance custom properties. | Not set| `agent.instance_properties[key]=value` | Add service instance custom properties. | Not set|
`agent.cause_exception_depth`|How depth the agent goes, when log all cause exceptions.|`5`| `agent.cause_exception_depth`|How depth the agent goes, when log all cause exceptions.|`5`|
`agent.active_v1_header `|Deactivate V1 header in default.|`false`|
`agent.cool_down_threshold `|How long should the agent wait (in minute) before re-registering to the OAP server after receiving reset command.|`10`| `agent.cool_down_threshold `|How long should the agent wait (in minute) before re-registering to the OAP server after receiving reset command.|`10`|
`agent.force_reconnection_period `|Force reconnection period of grpc, based on grpc_channel_check_interval.|`1`| `agent.force_reconnection_period `|Force reconnection period of grpc, based on grpc_channel_check_interval.|`1`|
`agent.operation_name_threshold `|The operationName max length, setting this value > 500 is not recommended.|`500`| `agent.operation_name_threshold `|The operationName max length, setting this value > 500 is not recommended.|`500`|
......
...@@ -23,8 +23,7 @@ import java.util.ArrayList; ...@@ -23,8 +23,7 @@ import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import org.apache.skywalking.apm.network.language.agent.SpanObject; import java.util.stream.Collectors;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentObject;
import org.apache.skywalking.apm.network.language.agent.UniqueId; import org.apache.skywalking.apm.network.language.agent.UniqueId;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
...@@ -125,13 +124,8 @@ public class TraceQueryService implements Service { ...@@ -125,13 +124,8 @@ public class TraceQueryService implements Service {
} else { } else {
for (SegmentRecord segment : segmentRecords) { for (SegmentRecord segment : segmentRecords) {
if (nonNull(segment)) { if (nonNull(segment)) {
if (segment.getVersion() == 2) { SegmentObject segmentObject = SegmentObject.parseFrom(segment.getDataBinary());
SegmentObject segmentObject = SegmentObject.parseFrom(segment.getDataBinary()); trace.getSpans().addAll(buildSpanV2List(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList()));
trace.getSpans().addAll(buildSpanV2List(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList()));
} else {
TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(segment.getDataBinary());
trace.getSpans().addAll(buildSpanList(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList()));
}
} }
} }
} }
...@@ -221,125 +215,9 @@ public class TraceQueryService implements Service { ...@@ -221,125 +215,9 @@ public class TraceQueryService implements Service {
} }
ref.setParentSpanId(reference.getParentSpanId()); ref.setParentSpanId(reference.getParentSpanId());
UniqueId uniqueId = reference.getParentTraceSegmentId(); final UniqueId uniqueId = reference.getParentTraceSegmentId();
StringBuilder segmentIdBuilder = new StringBuilder(); final String parentSegmentId = uniqueId.getIdPartsList().stream().map(String::valueOf).collect(Collectors.joining("."));
for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) { ref.setParentSegmentId(parentSegmentId);
if (i == 0) {
segmentIdBuilder.append(uniqueId.getIdPartsList().get(i));
} else {
segmentIdBuilder.append(".").append(uniqueId.getIdPartsList().get(i));
}
}
ref.setParentSegmentId(segmentIdBuilder.toString());
span.setSegmentParentSpanId(ref.getParentSegmentId() + Const.SEGMENT_SPAN_SPLIT + ref.getParentSpanId());
span.getRefs().add(ref);
});
spanObject.getTagsList().forEach(tag -> {
KeyValue keyValue = new KeyValue();
keyValue.setKey(tag.getKey());
keyValue.setValue(tag.getValue());
span.getTags().add(keyValue);
});
spanObject.getLogsList().forEach(log -> {
LogEntity logEntity = new LogEntity();
logEntity.setTime(log.getTime());
log.getDataList().forEach(data -> {
KeyValue keyValue = new KeyValue();
keyValue.setKey(data.getKey());
keyValue.setValue(data.getValue());
logEntity.getData().add(keyValue);
});
span.getLogs().add(logEntity);
});
spans.add(span);
});
return spans;
}
private List<Span> buildSpanList(String traceId, String segmentId, int serviceId,
List<SpanObject> spanObjects) {
List<Span> spans = new ArrayList<>();
spanObjects.forEach(spanObject -> {
Span span = new Span();
span.setTraceId(traceId);
span.setSegmentId(segmentId);
span.setSpanId(spanObject.getSpanId());
span.setParentSpanId(spanObject.getParentSpanId());
span.setStartTime(spanObject.getStartTime());
span.setEndTime(spanObject.getEndTime());
span.setError(spanObject.getIsError());
span.setLayer(spanObject.getSpanLayer().name());
span.setType(spanObject.getSpanType().name());
String segmentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + spanObject.getSpanId();
span.setSegmentSpanId(segmentSpanId);
String segmentParentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + spanObject.getParentSpanId();
span.setSegmentParentSpanId(segmentParentSpanId);
if (spanObject.getPeerId() == 0) {
span.setPeer(spanObject.getPeer());
} else {
span.setPeer(getNetworkAddressInventoryCache().get(spanObject.getPeerId()).getName());
}
String endpointName = spanObject.getOperationName();
if (spanObject.getOperationNameId() != 0) {
EndpointInventory endpointInventory = getEndpointInventoryCache().get(spanObject.getOperationNameId());
if (nonNull(endpointInventory)) {
endpointName = endpointInventory.getName();
} else {
endpointName = Const.EMPTY_STRING;
}
}
span.setEndpointName(endpointName);
final ServiceInventory serviceInventory = getServiceInventoryCache().get(serviceId);
if (serviceInventory != null) {
span.setServiceCode(serviceInventory.getName());
} else {
span.setServiceCode("unknown");
}
if (spanObject.getComponentId() == 0) {
span.setComponent(spanObject.getComponent());
} else {
span.setComponent(getComponentLibraryCatalogService().getComponentName(spanObject.getComponentId()));
}
spanObject.getRefsList().forEach(reference -> {
Ref ref = new Ref();
ref.setTraceId(traceId);
switch (reference.getRefType()) {
case CrossThread:
ref.setType(RefType.CROSS_THREAD);
break;
case CrossProcess:
ref.setType(RefType.CROSS_PROCESS);
break;
}
ref.setParentSpanId(reference.getParentSpanId());
UniqueId uniqueId = reference.getParentTraceSegmentId();
StringBuilder segmentIdBuilder = new StringBuilder();
for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) {
if (i == 0) {
segmentIdBuilder.append(uniqueId.getIdPartsList().get(i));
} else {
segmentIdBuilder.append(".").append(uniqueId.getIdPartsList().get(i));
}
}
ref.setParentSegmentId(segmentIdBuilder.toString());
span.setSegmentParentSpanId(ref.getParentSegmentId() + Const.SEGMENT_SPAN_SPLIT + ref.getParentSpanId()); span.setSegmentParentSpanId(ref.getParentSegmentId() + Const.SEGMENT_SPAN_SPLIT + ref.getParentSpanId());
...@@ -392,14 +270,14 @@ public class TraceQueryService implements Service { ...@@ -392,14 +270,14 @@ public class TraceQueryService implements Service {
rootSpans.add(span); rootSpans.add(span);
} }
}); });
/** /*
* In some cases, there are segment fragments, which could not be linked by Ref, * In some cases, there are segment fragments, which could not be linked by Ref,
* because of two kinds of reasons. * because of two kinds of reasons.
* 1. Multiple leaf segments have no particular order in the storage. * 1. Multiple leaf segments have no particular order in the storage.
* 2. Lost in sampling, agent fail safe, segment lost, even bug. * 2. Lost in sampling, agent fail safe, segment lost, even bug.
* Sorting the segments makes the trace view more readable. * Sorting the segments makes the trace view more readable.
*/ */
rootSpans.sort(Comparator.comparing(span -> span.getStartTime())); rootSpans.sort(Comparator.comparing(Span::getStartTime));
return rootSpans; return rootSpans;
} }
......
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
package org.apache.skywalking.oap.server.library.buffer; package org.apache.skywalking.oap.server.library.buffer;
import com.google.protobuf.GeneratedMessageV3; import com.google.protobuf.GeneratedMessageV3;
import lombok.*; import lombok.Getter;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentObject; import lombok.Setter;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
/** /**
...@@ -29,7 +29,6 @@ import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; ...@@ -29,7 +29,6 @@ import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
@Getter @Getter
public class BufferData<MESSAGE_TYPE extends GeneratedMessageV3> { public class BufferData<MESSAGE_TYPE extends GeneratedMessageV3> {
private MESSAGE_TYPE messageType; private MESSAGE_TYPE messageType;
@Setter private TraceSegmentObject v1Segment;
@Setter private SegmentObject v2Segment; @Setter private SegmentObject v2Segment;
public BufferData(MESSAGE_TYPE messageType) { public BufferData(MESSAGE_TYPE messageType) {
......
/*
* 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.oap.server.library.buffer;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.apache.skywalking.apm.network.language.agent.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class BufferStreamTestCase {
private static final Logger logger = LoggerFactory.getLogger(BufferStreamTestCase.class);
public static void main(String[] args) throws IOException, InterruptedException {
String directory = "/Users/pengys5/code/sky-walking/buffer-test";
BufferStream.Builder<TraceSegmentObject> builder = new BufferStream.Builder<>(directory);
// builder.cleanWhenRestart(true);
builder.dataFileMaxSize(50);
builder.offsetFileMaxSize(10);
builder.parser(TraceSegmentObject.parser());
builder.callBack(bufferData -> {
logger.info("segment parse: {}", bufferData.getMessageType().getSpans(0).getSpanId());
return false;
});
BufferStream<TraceSegmentObject> stream = builder.build();
stream.initialize();
TimeUnit.SECONDS.sleep(5);
StringBuilder str = new StringBuilder("2018-08-27 11:59:45,261 main DEBUG Registering MBean org.apache.logging.log4j2:type=6d6f6e28");
for (int i = 0; i < 1000; i++) {
str.append("main DEBUG Registering MBean org.apache.logging.log4j2:type=6d6f6e28 main DEBUG Registering MBean org.apache.logging.log4j2:type=6d6f6e28 main DEBUG Registering MBean org.apache.logging.log4j2:type=6d6f6e28");
}
for (int i = 0; i < 20000; i++) {
TraceSegmentObject.Builder segment = TraceSegmentObject.newBuilder();
SpanObject.Builder span = SpanObject.newBuilder();
span.setSpanId(i);
span.setOperationName(str.toString());
segment.addSpans(span);
stream.write(segment.build());
if (i % 1000 == 0) {
TimeUnit.MILLISECONDS.sleep(50);
}
}
}
}
...@@ -47,7 +47,6 @@ public class JVMModuleProvider extends ModuleProvider { ...@@ -47,7 +47,6 @@ public class JVMModuleProvider extends ModuleProvider {
@Override public void start() { @Override public void start() {
GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(GRPCHandlerRegister.class); GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(GRPCHandlerRegister.class);
grpcHandlerRegister.addHandler(new JVMMetricsServiceHandler(getManager()));
grpcHandlerRegister.addHandler(new JVMMetricReportServiceHandler(getManager())); grpcHandlerRegister.addHandler(new JVMMetricReportServiceHandler(getManager()));
} }
......
/*
* 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.oap.server.receiver.jvm.provider.handler;
import io.grpc.stub.StreamObserver;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(JVMMetricsServiceHandler.class);
private final JVMSourceDispatcher jvmSourceDispatcher;
public JVMMetricsServiceHandler(ModuleManager moduleManager) {
this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager);
}
@Override public void collect(JVMMetrics request, StreamObserver<Downstream> responseObserver) {
int serviceInstanceId = request.getApplicationInstanceId();
if (logger.isDebugEnabled()) {
logger.debug("receive the jvm metrics from service instance, id: {}", serviceInstanceId);
}
request.getMetricsList().forEach(metrics -> {
long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getTime());
jvmSourceDispatcher.sendMetric(serviceInstanceId, minuteTimeBucket, metrics);
});
responseObserver.onNext(Downstream.newBuilder().build());
responseObserver.onCompleted();
}
}
/*
* 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.oap.server.receiver.jvm.provider.handler;
import io.grpc.*;
import java.util.concurrent.*;
import org.apache.skywalking.apm.network.common.CPU;
import org.apache.skywalking.apm.network.language.agent.*;
/**
* @author peng-yongsheng
*/
public class JVMMetricsServiceHandlerMainTest {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
JVMMetricsServiceGrpc.JVMMetricsServiceBlockingStub stub = JVMMetricsServiceGrpc.newBlockingStub(channel);
Executors.newSingleThreadScheduledExecutor().schedule(() -> send(stub), 1, TimeUnit.SECONDS);
}
private static void send(JVMMetricsServiceGrpc.JVMMetricsServiceBlockingStub stub) {
JVMMetrics.Builder jvmMetrics = JVMMetrics.newBuilder();
jvmMetrics.setApplicationInstanceId(2);
JVMMetric.Builder jvmMetricBuilder = JVMMetric.newBuilder();
jvmMetricBuilder.setTime(System.currentTimeMillis());
buildCPUMetric(jvmMetricBuilder);
buildGCMetric(jvmMetricBuilder);
buildMemoryMetric(jvmMetricBuilder);
buildMemoryPoolMetric(jvmMetricBuilder);
jvmMetrics.addMetrics(jvmMetricBuilder);
stub.collect(jvmMetrics.build());
}
private static void buildMemoryPoolMetric(JVMMetric.Builder metricBuilder) {
MemoryPool.Builder codeCache = MemoryPool.newBuilder();
codeCache.setInit(10);
codeCache.setMax(100);
codeCache.setCommited(10);
codeCache.setUsed(50);
codeCache.setType(PoolType.CODE_CACHE_USAGE);
metricBuilder.addMemoryPool(codeCache);
MemoryPool.Builder newGen = MemoryPool.newBuilder();
newGen.setInit(10);
newGen.setMax(100);
newGen.setCommited(10);
newGen.setUsed(50);
newGen.setType(PoolType.NEWGEN_USAGE);
metricBuilder.addMemoryPool(newGen);
MemoryPool.Builder oldGen = MemoryPool.newBuilder();
oldGen.setInit(10);
oldGen.setMax(100);
oldGen.setCommited(10);
oldGen.setUsed(50);
oldGen.setType(PoolType.OLDGEN_USAGE);
metricBuilder.addMemoryPool(oldGen);
MemoryPool.Builder survivor = MemoryPool.newBuilder();
survivor.setInit(10);
survivor.setMax(100);
survivor.setCommited(10);
survivor.setUsed(50);
survivor.setType(PoolType.SURVIVOR_USAGE);
metricBuilder.addMemoryPool(survivor);
MemoryPool.Builder permGen = MemoryPool.newBuilder();
permGen.setInit(10);
permGen.setMax(100);
permGen.setCommited(10);
permGen.setUsed(50);
permGen.setType(PoolType.PERMGEN_USAGE);
metricBuilder.addMemoryPool(permGen);
MemoryPool.Builder metaSpace = MemoryPool.newBuilder();
metaSpace.setInit(10);
metaSpace.setMax(100);
metaSpace.setCommited(10);
metaSpace.setUsed(50);
metaSpace.setType(PoolType.METASPACE_USAGE);
metricBuilder.addMemoryPool(metaSpace);
}
private static void buildMemoryMetric(JVMMetric.Builder metricBuilder) {
Memory.Builder isHeap = Memory.newBuilder();
isHeap.setInit(20);
isHeap.setMax(100);
isHeap.setCommitted(20);
isHeap.setUsed(60);
isHeap.setIsHeap(true);
metricBuilder.addMemory(isHeap);
Memory.Builder nonHeap = Memory.newBuilder();
nonHeap.setInit(20);
nonHeap.setMax(100);
nonHeap.setCommitted(20);
nonHeap.setUsed(60);
nonHeap.setIsHeap(false);
metricBuilder.addMemory(nonHeap);
}
private static void buildGCMetric(JVMMetric.Builder metricBuilder) {
GC.Builder newGC = GC.newBuilder();
newGC.setPhrase(GCPhrase.NEW);
newGC.setCount(2);
newGC.setTime(1000);
metricBuilder.addGc(newGC);
GC.Builder oldGC = GC.newBuilder();
oldGC.setPhrase(GCPhrase.OLD);
oldGC.setCount(4);
oldGC.setTime(49);
metricBuilder.addGc(oldGC);
}
private static void buildCPUMetric(JVMMetric.Builder metricBuilder) {
CPU.Builder cpu = CPU.newBuilder();
cpu.setUsagePercent(20);
metricBuilder.setCpu(cpu.build());
}
}
...@@ -19,12 +19,13 @@ ...@@ -19,12 +19,13 @@
package org.apache.skywalking.oap.server.receiver.register.provider; package org.apache.skywalking.oap.server.receiver.register.provider;
import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.server.*; import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister;
import org.apache.skywalking.oap.server.library.module.*; import org.apache.skywalking.oap.server.library.module.ModuleConfig;
import org.apache.skywalking.oap.server.library.module.ModuleDefine;
import org.apache.skywalking.oap.server.library.module.ModuleProvider;
import org.apache.skywalking.oap.server.receiver.register.module.RegisterModule; import org.apache.skywalking.oap.server.receiver.register.module.RegisterModule;
import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc.*; import org.apache.skywalking.oap.server.receiver.register.provider.handler.v6.grpc.RegisterServiceHandler;
import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.*; import org.apache.skywalking.oap.server.receiver.register.provider.handler.v6.grpc.ServiceInstancePingServiceHandler;
import org.apache.skywalking.oap.server.receiver.register.provider.handler.v6.grpc.*;
import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule;
/** /**
...@@ -49,21 +50,8 @@ public class RegisterModuleProvider extends ModuleProvider { ...@@ -49,21 +50,8 @@ public class RegisterModuleProvider extends ModuleProvider {
@Override public void start() { @Override public void start() {
GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(GRPCHandlerRegister.class); GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(GRPCHandlerRegister.class);
grpcHandlerRegister.addHandler(new ApplicationRegisterHandler(getManager()));
grpcHandlerRegister.addHandler(new InstanceDiscoveryServiceHandler(getManager()));
grpcHandlerRegister.addHandler(new ServiceNameDiscoveryHandler(getManager()));
grpcHandlerRegister.addHandler(new NetworkAddressRegisterServiceHandler(getManager()));
// v2
grpcHandlerRegister.addHandler(new RegisterServiceHandler(getManager())); grpcHandlerRegister.addHandler(new RegisterServiceHandler(getManager()));
grpcHandlerRegister.addHandler(new ServiceInstancePingServiceHandler(getManager())); grpcHandlerRegister.addHandler(new ServiceInstancePingServiceHandler(getManager()));
JettyHandlerRegister jettyHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(JettyHandlerRegister.class);
jettyHandlerRegister.addHandler(new ApplicationRegisterServletHandler(getManager()));
jettyHandlerRegister.addHandler(new InstanceDiscoveryServletHandler(getManager()));
jettyHandlerRegister.addHandler(new InstanceHeartBeatServletHandler(getManager()));
jettyHandlerRegister.addHandler(new NetworkAddressRegisterServletHandler(getManager()));
jettyHandlerRegister.addHandler(new ServiceNameDiscoveryServiceHandler(getManager()));
} }
@Override public void notifyAfterCompleted() { @Override public void notifyAfterCompleted() {
......
/*
* 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.oap.server.receiver.register.provider.handler.v5.grpc;
import io.grpc.stub.StreamObserver;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.core.*;
import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class ApplicationRegisterHandler extends ApplicationRegisterServiceGrpc.ApplicationRegisterServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(ApplicationRegisterHandler.class);
private final IServiceInventoryRegister serviceInventoryRegister;
public ApplicationRegisterHandler(ModuleManager moduleManager) {
serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
}
@Override
public void applicationCodeRegister(Application request, StreamObserver<ApplicationMapping> responseObserver) {
if (logger.isDebugEnabled()) {
logger.debug("Register application, application code: {}", request.getApplicationCode());
}
ApplicationMapping.Builder builder = ApplicationMapping.newBuilder();
String serviceName = request.getApplicationCode();
int serviceId = serviceInventoryRegister.getOrCreate(serviceName, null);
if (serviceId != Const.NONE) {
KeyWithIntegerValue value = KeyWithIntegerValue.newBuilder().setKey(serviceName).setValue(serviceId).build();
builder.setApplication(value);
}
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.grpc;
import com.google.common.base.Strings;
import com.google.gson.JsonObject;
import io.grpc.stub.StreamObserver;
import java.util.Objects;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.cache.*;
import org.apache.skywalking.oap.server.core.register.*;
import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil;
import org.apache.skywalking.oap.server.core.register.service.*;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class InstanceDiscoveryServiceHandler extends InstanceDiscoveryServiceGrpc.InstanceDiscoveryServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(InstanceDiscoveryServiceHandler.class);
private final ServiceInventoryCache serviceInventoryCache;
private final ServiceInstanceInventoryCache serviceInstanceInventoryCache;
private final IServiceInventoryRegister serviceInventoryRegister;
private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister;
public InstanceDiscoveryServiceHandler(ModuleManager moduleManager) {
this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
}
@Override
public void registerInstance(ApplicationInstance request,
StreamObserver<ApplicationInstanceMapping> responseObserver) {
OSInfo osinfo = request.getOsinfo();
JsonObject instanceProperties = new JsonObject();
instanceProperties.addProperty(PropertyUtil.HOST_NAME, osinfo.getHostname());
instanceProperties.addProperty(PropertyUtil.OS_NAME, osinfo.getOsName());
instanceProperties.addProperty(PropertyUtil.PROCESS_NO, osinfo.getProcessNo() + "");
instanceProperties.addProperty(PropertyUtil.IPV4S, PropertyUtil.ipv4sSerialize(osinfo.getIpv4SList()));
ServiceInventory serviceInventory = serviceInventoryCache.get(request.getApplicationId());
String instanceName = serviceInventory.getName();
if (osinfo.getProcessNo() != 0) {
instanceName += "-pid:" + osinfo.getProcessNo();
}
if (!Strings.isNullOrEmpty(osinfo.getHostname())) {
instanceName += "@" + osinfo.getHostname();
}
int serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(request.getApplicationId(), instanceName, request.getAgentUUID(), request.getRegisterTime(), instanceProperties);
ApplicationInstanceMapping.Builder builder = ApplicationInstanceMapping.newBuilder();
builder.setApplicationId(request.getApplicationId());
builder.setApplicationInstanceId(serviceInstanceId);
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
@Override public void heartbeat(ApplicationInstanceHeartbeat request, StreamObserver<Downstream> responseObserver) {
int serviceInstanceId = request.getApplicationInstanceId();
long heartBeatTime = request.getHeartbeatTime();
serviceInstanceInventoryRegister.heartbeat(serviceInstanceId, heartBeatTime);
ServiceInstanceInventory serviceInstanceInventory = serviceInstanceInventoryCache.get(serviceInstanceId);
if (Objects.nonNull(serviceInstanceInventory)) {
serviceInventoryRegister.heartbeat(serviceInstanceInventory.getServiceId(), heartBeatTime);
} else {
logger.warn("Can't found service by service instance id from cache, service instance id is: {}", serviceInstanceId);
}
responseObserver.onNext(Downstream.getDefaultInstance());
responseObserver.onCompleted();
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.grpc;
import com.google.protobuf.ProtocolStringList;
import io.grpc.stub.StreamObserver;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.core.*;
import org.apache.skywalking.oap.server.core.register.service.INetworkAddressInventoryRegister;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class NetworkAddressRegisterServiceHandler extends NetworkAddressRegisterServiceGrpc.NetworkAddressRegisterServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(NetworkAddressRegisterServiceHandler.class);
private final INetworkAddressInventoryRegister networkAddressInventoryRegister;
public NetworkAddressRegisterServiceHandler(ModuleManager moduleManager) {
this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class);
}
@Override
public void batchRegister(NetworkAddresses request, StreamObserver<NetworkAddressMappings> responseObserver) {
if (logger.isDebugEnabled()) {
logger.debug("register application");
}
ProtocolStringList addressesList = request.getAddressesList();
NetworkAddressMappings.Builder builder = NetworkAddressMappings.newBuilder();
for (String networkAddress : addressesList) {
int addressId = networkAddressInventoryRegister.getOrCreate(networkAddress, null);
if (addressId != Const.NONE) {
KeyWithIntegerValue value = KeyWithIntegerValue.newBuilder().setKey(networkAddress).setValue(addressId).build();
builder.addAddressIds(value);
}
}
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.grpc;
import io.grpc.stub.StreamObserver;
import java.util.List;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.core.*;
import org.apache.skywalking.oap.server.core.register.service.IEndpointInventoryRegister;
import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class ServiceNameDiscoveryHandler extends ServiceNameDiscoveryServiceGrpc.ServiceNameDiscoveryServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(ServiceNameDiscoveryHandler.class);
private final IEndpointInventoryRegister inventoryService;
public ServiceNameDiscoveryHandler(ModuleManager moduleManager) {
this.inventoryService = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
}
@Override public void discovery(ServiceNameCollection request,
StreamObserver<ServiceNameMappingCollection> responseObserver) {
List<ServiceNameElement> serviceNameElementList = request.getElementsList();
ServiceNameMappingCollection.Builder builder = ServiceNameMappingCollection.newBuilder();
for (ServiceNameElement serviceNameElement : serviceNameElementList) {
int serviceId = serviceNameElement.getApplicationId();
String endpointName = serviceNameElement.getServiceName();
int endpointId = inventoryService.getOrCreate(serviceId, endpointName, DetectPoint.fromSpanType(serviceNameElement.getSrcSpanType()));
if (endpointId != Const.NONE) {
ServiceNameMappingElement.Builder mappingElement = ServiceNameMappingElement.newBuilder();
mappingElement.setServiceId(endpointId);
mappingElement.setElement(serviceNameElement);
builder.addElements(mappingElement);
}
}
responseObserver.onNext(builder.build());
responseObserver.onCompleted();
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.rest;
import com.google.gson.*;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.jetty.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class ApplicationRegisterServletHandler extends JettyJsonHandler {
private static final Logger logger = LoggerFactory.getLogger(ApplicationRegisterServletHandler.class);
private final IServiceInventoryRegister serviceInventoryRegister;
private Gson gson = new Gson();
private static final String APPLICATION_CODE = "c";
private static final String APPLICATION_ID = "i";
public ApplicationRegisterServletHandler(ModuleManager moduleManager) {
serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
}
@Override public String pathSpec() {
return "/application/register";
}
@Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException {
throw new UnsupportedOperationException();
}
@Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException {
JsonArray responseArray = new JsonArray();
try {
JsonArray applicationCodes = gson.fromJson(req.getReader(), JsonArray.class);
for (int i = 0; i < applicationCodes.size(); i++) {
String applicationCode = applicationCodes.get(i).getAsString();
int applicationId = serviceInventoryRegister.getOrCreate(applicationCode, null);
JsonObject mapping = new JsonObject();
mapping.addProperty(APPLICATION_CODE, applicationCode);
mapping.addProperty(APPLICATION_ID, applicationId);
responseArray.add(mapping);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return responseArray;
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.rest;
import com.google.gson.*;
import java.io.IOException;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache;
import org.apache.skywalking.oap.server.core.register.*;
import org.apache.skywalking.oap.server.core.register.service.IServiceInstanceInventoryRegister;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.jetty.*;
import org.slf4j.*;
import static org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory.PropertyUtil.*;
/**
* @author peng-yongsheng
*/
public class InstanceDiscoveryServletHandler extends JettyJsonHandler {
private static final Logger logger = LoggerFactory.getLogger(InstanceDiscoveryServletHandler.class);
private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister;
private final ServiceInventoryCache serviceInventoryCache;
private final Gson gson = new Gson();
private static final String APPLICATION_ID = "ai";
private static final String AGENT_UUID = "au";
private static final String REGISTER_TIME = "rt";
private static final String INSTANCE_ID = "ii";
private static final String OS_INFO = "oi";
public InstanceDiscoveryServletHandler(ModuleManager moduleManager) {
this.serviceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInventoryCache.class);
this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
}
@Override public String pathSpec() {
return "/instance/register";
}
@Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException {
throw new UnsupportedOperationException();
}
@Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException {
JsonObject responseJson = new JsonObject();
try {
JsonObject instance = gson.fromJson(req.getReader(), JsonObject.class);
int applicationId = instance.get(APPLICATION_ID).getAsInt();
String agentUUID = instance.get(AGENT_UUID).getAsString();
long registerTime = instance.get(REGISTER_TIME).getAsLong();
JsonObject osInfoJson = instance.get(OS_INFO).getAsJsonObject();
List<String> ipv4sList = new ArrayList<>();
JsonArray ipv4s = osInfoJson.get("ipv4s").getAsJsonArray();
ipv4s.forEach(ipv4 -> ipv4sList.add(ipv4.getAsString()));
ServiceInventory serviceInventory = serviceInventoryCache.get(applicationId);
JsonObject instanceProperties = new JsonObject();
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.HOST_NAME, osInfoJson.get("hostName").getAsString());
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.OS_NAME, osInfoJson.get("osName").getAsString());
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.PROCESS_NO, osInfoJson.get("processId").getAsInt() + "");
instanceProperties.addProperty(ServiceInstanceInventory.PropertyUtil.IPV4S, ServiceInstanceInventory.PropertyUtil.ipv4sSerialize(ipv4sList));
String instanceName = serviceInventory.getName();
if (instanceProperties.has(PROCESS_NO)) {
instanceName += "-pid:" + instanceProperties.get(PROCESS_NO).getAsString();
}
if (instanceProperties.has(HOST_NAME)) {
instanceName += "@" + instanceProperties.get(HOST_NAME).getAsString();
}
int instanceId = serviceInstanceInventoryRegister.getOrCreate(applicationId, instanceName, agentUUID, registerTime, instanceProperties);
responseJson.addProperty(APPLICATION_ID, applicationId);
responseJson.addProperty(INSTANCE_ID, instanceId);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return responseJson;
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.rest;
import com.google.gson.*;
import java.io.IOException;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache;
import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory;
import org.apache.skywalking.oap.server.core.register.service.IServiceInstanceInventoryRegister;
import org.apache.skywalking.oap.server.core.register.service.IServiceInventoryRegister;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.jetty.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class InstanceHeartBeatServletHandler extends JettyJsonHandler {
private static final Logger logger = LoggerFactory.getLogger(InstanceHeartBeatServletHandler.class);
private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister;
private final ServiceInstanceInventoryCache serviceInstanceInventoryCache;
private final IServiceInventoryRegister serviceInventoryRegister;
private final Gson gson = new Gson();
private static final String INSTANCE_ID = "ii";
private static final String HEARTBEAT_TIME = "ht";
public InstanceHeartBeatServletHandler(ModuleManager moduleManager) {
this.serviceInstanceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInstanceInventoryRegister.class);
this.serviceInstanceInventoryCache = moduleManager.find(CoreModule.NAME).provider().getService(ServiceInstanceInventoryCache.class);
this.serviceInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(IServiceInventoryRegister.class);
}
@Override public String pathSpec() {
return "/instance/heartbeat";
}
@Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException {
throw new UnsupportedOperationException();
}
@Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException, IOException {
JsonObject responseJson = new JsonObject();
try {
JsonObject heartBeat = gson.fromJson(req.getReader(), JsonObject.class);
int instanceId = heartBeat.get(INSTANCE_ID).getAsInt();
long heartBeatTime = heartBeat.get(HEARTBEAT_TIME).getAsLong();
serviceInstanceInventoryRegister.heartbeat(instanceId, heartBeatTime);
ServiceInstanceInventory serviceInstanceInventory = serviceInstanceInventoryCache.get(instanceId);
if (Objects.nonNull(serviceInstanceInventory)) {
serviceInventoryRegister.heartbeat(serviceInstanceInventory.getServiceId(), heartBeatTime);
} else {
logger.warn("Can't found service by service instance id from cache, service instance id is: {}", instanceId);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return responseJson;
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.rest;
import com.google.gson.*;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.register.service.INetworkAddressInventoryRegister;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.jetty.JettyJsonHandler;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class NetworkAddressRegisterServletHandler extends JettyJsonHandler {
private static final Logger logger = LoggerFactory.getLogger(NetworkAddressRegisterServletHandler.class);
private final INetworkAddressInventoryRegister networkAddressInventoryRegister;
private Gson gson = new Gson();
private static final String NETWORK_ADDRESS = "n";
private static final String ADDRESS_ID = "i";
public NetworkAddressRegisterServletHandler(ModuleManager moduleManager) {
this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class);
}
@Override public String pathSpec() {
return "/networkAddress/register";
}
@Override protected JsonElement doGet(HttpServletRequest req) {
throw new UnsupportedOperationException();
}
@Override protected JsonElement doPost(HttpServletRequest req) {
JsonArray responseArray = new JsonArray();
try {
JsonArray networkAddresses = gson.fromJson(req.getReader(), JsonArray.class);
for (int i = 0; i < networkAddresses.size(); i++) {
String networkAddress = networkAddresses.get(i).getAsString();
if (logger.isDebugEnabled()) {
logger.debug("network getAddress register, network getAddress: {}", networkAddress);
}
int addressId = networkAddressInventoryRegister.getOrCreate(networkAddress, null);
JsonObject mapping = new JsonObject();
mapping.addProperty(ADDRESS_ID, addressId);
mapping.addProperty(NETWORK_ADDRESS, networkAddress);
responseArray.add(mapping);
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return responseArray;
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5.rest;
import com.google.gson.*;
import java.io.IOException;
import java.util.Objects;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.apm.network.language.agent.SpanType;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.register.service.IEndpointInventoryRegister;
import org.apache.skywalking.oap.server.core.source.DetectPoint;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.jetty.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class ServiceNameDiscoveryServiceHandler extends JettyJsonHandler {
private static final Logger logger = LoggerFactory.getLogger(ServiceNameDiscoveryServiceHandler.class);
private final IEndpointInventoryRegister inventoryService;
private final Gson gson = new Gson();
private static final String APPLICATION_ID = "ai";
private static final String SERVICE_NAME = "sn";
private static final String SRC_SPAN_TYPE = "st";
private static final String SERVICE_ID = "si";
private static final String ELEMENT = "el";
public ServiceNameDiscoveryServiceHandler(ModuleManager moduleManager) {
this.inventoryService = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class);
}
@Override public String pathSpec() {
return "/servicename/discovery";
}
@Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException {
throw new UnsupportedOperationException();
}
@Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException {
JsonArray responseArray = new JsonArray();
try {
JsonArray services = gson.fromJson(req.getReader(), JsonArray.class);
for (JsonElement service : services) {
int applicationId = service.getAsJsonObject().get(APPLICATION_ID).getAsInt();
String serviceName = service.getAsJsonObject().get(SERVICE_NAME).getAsString();
int srcSpanType = service.getAsJsonObject().get(SRC_SPAN_TYPE).getAsInt();
SpanType spanType = SpanType.forNumber(srcSpanType);
if (Objects.nonNull(spanType)) {
int serviceId = inventoryService.getOrCreate(applicationId, serviceName, DetectPoint.fromSpanType(spanType));
if (serviceId != 0) {
JsonObject responseJson = new JsonObject();
responseJson.addProperty(SERVICE_ID, serviceId);
responseJson.add(ELEMENT, service);
responseArray.add(responseJson);
}
}
}
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return responseArray;
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5;
import io.grpc.*;
import io.grpc.stub.MetadataUtils;
import org.apache.skywalking.apm.network.language.agent.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class ApplicationRegisterHandlerTestCase {
private static final Logger logger = LoggerFactory.getLogger(ApplicationRegisterHandlerTestCase.class);
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
ApplicationRegisterServiceGrpc.ApplicationRegisterServiceBlockingStub stub = ApplicationRegisterServiceGrpc.newBlockingStub(channel);
Metadata authHeader = new Metadata();
authHeader.put(Metadata.Key.of("Authentication", Metadata.ASCII_STRING_MARSHALLER), "c4a4baabf931f2379bdfe53a450ecb89");
stub = MetadataUtils.attachHeaders(stub, authHeader);
Application.Builder application = Application.newBuilder();
application.setApplicationCode("dubbox-consumer");
ApplicationMapping applicationMapping = stub.applicationCodeRegister(application.build());
logger.info("application id: {}", applicationMapping.getApplication().getValue());
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5;
import io.grpc.*;
import org.apache.skywalking.apm.network.language.agent.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class InstanceDiscoveryServiceHandlerTestCase {
private static final Logger logger = LoggerFactory.getLogger(InstanceDiscoveryServiceHandlerTestCase.class);
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
InstanceDiscoveryServiceGrpc.InstanceDiscoveryServiceBlockingStub stub = InstanceDiscoveryServiceGrpc.newBlockingStub(channel);
ApplicationInstance.Builder applicationInstance = ApplicationInstance.newBuilder();
applicationInstance.setApplicationId(1);
applicationInstance.setAgentUUID("Test");
applicationInstance.setRegisterTime(System.currentTimeMillis());
OSInfo.Builder osInfo = OSInfo.newBuilder();
osInfo.setOsName("mac os");
osInfo.setHostname("pengys");
osInfo.setProcessNo(1);
osInfo.addIpv4S("10.0.0.1");
osInfo.addIpv4S("10.0.0.2");
applicationInstance.setOsinfo(osInfo);
ApplicationInstanceMapping instanceMapping = stub.registerInstance(applicationInstance.build());
logger.info("application id: {}, application instance id: {}", instanceMapping.getApplicationId(), instanceMapping.getApplicationInstanceId());
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5;
import io.grpc.*;
import org.apache.skywalking.apm.network.language.agent.*;
/**
* @author peng-yongsheng
*/
public class InstanceHeartBeatTestCase {
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
InstanceDiscoveryServiceGrpc.InstanceDiscoveryServiceBlockingStub stub = InstanceDiscoveryServiceGrpc.newBlockingStub(channel);
ApplicationInstanceHeartbeat.Builder builder = ApplicationInstanceHeartbeat.newBuilder();
builder.setApplicationInstanceId(2);
builder.setHeartbeatTime(System.currentTimeMillis() + 5 * 1000 * 60);
Downstream heartbeat = stub.heartbeat(builder.build());
builder.setApplicationInstanceId(3);
heartbeat = stub.heartbeat(builder.build());
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5;
import io.grpc.*;
import org.apache.skywalking.apm.network.language.agent.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class NetworkAddressRegisterServiceHandlerTestCase {
private static final Logger logger = LoggerFactory.getLogger(NetworkAddressRegisterServiceHandlerTestCase.class);
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
NetworkAddressRegisterServiceGrpc.NetworkAddressRegisterServiceBlockingStub stub = NetworkAddressRegisterServiceGrpc.newBlockingStub(channel);
NetworkAddresses.Builder networkAddresses = NetworkAddresses.newBuilder();
networkAddresses.addAddresses("127.0.0.1:8080");
NetworkAddressMappings addressMappings = stub.batchRegister(networkAddresses.build());
for (KeyWithIntegerValue value : addressMappings.getAddressIdsList()) {
logger.info("key: {}, value: {}", value.getKey(), value.getValue());
}
}
}
/*
* 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.oap.server.receiver.register.provider.handler.v5;
import io.grpc.*;
import org.apache.skywalking.apm.network.language.agent.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class ServiceNameDiscoveryHandlerTestCase {
private static final Logger logger = LoggerFactory.getLogger(ServiceNameDiscoveryHandlerTestCase.class);
public static void main(String[] args) {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
ServiceNameDiscoveryServiceGrpc.ServiceNameDiscoveryServiceBlockingStub stub = ServiceNameDiscoveryServiceGrpc.newBlockingStub(channel);
ServiceNameCollection.Builder serviceNameCollection = ServiceNameCollection.newBuilder();
ServiceNameElement.Builder serviceNameElement = ServiceNameElement.newBuilder();
serviceNameElement.setApplicationId(1);
serviceNameElement.setServiceName("org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()");
serviceNameElement.setSrcSpanType(SpanType.Entry);
serviceNameCollection.addElements(serviceNameElement);
ServiceNameMappingCollection collection = stub.discovery(serviceNameCollection.build());
for (ServiceNameMappingElement element : collection.getElementsList()) {
logger.info("service id: {}", element.getServiceId());
}
}
}
...@@ -22,7 +22,6 @@ import org.apache.skywalking.oap.server.configuration.api.ConfigurationModule; ...@@ -22,7 +22,6 @@ import org.apache.skywalking.oap.server.configuration.api.ConfigurationModule;
import org.apache.skywalking.oap.server.configuration.api.DynamicConfigurationService; import org.apache.skywalking.oap.server.configuration.api.DynamicConfigurationService;
import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister;
import org.apache.skywalking.oap.server.core.server.JettyHandlerRegister;
import org.apache.skywalking.oap.server.library.module.ModuleConfig; import org.apache.skywalking.oap.server.library.module.ModuleConfig;
import org.apache.skywalking.oap.server.library.module.ModuleDefine; import org.apache.skywalking.oap.server.library.module.ModuleDefine;
import org.apache.skywalking.oap.server.library.module.ModuleProvider; import org.apache.skywalking.oap.server.library.module.ModuleProvider;
...@@ -30,11 +29,8 @@ import org.apache.skywalking.oap.server.library.module.ModuleStartException; ...@@ -30,11 +29,8 @@ import org.apache.skywalking.oap.server.library.module.ModuleStartException;
import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException; import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule; import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule;
import org.apache.skywalking.oap.server.receiver.trace.module.TraceModule; import org.apache.skywalking.oap.server.receiver.trace.module.TraceModule;
import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.grpc.TraceSegmentServiceHandler;
import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.rest.TraceSegmentServletHandler;
import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v6.grpc.TraceSegmentReportServiceHandler; import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v6.grpc.TraceSegmentReportServiceHandler;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.ISegmentParserService; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.ISegmentParserService;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParse;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParseV2; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParseV2;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParserListenerManager; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParserListenerManager;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParserServiceImpl; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParserServiceImpl;
...@@ -53,7 +49,6 @@ import java.io.IOException; ...@@ -53,7 +49,6 @@ import java.io.IOException;
public class TraceModuleProvider extends ModuleProvider { public class TraceModuleProvider extends ModuleProvider {
private final TraceServiceModuleConfig moduleConfig; private final TraceServiceModuleConfig moduleConfig;
private SegmentParse.Producer segmentProducer;
private SegmentParseV2.Producer segmentProducerV2; private SegmentParseV2.Producer segmentProducerV2;
private DBLatencyThresholdsAndWatcher thresholds; private DBLatencyThresholdsAndWatcher thresholds;
private UninstrumentedGatewaysConfig uninstrumentedGatewaysConfig; private UninstrumentedGatewaysConfig uninstrumentedGatewaysConfig;
...@@ -82,7 +77,6 @@ public class TraceModuleProvider extends ModuleProvider { ...@@ -82,7 +77,6 @@ public class TraceModuleProvider extends ModuleProvider {
moduleConfig.setDbLatencyThresholdsAndWatcher(thresholds); moduleConfig.setDbLatencyThresholdsAndWatcher(thresholds);
moduleConfig.setUninstrumentedGatewaysConfig(uninstrumentedGatewaysConfig); moduleConfig.setUninstrumentedGatewaysConfig(uninstrumentedGatewaysConfig);
segmentProducer = new SegmentParse.Producer(getManager(), listenerManager(), moduleConfig);
segmentProducerV2 = new SegmentParseV2.Producer(getManager(), listenerManager(), moduleConfig); segmentProducerV2 = new SegmentParseV2.Producer(getManager(), listenerManager(), moduleConfig);
this.registerServiceImplementation(ISegmentParserService.class, new SegmentParserServiceImpl(segmentProducerV2)); this.registerServiceImplementation(ISegmentParserService.class, new SegmentParserServiceImpl(segmentProducerV2));
...@@ -103,19 +97,13 @@ public class TraceModuleProvider extends ModuleProvider { ...@@ -103,19 +97,13 @@ public class TraceModuleProvider extends ModuleProvider {
@Override public void start() throws ModuleStartException { @Override public void start() throws ModuleStartException {
DynamicConfigurationService dynamicConfigurationService = getManager().find(ConfigurationModule.NAME).provider().getService(DynamicConfigurationService.class); DynamicConfigurationService dynamicConfigurationService = getManager().find(ConfigurationModule.NAME).provider().getService(DynamicConfigurationService.class);
GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(GRPCHandlerRegister.class); GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(GRPCHandlerRegister.class);
JettyHandlerRegister jettyHandlerRegister = getManager().find(SharingServerModule.NAME).provider().getService(JettyHandlerRegister.class);
try { try {
dynamicConfigurationService.registerConfigChangeWatcher(thresholds); dynamicConfigurationService.registerConfigChangeWatcher(thresholds);
dynamicConfigurationService.registerConfigChangeWatcher(uninstrumentedGatewaysConfig); dynamicConfigurationService.registerConfigChangeWatcher(uninstrumentedGatewaysConfig);
grpcHandlerRegister.addHandler(new TraceSegmentServiceHandler(segmentProducer));
grpcHandlerRegister.addHandler(new TraceSegmentReportServiceHandler(segmentProducerV2, getManager())); grpcHandlerRegister.addHandler(new TraceSegmentReportServiceHandler(segmentProducerV2, getManager()));
jettyHandlerRegister.addHandler(new TraceSegmentServletHandler(segmentProducer));
SegmentStandardizationWorker standardizationWorker = new SegmentStandardizationWorker(getManager(), segmentProducer, moduleConfig.getBufferPath() + "v5", moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart(), false); SegmentStandardizationWorker standardizationWorkerV2 = new SegmentStandardizationWorker(getManager(), segmentProducerV2, moduleConfig.getBufferPath(), moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart());
segmentProducer.setStandardizationWorker(standardizationWorker);
SegmentStandardizationWorker standardizationWorkerV2 = new SegmentStandardizationWorker(getManager(), segmentProducerV2, moduleConfig.getBufferPath(), moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart(), true);
segmentProducerV2.setStandardizationWorker(standardizationWorkerV2); segmentProducerV2.setStandardizationWorker(standardizationWorkerV2);
} catch (IOException e) { } catch (IOException e) {
throw new ModuleStartException(e.getMessage(), e); throw new ModuleStartException(e.getMessage(), e);
......
/*
* 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.oap.server.receiver.trace.provider.handler.v5.grpc;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author peng-yongsheng
*/
public enum SegmentCounter {
INSTANCE;
private final AtomicLong counter = new AtomicLong(0);
public long incrementAndGet() {
return counter.incrementAndGet();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.grpc;
import io.grpc.stub.StreamObserver;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParse;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class TraceSegmentServiceHandler extends TraceSegmentServiceGrpc.TraceSegmentServiceImplBase implements GRPCHandler {
private static final Logger logger = LoggerFactory.getLogger(TraceSegmentServiceHandler.class);
private final Boolean debug;
private final SegmentParse.Producer segmentProducer;
public TraceSegmentServiceHandler(SegmentParse.Producer segmentProducer) {
this.debug = System.getProperty("debug") != null;
this.segmentProducer = segmentProducer;
}
@Override public StreamObserver<UpstreamSegment> collect(StreamObserver<Downstream> responseObserver) {
return new StreamObserver<UpstreamSegment>() {
@Override public void onNext(UpstreamSegment segment) {
if (logger.isDebugEnabled()) {
logger.debug("receive segment");
}
segmentProducer.send(segment, SegmentParse.Source.Agent);
if (debug) {
long count = SegmentCounter.INSTANCE.incrementAndGet();
if (count % 100000 == 0) {
logger.info("received segment count: {}", count);
}
}
}
@Override public void onError(Throwable throwable) {
logger.error(throwable.getMessage(), throwable);
responseObserver.onCompleted();
}
@Override public void onCompleted() {
responseObserver.onNext(Downstream.newBuilder().build());
responseObserver.onCompleted();
}
};
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest;
import com.google.gson.JsonElement;
import com.google.gson.stream.JsonReader;
import java.io.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.skywalking.oap.server.library.server.jetty.JettyJsonHandler;
import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.rest.reader.*;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParse;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class TraceSegmentServletHandler extends JettyJsonHandler {
private static final Logger logger = LoggerFactory.getLogger(TraceSegmentServletHandler.class);
private final SegmentParse.Producer segmentProducer;
public TraceSegmentServletHandler(SegmentParse.Producer segmentProducer) {
this.segmentProducer = segmentProducer;
}
@Override public String pathSpec() {
return "/segments";
}
@Override protected JsonElement doGet(HttpServletRequest req) {
throw new UnsupportedOperationException();
}
@Override protected JsonElement doPost(HttpServletRequest req) {
if (logger.isDebugEnabled()) {
logger.debug("receive stream segment");
}
try {
BufferedReader bufferedReader = req.getReader();
read(bufferedReader);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
return null;
}
private TraceSegmentJsonReader jsonReader = new TraceSegmentJsonReader();
private void read(BufferedReader bufferedReader) throws IOException {
JsonReader reader = new JsonReader(bufferedReader);
reader.beginArray();
while (reader.hasNext()) {
TraceSegment traceSegment = jsonReader.read(reader);
segmentProducer.send(traceSegment.getUpstreamSegment(), SegmentParse.Source.Agent);
}
reader.endArray();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.apache.skywalking.apm.network.language.agent.KeyWithStringValue;
/**
* @author peng-yongsheng
*/
public class KeyWithStringValueJsonReader implements StreamJsonReader<KeyWithStringValue> {
private static final String KEY = "k";
private static final String VALUE = "v";
@Override public KeyWithStringValue read(JsonReader reader) throws IOException {
KeyWithStringValue.Builder builder = KeyWithStringValue.newBuilder();
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case KEY:
builder.setKey(reader.nextString());
break;
case VALUE:
builder.setValue(reader.nextString());
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
return builder.build();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.apache.skywalking.apm.network.language.agent.LogMessage;
/**
* @author peng-yongsheng
*/
public class LogJsonReader implements StreamJsonReader<LogMessage> {
private KeyWithStringValueJsonReader keyWithStringValueJsonReader = new KeyWithStringValueJsonReader();
private static final String TIME = "ti";
private static final String LOG_DATA = "ld";
@Override public LogMessage read(JsonReader reader) throws IOException {
LogMessage.Builder builder = LogMessage.newBuilder();
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case TIME:
builder.setTime(reader.nextLong());
break;
case LOG_DATA:
reader.beginArray();
while (reader.hasNext()) {
builder.addData(keyWithStringValueJsonReader.read(reader));
}
reader.endArray();
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
return builder.build();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentReference;
/**
* @author peng-yongsheng
*/
public class ReferenceJsonReader implements StreamJsonReader<TraceSegmentReference> {
private UniqueIdJsonReader uniqueIdJsonReader = new UniqueIdJsonReader();
private static final String PARENT_TRACE_SEGMENT_ID = "pts";
private static final String PARENT_APPLICATION_INSTANCE_ID = "pii";
private static final String PARENT_SPAN_ID = "psp";
private static final String PARENT_SERVICE_ID = "psi";
private static final String PARENT_SERVICE_NAME = "psn";
private static final String NETWORK_ADDRESS_ID = "ni";
private static final String NETWORK_ADDRESS = "nn";
private static final String ENTRY_APPLICATION_INSTANCE_ID = "eii";
private static final String ENTRY_SERVICE_ID = "esi";
private static final String ENTRY_SERVICE_NAME = "esn";
private static final String REF_TYPE_VALUE = "rv";
@Override public TraceSegmentReference read(JsonReader reader) throws IOException {
TraceSegmentReference.Builder builder = TraceSegmentReference.newBuilder();
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case PARENT_TRACE_SEGMENT_ID:
builder.setParentTraceSegmentId(uniqueIdJsonReader.read(reader));
break;
case PARENT_APPLICATION_INSTANCE_ID:
builder.setParentApplicationInstanceId(reader.nextInt());
break;
case PARENT_SPAN_ID:
builder.setParentSpanId(reader.nextInt());
break;
case PARENT_SERVICE_ID:
builder.setParentServiceId(reader.nextInt());
break;
case PARENT_SERVICE_NAME:
builder.setParentServiceName(reader.nextString());
break;
case NETWORK_ADDRESS_ID:
builder.setNetworkAddressId(reader.nextInt());
break;
case NETWORK_ADDRESS:
builder.setNetworkAddress(reader.nextString());
break;
case ENTRY_APPLICATION_INSTANCE_ID:
builder.setEntryApplicationInstanceId(reader.nextInt());
break;
case ENTRY_SERVICE_ID:
builder.setEntryServiceId(reader.nextInt());
break;
case ENTRY_SERVICE_NAME:
builder.setEntryServiceName(reader.nextString());
break;
case REF_TYPE_VALUE:
builder.setRefTypeValue(reader.nextInt());
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
return builder.build();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentObject;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class SegmentJsonReader implements StreamJsonReader<TraceSegmentObject.Builder> {
private static final Logger logger = LoggerFactory.getLogger(SegmentJsonReader.class);
private UniqueIdJsonReader uniqueIdJsonReader = new UniqueIdJsonReader();
private SpanJsonReader spanJsonReader = new SpanJsonReader();
private static final String TRACE_SEGMENT_ID = "ts";
private static final String APPLICATION_ID = "ai";
private static final String APPLICATION_INSTANCE_ID = "ii";
private static final String SPANS = "ss";
@Override public TraceSegmentObject.Builder read(JsonReader reader) throws IOException {
TraceSegmentObject.Builder builder = TraceSegmentObject.newBuilder();
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case TRACE_SEGMENT_ID:
builder.setTraceSegmentId(uniqueIdJsonReader.read(reader));
if (logger.isDebugEnabled()) {
StringBuilder segmentId = new StringBuilder();
builder.getTraceSegmentId().getIdPartsList().forEach(idPart -> segmentId.append(idPart));
logger.debug("segment id: {}", segmentId);
}
break;
case APPLICATION_ID:
builder.setApplicationId(reader.nextInt());
break;
case APPLICATION_INSTANCE_ID:
builder.setApplicationInstanceId(reader.nextInt());
break;
case SPANS:
reader.beginArray();
while (reader.hasNext()) {
builder.addSpans(spanJsonReader.read(reader));
}
reader.endArray();
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
return builder;
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.apache.skywalking.apm.network.language.agent.SpanObject;
/**
* @author peng-yongsheng
*/
public class SpanJsonReader implements StreamJsonReader<SpanObject> {
private KeyWithStringValueJsonReader keyWithStringValueJsonReader = new KeyWithStringValueJsonReader();
private LogJsonReader logJsonReader = new LogJsonReader();
private ReferenceJsonReader referenceJsonReader = new ReferenceJsonReader();
private static final String SPAN_ID = "si";
private static final String SPAN_TYPE_VALUE = "tv";
private static final String SPAN_LAYER_VALUE = "lv";
private static final String PARENT_SPAN_ID = "ps";
private static final String START_TIME = "st";
private static final String END_TIME = "et";
private static final String COMPONENT_ID = "ci";
private static final String COMPONENT_NAME = "cn";
private static final String OPERATION_NAME_ID = "oi";
private static final String OPERATION_NAME = "on";
private static final String PEER_ID = "pi";
private static final String PEER = "pn";
private static final String IS_ERROR = "ie";
private static final String TRACE_SEGMENT_REFERENCE = "rs";
private static final String TAGS = "to";
private static final String LOGS = "lo";
@Override public SpanObject read(JsonReader reader) throws IOException {
SpanObject.Builder builder = SpanObject.newBuilder();
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case SPAN_ID:
builder.setSpanId(reader.nextInt());
break;
case SPAN_TYPE_VALUE:
builder.setSpanTypeValue(reader.nextInt());
break;
case SPAN_LAYER_VALUE:
builder.setSpanLayerValue(reader.nextInt());
break;
case PARENT_SPAN_ID:
builder.setParentSpanId(reader.nextInt());
break;
case START_TIME:
builder.setStartTime(reader.nextLong());
break;
case END_TIME:
builder.setEndTime(reader.nextLong());
break;
case COMPONENT_ID:
builder.setComponentId(reader.nextInt());
break;
case COMPONENT_NAME:
builder.setComponent(reader.nextString());
break;
case OPERATION_NAME_ID:
builder.setOperationNameId(reader.nextInt());
break;
case OPERATION_NAME:
builder.setOperationName(reader.nextString());
break;
case PEER_ID:
builder.setPeerId(reader.nextInt());
break;
case PEER:
builder.setPeer(reader.nextString());
break;
case IS_ERROR:
builder.setIsError(reader.nextBoolean());
break;
case TRACE_SEGMENT_REFERENCE:
reader.beginArray();
while (reader.hasNext()) {
builder.addRefs(referenceJsonReader.read(reader));
}
reader.endArray();
break;
case TAGS:
reader.beginArray();
while (reader.hasNext()) {
builder.addTags(keyWithStringValueJsonReader.read(reader));
}
reader.endArray();
break;
case LOGS:
reader.beginArray();
while (reader.hasNext()) {
builder.addLogs(logJsonReader.read(reader));
}
reader.endArray();
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
return builder.build();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import org.apache.skywalking.apm.network.language.agent.*;
/**
* @author peng-yongsheng
*/
public class TraceSegment {
private UpstreamSegment.Builder builder;
public TraceSegment() {
builder = UpstreamSegment.newBuilder();
}
public void addGlobalTraceId(UniqueId.Builder globalTraceId) {
builder.addGlobalTraceIds(globalTraceId);
}
public void setTraceSegmentBuilder(TraceSegmentObject.Builder traceSegmentBuilder) {
builder.setSegment(traceSegmentBuilder.build().toByteString());
}
public UpstreamSegment getUpstreamSegment() {
return builder.build();
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class TraceSegmentJsonReader implements StreamJsonReader<TraceSegment> {
private static final Logger logger = LoggerFactory.getLogger(TraceSegmentJsonReader.class);
private UniqueIdJsonReader uniqueIdJsonReader = new UniqueIdJsonReader();
private SegmentJsonReader segmentJsonReader = new SegmentJsonReader();
private static final String GLOBAL_TRACE_IDS = "gt";
private static final String SEGMENT = "sg";
@Override public TraceSegment read(JsonReader reader) throws IOException {
TraceSegment traceSegment = new TraceSegment();
reader.beginObject();
while (reader.hasNext()) {
switch (reader.nextName()) {
case GLOBAL_TRACE_IDS:
reader.beginArray();
while (reader.hasNext()) {
traceSegment.addGlobalTraceId(uniqueIdJsonReader.read(reader));
}
reader.endArray();
break;
case SEGMENT:
traceSegment.setTraceSegmentBuilder(segmentJsonReader.read(reader));
break;
default:
reader.skipValue();
break;
}
}
reader.endObject();
return traceSegment;
}
}
/*
* 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.oap.server.receiver.trace.provider.handler.v5.rest.reader;
import com.google.gson.stream.JsonReader;
import java.io.IOException;
import org.apache.skywalking.apm.network.language.agent.UniqueId;
/**
* @author peng-yongsheng
*/
public class UniqueIdJsonReader implements StreamJsonReader<UniqueId.Builder> {
@Override public UniqueId.Builder read(JsonReader reader) throws IOException {
UniqueId.Builder builder = UniqueId.newBuilder();
reader.beginArray();
while (reader.hasNext()) {
builder.addIdParts(reader.nextLong());
}
reader.endArray();
return builder;
}
}
/*
* 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.oap.server.receiver.trace.provider.parser;
import com.google.protobuf.InvalidProtocolBufferException;
import java.util.*;
import lombok.Setter;
import org.apache.skywalking.apm.network.language.agent.*;
import org.apache.skywalking.oap.server.library.buffer.*;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.*;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.*;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.standardization.*;
import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
import org.apache.skywalking.oap.server.telemetry.api.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
public class SegmentParse {
private static final Logger logger = LoggerFactory.getLogger(SegmentParse.class);
private final ModuleManager moduleManager;
private final List<SpanListener> spanListeners;
private final SegmentParserListenerManager listenerManager;
private final SegmentCoreInfo segmentCoreInfo;
private final TraceServiceModuleConfig config;
@Setter private SegmentStandardizationWorker standardizationWorker;
private volatile static CounterMetrics TRACE_BUFFER_FILE_RETRY;
private volatile static CounterMetrics TRACE_BUFFER_FILE_OUT;
private volatile static CounterMetrics TRACE_PARSE_ERROR;
private SegmentParse(ModuleManager moduleManager, SegmentParserListenerManager listenerManager,
TraceServiceModuleConfig config) {
this.moduleManager = moduleManager;
this.listenerManager = listenerManager;
this.spanListeners = new LinkedList<>();
this.segmentCoreInfo = new SegmentCoreInfo();
this.segmentCoreInfo.setStartTime(Long.MAX_VALUE);
this.segmentCoreInfo.setEndTime(Long.MIN_VALUE);
this.segmentCoreInfo.setV2(false);
this.config = config;
MetricsCreator metricsCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricsCreator.class);
TRACE_BUFFER_FILE_RETRY = metricsCreator.createCounter("v5_trace_buffer_file_retry", "The number of retry trace segment from the buffer file, but haven't registered successfully.",
MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE);
TRACE_BUFFER_FILE_OUT = metricsCreator.createCounter("v5_trace_buffer_file_out", "The number of trace segment out of the buffer file",
MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE);
TRACE_PARSE_ERROR = metricsCreator.createCounter("v5_trace_parse_error", "The number of trace segment out of the buffer file",
MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE);
}
public boolean parse(BufferData<UpstreamSegment> bufferData, Source source) {
createSpanListeners();
try {
UpstreamSegment upstreamSegment = bufferData.getMessageType();
List<UniqueId> traceIds = upstreamSegment.getGlobalTraceIdsList();
if (bufferData.getV1Segment() == null) {
bufferData.setV1Segment(parseBinarySegment(upstreamSegment));
}
TraceSegmentObject segmentObject = bufferData.getV1Segment();
SegmentDecorator segmentDecorator = new SegmentDecorator(segmentObject);
if (!preBuild(traceIds, segmentDecorator)) {
if (logger.isDebugEnabled()) {
logger.debug("This segment id exchange not success, write to buffer file, id: {}", segmentCoreInfo.getSegmentId());
}
if (source.equals(Source.Agent)) {
writeToBufferFile(segmentCoreInfo.getSegmentId(), upstreamSegment);
} else {
// from SegmentSource.Buffer
TRACE_BUFFER_FILE_RETRY.inc();
}
return false;
} else {
if (logger.isDebugEnabled()) {
logger.debug("This segment id exchange success, id: {}", segmentCoreInfo.getSegmentId());
}
TRACE_BUFFER_FILE_OUT.inc();
notifyListenerToBuild();
return true;
}
} catch (Throwable e) {
TRACE_PARSE_ERROR.inc();
logger.error(e.getMessage(), e);
return true;
}
}
private TraceSegmentObject parseBinarySegment(UpstreamSegment segment) throws InvalidProtocolBufferException {
return TraceSegmentObject.parseFrom(segment.getSegment());
}
private boolean preBuild(List<UniqueId> traceIds, SegmentDecorator segmentDecorator) {
StringBuilder segmentIdBuilder = new StringBuilder();
for (int i = 0; i < segmentDecorator.getTraceSegmentId().getIdPartsList().size(); i++) {
if (i == 0) {
segmentIdBuilder.append(segmentDecorator.getTraceSegmentId().getIdPartsList().get(i));
} else {
segmentIdBuilder.append(".").append(segmentDecorator.getTraceSegmentId().getIdPartsList().get(i));
}
}
for (UniqueId uniqueId : traceIds) {
notifyGlobalsListener(uniqueId);
}
segmentCoreInfo.setSegmentId(segmentIdBuilder.toString());
segmentCoreInfo.setServiceId(segmentDecorator.getServiceId());
segmentCoreInfo.setServiceInstanceId(segmentDecorator.getServiceInstanceId());
segmentCoreInfo.setDataBinary(segmentDecorator.toByteArray());
segmentCoreInfo.setV2(false);
boolean exchanged = true;
for (int i = 0; i < segmentDecorator.getSpansCount(); i++) {
SpanDecorator spanDecorator = segmentDecorator.getSpans(i);
if (!SpanExchanger.getInstance(moduleManager).exchange(spanDecorator, segmentCoreInfo.getServiceId())) {
exchanged = false;
} else {
for (int j = 0; j < spanDecorator.getRefsCount(); j++) {
ReferenceDecorator referenceDecorator = spanDecorator.getRefs(j);
if (!ReferenceIdExchanger.getInstance(moduleManager).exchange(referenceDecorator, segmentCoreInfo.getServiceId())) {
exchanged = false;
}
}
}
if (segmentCoreInfo.getStartTime() > spanDecorator.getStartTime()) {
segmentCoreInfo.setStartTime(spanDecorator.getStartTime());
}
if (segmentCoreInfo.getEndTime() < spanDecorator.getEndTime()) {
segmentCoreInfo.setEndTime(spanDecorator.getEndTime());
}
segmentCoreInfo.setError(spanDecorator.getIsError() || segmentCoreInfo.isError());
}
if (exchanged) {
long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(segmentCoreInfo.getStartTime());
segmentCoreInfo.setMinuteTimeBucket(minuteTimeBucket);
for (int i = 0; i < segmentDecorator.getSpansCount(); i++) {
SpanDecorator spanDecorator = segmentDecorator.getSpans(i);
if (spanDecorator.getSpanId() == 0) {
notifyFirstListener(spanDecorator);
}
if (SpanType.Exit.equals(spanDecorator.getSpanType())) {
notifyExitListener(spanDecorator);
} else if (SpanType.Entry.equals(spanDecorator.getSpanType())) {
notifyEntryListener(spanDecorator);
} else if (SpanType.Local.equals(spanDecorator.getSpanType())) {
notifyLocalListener(spanDecorator);
} else {
logger.error("span type value was unexpected, span type name: {}", spanDecorator.getSpanType().name());
}
}
}
return exchanged;
}
private void writeToBufferFile(String id, UpstreamSegment upstreamSegment) {
if (logger.isDebugEnabled()) {
logger.debug("push to segment buffer write worker, id: {}", id);
}
SegmentStandardization standardization = new SegmentStandardization(id);
standardization.setUpstreamSegment(upstreamSegment);
standardizationWorker.in(standardization);
}
private void notifyListenerToBuild() {
spanListeners.forEach(SpanListener::build);
}
private void notifyExitListener(SpanDecorator spanDecorator) {
spanListeners.forEach(listener -> {
if (listener.containsPoint(SpanListener.Point.Exit)) {
((ExitSpanListener)listener).parseExit(spanDecorator, segmentCoreInfo);
}
});
}
private void notifyEntryListener(SpanDecorator spanDecorator) {
spanListeners.forEach(listener -> {
if (listener.containsPoint(SpanListener.Point.Entry)) {
((EntrySpanListener)listener).parseEntry(spanDecorator, segmentCoreInfo);
}
});
}
private void notifyLocalListener(SpanDecorator spanDecorator) {
spanListeners.forEach(listener -> {
if (listener.containsPoint(SpanListener.Point.Local)) {
((LocalSpanListener)listener).parseLocal(spanDecorator, segmentCoreInfo);
}
});
}
private void notifyFirstListener(SpanDecorator spanDecorator) {
spanListeners.forEach(listener -> {
if (listener.containsPoint(SpanListener.Point.First)) {
((FirstSpanListener)listener).parseFirst(spanDecorator, segmentCoreInfo);
}
});
}
private void notifyGlobalsListener(UniqueId uniqueId) {
spanListeners.forEach(listener -> {
if (listener.containsPoint(SpanListener.Point.TraceIds)) {
((GlobalTraceIdsListener)listener).parseGlobalTraceId(uniqueId, segmentCoreInfo);
}
});
}
private void createSpanListeners() {
listenerManager.getSpanListenerFactories().forEach(spanListenerFactory -> spanListeners.add(spanListenerFactory.create(moduleManager, config)));
}
public enum Source {
Agent, Buffer
}
public static class Producer implements DataStreamReader.CallBack<UpstreamSegment> {
@Setter private SegmentStandardizationWorker standardizationWorker;
private final ModuleManager moduleManager;
private final SegmentParserListenerManager listenerManager;
private final TraceServiceModuleConfig config;
public Producer(ModuleManager moduleManager, SegmentParserListenerManager listenerManager,
TraceServiceModuleConfig config) {
this.moduleManager = moduleManager;
this.listenerManager = listenerManager;
this.config = config;
}
public void send(UpstreamSegment segment, Source source) {
SegmentParse segmentParse = new SegmentParse(moduleManager, listenerManager, config);
segmentParse.setStandardizationWorker(standardizationWorker);
segmentParse.parse(new BufferData<>(segment), source);
}
@Override public boolean call(BufferData<UpstreamSegment> bufferData) {
SegmentParse segmentParse = new SegmentParse(moduleManager, listenerManager, config);
segmentParse.setStandardizationWorker(standardizationWorker);
boolean parseResult = segmentParse.parse(bufferData, Source.Buffer);
if (parseResult) {
TRACE_BUFFER_FILE_OUT.inc();
}
return parseResult;
}
}
}
...@@ -19,22 +19,42 @@ ...@@ -19,22 +19,42 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser; package org.apache.skywalking.oap.server.receiver.trace.provider.parser;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import java.util.*; import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import lombok.Setter; import lombok.Setter;
import org.apache.skywalking.apm.network.language.agent.*; import org.apache.skywalking.apm.network.ProtocolVersion;
import org.apache.skywalking.apm.network.language.agent.SpanType;
import org.apache.skywalking.apm.network.language.agent.UniqueId;
import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache; import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache;
import org.apache.skywalking.oap.server.library.buffer.*; import org.apache.skywalking.oap.server.library.buffer.BufferData;
import org.apache.skywalking.oap.server.library.buffer.DataStreamReader;
import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig; import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.ReferenceDecorator;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SegmentCoreInfo;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.standardization.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SegmentDecorator;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SpanDecorator;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.EntrySpanListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.ExitSpanListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.FirstSpanListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.GlobalTraceIdsListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.LocalSpanListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.SpanListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.standardization.ReferenceIdExchanger;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.standardization.SegmentStandardization;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.standardization.SegmentStandardizationWorker;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.standardization.SpanExchanger;
import org.apache.skywalking.oap.server.telemetry.TelemetryModule; import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
import org.apache.skywalking.oap.server.telemetry.api.*; import org.apache.skywalking.oap.server.telemetry.api.CounterMetrics;
import org.slf4j.*; import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* SegmentParseV2 is a replication of SegmentParse, but be compatible with v2 trace protocol. * SegmentParseV2 is a replication of SegmentParse, but be compatible with v2 trace protocol.
...@@ -63,7 +83,7 @@ public class SegmentParseV2 { ...@@ -63,7 +83,7 @@ public class SegmentParseV2 {
this.segmentCoreInfo = new SegmentCoreInfo(); this.segmentCoreInfo = new SegmentCoreInfo();
this.segmentCoreInfo.setStartTime(Long.MAX_VALUE); this.segmentCoreInfo.setStartTime(Long.MAX_VALUE);
this.segmentCoreInfo.setEndTime(Long.MIN_VALUE); this.segmentCoreInfo.setEndTime(Long.MIN_VALUE);
this.segmentCoreInfo.setV2(true); this.segmentCoreInfo.setVersion(ProtocolVersion.V2);
this.config = config; this.config = config;
if (TRACE_BUFFER_FILE_RETRY == null) { if (TRACE_BUFFER_FILE_RETRY == null) {
...@@ -133,25 +153,16 @@ public class SegmentParseV2 { ...@@ -133,25 +153,16 @@ public class SegmentParseV2 {
} }
private boolean preBuild(List<UniqueId> traceIds, SegmentDecorator segmentDecorator) { private boolean preBuild(List<UniqueId> traceIds, SegmentDecorator segmentDecorator) {
StringBuilder segmentIdBuilder = new StringBuilder();
for (int i = 0; i < segmentDecorator.getTraceSegmentId().getIdPartsList().size(); i++) {
if (i == 0) {
segmentIdBuilder.append(segmentDecorator.getTraceSegmentId().getIdPartsList().get(i));
} else {
segmentIdBuilder.append(".").append(segmentDecorator.getTraceSegmentId().getIdPartsList().get(i));
}
}
for (UniqueId uniqueId : traceIds) { for (UniqueId uniqueId : traceIds) {
notifyGlobalsListener(uniqueId); notifyGlobalsListener(uniqueId);
} }
segmentCoreInfo.setSegmentId(segmentIdBuilder.toString()); final String segmentId = segmentDecorator.getTraceSegmentId().getIdPartsList().stream().map(String::valueOf).collect(Collectors.joining("."));
segmentCoreInfo.setSegmentId(segmentId);
segmentCoreInfo.setServiceId(segmentDecorator.getServiceId()); segmentCoreInfo.setServiceId(segmentDecorator.getServiceId());
segmentCoreInfo.setServiceInstanceId(segmentDecorator.getServiceInstanceId()); segmentCoreInfo.setServiceInstanceId(segmentDecorator.getServiceInstanceId());
segmentCoreInfo.setDataBinary(segmentDecorator.toByteArray()); segmentCoreInfo.setDataBinary(segmentDecorator.toByteArray());
segmentCoreInfo.setV2(true); segmentCoreInfo.setVersion(ProtocolVersion.V2);
boolean exchanged = true; boolean exchanged = true;
......
...@@ -27,7 +27,7 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener. ...@@ -27,7 +27,7 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.
*/ */
public class SegmentParserListenerManager implements ISegmentParserListenerManager { public class SegmentParserListenerManager implements ISegmentParserListenerManager {
private List<SpanListenerFactory> spanListenerFactories; private final List<SpanListenerFactory> spanListenerFactories;
public SegmentParserListenerManager() { public SegmentParserListenerManager() {
this.spanListenerFactories = new LinkedList<>(); this.spanListenerFactories = new LinkedList<>();
......
...@@ -18,9 +18,6 @@ ...@@ -18,9 +18,6 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator;
import org.apache.skywalking.apm.network.language.agent.RefType;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentReference;
import org.apache.skywalking.apm.network.language.agent.UniqueId;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference; import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
/** /**
...@@ -29,60 +26,26 @@ import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference; ...@@ -29,60 +26,26 @@ import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference;
public class ReferenceDecorator implements StandardBuilder { public class ReferenceDecorator implements StandardBuilder {
private boolean isOrigin = true; private boolean isOrigin = true;
private StandardBuilder standardBuilder; private final StandardBuilder standardBuilder;
private TraceSegmentReference referenceObject;
private TraceSegmentReference.Builder referenceBuilder;
private final boolean isV2;
private SegmentReference referenceObjectV2; private SegmentReference referenceObjectV2;
private SegmentReference.Builder referenceBuilderV2; private SegmentReference.Builder referenceBuilderV2;
public ReferenceDecorator(TraceSegmentReference referenceObject, StandardBuilder standardBuilder) {
this.referenceObject = referenceObject;
this.standardBuilder = standardBuilder;
isV2 = false;
}
public ReferenceDecorator(TraceSegmentReference.Builder referenceBuilder, StandardBuilder standardBuilder) {
this.referenceBuilder = referenceBuilder;
this.standardBuilder = standardBuilder;
this.isOrigin = false;
isV2 = false;
}
public ReferenceDecorator(SegmentReference referenceObject, StandardBuilder standardBuilder) { public ReferenceDecorator(SegmentReference referenceObject, StandardBuilder standardBuilder) {
this.referenceObjectV2 = referenceObject; this.referenceObjectV2 = referenceObject;
this.standardBuilder = standardBuilder; this.standardBuilder = standardBuilder;
isV2 = true;
} }
public ReferenceDecorator(SegmentReference.Builder referenceBuilder, StandardBuilder standardBuilder) { public ReferenceDecorator(SegmentReference.Builder referenceBuilder, StandardBuilder standardBuilder) {
this.referenceBuilderV2 = referenceBuilder; this.referenceBuilderV2 = referenceBuilder;
this.standardBuilder = standardBuilder; this.standardBuilder = standardBuilder;
this.isOrigin = false; this.isOrigin = false;
isV2 = true;
}
public RefType getRefType() {
if (isOrigin) {
return isV2 ? referenceObjectV2.getRefType() : referenceObject.getRefType();
} else {
return isV2 ? referenceBuilderV2.getRefType() : referenceBuilder.getRefType();
}
}
public int getRefTypeValue() {
if (isOrigin) {
return isV2 ? referenceObjectV2.getRefTypeValue() : referenceObject.getRefTypeValue();
} else {
return isV2 ? referenceBuilderV2.getRefTypeValue() : referenceBuilder.getRefTypeValue();
}
} }
public int getEntryEndpointId() { public int getEntryEndpointId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getEntryEndpointId() : referenceObject.getEntryServiceId(); return referenceObjectV2.getEntryEndpointId();
} else { } else {
return isV2 ? referenceBuilderV2.getEntryEndpointId() : referenceBuilder.getEntryServiceId(); return referenceBuilderV2.getEntryEndpointId();
} }
} }
...@@ -90,18 +53,14 @@ public class ReferenceDecorator implements StandardBuilder { ...@@ -90,18 +53,14 @@ public class ReferenceDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { referenceBuilderV2.setEntryEndpointId(value);
referenceBuilderV2.setEntryEndpointId(value);
} else {
referenceBuilder.setEntryServiceId(value);
}
} }
public String getEntryEndpointName() { public String getEntryEndpointName() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getEntryEndpoint() : referenceObject.getEntryServiceName(); return referenceObjectV2.getEntryEndpoint();
} else { } else {
return isV2 ? referenceBuilderV2.getEntryEndpoint() : referenceBuilder.getEntryServiceName(); return referenceBuilderV2.getEntryEndpoint();
} }
} }
...@@ -109,34 +68,30 @@ public class ReferenceDecorator implements StandardBuilder { ...@@ -109,34 +68,30 @@ public class ReferenceDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { referenceBuilderV2.setEntryEndpoint(value);
referenceBuilderV2.setEntryEndpoint(value);
} else {
referenceBuilder.setEntryServiceName(value);
}
} }
public int getEntryServiceInstanceId() { public int getEntryServiceInstanceId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getEntryServiceInstanceId() : referenceObject.getEntryApplicationInstanceId(); return referenceObjectV2.getEntryServiceInstanceId();
} else { } else {
return isV2 ? referenceBuilderV2.getEntryServiceInstanceId() : referenceBuilder.getEntryApplicationInstanceId(); return referenceBuilderV2.getEntryServiceInstanceId();
} }
} }
public int getParentServiceInstanceId() { public int getParentServiceInstanceId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getParentServiceInstanceId() : referenceObject.getParentApplicationInstanceId(); return referenceObjectV2.getParentServiceInstanceId();
} else { } else {
return isV2 ? referenceBuilderV2.getParentServiceInstanceId() : referenceBuilder.getParentApplicationInstanceId(); return referenceBuilderV2.getParentServiceInstanceId();
} }
} }
public int getParentEndpointId() { public int getParentEndpointId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getParentEndpointId() : referenceObject.getParentServiceId(); return referenceObjectV2.getParentEndpointId();
} else { } else {
return isV2 ? referenceBuilderV2.getParentEndpointId() : referenceBuilder.getParentServiceId(); return referenceBuilderV2.getParentEndpointId();
} }
} }
...@@ -144,26 +99,14 @@ public class ReferenceDecorator implements StandardBuilder { ...@@ -144,26 +99,14 @@ public class ReferenceDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { referenceBuilderV2.setParentEndpointId(value);
referenceBuilderV2.setParentEndpointId(value);
} else {
referenceBuilder.setParentServiceId(value);
}
}
public int getParentSpanId() {
if (isOrigin) {
return isV2 ? referenceObjectV2.getParentSpanId() : referenceObject.getParentSpanId();
} else {
return isV2 ? referenceBuilderV2.getParentSpanId() : referenceBuilder.getParentSpanId();
}
} }
public String getParentEndpointName() { public String getParentEndpointName() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getParentEndpoint() : referenceObject.getParentServiceName(); return referenceObjectV2.getParentEndpoint();
} else { } else {
return isV2 ? referenceBuilderV2.getParentEndpoint() : referenceBuilder.getParentServiceName(); return referenceBuilderV2.getParentEndpoint();
} }
} }
...@@ -171,26 +114,14 @@ public class ReferenceDecorator implements StandardBuilder { ...@@ -171,26 +114,14 @@ public class ReferenceDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { referenceBuilderV2.setParentEndpoint(value);
referenceBuilderV2.setParentEndpoint(value);
} else {
referenceBuilder.setParentServiceName(value);
}
}
public UniqueId getParentTraceSegmentId() {
if (isOrigin) {
return isV2 ? referenceObjectV2.getParentTraceSegmentId() : referenceObject.getParentTraceSegmentId();
} else {
return isV2 ? referenceBuilderV2.getParentTraceSegmentId() : referenceBuilder.getParentTraceSegmentId();
}
} }
public int getNetworkAddressId() { public int getNetworkAddressId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getNetworkAddressId() : referenceObject.getNetworkAddressId(); return referenceObjectV2.getNetworkAddressId();
} else { } else {
return isV2 ? referenceBuilderV2.getNetworkAddressId() : referenceBuilder.getNetworkAddressId(); return referenceBuilderV2.getNetworkAddressId();
} }
} }
...@@ -198,18 +129,14 @@ public class ReferenceDecorator implements StandardBuilder { ...@@ -198,18 +129,14 @@ public class ReferenceDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { referenceBuilderV2.setNetworkAddressId(value);
referenceBuilderV2.setNetworkAddressId(value);
} else {
referenceBuilder.setNetworkAddressId(value);
}
} }
public String getNetworkAddress() { public String getNetworkAddress() {
if (isOrigin) { if (isOrigin) {
return isV2 ? referenceObjectV2.getNetworkAddress() : referenceObject.getNetworkAddress(); return referenceObjectV2.getNetworkAddress();
} else { } else {
return isV2 ? referenceBuilderV2.getNetworkAddress() : referenceBuilder.getNetworkAddress(); return referenceBuilderV2.getNetworkAddress();
} }
} }
...@@ -217,21 +144,13 @@ public class ReferenceDecorator implements StandardBuilder { ...@@ -217,21 +144,13 @@ public class ReferenceDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { referenceBuilderV2.setNetworkAddress(value);
referenceBuilderV2.setNetworkAddress(value);
} else {
referenceBuilder.setNetworkAddress(value);
}
} }
@Override public void toBuilder() { @Override public void toBuilder() {
if (this.isOrigin) { if (this.isOrigin) {
this.isOrigin = false; this.isOrigin = false;
if (isV2) { referenceBuilderV2 = referenceObjectV2.toBuilder();
referenceBuilderV2 = referenceObjectV2.toBuilder();
} else {
referenceBuilder = referenceObject.toBuilder();
}
standardBuilder.toBuilder(); standardBuilder.toBuilder();
} }
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator;
import lombok.*; import lombok.*;
import org.apache.skywalking.apm.network.ProtocolVersion;
/** /**
* @author peng-yongsheng * @author peng-yongsheng
...@@ -34,5 +35,5 @@ public class SegmentCoreInfo { ...@@ -34,5 +35,5 @@ public class SegmentCoreInfo {
private boolean isError; private boolean isError;
private long minuteTimeBucket; private long minuteTimeBucket;
private byte[] dataBinary; private byte[] dataBinary;
private boolean isV2; private ProtocolVersion version;
} }
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentObject;
import org.apache.skywalking.apm.network.language.agent.UniqueId; import org.apache.skywalking.apm.network.language.agent.UniqueId;
import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject;
...@@ -29,78 +28,50 @@ import static java.util.Objects.isNull; ...@@ -29,78 +28,50 @@ import static java.util.Objects.isNull;
*/ */
public class SegmentDecorator implements StandardBuilder { public class SegmentDecorator implements StandardBuilder {
private boolean isOrigin = true; private boolean isOrigin = true;
private final TraceSegmentObject segmentObject;
private TraceSegmentObject.Builder segmentBuilder;
private final boolean isV2;
private final SegmentObject segmentObjectV2; private final SegmentObject segmentObjectV2;
private SegmentObject.Builder segmentBuilderV2; private SegmentObject.Builder segmentBuilderV2;
private final SpanDecorator[] spanDecorators; private final SpanDecorator[] spanDecorators;
public SegmentDecorator(TraceSegmentObject segmentObject) {
this.segmentObject = segmentObject;
this.segmentObjectV2 = null;
this.spanDecorators = new SpanDecorator[segmentObject.getSpansCount()];
isV2 = false;
}
public SegmentDecorator(SegmentObject segmentObjectV2) { public SegmentDecorator(SegmentObject segmentObjectV2) {
this.segmentObjectV2 = segmentObjectV2; this.segmentObjectV2 = segmentObjectV2;
this.segmentObject = null;
this.spanDecorators = new SpanDecorator[segmentObjectV2.getSpansCount()]; this.spanDecorators = new SpanDecorator[segmentObjectV2.getSpansCount()];
isV2 = true;
} }
public int getServiceId() { public int getServiceId() {
return isV2 ? segmentObjectV2.getServiceId() : segmentObject.getApplicationId(); return segmentObjectV2.getServiceId();
} }
public int getServiceInstanceId() { public int getServiceInstanceId() {
return isV2 ? segmentObjectV2.getServiceInstanceId() : segmentObject.getApplicationInstanceId(); return segmentObjectV2.getServiceInstanceId();
} }
public UniqueId getTraceSegmentId() { public UniqueId getTraceSegmentId() {
return isV2 ? segmentObjectV2.getTraceSegmentId() : segmentObject.getTraceSegmentId(); return segmentObjectV2.getTraceSegmentId();
} }
public int getSpansCount() { public int getSpansCount() {
return isV2 ? segmentObjectV2.getSpansCount() : segmentObject.getSpansCount(); return segmentObjectV2.getSpansCount();
} }
public SpanDecorator getSpans(int index) { public SpanDecorator getSpans(int index) {
if (isNull(spanDecorators[index])) { if (isNull(spanDecorators[index])) {
if (isOrigin) { if (isOrigin) {
if (isV2) { spanDecorators[index] = new SpanDecorator(segmentObjectV2.getSpans(index), this);
spanDecorators[index] = new SpanDecorator(segmentObjectV2.getSpans(index), this);
} else {
spanDecorators[index] = new SpanDecorator(segmentObject.getSpans(index), this);
}
} else { } else {
if (isV2) { spanDecorators[index] = new SpanDecorator(segmentBuilderV2.getSpansBuilder(index), this);
spanDecorators[index] = new SpanDecorator(segmentBuilderV2.getSpansBuilder(index), this);
} else {
spanDecorators[index] = new SpanDecorator(segmentBuilder.getSpansBuilder(index), this);
}
} }
} }
return spanDecorators[index]; return spanDecorators[index];
} }
public byte[] toByteArray() { public byte[] toByteArray() {
if (isOrigin) { return segmentObjectV2.toByteArray();
return isV2 ? segmentObjectV2.toByteArray() : segmentObject.toByteArray();
} else {
return segmentBuilder.build().toByteArray();
}
} }
@Override public void toBuilder() { @Override public void toBuilder() {
if (isOrigin) { if (isOrigin) {
this.isOrigin = false; this.isOrigin = false;
if (isV2) { this.segmentBuilderV2 = segmentObjectV2.toBuilder();
this.segmentBuilderV2 = segmentObjectV2.toBuilder();
} else {
this.segmentBuilder = segmentObject.toBuilder();
}
} }
} }
} }
...@@ -18,9 +18,10 @@ ...@@ -18,9 +18,10 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator;
import java.util.*; import java.util.List;
import org.apache.skywalking.apm.network.common.KeyStringValuePair; import org.apache.skywalking.apm.network.common.KeyStringValuePair;
import org.apache.skywalking.apm.network.language.agent.*; import org.apache.skywalking.apm.network.language.agent.SpanLayer;
import org.apache.skywalking.apm.network.language.agent.SpanType;
import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2;
import static java.util.Objects.isNull; import static java.util.Objects.isNull;
...@@ -29,35 +30,16 @@ import static java.util.Objects.isNull; ...@@ -29,35 +30,16 @@ import static java.util.Objects.isNull;
* @author peng-yongsheng * @author peng-yongsheng
*/ */
public class SpanDecorator implements StandardBuilder { public class SpanDecorator implements StandardBuilder {
private final boolean isV2;
private boolean isOrigin = true; private boolean isOrigin = true;
private StandardBuilder standardBuilder; private final StandardBuilder standardBuilder;
private SpanObject spanObject;
private SpanObjectV2 spanObjectV2; private SpanObjectV2 spanObjectV2;
private SpanObject.Builder spanBuilder;
private SpanObjectV2.Builder spanBuilderV2; private SpanObjectV2.Builder spanBuilderV2;
private final ReferenceDecorator[] referenceDecorators; private final ReferenceDecorator[] referenceDecorators;
public SpanDecorator(SpanObject spanObject, StandardBuilder standardBuilder) {
this.spanObject = spanObject;
this.standardBuilder = standardBuilder;
this.referenceDecorators = new ReferenceDecorator[spanObject.getRefsCount()];
this.isV2 = false;
}
public SpanDecorator(SpanObject.Builder spanBuilder, StandardBuilder standardBuilder) {
this.spanBuilder = spanBuilder;
this.standardBuilder = standardBuilder;
this.isOrigin = false;
this.referenceDecorators = new ReferenceDecorator[spanBuilder.getRefsCount()];
this.isV2 = false;
}
public SpanDecorator(SpanObjectV2 spanObject, StandardBuilder standardBuilder) { public SpanDecorator(SpanObjectV2 spanObject, StandardBuilder standardBuilder) {
this.spanObjectV2 = spanObject; this.spanObjectV2 = spanObject;
this.standardBuilder = standardBuilder; this.standardBuilder = standardBuilder;
this.referenceDecorators = new ReferenceDecorator[spanObject.getRefsCount()]; this.referenceDecorators = new ReferenceDecorator[spanObject.getRefsCount()];
this.isV2 = true;
} }
public SpanDecorator(SpanObjectV2.Builder spanBuilder, StandardBuilder standardBuilder) { public SpanDecorator(SpanObjectV2.Builder spanBuilder, StandardBuilder standardBuilder) {
...@@ -65,78 +47,61 @@ public class SpanDecorator implements StandardBuilder { ...@@ -65,78 +47,61 @@ public class SpanDecorator implements StandardBuilder {
this.standardBuilder = standardBuilder; this.standardBuilder = standardBuilder;
this.isOrigin = false; this.isOrigin = false;
this.referenceDecorators = new ReferenceDecorator[spanBuilder.getRefsCount()]; this.referenceDecorators = new ReferenceDecorator[spanBuilder.getRefsCount()];
this.isV2 = true;
} }
public int getSpanId() { public int getSpanId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getSpanId() : spanObject.getSpanId(); return spanObjectV2.getSpanId();
} else { } else {
return isV2 ? spanBuilderV2.getSpanId() : spanBuilder.getSpanId(); return spanBuilderV2.getSpanId();
}
}
public int getParentSpanId() {
if (isOrigin) {
return isV2 ? spanObjectV2.getParentSpanId() : spanObject.getParentSpanId();
} else {
return isV2 ? spanBuilderV2.getParentSpanId() : spanBuilder.getParentSpanId();
} }
} }
public SpanType getSpanType() { public SpanType getSpanType() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getSpanType() : spanObject.getSpanType(); return spanObjectV2.getSpanType();
} else { } else {
return isV2 ? spanBuilderV2.getSpanType() : spanBuilder.getSpanType(); return spanBuilderV2.getSpanType();
}
}
public int getSpanTypeValue() {
if (isOrigin) {
return isV2 ? spanObjectV2.getSpanTypeValue() : spanObject.getSpanTypeValue();
} else {
return isV2 ? spanBuilderV2.getSpanTypeValue() : spanBuilder.getSpanTypeValue();
} }
} }
public SpanLayer getSpanLayer() { public SpanLayer getSpanLayer() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getSpanLayer() : spanObject.getSpanLayer(); return spanObjectV2.getSpanLayer();
} else { } else {
return isV2 ? spanBuilderV2.getSpanLayer() : spanBuilder.getSpanLayer(); return spanBuilderV2.getSpanLayer();
} }
} }
public int getSpanLayerValue() { public int getSpanLayerValue() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getSpanLayerValue() : spanObject.getSpanLayerValue(); return spanObjectV2.getSpanLayerValue();
} else { } else {
return isV2 ? spanBuilderV2.getSpanLayerValue() : spanBuilder.getSpanLayerValue(); return spanBuilderV2.getSpanLayerValue();
} }
} }
public long getStartTime() { public long getStartTime() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getStartTime() : spanObject.getStartTime(); return spanObjectV2.getStartTime();
} else { } else {
return isV2 ? spanBuilderV2.getStartTime() : spanBuilder.getStartTime(); return spanBuilderV2.getStartTime();
} }
} }
public long getEndTime() { public long getEndTime() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getEndTime() : spanObject.getEndTime(); return spanObjectV2.getEndTime();
} else { } else {
return isV2 ? spanBuilderV2.getEndTime() : spanBuilder.getEndTime(); return spanBuilderV2.getEndTime();
} }
} }
public int getComponentId() { public int getComponentId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getComponentId() : spanObject.getComponentId(); return spanObjectV2.getComponentId();
} else { } else {
return isV2 ? spanBuilderV2.getComponentId() : spanBuilder.getComponentId(); return spanBuilderV2.getComponentId();
} }
} }
...@@ -144,18 +109,14 @@ public class SpanDecorator implements StandardBuilder { ...@@ -144,18 +109,14 @@ public class SpanDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { spanBuilderV2.setComponentId(value);
spanBuilderV2.setComponentId(value);
} else {
spanBuilder.setComponentId(value);
}
} }
public String getComponent() { public String getComponent() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getComponent() : spanObject.getComponent(); return spanObjectV2.getComponent();
} else { } else {
return isV2 ? spanBuilderV2.getComponent() : spanBuilder.getComponent(); return spanBuilderV2.getComponent();
} }
} }
...@@ -163,18 +124,14 @@ public class SpanDecorator implements StandardBuilder { ...@@ -163,18 +124,14 @@ public class SpanDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { spanBuilderV2.setComponent(value);
spanBuilderV2.setComponent(value);
} else {
spanBuilder.setComponent(value);
}
} }
public int getPeerId() { public int getPeerId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getPeerId() : spanObject.getPeerId(); return spanObjectV2.getPeerId();
} else { } else {
return isV2 ? spanBuilderV2.getPeerId() : spanBuilder.getPeerId(); return spanBuilderV2.getPeerId();
} }
} }
...@@ -182,18 +139,14 @@ public class SpanDecorator implements StandardBuilder { ...@@ -182,18 +139,14 @@ public class SpanDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { spanBuilderV2.setPeerId(peerId);
spanBuilderV2.setPeerId(peerId);
} else {
spanBuilder.setPeerId(peerId);
}
} }
public String getPeer() { public String getPeer() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getPeer() : spanObject.getPeer(); return spanObjectV2.getPeer();
} else { } else {
return isV2 ? spanBuilderV2.getPeer() : spanBuilder.getPeer(); return spanBuilderV2.getPeer();
} }
} }
...@@ -201,18 +154,14 @@ public class SpanDecorator implements StandardBuilder { ...@@ -201,18 +154,14 @@ public class SpanDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { spanBuilderV2.setPeer(peer);
spanBuilderV2.setPeer(peer);
} else {
spanBuilder.setPeer(peer);
}
} }
public int getOperationNameId() { public int getOperationNameId() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getOperationNameId() : spanObject.getOperationNameId(); return spanObjectV2.getOperationNameId();
} else { } else {
return isV2 ? spanBuilderV2.getOperationNameId() : spanBuilder.getOperationNameId(); return spanBuilderV2.getOperationNameId();
} }
} }
...@@ -220,18 +169,14 @@ public class SpanDecorator implements StandardBuilder { ...@@ -220,18 +169,14 @@ public class SpanDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { spanBuilderV2.setOperationNameId(value);
spanBuilderV2.setOperationNameId(value);
} else {
spanBuilder.setOperationNameId(value);
}
} }
public String getOperationName() { public String getOperationName() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getOperationName() : spanObject.getOperationName(); return spanObjectV2.getOperationName();
} else { } else {
return isV2 ? spanBuilderV2.getOperationName() : spanBuilder.getOperationName(); return spanBuilderV2.getOperationName();
} }
} }
...@@ -239,43 +184,31 @@ public class SpanDecorator implements StandardBuilder { ...@@ -239,43 +184,31 @@ public class SpanDecorator implements StandardBuilder {
if (isOrigin) { if (isOrigin) {
toBuilder(); toBuilder();
} }
if (isV2) { spanBuilderV2.setOperationName(value);
spanBuilderV2.setOperationName(value);
} else {
spanBuilder.setOperationName(value);
}
} }
public boolean getIsError() { public boolean getIsError() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getIsError() : spanObject.getIsError(); return spanObjectV2.getIsError();
} else { } else {
return isV2 ? spanBuilderV2.getIsError() : spanBuilder.getIsError(); return spanBuilderV2.getIsError();
} }
} }
public int getRefsCount() { public int getRefsCount() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getRefsCount() : spanObject.getRefsCount(); return spanObjectV2.getRefsCount();
} else { } else {
return isV2 ? spanBuilderV2.getRefsCount() : spanBuilder.getRefsCount(); return spanBuilderV2.getRefsCount();
} }
} }
public ReferenceDecorator getRefs(int index) { public ReferenceDecorator getRefs(int index) {
if (isNull(referenceDecorators[index])) { if (isNull(referenceDecorators[index])) {
if (isOrigin) { if (isOrigin) {
if (isV2) { referenceDecorators[index] = new ReferenceDecorator(spanObjectV2.getRefs(index), this);
referenceDecorators[index] = new ReferenceDecorator(spanObjectV2.getRefs(index), this);
} else {
referenceDecorators[index] = new ReferenceDecorator(spanObject.getRefs(index), this);
}
} else { } else {
if (isV2) { referenceDecorators[index] = new ReferenceDecorator(spanBuilderV2.getRefsBuilder(index), this);
referenceDecorators[index] = new ReferenceDecorator(spanBuilderV2.getRefsBuilder(index), this);
} else {
referenceDecorators[index] = new ReferenceDecorator(spanBuilder.getRefsBuilder(index), this);
}
} }
} }
return referenceDecorators[index]; return referenceDecorators[index];
...@@ -283,33 +216,18 @@ public class SpanDecorator implements StandardBuilder { ...@@ -283,33 +216,18 @@ public class SpanDecorator implements StandardBuilder {
public List<KeyStringValuePair> getAllTags() { public List<KeyStringValuePair> getAllTags() {
if (isOrigin) { if (isOrigin) {
return isV2 ? spanObjectV2.getTagsList() : convert(spanObject.getTagsList()); return spanObjectV2.getTagsList();
} else { } else {
return isV2 ? spanBuilderV2.getTagsList() : convert(spanBuilder.getTagsList()); return spanBuilderV2.getTagsList();
} }
} }
@Override public void toBuilder() { @Override public void toBuilder() {
if (this.isOrigin) { if (this.isOrigin) {
this.isOrigin = false; this.isOrigin = false;
if (isV2) { spanBuilderV2 = spanObjectV2.toBuilder();
spanBuilderV2 = spanObjectV2.toBuilder();
} else {
spanBuilder = spanObject.toBuilder();
}
standardBuilder.toBuilder(); standardBuilder.toBuilder();
} }
} }
private List<KeyStringValuePair> convert(List<KeyWithStringValue> list) {
List<KeyStringValuePair> result = new ArrayList<>();
if (list != null) {
list.forEach(element -> {
result.add(KeyStringValuePair.newBuilder()
.setKey(element.getKey())
.setValue(element.getValue()).build());
});
}
return result;
}
} }
...@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener ...@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import org.apache.skywalking.apm.network.common.KeyStringValuePair; import org.apache.skywalking.apm.network.common.KeyStringValuePair;
import org.apache.skywalking.apm.network.language.agent.SpanLayer; import org.apache.skywalking.apm.network.language.agent.SpanLayer;
import org.apache.skywalking.apm.network.language.agent.UniqueId; import org.apache.skywalking.apm.network.language.agent.UniqueId;
...@@ -49,24 +50,16 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener. ...@@ -49,24 +50,16 @@ import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.GlobalTraceIdsListener; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.GlobalTraceIdsListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.SpanListener; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.SpanListener;
import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.SpanListenerFactory; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.SpanListenerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static java.util.Objects.nonNull; import static java.util.Objects.nonNull;
/** /**
* Notice, in here, there are following concepts match * Notice, in here, there are following concepts match
* *
* v5 | v6
*
* 1. Application == Service 2. Server == Service Instance 3. Service == Endpoint
*
* @author peng-yongsheng, wusheng * @author peng-yongsheng, wusheng
*/ */
public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListener, GlobalTraceIdsListener { public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListener, GlobalTraceIdsListener {
private static final Logger logger = LoggerFactory.getLogger(MultiScopesSpanListener.class);
private final SourceReceiver sourceReceiver; private final SourceReceiver sourceReceiver;
private final ServiceInstanceInventoryCache instanceInventoryCache; private final ServiceInstanceInventoryCache instanceInventoryCache;
private final ServiceInventoryCache serviceInventoryCache; private final ServiceInventoryCache serviceInventoryCache;
...@@ -257,7 +250,7 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe ...@@ -257,7 +250,7 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe
sourceReceiver.receive(entrySourceBuilder.toServiceRelation()); sourceReceiver.receive(entrySourceBuilder.toServiceRelation());
sourceReceiver.receive(entrySourceBuilder.toServiceInstanceRelation()); sourceReceiver.receive(entrySourceBuilder.toServiceInstanceRelation());
EndpointRelation endpointRelation = entrySourceBuilder.toEndpointRelation(); EndpointRelation endpointRelation = entrySourceBuilder.toEndpointRelation();
/** /*
* Parent endpoint could be none, because in SkyWalking Cross Process Propagation Headers Protocol v2, * Parent endpoint could be none, because in SkyWalking Cross Process Propagation Headers Protocol v2,
* endpoint in ref could be empty, based on that, endpoint relation maybe can't be established. * endpoint in ref could be empty, based on that, endpoint relation maybe can't be established.
* So, I am making this source as optional. * So, I am making this source as optional.
...@@ -291,15 +284,7 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe ...@@ -291,15 +284,7 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe
@Override public void parseGlobalTraceId(UniqueId uniqueId, SegmentCoreInfo segmentCoreInfo) { @Override public void parseGlobalTraceId(UniqueId uniqueId, SegmentCoreInfo segmentCoreInfo) {
if (traceId == null) { if (traceId == null) {
StringBuilder traceIdBuilder = new StringBuilder(); traceId = uniqueId.getIdPartsList().stream().map(String::valueOf).collect(Collectors.joining("."));
for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) {
if (i == 0) {
traceIdBuilder.append(uniqueId.getIdPartsList().get(i));
} else {
traceIdBuilder.append(".").append(uniqueId.getIdPartsList().get(i));
}
}
traceId = traceIdBuilder.toString();
} }
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.segment; package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.segment;
import java.util.stream.Collectors;
import org.apache.skywalking.apm.network.language.agent.UniqueId; import org.apache.skywalking.apm.network.language.agent.UniqueId;
import org.apache.skywalking.oap.server.core.Const; import org.apache.skywalking.oap.server.core.Const;
import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.CoreModule;
...@@ -81,10 +82,7 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener ...@@ -81,10 +82,7 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
segment.setIsError(BooleanUtils.booleanToValue(segmentCoreInfo.isError())); segment.setIsError(BooleanUtils.booleanToValue(segmentCoreInfo.isError()));
segment.setTimeBucket(timeBucket); segment.setTimeBucket(timeBucket);
segment.setDataBinary(segmentCoreInfo.getDataBinary()); segment.setDataBinary(segmentCoreInfo.getDataBinary());
/** segment.setVersion(segmentCoreInfo.getVersion().number());
* Only consider v1, v2 compatible for now.
*/
segment.setVersion(segmentCoreInfo.isV2() ? 2 : 1);
firstEndpointId = spanDecorator.getOperationNameId(); firstEndpointId = spanDecorator.getOperationNameId();
firstEndpointName = spanDecorator.getOperationName(); firstEndpointName = spanDecorator.getOperationName();
...@@ -107,15 +105,8 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener ...@@ -107,15 +105,8 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
return; return;
} }
StringBuilder traceIdBuilder = new StringBuilder(); final String traceId = uniqueId.getIdPartsList().stream().map(String::valueOf).collect(Collectors.joining("."));
for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) { segment.setTraceId(traceId);
if (i == 0) {
traceIdBuilder.append(uniqueId.getIdPartsList().get(i));
} else {
traceIdBuilder.append(".").append(uniqueId.getIdPartsList().get(i));
}
}
segment.setTraceId(traceIdBuilder.toString());
} }
@Override public void build() { @Override public void build() {
...@@ -129,13 +120,13 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener ...@@ -129,13 +120,13 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
if (entryEndpointId == Const.NONE) { if (entryEndpointId == Const.NONE) {
if (firstEndpointId != Const.NONE) { if (firstEndpointId != Const.NONE) {
/** /*
* Since 6.6.0, only entry span is treated as an endpoint. Other span's endpoint id == 0. * Since 6.6.0, only entry span is treated as an endpoint. Other span's endpoint id == 0.
*/ */
segment.setEndpointId(firstEndpointId); segment.setEndpointId(firstEndpointId);
segment.setEndpointName(serviceNameCacheService.get(firstEndpointId).getName()); segment.setEndpointName(serviceNameCacheService.get(firstEndpointId).getName());
} else { } else {
/** /*
* Only fill first operation name for the trace list query, as no endpoint id. * Only fill first operation name for the trace list query, as no endpoint id.
*/ */
segment.setEndpointName(firstEndpointName); segment.setEndpointName(firstEndpointName);
...@@ -153,7 +144,7 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener ...@@ -153,7 +144,7 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener
} }
public static class Factory implements SpanListenerFactory { public static class Factory implements SpanListenerFactory {
private TraceSegmentSampler sampler; private final TraceSegmentSampler sampler;
public Factory(int segmentSamplingRate) { public Factory(int segmentSamplingRate) {
this.sampler = new TraceSegmentSampler(segmentSamplingRate); this.sampler = new TraceSegmentSampler(segmentSamplingRate);
......
...@@ -42,7 +42,7 @@ public class SegmentStandardizationWorker extends AbstractWorker<SegmentStandard ...@@ -42,7 +42,7 @@ public class SegmentStandardizationWorker extends AbstractWorker<SegmentStandard
public SegmentStandardizationWorker(ModuleDefineHolder moduleDefineHolder, public SegmentStandardizationWorker(ModuleDefineHolder moduleDefineHolder,
DataStreamReader.CallBack<UpstreamSegment> segmentParse, String path, int offsetFileMaxSize, DataStreamReader.CallBack<UpstreamSegment> segmentParse, String path, int offsetFileMaxSize,
int dataFileMaxSize, boolean cleanWhenRestart, boolean isV6) throws IOException { int dataFileMaxSize, boolean cleanWhenRestart) throws IOException {
super(moduleDefineHolder); super(moduleDefineHolder);
BufferStream.Builder<UpstreamSegment> builder = new BufferStream.Builder<>(path); BufferStream.Builder<UpstreamSegment> builder = new BufferStream.Builder<>(path);
...@@ -59,7 +59,7 @@ public class SegmentStandardizationWorker extends AbstractWorker<SegmentStandard ...@@ -59,7 +59,7 @@ public class SegmentStandardizationWorker extends AbstractWorker<SegmentStandard
dataCarrier.consume(new Consumer(stream), 1, 200); dataCarrier.consume(new Consumer(stream), 1, 200);
MetricsCreator metricsCreator = moduleDefineHolder.find(TelemetryModule.NAME).provider().getService(MetricsCreator.class); MetricsCreator metricsCreator = moduleDefineHolder.find(TelemetryModule.NAME).provider().getService(MetricsCreator.class);
String metricNamePrefix = isV6 ? "v6_" : "v5_"; String metricNamePrefix = "v6_";
traceBufferFileIn = metricsCreator.createCounter(metricNamePrefix + "trace_buffer_file_in", "The number of trace segment into the buffer file", traceBufferFileIn = metricsCreator.createCounter(metricNamePrefix + "trace_buffer_file_in", "The number of trace segment into the buffer file",
MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE); MetricsTag.EMPTY_KEY, MetricsTag.EMPTY_VALUE);
} }
......
/*
* 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.oap.server.receiver.trace.mock;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
import java.util.concurrent.TimeUnit;
import org.apache.skywalking.apm.network.language.agent.Downstream;
import org.apache.skywalking.apm.network.language.agent.TraceSegmentServiceGrpc;
import org.apache.skywalking.apm.network.language.agent.UniqueId;
import org.apache.skywalking.apm.network.language.agent.UpstreamSegment;
/**
* @author peng-yongsheng
*/
public class AgentDataMock {
private static boolean IS_COMPLETED = false;
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
RegisterMock registerMock = new RegisterMock(channel);
StreamObserver<UpstreamSegment> streamObserver = createStreamObserver();
UniqueId.Builder globalTraceId = UniqueIdBuilder.INSTANCE.create();
long startTimestamp = System.currentTimeMillis();
//long startTimestamp = new DateTime().minusDays(2).getMillis();
// ServiceAMock
ServiceAMock serviceAMock = new ServiceAMock(registerMock);
serviceAMock.register();
// ServiceBMock
ServiceBMock serviceBMock = new ServiceBMock(registerMock);
serviceBMock.register();
// ServiceCMock
ServiceCMock serviceCMock = new ServiceCMock(registerMock);
serviceCMock.register();
UniqueId.Builder serviceASegmentId = UniqueIdBuilder.INSTANCE.create();
serviceAMock.mock(streamObserver, globalTraceId, serviceASegmentId, startTimestamp, true);
UniqueId.Builder serviceBSegmentId = UniqueIdBuilder.INSTANCE.create();
serviceBMock.mock(streamObserver, globalTraceId, serviceBSegmentId, serviceASegmentId, startTimestamp, true);
UniqueId.Builder serviceCSegmentId = UniqueIdBuilder.INSTANCE.create();
serviceCMock.mock(streamObserver, globalTraceId, serviceCSegmentId, serviceBSegmentId, startTimestamp, true);
TimeUnit.SECONDS.sleep(10);
for (int i = 0; i < 500; i++) {
globalTraceId = UniqueIdBuilder.INSTANCE.create();
serviceASegmentId = UniqueIdBuilder.INSTANCE.create();
serviceBSegmentId = UniqueIdBuilder.INSTANCE.create();
serviceCSegmentId = UniqueIdBuilder.INSTANCE.create();
serviceAMock.mock(streamObserver, globalTraceId, serviceASegmentId, startTimestamp, true);
serviceBMock.mock(streamObserver, globalTraceId, serviceBSegmentId, serviceASegmentId, startTimestamp, true);
serviceCMock.mock(streamObserver, globalTraceId, serviceCSegmentId, serviceBSegmentId, startTimestamp, true);
}
streamObserver.onCompleted();
while (!IS_COMPLETED) {
TimeUnit.MILLISECONDS.sleep(500);
}
}
private static StreamObserver<UpstreamSegment> createStreamObserver() {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 11800).usePlaintext().build();
TraceSegmentServiceGrpc.TraceSegmentServiceStub stub = TraceSegmentServiceGrpc.newStub(channel);
return stub.collect(new StreamObserver<Downstream>() {
@Override public void onNext(Downstream downstream) {
}
@Override public void onError(Throwable throwable) {
}
@Override public void onCompleted() {
IS_COMPLETED = true;
}
});
}
}
/*
* 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.oap.server.receiver.trace.mock;
import io.grpc.ManagedChannel;
import java.util.concurrent.TimeUnit;
import org.apache.skywalking.apm.network.language.agent.*;
import org.slf4j.*;
/**
* @author peng-yongsheng
*/
class RegisterMock {
private static final Logger logger = LoggerFactory.getLogger(RegisterMock.class);
private final ApplicationRegisterServiceGrpc.ApplicationRegisterServiceBlockingStub applicationRegisterServiceBlockingStub;
private final InstanceDiscoveryServiceGrpc.InstanceDiscoveryServiceBlockingStub instanceDiscoveryServiceBlockingStub;
RegisterMock(ManagedChannel channel) {
applicationRegisterServiceBlockingStub = ApplicationRegisterServiceGrpc.newBlockingStub(channel);
instanceDiscoveryServiceBlockingStub = InstanceDiscoveryServiceGrpc.newBlockingStub(channel);
}
int registerService(String serviceName) throws InterruptedException {
Application.Builder application = Application.newBuilder();
application.setApplicationCode(serviceName);
ApplicationMapping applicationMapping;
do {
applicationMapping = applicationRegisterServiceBlockingStub.applicationCodeRegister(application.build());
logger.debug("service id: {}", applicationMapping.getApplication().getValue());
TimeUnit.MILLISECONDS.sleep(20);
}
while (applicationMapping.getApplication().getValue() == 0);
return applicationMapping.getApplication().getValue();
}
int registerServiceInstance(int serviceId, String agentName) throws InterruptedException {
ApplicationInstance.Builder instance = ApplicationInstance.newBuilder();
instance.setApplicationId(serviceId);
instance.setAgentUUID(agentName);
instance.setRegisterTime(System.currentTimeMillis());
OSInfo.Builder osInfo = OSInfo.newBuilder();
osInfo.setHostname(agentName);
osInfo.setOsName("MacOS XX");
osInfo.setProcessNo(1001);
osInfo.addIpv4S("10.0.0.3");
osInfo.addIpv4S("10.0.0.4");
instance.setOsinfo(osInfo);
ApplicationInstanceMapping instanceMapping;
do {
instanceMapping = instanceDiscoveryServiceBlockingStub.registerInstance(instance.build());
logger.debug("instance id: {}", instanceMapping.getApplicationInstanceId());
TimeUnit.MILLISECONDS.sleep(20);
}
while (instanceMapping.getApplicationInstanceId() == 0);
return instanceMapping.getApplicationInstanceId();
}
}
/*
* 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.oap.server.receiver.trace.mock;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.skywalking.apm.network.language.agent.UniqueId;
/**
* @author peng-yongsheng
*/
public enum UniqueIdBuilder {
INSTANCE;
private AtomicLong idPart = new AtomicLong(1);
UniqueId.Builder create() {
UniqueId.Builder uniqueId = UniqueId.newBuilder();
uniqueId.addIdParts(idPart.getAndIncrement());
uniqueId.addIdParts(idPart.getAndIncrement());
uniqueId.addIdParts(idPart.getAndIncrement());
return uniqueId;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册