diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto index e7fc69462955c86d70f3f7f33712dfe33ecefbc6..b66fa070fd647662f06497e4ed3657eb258cb6e9 160000 --- a/apm-protocol/apm-network/src/main/proto +++ b/apm-protocol/apm-network/src/main/proto @@ -1 +1 @@ -Subproject commit e7fc69462955c86d70f3f7f33712dfe33ecefbc6 +Subproject commit b66fa070fd647662f06497e4ed3657eb258cb6e9 diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java index b44f40fe69959e9cb563ce48df1692b36d5c82c4..9754119238a75f4812b0dd85328958053a6b472a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java @@ -40,7 +40,7 @@ public class Config { * Application code is showed in sky-walking-ui. Suggestion: set an unique name for each application, one * application's nodes share the same code. */ - public static String APPLICATION_CODE = ""; + public static String SERVICE_NAME = ""; /** * Authentication active is based on backend setting, see application.yml for more details. @@ -114,9 +114,9 @@ public class Config { /** * The buffer size of application codes and peer */ - public static int APPLICATION_CODE_BUFFER_SIZE = 10 * 10000; + public static int SERVICE_CODE_BUFFER_SIZE = 10 * 10000; - public static int OPERATION_NAME_BUFFER_SIZE = 1000 * 10000; + public static int ENDPOINT_NAME_BUFFER_SIZE = 1000 * 10000; } public static class Logging { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java index d236b622805a8c31d6c0be955095b82e9adfbfac..d246786afaa1765e509dfbb672970fc4b1653acf 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/RemoteDownstreamConfig.java @@ -29,8 +29,8 @@ import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; */ public class RemoteDownstreamConfig { public static class Agent { - public volatile static int APPLICATION_ID = DictionaryUtil.nullValue(); + public volatile static int SERVICE_ID = DictionaryUtil.nullValue(); - public volatile static int APPLICATION_INSTANCE_ID = DictionaryUtil.nullValue(); + public volatile static int SERVICE_INSTANCE_ID = DictionaryUtil.nullValue(); } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java index 325557140ac521d799c2087f3c14ee17518eaca7..b18c0fe2a7c86c4523b13f47623f7b34c7cbc9a3 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/SnifferConfigInitializer.java @@ -87,8 +87,8 @@ public class SnifferConfigInitializer { } } - if (StringUtil.isEmpty(Config.Agent.APPLICATION_CODE)) { - throw new ExceptionInInitializerError("`agent.application_code` is missing."); + if (StringUtil.isEmpty(Config.Agent.SERVICE_NAME)) { + throw new ExceptionInInitializerError("`agent.service_code` is missing."); } if (StringUtil.isEmpty(Config.Collector.BACKEND_SERVICE)) { throw new ExceptionInInitializerError("`collector.direct_servers` and `collector.servers` cannot be empty at the same time."); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java index 8ff218de16df7b135cbd9699fac37d33b7d2ce79..91d728e031f5b80031ec16f5a313313e8118fef4 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextCarrier.java @@ -49,12 +49,12 @@ public class ContextCarrier implements Serializable { /** * id of parent application instance, it's the id assigned by collector. */ - private int parentApplicationInstanceId = DictionaryUtil.nullValue(); + private int parentServiceInstanceId = DictionaryUtil.nullValue(); /** * id of first application instance in this distributed trace, it's the id assigned by collector. */ - private int entryApplicationInstanceId = DictionaryUtil.nullValue(); + private int entryServiceInstanceId = DictionaryUtil.nullValue(); /** * peer(ipv4s/ipv6/hostname + port) of the server, from client side. @@ -64,12 +64,12 @@ public class ContextCarrier implements Serializable { /** * Operation/Service name of the first one in this distributed trace. This name may be compressed to an integer. */ - private String entryOperationName; + private String entryEndpointName; /** * Operation/Service name of the parent one in this distributed trace. This name may be compressed to an integer. */ - private String parentOperationName; + private String parentEndpointName; /** * {@link DistributedTraceId}, also known as TraceId @@ -106,11 +106,11 @@ public class ContextCarrier implements Serializable { return StringUtil.join('|', this.getTraceSegmentId().encode(), this.getSpanId() + "", - this.getParentApplicationInstanceId() + "", - this.getEntryApplicationInstanceId() + "", + this.getParentServiceInstanceId() + "", + this.getEntryServiceInstanceId() + "", this.getPeerHost(), - this.getEntryOperationName(), - this.getParentOperationName(), + this.getEntryEndpointName(), + this.getParentEndpointName(), this.getPrimaryDistributedTraceId().encode()); } else { return ""; @@ -122,11 +122,11 @@ public class ContextCarrier implements Serializable { Base64.encode(this.getPrimaryDistributedTraceId().encode()), Base64.encode(this.getTraceSegmentId().encode()), this.getSpanId() + "", - this.getParentApplicationInstanceId() + "", - this.getEntryApplicationInstanceId() + "", + this.getParentServiceInstanceId() + "", + this.getEntryServiceInstanceId() + "", Base64.encode(this.getPeerHost()), - Base64.encode(this.getEntryOperationName()), - Base64.encode(this.getParentOperationName())); + Base64.encode(this.getEntryEndpointName()), + Base64.encode(this.getParentEndpointName())); } else { return ""; } @@ -153,11 +153,11 @@ public class ContextCarrier implements Serializable { try { this.traceSegmentId = new ID(parts[0]); this.spanId = Integer.parseInt(parts[1]); - this.parentApplicationInstanceId = Integer.parseInt(parts[2]); - this.entryApplicationInstanceId = Integer.parseInt(parts[3]); + this.parentServiceInstanceId = Integer.parseInt(parts[2]); + this.entryServiceInstanceId = Integer.parseInt(parts[3]); this.peerHost = parts[4]; - this.entryOperationName = parts[5]; - this.parentOperationName = parts[6]; + this.entryEndpointName = parts[5]; + this.parentEndpointName = parts[6]; this.primaryDistributedTraceId = new PropagatedTraceId(parts[7]); } catch (NumberFormatException e) { @@ -171,11 +171,11 @@ public class ContextCarrier implements Serializable { this.primaryDistributedTraceId = new PropagatedTraceId(Base64.decode2UTFString(parts[1])); this.traceSegmentId = new ID(Base64.decode2UTFString(parts[2])); this.spanId = Integer.parseInt(parts[3]); - this.parentApplicationInstanceId = Integer.parseInt(parts[4]); - this.entryApplicationInstanceId = Integer.parseInt(parts[5]); + this.parentServiceInstanceId = Integer.parseInt(parts[4]); + this.entryServiceInstanceId = Integer.parseInt(parts[5]); this.peerHost = Base64.decode2UTFString(parts[6]); - this.entryOperationName = Base64.decode2UTFString(parts[7]); - this.parentOperationName = Base64.decode2UTFString(parts[8]); + this.entryEndpointName = Base64.decode2UTFString(parts[7]); + this.parentEndpointName = Base64.decode2UTFString(parts[8]); } catch (NumberFormatException e) { } @@ -201,18 +201,18 @@ public class ContextCarrier implements Serializable { return traceSegmentId != null && traceSegmentId.isValid() && getSpanId() > -1 - && parentApplicationInstanceId != DictionaryUtil.nullValue() - && entryApplicationInstanceId != DictionaryUtil.nullValue() + && parentServiceInstanceId != DictionaryUtil.nullValue() + && entryServiceInstanceId != DictionaryUtil.nullValue() && !StringUtil.isEmpty(peerHost) - && !StringUtil.isEmpty(entryOperationName) - && !StringUtil.isEmpty(parentOperationName) + && !StringUtil.isEmpty(entryEndpointName) + && !StringUtil.isEmpty(parentEndpointName) && primaryDistributedTraceId != null; } else if (HeaderVersion.v2.equals(version)) { return traceSegmentId != null && traceSegmentId.isValid() && getSpanId() > -1 - && parentApplicationInstanceId != DictionaryUtil.nullValue() - && entryApplicationInstanceId != DictionaryUtil.nullValue() + && parentServiceInstanceId != DictionaryUtil.nullValue() + && entryServiceInstanceId != DictionaryUtil.nullValue() && !StringUtil.isEmpty(peerHost) && primaryDistributedTraceId != null; } else { @@ -220,24 +220,24 @@ public class ContextCarrier implements Serializable { } } - public String getEntryOperationName() { - return entryOperationName; + public String getEntryEndpointName() { + return entryEndpointName; } - void setEntryOperationName(String entryOperationName) { - this.entryOperationName = '#' + entryOperationName; + void setEntryEndpointName(String entryEndpointName) { + this.entryEndpointName = '#' + entryEndpointName; } - void setEntryOperationId(int entryOperationId) { - this.entryOperationName = entryOperationId + ""; + void setEntryEndpointId(int entryOperationId) { + this.entryEndpointName = entryOperationId + ""; } - void setParentOperationName(String parentOperationName) { - this.parentOperationName = '#' + parentOperationName; + void setParentEndpointName(String parentEndpointName) { + this.parentEndpointName = '#' + parentEndpointName; } - void setParentOperationId(int parentOperationId) { - this.parentOperationName = parentOperationId + ""; + void setParentEndpointId(int parentOperationId) { + this.parentEndpointName = parentOperationId + ""; } public ID getTraceSegmentId() { @@ -256,12 +256,12 @@ public class ContextCarrier implements Serializable { this.spanId = spanId; } - public int getParentApplicationInstanceId() { - return parentApplicationInstanceId; + public int getParentServiceInstanceId() { + return parentServiceInstanceId; } - void setParentApplicationInstanceId(int parentApplicationInstanceId) { - this.parentApplicationInstanceId = parentApplicationInstanceId; + void setParentServiceInstanceId(int parentServiceInstanceId) { + this.parentServiceInstanceId = parentServiceInstanceId; } public String getPeerHost() { @@ -288,16 +288,16 @@ public class ContextCarrier implements Serializable { return primaryDistributedTraceId; } - public String getParentOperationName() { - return parentOperationName; + public String getParentEndpointName() { + return parentEndpointName; } - public int getEntryApplicationInstanceId() { - return entryApplicationInstanceId; + public int getEntryServiceInstanceId() { + return entryServiceInstanceId; } - public void setEntryApplicationInstanceId(int entryApplicationInstanceId) { - this.entryApplicationInstanceId = entryApplicationInstanceId; + public void setEntryServiceInstanceId(int entryServiceInstanceId) { + this.entryServiceInstanceId = entryServiceInstanceId; } public enum HeaderVersion { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java index a2ea19aaad0936a45fb9e81685ffe12d8bd97a70..aeaa708d201e206388f4d4d108456826b40c79b8 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ContextManager.java @@ -57,8 +57,8 @@ public class ContextManager implements TracingContextListener, BootService, Igno } context = new IgnoredTracerContext(); } else { - if (RemoteDownstreamConfig.Agent.APPLICATION_ID != DictionaryUtil.nullValue() - && RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID != DictionaryUtil.nullValue() + if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() + && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue() ) { context = EXTEND_SERVICE.createTraceContext(operationName, forceSampling); } else { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java index c4a3bf1d3d35b43f0a7fe778831cfd228cef644c..df35adabd4bc545cc5911ad0a19d7105fdec1e79 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/TracingContext.java @@ -112,7 +112,7 @@ public class TracingContext implements AbstractTracerContext { carrier.setTraceSegmentId(this.segment.getTraceSegmentId()); carrier.setSpanId(span.getSpanId()); - carrier.setParentApplicationInstanceId(segment.getApplicationInstanceId()); + carrier.setParentServiceInstanceId(segment.getApplicationInstanceId()); if (DictionaryUtil.isNull(peerId)) { carrier.setPeerHost(peer); @@ -125,30 +125,30 @@ public class TracingContext implements AbstractTracerContext { int entryApplicationInstanceId; if (refs != null && refs.size() > 0) { TraceSegmentRef ref = refs.get(0); - operationId = ref.getEntryOperationId(); - operationName = ref.getEntryOperationName(); - entryApplicationInstanceId = ref.getEntryApplicationInstanceId(); + operationId = ref.getEntryEndpointId(); + operationName = ref.getEntryEndpointName(); + entryApplicationInstanceId = ref.getEntryServiceInstanceId(); } else { AbstractSpan firstSpan = first(); operationId = firstSpan.getOperationId(); operationName = firstSpan.getOperationName(); entryApplicationInstanceId = this.segment.getApplicationInstanceId(); } - carrier.setEntryApplicationInstanceId(entryApplicationInstanceId); + carrier.setEntryServiceInstanceId(entryApplicationInstanceId); if (operationId == DictionaryUtil.nullValue()) { if (!StringUtil.isEmpty(operationName)) { - carrier.setEntryOperationName(operationName); + carrier.setEntryEndpointName(operationName); } } else { - carrier.setEntryOperationId(operationId); + carrier.setEntryEndpointId(operationId); } int parentOperationId = first().getOperationId(); if (parentOperationId == DictionaryUtil.nullValue()) { - carrier.setParentOperationName(first().getOperationName()); + carrier.setParentEndpointName(first().getOperationName()); } else { - carrier.setParentOperationId(parentOperationId); + carrier.setParentEndpointId(parentOperationId); } carrier.setDistributedTraceIds(this.segment.getRelatedGlobalTraces()); @@ -188,9 +188,9 @@ public class TracingContext implements AbstractTracerContext { AbstractSpan firstSpan = first(); if (refs != null && refs.size() > 0) { TraceSegmentRef ref = refs.get(0); - entryOperationId = ref.getEntryOperationId(); - entryOperationName = ref.getEntryOperationName(); - entryApplicationInstanceId = ref.getEntryApplicationInstanceId(); + entryOperationId = ref.getEntryEndpointId(); + entryOperationName = ref.getEntryEndpointName(); + entryApplicationInstanceId = ref.getEntryServiceInstanceId(); } else { entryOperationId = firstSpan.getOperationId(); entryOperationName = firstSpan.getOperationName(); @@ -251,8 +251,8 @@ public class TracingContext implements AbstractTracerContext { final AbstractSpan parentSpan = peek(); final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); if (parentSpan != null && parentSpan.isEntry()) { - entrySpan = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() - .findOnly(segment.getApplicationId(), operationName) + entrySpan = (AbstractTracingSpan)DictionaryManager.findEndpointSection() + .findOnly(segment.getServiceId(), operationName) .doInCondition(new PossibleFound.FoundAndObtain() { @Override public Object doProcess(int operationId) { return parentSpan.setOperationId(operationId); @@ -264,8 +264,8 @@ public class TracingContext implements AbstractTracerContext { }); return entrySpan.start(); } else { - entrySpan = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() - .findOnly(segment.getApplicationId(), operationName) + entrySpan = (AbstractTracingSpan)DictionaryManager.findEndpointSection() + .findOnly(segment.getServiceId(), operationName) .doInCondition(new PossibleFound.FoundAndObtain() { @Override public Object doProcess(int operationId) { return new EntrySpan(spanIdGenerator++, parentSpanId, operationId); @@ -294,19 +294,11 @@ public class TracingContext implements AbstractTracerContext { } AbstractSpan parentSpan = peek(); final int parentSpanId = parentSpan == null ? -1 : parentSpan.getSpanId(); - AbstractTracingSpan span = (AbstractTracingSpan)DictionaryManager.findOperationNameCodeSection() - .findOrPrepare4Register(segment.getApplicationId(), operationName, false, false) - .doInCondition(new PossibleFound.FoundAndObtain() { - @Override - public Object doProcess(int operationId) { - return new LocalSpan(spanIdGenerator++, parentSpanId, operationId); - } - }, new PossibleFound.NotFoundAndObtain() { - @Override - public Object doProcess() { - return new LocalSpan(spanIdGenerator++, parentSpanId, operationName); - } - }); + /** + * From v6.0.0-beta, local span doesn't do op name register. + * All op name register is related to entry and exit spans only. + */ + AbstractTracingSpan span = new LocalSpan(spanIdGenerator++, parentSpanId, operationName); span.start(); return push(span); } @@ -336,8 +328,8 @@ public class TracingContext implements AbstractTracerContext { return new NoopExitSpan(peerId); } - return DictionaryManager.findOperationNameCodeSection() - .findOnly(segment.getApplicationId(), operationName) + return DictionaryManager.findEndpointSection() + .findOnly(segment.getServiceId(), operationName) .doInCondition( new PossibleFound.FoundAndObtain() { @Override @@ -359,8 +351,8 @@ public class TracingContext implements AbstractTracerContext { return new NoopExitSpan(remotePeer); } - return DictionaryManager.findOperationNameCodeSection() - .findOnly(segment.getApplicationId(), operationName) + return DictionaryManager.findEndpointSection() + .findOnly(segment.getServiceId(), operationName) .doInCondition( new PossibleFound.FoundAndObtain() { @Override diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java index b6060f7851dfd0dc5a8df3283932d447250a210d..da2f20686f01c1ac5cd250c3cd5df57fa96f8088 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/ids/GlobalIdGenerator.java @@ -52,13 +52,13 @@ public final class GlobalIdGenerator { * @return an array contains three long numbers, which represents a unique id. */ public static ID generate() { - if (RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID == DictionaryUtil.nullValue()) { + if (RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID == DictionaryUtil.nullValue()) { throw new IllegalStateException(); } IDContext context = THREAD_ID_SEQUENCE.get(); return new ID( - RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID, + RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID, Thread.currentThread().getId(), context.nextSeq() ); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java index b0116c1d89754e6ee5c59d76902c915ae5638622..e840b7397ff4bb5e87365a893881508461b7cc1f 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/AbstractTracingSpan.java @@ -25,6 +25,7 @@ import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair; import org.apache.skywalking.apm.agent.core.context.util.ThrowableTransformer; import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; import org.apache.skywalking.apm.network.trace.component.Component; /** @@ -244,8 +245,8 @@ public abstract class AbstractTracingSpan implements AbstractSpan { return this; } - public SpanObject.Builder transform() { - SpanObject.Builder spanBuilder = SpanObject.newBuilder(); + public SpanObjectV2.Builder transform() { + SpanObjectV2.Builder spanBuilder = SpanObjectV2.newBuilder(); spanBuilder.setSpanId(this.spanId); spanBuilder.setParentSpanId(parentSpanId); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java index aeae4a25db7ec518cf980b91133469e08aaf61a7..400e5ba522f3f746854d19cb00fbd0acabbe4f6a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/ExitSpan.java @@ -20,8 +20,7 @@ package org.apache.skywalking.apm.agent.core.context.trace; import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; -import org.apache.skywalking.apm.network.language.agent.*; - +import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; import org.apache.skywalking.apm.network.trace.component.Component; /** @@ -119,8 +118,8 @@ public class ExitSpan extends StackBasedTracingSpan implements WithPeerInfo { return this; } - @Override public SpanObject.Builder transform() { - SpanObject.Builder spanBuilder = super.transform(); + @Override public SpanObjectV2.Builder transform() { + SpanObjectV2.Builder spanBuilder = super.transform(); if (peerId != DictionaryUtil.nullValue()) { spanBuilder.setPeerId(peerId); } else { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java index 9aa7b0af665b8be8ccd7c8295ef8ae58c4ef13a9..dbca6db1cbcdc963625d7c5293d06d932f8eeb17 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/LogDataEntity.java @@ -16,17 +16,16 @@ * */ - package org.apache.skywalking.apm.agent.core.context.trace; import java.util.LinkedList; import java.util.List; import org.apache.skywalking.apm.agent.core.context.util.KeyValuePair; -import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.language.agent.v2.Log; /** - * The LogDataEntity represents a collection of {@link KeyValuePair}, - * contains several fields of a logging operation. + * The LogDataEntity represents a collection of {@link KeyValuePair}, contains several fields of a logging + * operation. * * @author wusheng */ @@ -62,8 +61,8 @@ public class LogDataEntity { } } - public LogMessage transform() { - LogMessage.Builder logMessageBuilder = LogMessage.newBuilder(); + public Log transform() { + Log.Builder logMessageBuilder = Log.newBuilder(); for (KeyValuePair log : logs) { logMessageBuilder.addData(log.transform()); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java index 4ee8957c8940a5018be1dce38dacd61ecc7e476b..dc0899a3c4979f203cf73c7655290903eb74ab45 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/StackBasedTracingSpan.java @@ -46,8 +46,8 @@ public abstract class StackBasedTracingSpan extends AbstractTracingSpan { public boolean finish(TraceSegment owner) { if (--stackDepth == 0) { if (this.operationId == DictionaryUtil.nullValue()) { - this.operationId = (Integer)DictionaryManager.findOperationNameCodeSection() - .findOrPrepare4Register(owner.getApplicationId(), operationName, this.isEntry(), this.isExit()) + this.operationId = (Integer)DictionaryManager.findEndpointSection() + .findOrPrepare4Register(owner.getServiceId(), operationName, this.isEntry(), this.isExit()) .doInCondition( new PossibleFound.FoundAndObtain() { @Override public Object doProcess(int value) { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java index f5c4581712a30e3df858c344dcab776abc824ab8..b1f591c59b0df0d50df68218047fd3345adcb9c3 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegment.java @@ -28,6 +28,7 @@ import org.apache.skywalking.apm.agent.core.context.ids.GlobalIdGenerator; import org.apache.skywalking.apm.agent.core.context.ids.ID; import org.apache.skywalking.apm.agent.core.context.ids.NewDistributedTraceId; import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; /** * {@link TraceSegment} is a segment or fragment of the distributed trace. See https://github.com/opentracing/specification/blob/master/specification.md#the-opentracing-data-model @@ -124,8 +125,8 @@ public class TraceSegment { return traceSegmentId; } - public int getApplicationId() { - return RemoteDownstreamConfig.Agent.APPLICATION_ID; + public int getServiceId() { + return RemoteDownstreamConfig.Agent.SERVICE_ID; } public boolean hasRef() { @@ -162,7 +163,7 @@ public class TraceSegment { for (DistributedTraceId distributedTraceId : getRelatedGlobalTraces()) { upstreamBuilder = upstreamBuilder.addGlobalTraceIds(distributedTraceId.toUniqueId()); } - TraceSegmentObject.Builder traceSegmentBuilder = TraceSegmentObject.newBuilder(); + SegmentObject.Builder traceSegmentBuilder = SegmentObject.newBuilder(); /** * Trace Segment */ @@ -173,8 +174,8 @@ public class TraceSegment { for (AbstractTracingSpan span : this.spans) { traceSegmentBuilder.addSpans(span.transform()); } - traceSegmentBuilder.setApplicationId(RemoteDownstreamConfig.Agent.APPLICATION_ID); - traceSegmentBuilder.setApplicationInstanceId(RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID); + traceSegmentBuilder.setServiceId(RemoteDownstreamConfig.Agent.SERVICE_ID); + traceSegmentBuilder.setServiceInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID); traceSegmentBuilder.setIsSizeLimited(this.isSizeLimited); upstreamBuilder.setSegment(traceSegmentBuilder.build().toByteString()); @@ -192,6 +193,6 @@ public class TraceSegment { } public int getApplicationInstanceId() { - return RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID; + return RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID; } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java index ef3f287b51529842b3a29bd5d416468ddf74812d..24abf071a807039f2c7ddf0216b9bf7d5ad223dd 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/TraceSegmentRef.java @@ -24,7 +24,7 @@ import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; import org.apache.skywalking.apm.agent.core.context.ids.ID; import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; 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.v2.SegmentReference; import org.apache.skywalking.apm.util.StringUtil; /** @@ -44,17 +44,17 @@ public class TraceSegmentRef { private String peerHost; - private int entryApplicationInstanceId = DictionaryUtil.nullValue(); + private int entryServiceInstanceId = DictionaryUtil.nullValue(); - private int parentApplicationInstanceId = DictionaryUtil.nullValue(); + private int parentServiceInstanceId = DictionaryUtil.nullValue(); - private String entryOperationName; + private String entryEndpointName; - private int entryOperationId = DictionaryUtil.nullValue(); + private int entryEndpointId = DictionaryUtil.nullValue(); - private String parentOperationName; + private String parentEndpointName; - private int parentOperationId = DictionaryUtil.nullValue(); + private int parentEndpointId = DictionaryUtil.nullValue(); /** * Transform a {@link ContextCarrier} to the TraceSegmentRef @@ -65,28 +65,28 @@ public class TraceSegmentRef { this.type = SegmentRefType.CROSS_PROCESS; this.traceSegmentId = carrier.getTraceSegmentId(); this.spanId = carrier.getSpanId(); - this.parentApplicationInstanceId = carrier.getParentApplicationInstanceId(); - this.entryApplicationInstanceId = carrier.getEntryApplicationInstanceId(); + this.parentServiceInstanceId = carrier.getParentServiceInstanceId(); + this.entryServiceInstanceId = carrier.getEntryServiceInstanceId(); String host = carrier.getPeerHost(); if (host.charAt(0) == '#') { this.peerHost = host.substring(1); } else { this.peerId = Integer.parseInt(host); } - String entryOperationName = carrier.getEntryOperationName(); + String entryOperationName = carrier.getEntryEndpointName(); if (!StringUtil.isEmpty(entryOperationName)) { if (entryOperationName.charAt(0) == '#') { - this.entryOperationName = entryOperationName.substring(1); + this.entryEndpointName = entryOperationName.substring(1); } else { - this.entryOperationId = Integer.parseInt(entryOperationName); + this.entryEndpointId = Integer.parseInt(entryOperationName); } } - String parentOperationName = carrier.getParentOperationName(); + String parentOperationName = carrier.getParentEndpointName(); if (!StringUtil.isEmpty(parentOperationName)) { if (parentOperationName.charAt(0) == '#') { - this.parentOperationName = parentOperationName.substring(1); + this.parentEndpointName = parentOperationName.substring(1); } else { - this.parentOperationId = Integer.parseInt(parentOperationName); + this.parentEndpointId = Integer.parseInt(parentOperationName); } } } @@ -95,40 +95,40 @@ public class TraceSegmentRef { this.type = SegmentRefType.CROSS_THREAD; this.traceSegmentId = snapshot.getTraceSegmentId(); this.spanId = snapshot.getSpanId(); - this.parentApplicationInstanceId = RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID; - this.entryApplicationInstanceId = snapshot.getEntryApplicationInstanceId(); + this.parentServiceInstanceId = RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID; + this.entryServiceInstanceId = snapshot.getEntryApplicationInstanceId(); String entryOperationName = snapshot.getEntryOperationName(); if (!StringUtil.isEmpty(entryOperationName)) { if (entryOperationName.charAt(0) == '#') { - this.entryOperationName = entryOperationName.substring(1); + this.entryEndpointName = entryOperationName.substring(1); } else { - this.entryOperationId = Integer.parseInt(entryOperationName); + this.entryEndpointId = Integer.parseInt(entryOperationName); } } String parentOperationName = snapshot.getParentOperationName(); if (!StringUtil.isEmpty(parentOperationName)) { if (parentOperationName.charAt(0) == '#') { - this.parentOperationName = parentOperationName.substring(1); + this.parentEndpointName = parentOperationName.substring(1); } else { - this.parentOperationId = Integer.parseInt(parentOperationName); + this.parentEndpointId = Integer.parseInt(parentOperationName); } } } - public String getEntryOperationName() { - return entryOperationName; + public String getEntryEndpointName() { + return entryEndpointName; } - public int getEntryOperationId() { - return entryOperationId; + public int getEntryEndpointId() { + return entryEndpointId; } - public int getEntryApplicationInstanceId() { - return entryApplicationInstanceId; + public int getEntryServiceInstanceId() { + return entryServiceInstanceId; } - public TraceSegmentReference transform() { - TraceSegmentReference.Builder refBuilder = TraceSegmentReference.newBuilder(); + public SegmentReference transform() { + SegmentReference.Builder refBuilder = SegmentReference.newBuilder(); if (SegmentRefType.CROSS_PROCESS.equals(type)) { refBuilder.setRefType(RefType.CrossProcess); if (peerId == DictionaryUtil.nullValue()) { @@ -140,28 +140,28 @@ public class TraceSegmentRef { refBuilder.setRefType(RefType.CrossThread); } - refBuilder.setParentApplicationInstanceId(parentApplicationInstanceId); - refBuilder.setEntryApplicationInstanceId(entryApplicationInstanceId); + refBuilder.setParentServiceInstanceId(parentServiceInstanceId); + refBuilder.setEntryServiceInstanceId(entryServiceInstanceId); refBuilder.setParentTraceSegmentId(traceSegmentId.transform()); refBuilder.setParentSpanId(spanId); /** - * entryOperationId/entryOperationName and parentOperationId/parentOperationName could be empty at same time. + * entryEndpointId/entryEndpointName and parentEndpointId/parentEndpointName could be empty at same time. * This is accepted in v2 format. * */ - if (entryOperationId == DictionaryUtil.nullValue()) { - if (!StringUtil.isEmpty(entryOperationName)) { - refBuilder.setEntryServiceName(entryOperationName); + if (entryEndpointId == DictionaryUtil.nullValue()) { + if (!StringUtil.isEmpty(entryEndpointName)) { + refBuilder.setEntryEndpoint(entryEndpointName); } } else { - refBuilder.setEntryServiceId(entryOperationId); + refBuilder.setEntryEndpointId(entryEndpointId); } - if (parentOperationId == DictionaryUtil.nullValue()) { - if (!StringUtil.isEmpty(parentOperationName)) { - refBuilder.setParentServiceName(parentOperationName); + if (parentEndpointId == DictionaryUtil.nullValue()) { + if (!StringUtil.isEmpty(parentEndpointName)) { + refBuilder.setParentEndpoint(parentEndpointName); } } else { - refBuilder.setParentServiceId(parentOperationId); + refBuilder.setParentEndpointId(parentEndpointId); } return refBuilder.build(); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/util/KeyValuePair.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/util/KeyValuePair.java index e9ddc640d97c74586362c47bc1c3f627310a86df..86b4822fb9e7741a4e6e9a981fb2f7620213aa0a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/util/KeyValuePair.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/util/KeyValuePair.java @@ -19,7 +19,7 @@ package org.apache.skywalking.apm.agent.core.context.util; -import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.common.KeyStringValuePair; /** * The KeyValuePair represents a object which contains a string key and a string value. @@ -43,8 +43,8 @@ public class KeyValuePair { return value; } - public KeyWithStringValue transform() { - KeyWithStringValue.Builder keyValueBuilder = KeyWithStringValue.newBuilder(); + public KeyStringValuePair transform() { + KeyStringValuePair.Builder keyValueBuilder = KeyStringValuePair.newBuilder(); keyValueBuilder.setKey(key); if (value != null) { keyValueBuilder.setValue(value); diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java index 7d354320837078e316ce45c5e7405c9212b621e1..bd50d47fc802ab21ed0ceb090f24ae2753c0e895 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/DictionaryManager.java @@ -31,9 +31,9 @@ public class DictionaryManager { } /** - * @return {@link OperationNameDictionary} to find service id. + * @return {@link EndpointNameDictionary} to find service id. */ - public static OperationNameDictionary findOperationNameCodeSection() { - return OperationNameDictionary.INSTANCE; + public static EndpointNameDictionary findEndpointSection() { + return EndpointNameDictionary.INSTANCE; } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/EndpointNameDictionary.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/EndpointNameDictionary.java new file mode 100644 index 0000000000000000000000000000000000000000..ac56aa608715433ad57d5f55ef35b68c1eb58418 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/EndpointNameDictionary.java @@ -0,0 +1,170 @@ +/* + * 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.dictionary; + +import io.netty.util.internal.ConcurrentSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.skywalking.apm.agent.core.logging.api.ILog; +import org.apache.skywalking.apm.agent.core.logging.api.LogManager; +import org.apache.skywalking.apm.network.common.DetectPoint; +import org.apache.skywalking.apm.network.register.v2.Endpoint; +import org.apache.skywalking.apm.network.register.v2.EndpointMapping; +import org.apache.skywalking.apm.network.register.v2.EndpointMappingElement; +import org.apache.skywalking.apm.network.register.v2.Enpoints; +import org.apache.skywalking.apm.network.register.v2.RegisterGrpc; + +import static org.apache.skywalking.apm.agent.core.conf.Config.Dictionary.ENDPOINT_NAME_BUFFER_SIZE; + +/** + * @author wusheng + */ +public enum EndpointNameDictionary { + INSTANCE; + private static final ILog logger = LogManager.getLogger(EndpointNameDictionary.class); + + private Map endpointDictionary = new ConcurrentHashMap(); + private Set unRegisterEndpoints = new ConcurrentSet(); + + public PossibleFound findOrPrepare4Register(int serviceId, String endpointName, + boolean isEntry, boolean isExit) { + return find0(serviceId, endpointName, isEntry, isExit, true); + } + + public PossibleFound findOnly(int serviceId, String endpointName) { + return find0(serviceId, endpointName, false, false, false); + } + + private PossibleFound find0(int serviceId, String endpointName, + boolean isEntry, boolean isExit, boolean registerWhenNotFound) { + if (endpointName == null || endpointName.length() == 0) { + return new NotFound(); + } + OperationNameKey key = new OperationNameKey(serviceId, endpointName, isEntry, isExit); + Integer operationId = endpointDictionary.get(key); + if (operationId != null) { + return new Found(operationId); + } else { + if (registerWhenNotFound && + endpointDictionary.size() + unRegisterEndpoints.size() < ENDPOINT_NAME_BUFFER_SIZE) { + unRegisterEndpoints.add(key); + } + return new NotFound(); + } + } + + public void syncRemoteDictionary( + RegisterGrpc.RegisterBlockingStub serviceNameDiscoveryServiceBlockingStub) { + if (unRegisterEndpoints.size() > 0) { + Enpoints.Builder builder = Enpoints.newBuilder(); + for (OperationNameKey operationNameKey : unRegisterEndpoints) { + Endpoint endpoint = Endpoint.newBuilder() + .setServiceId(operationNameKey.getServiceId()) + .setEndpointName(operationNameKey.getEndpointName()) + .setFrom(operationNameKey.getSpanType()) + .build(); + builder.addEndpoints(endpoint); + } + EndpointMapping serviceNameMappingCollection = serviceNameDiscoveryServiceBlockingStub.doEndpointRegister(builder.build()); + if (serviceNameMappingCollection.getElementsCount() > 0) { + for (EndpointMappingElement element : serviceNameMappingCollection.getElementsList()) { + OperationNameKey key = new OperationNameKey( + element.getServiceId(), + element.getEndpointName(), + DetectPoint.server.equals(element.getFrom()), + DetectPoint.client.equals(element.getFrom())); + unRegisterEndpoints.remove(key); + endpointDictionary.put(key, element.getEndpointId()); + } + } + } + } + + private class OperationNameKey { + private int serviceId; + private String endpointName; + private boolean isEntry; + private boolean isExit; + + public OperationNameKey(int serviceId, String endpointName, boolean isEntry, boolean isExit) { + this.serviceId = serviceId; + this.endpointName = endpointName; + this.isEntry = isEntry; + this.isExit = isExit; + } + + public int getServiceId() { + return serviceId; + } + + public String getEndpointName() { + return endpointName; + } + + @Override public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + OperationNameKey key = (OperationNameKey)o; + + boolean isServiceEndpointMatch = false; + if (serviceId == key.serviceId && endpointName.equals(key.endpointName)) { + isServiceEndpointMatch = true; + } + return isServiceEndpointMatch && isEntry == key.isEntry + && isExit == key.isExit; + } + + @Override public int hashCode() { + int result = serviceId; + result = 31 * result + endpointName.hashCode(); + return result; + } + + boolean isEntry() { + return isEntry; + } + + boolean isExit() { + return isExit; + } + + DetectPoint getSpanType() { + if (isEntry) { + return DetectPoint.server; + } else if (isExit) { + return DetectPoint.client; + } else { + return DetectPoint.UNRECOGNIZED; + } + } + + @Override public String toString() { + return "OperationNameKey{" + + "serviceId=" + serviceId + + ", endpointName='" + endpointName + '\'' + + ", isEntry=" + isEntry + + ", isExit=" + isExit + + '}'; + } + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java index 208ba172555cf1d54ea4726921314bf033866636..2e9e2aa743da35876ada6875b265897ee53af5d0 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/NetworkAddressDictionary.java @@ -23,9 +23,13 @@ import io.netty.util.internal.ConcurrentSet; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import org.apache.skywalking.apm.network.common.KeyIntValuePair; import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.register.v2.NetAddressMapping; +import org.apache.skywalking.apm.network.register.v2.NetAddresses; +import org.apache.skywalking.apm.network.register.v2.RegisterGrpc; -import static org.apache.skywalking.apm.agent.core.conf.Config.Dictionary.APPLICATION_CODE_BUFFER_SIZE; +import static org.apache.skywalking.apm.agent.core.conf.Config.Dictionary.SERVICE_CODE_BUFFER_SIZE; /** * Map of network address id to network literal address, which is from the collector side. @@ -35,28 +39,28 @@ import static org.apache.skywalking.apm.agent.core.conf.Config.Dictionary.APPLIC public enum NetworkAddressDictionary { INSTANCE; private Map applicationDictionary = new ConcurrentHashMap(); - private Set unRegisterApplications = new ConcurrentSet(); + private Set unRegisterServices = new ConcurrentSet(); public PossibleFound find(String networkAddress) { Integer applicationId = applicationDictionary.get(networkAddress); if (applicationId != null) { return new Found(applicationId); } else { - if (applicationDictionary.size() + unRegisterApplications.size() < APPLICATION_CODE_BUFFER_SIZE) { - unRegisterApplications.add(networkAddress); + if (applicationDictionary.size() + unRegisterServices.size() < SERVICE_CODE_BUFFER_SIZE) { + unRegisterServices.add(networkAddress); } return new NotFound(); } } public void syncRemoteDictionary( - NetworkAddressRegisterServiceGrpc.NetworkAddressRegisterServiceBlockingStub networkAddressRegisterServiceBlockingStub) { - if (unRegisterApplications.size() > 0) { - NetworkAddressMappings networkAddressMappings = networkAddressRegisterServiceBlockingStub.batchRegister( - NetworkAddresses.newBuilder().addAllAddresses(unRegisterApplications).build()); + RegisterGrpc.RegisterBlockingStub networkAddressRegisterServiceBlockingStub) { + if (unRegisterServices.size() > 0) { + NetAddressMapping networkAddressMappings = networkAddressRegisterServiceBlockingStub.doNetworkAddressRegister( + NetAddresses.newBuilder().addAllAddresses(unRegisterServices).build()); if (networkAddressMappings.getAddressIdsCount() > 0) { - for (KeyWithIntegerValue keyWithIntegerValue : networkAddressMappings.getAddressIdsList()) { - unRegisterApplications.remove(keyWithIntegerValue.getKey()); + for (KeyIntValuePair keyWithIntegerValue : networkAddressMappings.getAddressIdsList()) { + unRegisterServices.remove(keyWithIntegerValue.getKey()); applicationDictionary.put(keyWithIntegerValue.getKey(), keyWithIntegerValue.getValue()); } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java deleted file mode 100644 index 7f743b59312bdd004a4a219f9a6e773bd5a09fd2..0000000000000000000000000000000000000000 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/dictionary/OperationNameDictionary.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.agent.core.dictionary; - -import io.netty.util.internal.ConcurrentSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import org.apache.skywalking.apm.network.language.agent.*; - -import static org.apache.skywalking.apm.agent.core.conf.Config.Dictionary.OPERATION_NAME_BUFFER_SIZE; - -/** - * @author wusheng - */ -public enum OperationNameDictionary { - INSTANCE; - private Map operationNameDictionary = new ConcurrentHashMap(); - private Set unRegisterOperationNames = new ConcurrentSet(); - - public PossibleFound findOrPrepare4Register(int applicationId, String operationName, - boolean isEntry, boolean isExit) { - return find0(applicationId, operationName, isEntry, isExit, true); - } - - public PossibleFound findOnly(int applicationId, String operationName) { - return find0(applicationId, operationName, false, false, false); - } - - private PossibleFound find0(int applicationId, String operationName, - boolean isEntry, boolean isExit, boolean registerWhenNotFound) { - if (operationName == null || operationName.length() == 0) { - return new NotFound(); - } - OperationNameKey key = new OperationNameKey(applicationId, operationName, isEntry, isExit); - Integer operationId = operationNameDictionary.get(key); - if (operationId != null) { - return new Found(operationId); - } else { - if (registerWhenNotFound && - operationNameDictionary.size() + unRegisterOperationNames.size() < OPERATION_NAME_BUFFER_SIZE) { - unRegisterOperationNames.add(key); - } - return new NotFound(); - } - } - - public void syncRemoteDictionary( - ServiceNameDiscoveryServiceGrpc.ServiceNameDiscoveryServiceBlockingStub serviceNameDiscoveryServiceBlockingStub) { - if (unRegisterOperationNames.size() > 0) { - ServiceNameCollection.Builder builder = ServiceNameCollection.newBuilder(); - for (OperationNameKey operationNameKey : unRegisterOperationNames) { - ServiceNameElement serviceNameElement = ServiceNameElement.newBuilder() - .setApplicationId(operationNameKey.getApplicationId()) - .setServiceName(operationNameKey.getOperationName()) - .setSrcSpanType(operationNameKey.getSpanType()) - .build(); - builder.addElements(serviceNameElement); - } - ServiceNameMappingCollection serviceNameMappingCollection = serviceNameDiscoveryServiceBlockingStub.discovery(builder.build()); - if (serviceNameMappingCollection.getElementsCount() > 0) { - for (ServiceNameMappingElement serviceNameMappingElement : serviceNameMappingCollection.getElementsList()) { - ServiceNameElement element = serviceNameMappingElement.getElement(); - OperationNameKey key = new OperationNameKey( - element.getApplicationId(), - element.getServiceName(), - SpanType.Entry.equals(element.getSrcSpanType()), - SpanType.Exit.equals(element.getSrcSpanType())); - unRegisterOperationNames.remove(key); - operationNameDictionary.put(key, serviceNameMappingElement.getServiceId()); - } - } - } - } - - private class OperationNameKey { - private int applicationId; - private String operationName; - private boolean isEntry; - private boolean isExit; - - public OperationNameKey(int applicationId, String operationName, boolean isEntry, boolean isExit) { - this.applicationId = applicationId; - this.operationName = operationName; - this.isEntry = isEntry; - this.isExit = isExit; - } - - public int getApplicationId() { - return applicationId; - } - - public String getOperationName() { - return operationName; - } - - @Override public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - - OperationNameKey key = (OperationNameKey)o; - - boolean isApplicationMatch = false; - if (applicationId == key.applicationId) { - isApplicationMatch = true; - } else if (operationName.equals(key.operationName)) { - isApplicationMatch = true; - } - return isApplicationMatch && isEntry == key.isEntry - && isExit == key.isExit; - } - - @Override public int hashCode() { - int result = applicationId; - result = 31 * result + operationName.hashCode(); - return result; - } - - boolean isEntry() { - return isEntry; - } - - boolean isExit() { - return isExit; - } - - SpanType getSpanType() { - if (isEntry) { - return SpanType.Entry; - } else if (isExit) { - return SpanType.Exit; - } else { - return SpanType.Local; - } - } - } -} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java index 37b92962a8c9a0df68bf170b8de4487d048ffb98..d5f1032aa00442720038412fc3a24fab223d4ea9 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/jvm/JVMService.java @@ -19,6 +19,11 @@ package org.apache.skywalking.apm.agent.core.jvm; import io.grpc.Channel; +import java.util.LinkedList; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; import org.apache.skywalking.apm.agent.core.boot.BootService; import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor; import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; @@ -35,19 +40,14 @@ import org.apache.skywalking.apm.agent.core.logging.api.LogManager; import org.apache.skywalking.apm.agent.core.remote.GRPCChannelListener; import org.apache.skywalking.apm.agent.core.remote.GRPCChannelManager; import org.apache.skywalking.apm.agent.core.remote.GRPCChannelStatus; -import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.language.agent.JVMMetric; +import org.apache.skywalking.apm.network.language.agent.v2.JVMMetricCollection; +import org.apache.skywalking.apm.network.language.agent.v2.JVMMetricReportServiceGrpc; import org.apache.skywalking.apm.util.RunnableWithExceptionProtection; -import java.util.LinkedList; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - /** - * The JVMService represents a timer, - * which collectors JVM cpu, memory, memorypool and gc info, - * and send the collected info to Collector through the channel provided by {@link GRPCChannelManager} + * The JVMService represents a timer, which collectors JVM cpu, memory, memorypool and gc info, and send + * the collected info to Collector through the channel provided by {@link GRPCChannelManager} * * @author wusheng */ @@ -98,9 +98,9 @@ public class JVMService implements BootService, Runnable { @Override public void run() { - if (RemoteDownstreamConfig.Agent.APPLICATION_ID != DictionaryUtil.nullValue() - && RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID != DictionaryUtil.nullValue() - ) { + if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() + && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue() + ) { long currentTimeMillis = System.currentTimeMillis(); try { JVMMetric.Builder jvmBuilder = JVMMetric.newBuilder(); @@ -123,21 +123,21 @@ public class JVMService implements BootService, Runnable { private class Sender implements Runnable, GRPCChannelListener { private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT; - private volatile JVMMetricsServiceGrpc.JVMMetricsServiceBlockingStub stub = null; + private volatile JVMMetricReportServiceGrpc.JVMMetricReportServiceBlockingStub stub = null; @Override public void run() { - if (RemoteDownstreamConfig.Agent.APPLICATION_ID != DictionaryUtil.nullValue() - && RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID != DictionaryUtil.nullValue() - ) { + if (RemoteDownstreamConfig.Agent.SERVICE_ID != DictionaryUtil.nullValue() + && RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID != DictionaryUtil.nullValue() + ) { if (status == GRPCChannelStatus.CONNECTED) { try { - JVMMetrics.Builder builder = JVMMetrics.newBuilder(); + JVMMetricCollection.Builder builder = JVMMetricCollection.newBuilder(); LinkedList buffer = new LinkedList(); queue.drainTo(buffer); if (buffer.size() > 0) { builder.addAllMetrics(buffer); - builder.setApplicationInstanceId(RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID); + builder.setServiceInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID); stub.collect(builder.build()); } } catch (Throwable t) { @@ -151,7 +151,7 @@ public class JVMService implements BootService, Runnable { public void statusChanged(GRPCChannelStatus status) { if (GRPCChannelStatus.CONNECTED.equals(status)) { Channel channel = ServiceManager.INSTANCE.findService(GRPCChannelManager.class).getChannel(); - stub = JVMMetricsServiceGrpc.newBlockingStub(channel); + stub = JVMMetricReportServiceGrpc.newBlockingStub(channel); } this.status = status; } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java index d3434e8faf9fdabe81c6c0cb09ab2987c83ca985..0f4a1cbf9ac6aa34b9b8461ddd41dcd3907d751b 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/os/OSUtil.java @@ -16,7 +16,6 @@ * */ - package org.apache.skywalking.apm.agent.core.os; import java.lang.management.ManagementFactory; @@ -25,10 +24,11 @@ import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; -import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.common.KeyStringValuePair; /** * @author wusheng @@ -95,21 +95,24 @@ public class OSUtil { return PROCESS_NO; } - public static OSInfo buildOSInfo() { - OSInfo.Builder builder = OSInfo.newBuilder(); + public static List buildOSInfo() { + List osInfo = new ArrayList(); + String osName = getOsName(); if (osName != null) { - builder.setOsName(osName); + osInfo.add(KeyStringValuePair.newBuilder().setKey("OSName").setValue(osName).build()); } String hostName = getHostName(); if (hostName != null) { - builder.setHostname(hostName); + osInfo.add(KeyStringValuePair.newBuilder().setKey("hostname").setValue(hostName).build()); } List allIPV4 = getAllIPV4(); if (allIPV4.size() > 0) { - builder.addAllIpv4S(allIPV4); + for (String ipv4 : allIPV4) { + osInfo.add(KeyStringValuePair.newBuilder().setKey("ipv4").setValue(ipv4).build()); + } } - builder.setProcessNo(getProcessNo()); - return builder.build(); + osInfo.add(KeyStringValuePair.newBuilder().setKey("ProcessNo").setValue(getProcessNo() + "").build()); + return osInfo; } } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java deleted file mode 100644 index de5c17db4d6e03e5f5b197d15ade0532062815f1..0000000000000000000000000000000000000000 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/AppAndServiceRegisterClient.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.agent.core.remote; - -import io.grpc.Channel; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import org.apache.skywalking.apm.agent.core.boot.BootService; -import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor; -import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; -import org.apache.skywalking.apm.agent.core.boot.ServiceManager; -import org.apache.skywalking.apm.agent.core.conf.Config; -import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; -import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; -import org.apache.skywalking.apm.agent.core.dictionary.NetworkAddressDictionary; -import org.apache.skywalking.apm.agent.core.dictionary.OperationNameDictionary; -import org.apache.skywalking.apm.agent.core.logging.api.ILog; -import org.apache.skywalking.apm.agent.core.logging.api.LogManager; -import org.apache.skywalking.apm.agent.core.os.OSUtil; -import org.apache.skywalking.apm.network.language.agent.Application; -import org.apache.skywalking.apm.network.language.agent.ApplicationInstance; -import org.apache.skywalking.apm.network.language.agent.ApplicationInstanceHeartbeat; -import org.apache.skywalking.apm.network.language.agent.ApplicationInstanceMapping; -import org.apache.skywalking.apm.network.language.agent.ApplicationMapping; -import org.apache.skywalking.apm.network.language.agent.ApplicationRegisterServiceGrpc; -import org.apache.skywalking.apm.network.language.agent.InstanceDiscoveryServiceGrpc; -import org.apache.skywalking.apm.network.language.agent.NetworkAddressRegisterServiceGrpc; -import org.apache.skywalking.apm.network.language.agent.ServiceNameDiscoveryServiceGrpc; -import org.apache.skywalking.apm.util.RunnableWithExceptionProtection; - -/** - * @author wusheng - */ -@DefaultImplementor -public class AppAndServiceRegisterClient implements BootService, Runnable, GRPCChannelListener { - private static final ILog logger = LogManager.getLogger(AppAndServiceRegisterClient.class); - private static final String PROCESS_UUID = UUID.randomUUID().toString().replaceAll("-", ""); - - private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT; - private volatile ApplicationRegisterServiceGrpc.ApplicationRegisterServiceBlockingStub applicationRegisterServiceBlockingStub; - private volatile InstanceDiscoveryServiceGrpc.InstanceDiscoveryServiceBlockingStub instanceDiscoveryServiceBlockingStub; - private volatile ServiceNameDiscoveryServiceGrpc.ServiceNameDiscoveryServiceBlockingStub serviceNameDiscoveryServiceBlockingStub; - private volatile NetworkAddressRegisterServiceGrpc.NetworkAddressRegisterServiceBlockingStub networkAddressRegisterServiceBlockingStub; - private volatile ScheduledFuture applicationRegisterFuture; - - @Override - public void statusChanged(GRPCChannelStatus status) { - if (GRPCChannelStatus.CONNECTED.equals(status)) { - Channel channel = ServiceManager.INSTANCE.findService(GRPCChannelManager.class).getChannel(); - applicationRegisterServiceBlockingStub = ApplicationRegisterServiceGrpc.newBlockingStub(channel); - instanceDiscoveryServiceBlockingStub = InstanceDiscoveryServiceGrpc.newBlockingStub(channel); - serviceNameDiscoveryServiceBlockingStub = ServiceNameDiscoveryServiceGrpc.newBlockingStub(channel); - networkAddressRegisterServiceBlockingStub = NetworkAddressRegisterServiceGrpc.newBlockingStub(channel); - } else { - applicationRegisterServiceBlockingStub = null; - instanceDiscoveryServiceBlockingStub = null; - serviceNameDiscoveryServiceBlockingStub = null; - } - this.status = status; - } - - @Override - public void prepare() throws Throwable { - ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(this); - } - - @Override - public void boot() throws Throwable { - applicationRegisterFuture = Executors - .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("AppAndServiceRegisterClient")) - .scheduleAtFixedRate(new RunnableWithExceptionProtection(this, new RunnableWithExceptionProtection.CallbackWhenException() { - @Override - public void handle(Throwable t) { - logger.error("unexpected exception.", t); - } - }), 0, Config.Collector.APP_AND_SERVICE_REGISTER_CHECK_INTERVAL, TimeUnit.SECONDS); - } - - @Override - public void onComplete() throws Throwable { - } - - @Override - public void shutdown() throws Throwable { - applicationRegisterFuture.cancel(true); - } - - @Override - public void run() { - logger.debug("AppAndServiceRegisterClient running, status:{}.", status); - boolean shouldTry = true; - while (GRPCChannelStatus.CONNECTED.equals(status) && shouldTry) { - shouldTry = false; - try { - if (RemoteDownstreamConfig.Agent.APPLICATION_ID == DictionaryUtil.nullValue()) { - if (applicationRegisterServiceBlockingStub != null) { - ApplicationMapping applicationMapping = applicationRegisterServiceBlockingStub.applicationCodeRegister( - Application.newBuilder().setApplicationCode(Config.Agent.APPLICATION_CODE).build()); - if (applicationMapping != null) { - RemoteDownstreamConfig.Agent.APPLICATION_ID = applicationMapping.getApplication().getValue(); - shouldTry = true; - } - } - } else { - if (instanceDiscoveryServiceBlockingStub != null) { - if (RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID == DictionaryUtil.nullValue()) { - - ApplicationInstanceMapping instanceMapping = instanceDiscoveryServiceBlockingStub.registerInstance(ApplicationInstance.newBuilder() - .setApplicationId(RemoteDownstreamConfig.Agent.APPLICATION_ID) - .setAgentUUID(PROCESS_UUID) - .setRegisterTime(System.currentTimeMillis()) - .setOsinfo(OSUtil.buildOSInfo()) - .build()); - if (instanceMapping.getApplicationInstanceId() != DictionaryUtil.nullValue()) { - RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID - = instanceMapping.getApplicationInstanceId(); - } - } else { - instanceDiscoveryServiceBlockingStub.heartbeat(ApplicationInstanceHeartbeat.newBuilder() - .setApplicationInstanceId(RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID) - .setHeartbeatTime(System.currentTimeMillis()) - .build()); - - NetworkAddressDictionary.INSTANCE.syncRemoteDictionary(networkAddressRegisterServiceBlockingStub); - OperationNameDictionary.INSTANCE.syncRemoteDictionary(serviceNameDiscoveryServiceBlockingStub); - } - } - } - } catch (Throwable t) { - logger.error(t, "AppAndServiceRegisterClient execute fail."); - ServiceManager.INSTANCE.findService(GRPCChannelManager.class).reportError(t); - } - } - } -} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceAndEndpointRegisterClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceAndEndpointRegisterClient.java new file mode 100644 index 0000000000000000000000000000000000000000..4709736c619c500cc3f8ae5eee1f02f46c5cc6db --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/ServiceAndEndpointRegisterClient.java @@ -0,0 +1,160 @@ +/* + * 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.remote; + +import io.grpc.Channel; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import org.apache.skywalking.apm.agent.core.boot.BootService; +import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor; +import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; +import org.apache.skywalking.apm.agent.core.boot.ServiceManager; +import org.apache.skywalking.apm.agent.core.conf.Config; +import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; +import org.apache.skywalking.apm.agent.core.dictionary.DictionaryUtil; +import org.apache.skywalking.apm.agent.core.dictionary.EndpointNameDictionary; +import org.apache.skywalking.apm.agent.core.dictionary.NetworkAddressDictionary; +import org.apache.skywalking.apm.agent.core.logging.api.ILog; +import org.apache.skywalking.apm.agent.core.logging.api.LogManager; +import org.apache.skywalking.apm.agent.core.os.OSUtil; +import org.apache.skywalking.apm.network.common.KeyIntValuePair; +import org.apache.skywalking.apm.network.register.v2.RegisterGrpc; +import org.apache.skywalking.apm.network.register.v2.Service; +import org.apache.skywalking.apm.network.register.v2.ServiceInstance; +import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingGrpc; +import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingPkg; +import org.apache.skywalking.apm.network.register.v2.ServiceInstanceRegisterMapping; +import org.apache.skywalking.apm.network.register.v2.ServiceInstances; +import org.apache.skywalking.apm.network.register.v2.ServiceRegisterMapping; +import org.apache.skywalking.apm.network.register.v2.Services; +import org.apache.skywalking.apm.util.RunnableWithExceptionProtection; + +/** + * @author wusheng + */ +@DefaultImplementor +public class ServiceAndEndpointRegisterClient implements BootService, Runnable, GRPCChannelListener { + private static final ILog logger = LogManager.getLogger(ServiceAndEndpointRegisterClient.class); + private static final String PROCESS_UUID = UUID.randomUUID().toString().replaceAll("-", ""); + + private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT; + private volatile RegisterGrpc.RegisterBlockingStub registerBlockingStub; + private volatile ServiceInstancePingGrpc.ServiceInstancePingBlockingStub serviceInstancePingStub; + private volatile ScheduledFuture applicationRegisterFuture; + + @Override + public void statusChanged(GRPCChannelStatus status) { + if (GRPCChannelStatus.CONNECTED.equals(status)) { + Channel channel = ServiceManager.INSTANCE.findService(GRPCChannelManager.class).getChannel(); + registerBlockingStub = RegisterGrpc.newBlockingStub(channel); + serviceInstancePingStub = ServiceInstancePingGrpc.newBlockingStub(channel); + } else { + registerBlockingStub = null; + serviceInstancePingStub = null; + } + this.status = status; + } + + @Override + public void prepare() throws Throwable { + ServiceManager.INSTANCE.findService(GRPCChannelManager.class).addChannelListener(this); + } + + @Override + public void boot() throws Throwable { + applicationRegisterFuture = Executors + .newSingleThreadScheduledExecutor(new DefaultNamedThreadFactory("ServiceAndEndpointRegisterClient")) + .scheduleAtFixedRate(new RunnableWithExceptionProtection(this, new RunnableWithExceptionProtection.CallbackWhenException() { + @Override + public void handle(Throwable t) { + logger.error("unexpected exception.", t); + } + }), 0, Config.Collector.APP_AND_SERVICE_REGISTER_CHECK_INTERVAL, TimeUnit.SECONDS); + } + + @Override + public void onComplete() throws Throwable { + } + + @Override + public void shutdown() throws Throwable { + applicationRegisterFuture.cancel(true); + } + + @Override + public void run() { + logger.debug("ServiceAndEndpointRegisterClient running, status:{}.", status); + boolean shouldTry = true; + while (GRPCChannelStatus.CONNECTED.equals(status) && shouldTry) { + shouldTry = false; + try { + if (RemoteDownstreamConfig.Agent.SERVICE_ID == DictionaryUtil.nullValue()) { + if (registerBlockingStub != null) { + ServiceRegisterMapping serviceRegisterMapping = registerBlockingStub.doServiceRegister( + Services.newBuilder().addServices(Service.newBuilder().setServiceName(Config.Agent.SERVICE_NAME)).build()); + if (serviceRegisterMapping != null) { + for (KeyIntValuePair registered : serviceRegisterMapping.getServicesList()) { + if (Config.Agent.SERVICE_NAME.equals(registered.getKey())) { + RemoteDownstreamConfig.Agent.SERVICE_ID = registered.getValue(); + shouldTry = true; + } + } + } + } + } else { + if (registerBlockingStub != null) { + if (RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID == DictionaryUtil.nullValue()) { + + ServiceInstanceRegisterMapping instanceMapping = registerBlockingStub.doServiceInstanceRegister(ServiceInstances.newBuilder() + .addInstances( + ServiceInstance.newBuilder() + .setServiceId(RemoteDownstreamConfig.Agent.SERVICE_ID) + .setInstanceUUID(PROCESS_UUID) + .setTime(System.currentTimeMillis()) + .addAllProperties(OSUtil.buildOSInfo()) + ).build()); + for (KeyIntValuePair serviceInstance : instanceMapping.getServiceInstancesList()) { + if (PROCESS_UUID.equals(serviceInstance.getKey())) { + int serviceInstanceId = serviceInstance.getValue(); + if (serviceInstanceId != DictionaryUtil.nullValue()) { + RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = serviceInstanceId; + } + } + } + } else { + serviceInstancePingStub.doPing(ServiceInstancePingPkg.newBuilder() + .setServiceInstanceId(RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID) + .setTime(System.currentTimeMillis()) + .setServiceInstanceUUID(PROCESS_UUID) + .build()); + + NetworkAddressDictionary.INSTANCE.syncRemoteDictionary(registerBlockingStub); + EndpointNameDictionary.INSTANCE.syncRemoteDictionary(registerBlockingStub); + } + } + } + } catch (Throwable t) { + logger.error(t, "ServiceAndEndpointRegisterClient execute fail."); + ServiceManager.INSTANCE.findService(GRPCChannelManager.class).reportError(t); + } + } + } +} diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java index 697d747fd83eeff3bca90fc93d9e106ed7c2d4bf..8524142d49550fc4f5cfcf7895de6c7869414e1b 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClient.java @@ -33,7 +33,9 @@ import org.apache.skywalking.apm.agent.core.logging.api.LogManager; import org.apache.skywalking.apm.commons.datacarrier.DataCarrier; import org.apache.skywalking.apm.commons.datacarrier.buffer.BufferStrategy; import org.apache.skywalking.apm.commons.datacarrier.consumer.IConsumer; +import org.apache.skywalking.apm.network.common.Commands; import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc; import static org.apache.skywalking.apm.agent.core.conf.Config.Buffer.BUFFER_SIZE; import static org.apache.skywalking.apm.agent.core.conf.Config.Buffer.CHANNEL_SIZE; @@ -51,7 +53,7 @@ public class TraceSegmentServiceClient implements BootService, IConsumer carrier; - private volatile TraceSegmentServiceGrpc.TraceSegmentServiceStub serviceStub; + private volatile TraceSegmentReportServiceGrpc.TraceSegmentReportServiceStub serviceStub; private volatile GRPCChannelStatus status = GRPCChannelStatus.DISCONNECT; @Override @@ -88,9 +90,9 @@ public class TraceSegmentServiceClient implements BootService, IConsumer data) { if (CONNECTED.equals(status)) { final GRPCStreamServiceStatus status = new GRPCStreamServiceStatus(false); - StreamObserver upstreamSegmentStreamObserver = serviceStub.collect(new StreamObserver() { + StreamObserver upstreamSegmentStreamObserver = serviceStub.collect(new StreamObserver() { @Override - public void onNext(Downstream downstream) { + public void onNext(Commands commands) { } @@ -169,7 +171,7 @@ public class TraceSegmentServiceClient implements BootService, IConsumer spanList = SegmentHelper.getSpan(actualSegment); assertThat(spanList.size(), is(2)); @@ -160,7 +160,7 @@ public class ContextManagerTest { assertThat(logs.get(0).getLogs().size(), is(4)); assertThat(injectContextCarrier.getSpanId(), is(1)); - assertThat(injectContextCarrier.getEntryOperationName(), is("#/portal/")); + assertThat(injectContextCarrier.getEntryEndpointName(), is("#/portal/")); assertThat(injectContextCarrier.getPeerHost(), is("#127.0.0.1:12800")); } @@ -211,18 +211,18 @@ public class ContextManagerTest { assertThat(firstExitSpanContextCarrier.getPeerHost(), is("#127.0.0.1:8080")); assertThat(firstExitSpanContextCarrier.getSpanId(), is(1)); - assertThat(firstExitSpanContextCarrier.getEntryOperationName(), is("#/testEntrySpan")); + assertThat(firstExitSpanContextCarrier.getEntryEndpointName(), is("#/testEntrySpan")); assertThat(secondExitSpanContextCarrier.getPeerHost(), is("#127.0.0.1:8080")); assertThat(secondExitSpanContextCarrier.getSpanId(), is(1)); - assertThat(secondExitSpanContextCarrier.getEntryOperationName(), is("#/testEntrySpan")); + assertThat(secondExitSpanContextCarrier.getEntryEndpointName(), is("#/testEntrySpan")); } @After public void tearDown() throws Exception { - RemoteDownstreamConfig.Agent.APPLICATION_ID = DictionaryUtil.nullValue(); - RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID = DictionaryUtil.nullValue(); + RemoteDownstreamConfig.Agent.SERVICE_ID = DictionaryUtil.nullValue(); + RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = DictionaryUtil.nullValue(); } @Test diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java index fb195b05985f45fbdca8a071cf990d9f7c51bb82..48fca0821120e3307ed27f5157af29a2e3f6def5 100644 --- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/context/IgnoredTracerContextTest.java @@ -48,8 +48,8 @@ public class IgnoredTracerContextTest { @Before public void setUp() throws Exception { - RemoteDownstreamConfig.Agent.APPLICATION_ID = 1; - RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID = 1; + RemoteDownstreamConfig.Agent.SERVICE_ID = 1; + RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1; } @AfterClass @@ -99,7 +99,7 @@ public class IgnoredTracerContextTest { ContextManager.stopSpan(); assertThat(abstractSpan.getClass().getName(), is(NoopSpan.class.getName())); - assertNull(contextCarrier.getEntryOperationName()); + assertNull(contextCarrier.getEntryEndpointName()); assertThat(contextCarrier.getSpanId(), is(-1)); assertNull(contextCarrier.getPeerHost()); diff --git a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java index 56cba0f78e66291f4e35729a9e9750304c25d55c..0ce01498238a5cd8b2d60f934fa9bf8fc15c323c 100644 --- a/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java +++ b/apm-sniffer/apm-agent-core/src/test/java/org/apache/skywalking/apm/agent/core/remote/TraceSegmentServiceClientTest.java @@ -16,36 +16,37 @@ * */ - package org.apache.skywalking.apm.agent.core.remote; import com.google.protobuf.InvalidProtocolBufferException; import io.grpc.stub.StreamObserver; import io.grpc.testing.GrpcServerRule; - import java.util.ArrayList; import java.util.List; - +import org.apache.skywalking.apm.agent.core.boot.ServiceManager; import org.apache.skywalking.apm.agent.core.conf.RemoteDownstreamConfig; +import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.test.tools.AgentServiceRule; -import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner; -import org.junit.*; -import org.junit.runner.RunWith; -import org.powermock.reflect.Whitebox; -import org.apache.skywalking.apm.agent.core.boot.ServiceManager; -import org.apache.skywalking.apm.agent.core.context.ContextManager; 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.network.language.agent.Downstream; -import org.apache.skywalking.apm.network.language.agent.SpanObject; +import org.apache.skywalking.apm.agent.core.test.tools.TracingSegmentRunner; +import org.apache.skywalking.apm.network.common.Commands; 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.TraceSegmentServiceGrpc; 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.SpanObjectV2; +import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.reflect.Whitebox; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -66,9 +67,9 @@ public class TraceSegmentServiceClientTest { private TraceSegmentServiceClient serviceClient = new TraceSegmentServiceClient(); private List upstreamSegments; - private TraceSegmentServiceGrpc.TraceSegmentServiceImplBase serviceImplBase = new TraceSegmentServiceGrpc.TraceSegmentServiceImplBase() { + private TraceSegmentReportServiceGrpc.TraceSegmentReportServiceImplBase serviceImplBase = new TraceSegmentReportServiceGrpc.TraceSegmentReportServiceImplBase() { @Override - public StreamObserver collect(final StreamObserver responseObserver) { + public StreamObserver collect(final StreamObserver responseObserver) { return new StreamObserver() { @Override public void onNext(UpstreamSegment value) { @@ -81,7 +82,7 @@ public class TraceSegmentServiceClientTest { @Override public void onCompleted() { - responseObserver.onNext(Downstream.getDefaultInstance()); + responseObserver.onNext(Commands.getDefaultInstance()); responseObserver.onCompleted(); } }; @@ -90,8 +91,8 @@ public class TraceSegmentServiceClientTest { @BeforeClass public static void setUpBeforeClass() { - RemoteDownstreamConfig.Agent.APPLICATION_ID = 1; - RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID = 1; + RemoteDownstreamConfig.Agent.SERVICE_ID = 1; + RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1; } @AfterClass @@ -105,7 +106,7 @@ public class TraceSegmentServiceClientTest { spy(serviceClient); Whitebox.setInternalState(serviceClient, "serviceStub", - TraceSegmentServiceGrpc.newStub(grpcServerRule.getChannel())); + TraceSegmentReportServiceGrpc.newStub(grpcServerRule.getChannel())); Whitebox.setInternalState(serviceClient, "status", GRPCChannelStatus.CONNECTED); upstreamSegments = new ArrayList(); @@ -127,11 +128,11 @@ public class TraceSegmentServiceClientTest { assertThat(upstreamSegments.size(), is(1)); UpstreamSegment upstreamSegment = upstreamSegments.get(0); assertThat(upstreamSegment.getGlobalTraceIdsCount(), is(1)); - TraceSegmentObject traceSegmentObject = TraceSegmentObject.parseFrom(upstreamSegment.getSegment()); + SegmentObject traceSegmentObject = SegmentObject.parseFrom(upstreamSegment.getSegment()); assertThat(traceSegmentObject.getSpans(0).getRefsCount(), is(0)); assertThat(traceSegmentObject.getSpansCount(), is(1)); - SpanObject spanObject = traceSegmentObject.getSpans(0); + SpanObjectV2 spanObject = traceSegmentObject.getSpans(0); assertThat(spanObject.getSpanType(), is(SpanType.Entry)); assertThat(spanObject.getSpanId(), is(0)); assertThat(spanObject.getParentSpanId(), is(-1)); diff --git a/apm-sniffer/apm-agent-core/src/test/resources/config/agent.config b/apm-sniffer/apm-agent-core/src/test/resources/config/agent.config index ebd5e5c99409d8d34d06ec6369ec770f0948a0ec..f4e505701f91b277939c3b11c04c6d871395e64b 100644 --- a/apm-sniffer/apm-agent-core/src/test/resources/config/agent.config +++ b/apm-sniffer/apm-agent-core/src/test/resources/config/agent.config @@ -14,6 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -agent.application_code = crmApp +agent.service_name = crmApp collector.backend_service = 127.0.0.1:8080 logging.level=info diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java index a9b0fd48611c286e13ee6854d1034663066e5601..3d2dfaee5ba10846a28e12bd6fa9e095c9666259 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/src/test/java/org/apache/skywalking/apm/plugin/dubbo/DubboInterceptorTest.java @@ -107,7 +107,7 @@ public class DubboInterceptorTest { when(rpcContext.isConsumerSide()).thenReturn(true); allArguments = new Object[] {invoker, invocation}; argumentTypes = new Class[] {invoker.getClass(), invocation.getClass()}; - Config.Agent.APPLICATION_CODE = "DubboTestCases-APP"; + Config.Agent.SERVICE_NAME = "DubboTestCases-APP"; } @After @@ -199,7 +199,7 @@ public class DubboInterceptorTest { private void assertTraceSegmentRef(TraceSegmentRef actual) { assertThat(SegmentRefHelper.getSpanId(actual), is(3)); - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(actual), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(actual), is(1)); assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("1.323.4433")); } diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java index bf6958bfdd069dc09e6357a8b06945c85fa67342..f956ef92cbf66afb1d4a50908e54364fe4952a8b 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/jetty/v9/server/HandleInterceptorTest.java @@ -146,7 +146,7 @@ public class HandleInterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); assertThat(SegmentRefHelper.getSpanId(ref), is(3)); assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111")); } diff --git a/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/CallbackInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/CallbackInterceptorTest.java index 17ddaf443bc245da2cf063939122a7dd31ea34d1..0629b204ab1bed2b38d77c014162822e65a52b20 100644 --- a/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/CallbackInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/CallbackInterceptorTest.java @@ -139,7 +139,7 @@ public class CallbackInterceptorTest { TraceSegmentRef segmentRef = refs.get(0); SegmentRefAssert.assertSpanId(segmentRef, 1); - assertThat(segmentRef.getEntryOperationName(), is("/for-test-entryOperationName")); + assertThat(segmentRef.getEntryEndpointName(), is("/for-test-entryOperationName")); } private void assertCallbackSpan(AbstractTracingSpan span) { diff --git a/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/KafkaConsumerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/KafkaConsumerInterceptorTest.java index 4383d08095f8be4819848912b924877d35e2117a..dc8a8329991f35d81e8f4162f433adc5526602af 100644 --- a/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/KafkaConsumerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/kafka-v1-plugin/src/test/java/org/apache/skywalking/apm/plugin/kafka/v11/KafkaConsumerInterceptorTest.java @@ -143,7 +143,7 @@ public class KafkaConsumerInterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - MatcherAssert.assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + MatcherAssert.assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); MatcherAssert.assertThat(SegmentRefHelper.getSpanId(ref), is(3)); MatcherAssert.assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111")); } diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java index cfe42d19b07b6338d29cef831423725197ee21fe..3ddae1d4546769854e294e721ba434ea5a20af1e 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/src/test/java/org/apache/skywalking/apm/plugin/motan/MotanProviderInterceptorTest.java @@ -163,7 +163,7 @@ public class MotanProviderInterceptorTest { private void assertRefSegment(TraceSegmentRef primaryRef) { assertThat(SegmentRefHelper.getTraceSegmentId(primaryRef).toString(), is("1.123.456")); assertThat(SegmentRefHelper.getSpanId(primaryRef), is(3)); - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(primaryRef), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(primaryRef), is(1)); assertThat(SegmentRefHelper.getPeerHost(primaryRef), is("192.168.1.8:18002")); } diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java index f97d9e8e44ee1d22074d020b9bb858802128a6e7..0dd9e02c71e7d420eb6893dd0f9fec00e3262a40 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/ProducerOperationHandlerInterceptorTest.java @@ -100,7 +100,7 @@ public class ProducerOperationHandlerInterceptorTest { when(statusType.getStatusCode()).thenReturn(200); when(method.getName()).thenReturn("producer"); when(invocation.getInvocationType()).thenReturn(InvocationType.PRODUCER); - Config.Agent.APPLICATION_CODE = "serviceComnTestCases-APP"; + Config.Agent.SERVICE_NAME = "serviceComnTestCases-APP"; allArguments = new Object[] {invocation,}; argumentsType = new Class[] {}; diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java index f3126575129b62cfe6bb95fe44e8001cfb2d8a2a..850cdcde33c29b420523c0581b8e6f160b1e0fa9 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-0.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/TransportClientHandlerInterceptorTest.java @@ -99,7 +99,7 @@ public class TransportClientHandlerInterceptorTest { when(invocation.getStatus()).thenReturn(statusType); when(statusType.getStatusCode()).thenReturn(200); when(invocation.getInvocationType()).thenReturn(InvocationType.CONSUMER); - Config.Agent.APPLICATION_CODE = "serviceComnTestCases-APP"; + Config.Agent.SERVICE_NAME = "serviceComnTestCases-APP"; allArguments = new Object[] {invocation,}; argumentsType = new Class[] {}; diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java index 1ab8e74833c495739dfd1d85cf68795454ebf5d9..406a0feb3a3c380249e71511eada9609964fbda4 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/ProducerOperationHandlerInterceptorTest.java @@ -100,7 +100,7 @@ public class ProducerOperationHandlerInterceptorTest { when(statusType.getStatusCode()).thenReturn(200); when(method.getName()).thenReturn("producer"); when(invocation.getInvocationType()).thenReturn(InvocationType.PRODUCER); - Config.Agent.APPLICATION_CODE = "serviceComnTestCases-APP"; + Config.Agent.SERVICE_NAME = "serviceComnTestCases-APP"; allArguments = new Object[] {invocation,}; argumentsType = new Class[] {}; diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java index 0f6972029e750747c5d965d5e73c41a9dd418619..2e76f60ed4ecd395678a8264e36b40136b33a4b0 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-1.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/servicecomb/v1/TransportClientHandlerInterceptorTest.java @@ -99,7 +99,7 @@ public class TransportClientHandlerInterceptorTest { when(invocation.getStatus()).thenReturn(statusType); when(statusType.getStatusCode()).thenReturn(200); when(invocation.getInvocationType()).thenReturn(InvocationType.CONSUMER); - Config.Agent.APPLICATION_CODE = "serviceComnTestCases-APP"; + Config.Agent.SERVICE_NAME = "serviceComnTestCases-APP"; allArguments = new Object[] {invocation,}; argumentsType = new Class[] {}; diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcConsumerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcConsumerInterceptorTest.java index 9962b01c6301d4c4c652d6d8817784a6a092237a..61c399daf989393d9eb4a5f0218f0b295e97b28a 100644 --- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcConsumerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcConsumerInterceptorTest.java @@ -100,7 +100,7 @@ public class SofaRpcConsumerInterceptorTest { when(rpcContext.getProviderInfo()).thenReturn(providerInfo); allArguments = new Object[] {sofaRequest}; argumentTypes = new Class[] {sofaRequest.getClass()}; - Config.Agent.APPLICATION_CODE = "SOFARPC-TestCases-APP"; + Config.Agent.SERVICE_NAME = "SOFARPC-TestCases-APP"; } @Test diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java index b3cabbf0a6ac8afe605d76cbb14bff457c2b64b1..792c4f6e0762e3c0494ec43baca30e867b7608ee 100644 --- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/SofaRpcProviderInterceptorTest.java @@ -110,7 +110,7 @@ public class SofaRpcProviderInterceptorTest { when(rpcContext.getProviderInfo()).thenReturn(providerInfo); allArguments = new Object[] {sofaRequest}; argumentTypes = new Class[] {sofaRequest.getClass()}; - Config.Agent.APPLICATION_CODE = "SOFARPC-TestCases-APP"; + Config.Agent.SERVICE_NAME = "SOFARPC-TestCases-APP"; } @After @@ -138,7 +138,7 @@ public class SofaRpcProviderInterceptorTest { private void assertTraceSegmentRef(TraceSegmentRef actual) { assertThat(SegmentRefHelper.getSpanId(actual), is(3)); - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(actual), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(actual), is(1)); assertThat(SegmentRefHelper.getTraceSegmentId(actual).toString(), is("1.323.4433")); } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java index db90da400c8912c8a0a169f878c2449f5bcbcbe5..43f41ef45e0b590066fd21b9c923bf6a4a2ffcee 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RequestMappingMethodInterceptorTest.java @@ -155,7 +155,7 @@ public class RequestMappingMethodInterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); assertThat(SegmentRefHelper.getSpanId(ref), is(3)); assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.444.555")); } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java index ccff690c5aac442bb254f3af8a7c3ed89ef95df9..d71c1459d1f320ed910aaba551f995b11de3645b 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/RestMappingMethodInterceptorTest.java @@ -286,7 +286,7 @@ public class RestMappingMethodInterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - MatcherAssert.assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + MatcherAssert.assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); assertThat(SegmentRefHelper.getSpanId(ref), is(3)); MatcherAssert.assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.444.555")); } diff --git a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java index a5957d15a28e145771f7b91a85fd63e0579582d7..6a07a19c1ca7f29c09623d72313363fb4114d9dd 100644 --- a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/struts2/Struts2InterceptorTest.java @@ -161,7 +161,7 @@ public class Struts2InterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); assertThat(SegmentRefHelper.getSpanId(ref), is(3)); assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111")); } diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java index 7b5a8f4ddddff30ccd55dd05e25a09ec9f183007..a649327a931dd2913570331d20811d5bb01b4bea 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/tomcat78x/TomcatInvokeInterceptorTest.java @@ -161,7 +161,7 @@ public class TomcatInvokeInterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); assertThat(SegmentRefHelper.getSpanId(ref), is(3)); assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111")); } diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/ExecuteRootHandlerInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/ExecuteRootHandlerInterceptorTest.java index 981d983dcb89a4b037edd19c2897f9a92601653a..a65c652470bbeb757cb0e168ef87c70eea56359a 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/ExecuteRootHandlerInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/undertow/v2x/ExecuteRootHandlerInterceptorTest.java @@ -172,7 +172,7 @@ public class ExecuteRootHandlerInterceptorTest { } private void assertTraceSegmentRef(TraceSegmentRef ref) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(1)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(1)); assertThat(SegmentRefHelper.getSpanId(ref), is(3)); assertThat(SegmentRefHelper.getTraceSegmentId(ref).toString(), is("1.234.111")); } diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java index cf766fae9105702e00e48580071ed2160c4690c8..60041bcf21d8e5e857b43bb42b3a8c75de03559d 100644 --- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java +++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/helper/SegmentRefHelper.java @@ -50,9 +50,9 @@ public class SegmentRefHelper { return -1; } - public static int getEntryApplicationInstanceId(TraceSegmentRef ref) { + public static int getEntryServiceInstanceId(TraceSegmentRef ref) { try { - return FieldGetter.getValue(ref, "entryApplicationInstanceId"); + return FieldGetter.getValue(ref, "entryServiceInstanceId"); } catch (Exception e) { } diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java index cf5007f60b3cbf124d176a465bc1025b5bc2714f..30c21a93aace03677e8ac29efcd57ff2535b3a31 100644 --- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java +++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/AgentServiceRule.java @@ -53,7 +53,7 @@ public class AgentServiceRule extends ExternalResource { AgentClassLoader.initDefaultLoader(); Config.Logging.LEVEL = LogLevel.OFF; ServiceManager.INSTANCE.boot(); - RemoteDownstreamConfig.Agent.APPLICATION_ID = 1; - RemoteDownstreamConfig.Agent.APPLICATION_INSTANCE_ID = 1; + RemoteDownstreamConfig.Agent.SERVICE_ID = 1; + RemoteDownstreamConfig.Agent.SERVICE_INSTANCE_ID = 1; } } diff --git a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java index a26f7b18a9a5fdd4d51da462816ae7acce82f46d..dd24591dc12dfbe6f5c43ef4a3a91e8b4b05ac6e 100644 --- a/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java +++ b/apm-sniffer/apm-test-tools/src/main/java/org/apache/skywalking/apm/agent/test/tools/SegmentRefAssert.java @@ -39,7 +39,7 @@ public class SegmentRefAssert { } public static void assertEntryApplicationInstanceId(TraceSegmentRef ref, int entryApplicationInstanceID) { - assertThat(SegmentRefHelper.getEntryApplicationInstanceId(ref), is(entryApplicationInstanceID)); + assertThat(SegmentRefHelper.getEntryServiceInstanceId(ref), is(entryApplicationInstanceID)); } } diff --git a/apm-sniffer/config/agent.config b/apm-sniffer/config/agent.config index 3bf1504fb9cded41ff7163f9dec03d4a4c67b9d9..c4306c9418172c99d3cc51f7d9451b26709f1182 100644 --- a/apm-sniffer/config/agent.config +++ b/apm-sniffer/config/agent.config @@ -17,8 +17,8 @@ # The agent namespace # agent.namespace=default-namespace -# The application name in UI -agent.application_code=Your_ApplicationName +# The service name in UI +agent.service_name=Your_ApplicationName # The number of sampled traces per 3 seconds # Negative number means sample traces as many as possible, most likely 100% diff --git a/docs/en/guides/Java-Plugin-Development-Guide.md b/docs/en/guides/Java-Plugin-Development-Guide.md index 37c14723fb4610254d6069fef2e4715c6086e93d..7de13178b1209eb160df32a7a6e23a8e1dbfae7a 100644 --- a/docs/en/guides/Java-Plugin-Development-Guide.md +++ b/docs/en/guides/Java-Plugin-Development-Guide.md @@ -76,19 +76,19 @@ ContextManager provides all major and primary APIs. 1. Create EntrySpan ```java -public static AbstractSpan createEntrySpan(String operationName, ContextCarrier carrier) +public static AbstractSpan createEntrySpan(String endpointName, ContextCarrier carrier) ``` Create EntrySpan by operation name(e.g. service name, uri) and **ContextCarrier**. 2. Create LocalSpan ```java -public static AbstractSpan createLocalSpan(String operationName) +public static AbstractSpan createLocalSpan(String endpointName) ``` Create LocalSpan by operation name(e.g. full method signature) 3. Create ExitSpan ```java -public static AbstractSpan createExitSpan(String operationName, ContextCarrier carrier, String remotePeer) +public static AbstractSpan createExitSpan(String endpointName, ContextCarrier carrier, String remotePeer) ``` Create ExitSpan by operation name(e.g. service name, uri) and new **ContextCarrier** and peer address (e.g. ip+port, hostname+port) @@ -145,7 +145,7 @@ Create ExitSpan by operation name(e.g. service name, uri) and new **ContextCarri * * @return this Span instance, for chaining */ - AbstractSpan setOperationName(String operationName); + AbstractSpan setOperationName(String endpointName); ``` Besides set operation name, tags and logs, two attributes shoule be set, which are component and layer, especially for EntrySpan and ExitSpan diff --git a/docs/en/protocols/README.md b/docs/en/protocols/README.md index 2392d5ee1bbb0235f6e805912479dbaf15ca5990..ccfe5dda92de42d19cd6de0e5a89034f9cdc5a4a 100644 --- a/docs/en/protocols/README.md +++ b/docs/en/protocols/README.md @@ -21,12 +21,22 @@ service ID. ### Language based native agent protocol -This protocol is combined from two parts: -* [**SW6** Cross Process Propagation Headers Protocol](Skywalking-Cross-Process-Propagation-Headers-Protocol-v2.md) is the new protocol for +There is two types of protocols to make language agents work in distributed environments. +1. **Cross Process Propagation Headers Protocol** is in wire data format, agent/SDK usually uses HTTP/MQ/HTTP2 headers +to carry the data with rpc request. The remote agent will receive this in the request handler, and bind the context +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 +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 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. -* [**SW3** Cross Process Propagation Headers Protocol](Skywalking-Cross-Process-Propagation-Headers-Protocol-v1.md) is for in-wire propagation. +* [Cross Process Propagation Headers Protocol v1](Skywalking-Cross-Process-Propagation-Headers-Protocol-v1.md) is for in-wire propagation. By following this protocol, the trace segments in different processes could be linked. -* [SkyWalking Trace Data Protocol](Trace-Data-Protocol.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.md). This protocol is used in old version. Still supported. ### Service Mesh probe protocol @@ -55,6 +65,7 @@ Query protocol follows GraphQL grammar, provides data query capabilities, which There are 5 dimensionality data is provided. 1. Metadata. Metadata includes the brief info of the whole under monitoring services and their instances, endpoints, etc. Use multiple ways to query this meta data. +1. Topology. Show the topology and dependency graph of services or endpoints. Including direct relationship or global map. 1. Metric. Metric query targets all the objects defined in [OAL script](../concepts-and-designs/oal.md). You could get the metric data in linear or thermodynamic matrix formats based on the aggregation functions in script. 1. Aggregation. Aggregation query means the metric data need a secondary aggregation in query stage, which makes the query @@ -64,4 +75,4 @@ by the values. 1. Trace. Query distributed traces by this. 1. Alarm. Through alarm query, you can have alarm trend and details. -The actual query GraphQL scrips could be found in [here](../../../apm-protocol/apm-ui-protocol/src/main/resources/ui-graphql-v6). \ No newline at end of file +The actual query GraphQL scrips could be found in [here](../../../oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol). \ No newline at end of file diff --git a/docs/en/protocols/Trace-Data-Protocol.md b/docs/en/protocols/Trace-Data-Protocol-v1.md similarity index 95% rename from docs/en/protocols/Trace-Data-Protocol.md rename to docs/en/protocols/Trace-Data-Protocol-v1.md index 870acd13947433a98e0f0530644b83664bafa661..43f6954f14c0105970bfe7750d3ad0343cb8e584 100644 --- a/docs/en/protocols/Trace-Data-Protocol.md +++ b/docs/en/protocols/Trace-Data-Protocol-v1.md @@ -8,7 +8,7 @@ uplink data to the SkyWalking backend. - Other services, includes Register, Trace, etc., provided by HTTP/JSON and gRPC both. ### Version -v2.0 +v1 #### gRPC proto files [gRPC proto files](https://github.com/apache/incubator-skywalking-data-collect-protocol/tree/v2.0) @@ -20,7 +20,7 @@ v2.0 - 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/operationName + - operationNameId/endpointName - networkAddress/networkAddressId - entryServiceName/entryServiceId - parentServiceName/parentServiceId @@ -36,7 +36,7 @@ Input: "gt": [[230150, 185809, 24040000]], "sg": { //TraceSegmentObject "ts": [137150, 185809, 48780000], - "ai": 2, //applicationId + "ai": 2, //serviceId "ii": 3, //applicationInstanceId "ss": [ //SpanObject { @@ -49,20 +49,20 @@ Input: "ci": 3, //componentId "cn": "", //component "oi": 0, //operationNameId - "on": "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()", //operationName + "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, //parentApplicationInstanceId + "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, //entryApplicationInstanceId + "eii": 2, //entryServiceInstanceId "esi": 0, //entryServiceId "esn": "/dubbox-case/case/dubbox-rest", //entryServiceName "rv": 0 //RefTypeValue @@ -140,7 +140,7 @@ HTTP format http://ip:port/instance/register(default: localhost:12800) Input: ``` { - ai: x, #applicationId + ai: x, #serviceId au: "", #agentUUID rt: x, #registerTime oi: "", #osinfo @@ -150,7 +150,7 @@ Input: Output: ``` { - ai: x, #applicationId + ai: x, #serviceId ii: x, #applicationInstanceId } ``` @@ -185,7 +185,7 @@ HTTP format http://ip:port/servicename/discovery(default: localhost:12800) Input: ``` { - ai: x, #applicationId + ai: x, #serviceId sn: "", #serviceName st: x, #srcSpanType } @@ -196,7 +196,7 @@ Output: { si: x, #osinfo el: { #element - ai: x, #applicationId + ai: x, #serviceId sn: "", #serviceName st: x, #srcSpanType } diff --git a/docs/en/protocols/Trace-Data-Protocol-v2.md b/docs/en/protocols/Trace-Data-Protocol-v2.md new file mode 100644 index 0000000000000000000000000000000000000000..6b6481b7f9f077605b715c8de70740378ff7e161 --- /dev/null +++ b/docs/en/protocols/Trace-Data-Protocol-v2.md @@ -0,0 +1,55 @@ +# Trace Data Protocol v2 +Trace Data Protocol describes the data format between SkyWalking agent/sniffer and backend. + +## Overview +Trace data protocol is defined and provided in [gRPC format](../../../apm-protocol/apm-network/src/main/proto). + +For each agent/SDK, it needs to register service id and service instance id before reporting any kind of trace +or metric data. + +### Step 1. Do register +[Register service](../../../apm-protocol/apm-network/src/main/proto/register/Register.proto) takes charge of +all register methods. At step 1, we need `doServiceRegister`, then `doServiceInstanceRegister`. + +1. First of all, do `doServiceRegister`, input is **serviceName**, which could be declared by any UTF-8 String. The return +value is KeyValue pair, **serviceName** as key, **service id** as value. Batch is also supported. +1. After have **service id**, use `doServiceInstanceRegister` to do instance register. Input is **service id**, **UUID**, +and **register time**. UUID should be unique in the whole distributed environments. The return value is still KeyValue pair, +**UUID** as key, **service instance id** as value. Batch is also supported. + +For register, the most important notice is that, the process is expected as async in backend, so, the return could be **NULL**. +In most cases, you need to set a timer to call these services repeated, until you got the response. Suggestion loop cycle, 10s. + +Because batch is supported, even for most language agent/SDK, no scenario to do batch register. We suggest to check the `serviceName` +and `UUID` in response, and match with your expected value. + +### Step 2. Send trace and metric +After you have trace id and trace instance id, you could send traces and metric. Now we +have +1. `TraceSegmentReportService#collect` for skywalking native trace format +1. `JVMMetricReportService#collect` for skywalking native jvm format + +For trace format, there are some notices +1. Segment is a concept in SkyWalking, it should include all span for per request in a single OS process, usually single thread based on language. +2. Span has 3 different groups. + +* EntrySpan +EntrySpan represents a service provider, also the endpoint of server side. As an APM system, we are targeting the +application servers. So almost all the services and MQ-comsumer are EntrySpan(s). + +* LocalSpan +LocalSpan represents a normal Java method, which don't relate with remote service, neither a MQ producer/comsumer +nor a service(e.g. HTTP service) provider/consumer. + +* ExitSpan +ExitSpan represents a client of service or MQ-producer, as named as `LeafSpan` at early age of SkyWalking. +e.g. accessing DB by JDBC, reading Redis/Memcached are cataloged an ExitSpan. + +3. Span parent info called Reference, which is included in span. Reference carries more fields besides +trace id, parent segment id, span id. Others are **entry service instance id**, **parent service instance id**, +**entry endpoint**, **parent endpoint** and **network address**. Follow [SkyWalking Trace Data Protocol v2](Trace-Data-Protocol-v2.md), +you will know how to get all these fields. + +### Step 3. Keep alive. +`ServiceInstancePing#doPing` should be called per several seconds. Make the backend know this instance is still +alive. Existed **service instance id** and **UUID** used in `doServiceInstanceRegister` are required. \ No newline at end of file diff --git a/docs/en/setup/backend/backend-cluster.md b/docs/en/setup/backend/backend-cluster.md index 5c7d4977fb1be64644b7b1847d4260d4cb7b3c2f..2fcb5c9f1b6d91128d89fb9e2d256f90346cd3cf 100644 --- a/docs/en/setup/backend/backend-cluster.md +++ b/docs/en/setup/backend/backend-cluster.md @@ -14,10 +14,7 @@ by using k8s native APIs to manage cluster. Zookeeper is a very common and wide used cluster coordinator. Set the **cluster** module's implementor to **zookeeper** in the yml to active. -Required Zookeeper version, 3.5+ - -Zookeeper version is required above 3.5 by Curator 4.0 lib, but actually Curator 4.0 is compatible with ZooKeeper 3.4.x. -To make ZooKeeper 3.4.x works, please replace the ZooKeeper 3.5+ library jar in `oap-libs` folder with ZooKeeper 3.4.x library. +Required Zookeeper version, 3.4+ ```yaml cluster: diff --git a/docs/en/setup/service-agent/java-agent/README.md b/docs/en/setup/service-agent/java-agent/README.md index b8012386a9b0f6f19271781fec0e0da02e2638c4..cd07e7a1dd17fe3f7b5fa929c9c99624f5bd855b 100644 --- a/docs/en/setup/service-agent/java-agent/README.md +++ b/docs/en/setup/service-agent/java-agent/README.md @@ -1,5 +1,7 @@ # Setup java agent 1. Find `agent` folder in SkyWalking release package +1. Set `agent.service_name` in `config/agent.config`. Could be any String in English. +1. Set `collector.backend_service` in `config/agent.config`. Default point to `127.0.0.1:11800`, only works for local backend. 1. Add `-javaagent:/path/to/skywalking-package/agenxt/skywalking-agent.jar` to JVM argument. And make sure to add it before the `-jar` argument. The agent release dist is included in Apache [official release](http://skywalking.apache.org/downloads/). New agent package looks like this. diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentDispatcher.java index 322abf9977757e140d30daba538823123cd1634d..c7b11da780be8e01c02f54e6dc55ef90579b25c9 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentDispatcher.java @@ -40,6 +40,7 @@ public class SegmentDispatcher implements SourceDispatcher { segment.setIsError(source.getIsError()); segment.setDataBinary(source.getDataBinary()); segment.setTimeBucket(source.getTimeBucket()); + segment.setVersion(source.getVersion()); RecordProcess.INSTANCE.in(segment); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java index c974cff7c8ebab55b6ed154fa53fbc9a0743881f..b85de76fd6b7e8548361864b54d5cdbf26612c63 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/segment/SegmentRecord.java @@ -18,15 +18,20 @@ package org.apache.skywalking.oap.server.core.analysis.manual.segment; -import java.util.*; -import lombok.*; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import lombok.Getter; +import lombok.Setter; import org.apache.skywalking.apm.util.StringUtil; import org.apache.skywalking.oap.server.core.Const; import org.apache.skywalking.oap.server.core.analysis.record.Record; import org.apache.skywalking.oap.server.core.analysis.record.annotation.RecordType; import org.apache.skywalking.oap.server.core.source.Scope; import org.apache.skywalking.oap.server.core.storage.StorageBuilder; -import org.apache.skywalking.oap.server.core.storage.annotation.*; +import org.apache.skywalking.oap.server.core.storage.annotation.Column; +import org.apache.skywalking.oap.server.core.storage.annotation.IDColumn; +import org.apache.skywalking.oap.server.core.storage.annotation.StorageEntity; import org.apache.skywalking.oap.server.library.util.CollectionUtils; /** @@ -47,6 +52,7 @@ public class SegmentRecord extends Record { public static final String LATENCY = "latency"; public static final String IS_ERROR = "is_error"; public static final String DATA_BINARY = "data_binary"; + public static final String VERSION = "version"; @Setter @Getter @Column(columnName = SEGMENT_ID) @IDColumn private String segmentId; @Setter @Getter @Column(columnName = TRACE_ID) @IDColumn private String traceId; @@ -58,6 +64,7 @@ public class SegmentRecord extends Record { @Setter @Getter @Column(columnName = LATENCY) @IDColumn private int latency; @Setter @Getter @Column(columnName = IS_ERROR) @IDColumn private int isError; @Setter @Getter @Column(columnName = DATA_BINARY) @IDColumn private byte[] dataBinary; + @Setter @Getter @Column(columnName = VERSION) @IDColumn private int version; @Override public String id() { return segmentId; @@ -82,6 +89,7 @@ public class SegmentRecord extends Record { } else { map.put(DATA_BINARY, new String(Base64.getEncoder().encode(storageData.getDataBinary()))); } + map.put(VERSION, storageData.getVersion()); return map; } @@ -102,6 +110,7 @@ public class SegmentRecord extends Record { } else { record.setDataBinary(Base64.getDecoder().decode((String)dbMap.get(DATA_BINARY))); } + record.setVersion(((Number)dbMap.get(VERSION)).intValue()); return record; } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java index b506e15c132184dd1f5557bc22fdb12c6d2fa1d3..abbe7bb7036e7a5b08a279d15aec7ea68dcf39bf 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/TraceQueryService.java @@ -21,6 +21,8 @@ package org.apache.skywalking.oap.server.core.query; import java.io.IOException; import java.util.*; import org.apache.skywalking.apm.network.language.agent.*; +import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; +import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; import org.apache.skywalking.oap.server.core.*; import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; import org.apache.skywalking.oap.server.core.cache.*; @@ -87,7 +89,8 @@ public class TraceQueryService implements Service { return componentLibraryCatalogService; } - public TraceBrief queryBasicTraces(final int serviceId, final int endpointId, final String traceId, final String endpointName, + public TraceBrief queryBasicTraces(final int serviceId, final int endpointId, final String traceId, + final String endpointName, final int minTraceDuration, int maxTraceDuration, final TraceState traceState, final QueryOrder queryOrder, final Pagination paging, final long startTB, final long endTB) throws IOException { PaginationUtils.Page page = PaginationUtils.INSTANCE.exchange(paging); @@ -102,8 +105,15 @@ public class TraceQueryService implements Service { List segmentRecords = getTraceQueryDAO().queryByTraceId(traceId); for (SegmentRecord segment : segmentRecords) { if (nonNull(segment)) { - TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(segment.getDataBinary()); - trace.getSpans().addAll(buildSpanList(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList())); + if (segment.getVersion() == 1) { + TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(segment.getDataBinary()); + trace.getSpans().addAll(buildSpanList(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList())); + } else if (segment.getVersion() == 2) { + SegmentObject segmentObject = SegmentObject.parseFrom(segment.getDataBinary()); + trace.getSpans().addAll(buildSpanV2List(traceId, segment.getSegmentId(), segment.getServiceId(), segmentObject.getSpansList())); + } else { + throw new UnexpectedException("Unsupported version=" + segment.getVersion()); + } } } @@ -126,6 +136,111 @@ public class TraceQueryService implements Service { return trace; } + private List buildSpanV2List(String traceId, String segmentId, int serviceId, + List spanObjects) { + List 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 + String.valueOf(spanObject.getSpanId()); + span.setSegmentSpanId(segmentSpanId); + + String segmentParentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(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); + + String serviceCode = getServiceInventoryCache().get(serviceId).getName(); + span.setServiceCode(serviceCode); + + 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(String.valueOf(uniqueId.getIdPartsList().get(i))); + } else { + segmentIdBuilder.append(".").append(String.valueOf(uniqueId.getIdPartsList().get(i))); + } + } + ref.setParentSegmentId(segmentIdBuilder.toString()); + + span.setSegmentParentSpanId(ref.getParentSegmentId() + Const.SEGMENT_SPAN_SPLIT + String.valueOf(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 buildSpanList(String traceId, String segmentId, int serviceId, List spanObjects) { List spans = new ArrayList<>(); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java index 598afcc20b8f8e9fa3c964034ce891c2c3d9996a..1b63776d1d1d6f3fade65e9c04b9a5f1961813ef 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DetectPoint.java @@ -39,7 +39,7 @@ public enum DetectPoint { } } - public static DetectPoint fromMeshDetectPoint(org.apache.skywalking.apm.network.common.DetectPoint detectPoint) { + public static DetectPoint fromNetworkProtocolDetectPoint(org.apache.skywalking.apm.network.common.DetectPoint detectPoint) { switch (detectPoint) { case client: return CLIENT; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java index 110f5640751d07fae342bed6b6441304c51cd8c4..041f7df1a78c4c170638ce6a172f47db61a46e80 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Segment.java @@ -45,4 +45,5 @@ public class Segment extends Source { @Setter @Getter private int latency; @Setter @Getter private int isError; @Setter @Getter private byte[] dataBinary; + @Setter @Getter private int version; } diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java index 64a70fe9d40410a3ea7403d883cbc34e28337dea..d199512c3dcebe1bdace771cb6b67f8786d61759 100644 --- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java @@ -20,8 +20,11 @@ package org.apache.skywalking.oap.server.receiver.jvm.provider; import org.apache.skywalking.oap.server.core.CoreModule; 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.jvm.module.JVMModule; +import org.apache.skywalking.oap.server.receiver.jvm.provider.handler.JVMMetricReportServiceHandler; import org.apache.skywalking.oap.server.receiver.jvm.provider.handler.JVMMetricsServiceHandler; /** @@ -47,6 +50,7 @@ public class JVMModuleProvider extends ModuleProvider { @Override public void start() { GRPCHandlerRegister grpcHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(GRPCHandlerRegister.class); grpcHandlerRegister.addHandler(new JVMMetricsServiceHandler(getManager())); + grpcHandlerRegister.addHandler(new JVMMetricReportServiceHandler(getManager())); } @Override public void notifyAfterCompleted() { diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..b4852fd65d86ae66162683cf534bc707d3804780 --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java @@ -0,0 +1,59 @@ +/* + * 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.common.Commands; +import org.apache.skywalking.apm.network.language.agent.v2.JVMMetricCollection; +import org.apache.skywalking.apm.network.language.agent.v2.JVMMetricReportServiceGrpc; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.source.SourceReceiver; +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.library.util.TimeBucketUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JVMMetricReportServiceImplBase implements GRPCHandler { + + private static final Logger logger = LoggerFactory.getLogger(JVMMetricReportServiceHandler.class); + + private final JVMSourceDispatcher jvmSourceDispatcher; + + public JVMMetricReportServiceHandler(ModuleManager moduleManager) { + this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class)); + } + + @Override public void collect(JVMMetricCollection request, StreamObserver responseObserver) { + int serviceInstanceId = request.getServiceInstanceId(); + + if (logger.isDebugEnabled()) { + logger.debug("receive the jvm metric from service instance, id: {}", serviceInstanceId); + } + + request.getMetricsList().forEach(metric -> { + long minuteTimeBucket = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(metric.getTime()); + jvmSourceDispatcher.sendMetric(serviceInstanceId, minuteTimeBucket, metric); + }); + + responseObserver.onNext(Commands.newBuilder().build()); + responseObserver.onCompleted(); + } + +} diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java index 55d49e64d5c37dd369cc70a8a48e9b82ca8c35d1..b5ac978f2f1097267b9b734b5b0e7871e202e8fa 100644 --- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricsServiceHandler.java @@ -19,15 +19,16 @@ package org.apache.skywalking.oap.server.receiver.jvm.provider.handler; 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.source.GCPhrase; -import org.apache.skywalking.oap.server.core.source.*; +import org.apache.skywalking.apm.network.language.agent.Downstream; +import org.apache.skywalking.apm.network.language.agent.JVMMetrics; +import org.apache.skywalking.apm.network.language.agent.JVMMetricsServiceGrpc; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.source.SourceReceiver; 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.library.util.TimeBucketUtils; -import org.slf4j.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author peng-yongsheng @@ -36,120 +37,26 @@ public class JVMMetricsServiceHandler extends JVMMetricsServiceGrpc.JVMMetricsSe private static final Logger logger = LoggerFactory.getLogger(JVMMetricsServiceHandler.class); - private final SourceReceiver sourceReceiver; + private final JVMSourceDispatcher jvmSourceDispatcher; public JVMMetricsServiceHandler(ModuleManager moduleManager) { - this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); + this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class)); } @Override public void collect(JVMMetrics request, StreamObserver responseObserver) { int serviceInstanceId = request.getApplicationInstanceId(); if (logger.isDebugEnabled()) { - logger.debug("receive the jvm metric from application instance, id: {}", serviceInstanceId); + logger.debug("receive the jvm metric from service instance, id: {}", serviceInstanceId); } request.getMetricsList().forEach(metric -> { long minuteTimeBucket = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(metric.getTime()); - sendToCpuMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getCpu()); - sendToMemoryMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getMemoryList()); - sendToMemoryPoolMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getMemoryPoolList()); - sendToGCMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getGcList()); + jvmSourceDispatcher.sendMetric(serviceInstanceId, minuteTimeBucket, metric); }); responseObserver.onNext(Downstream.newBuilder().build()); responseObserver.onCompleted(); } - private void sendToCpuMetricProcess(int serviceInstanceId, long timeBucket, CPU cpu) { - ServiceInstanceJVMCPU serviceInstanceJVMCPU = new ServiceInstanceJVMCPU(); - serviceInstanceJVMCPU.setId(serviceInstanceId); - serviceInstanceJVMCPU.setName(Const.EMPTY_STRING); - serviceInstanceJVMCPU.setServiceInstanceId(serviceInstanceId); - serviceInstanceJVMCPU.setServiceName(Const.EMPTY_STRING); - serviceInstanceJVMCPU.setUsePercent(cpu.getUsagePercent()); - serviceInstanceJVMCPU.setTimeBucket(timeBucket); - sourceReceiver.receive(serviceInstanceJVMCPU); - } - - private void sendToGCMetricProcess(int serviceInstanceId, long timeBucket, List gcs) { - gcs.forEach(gc -> { - ServiceInstanceJVMGC serviceInstanceJVMGC = new ServiceInstanceJVMGC(); - serviceInstanceJVMGC.setId(serviceInstanceId); - serviceInstanceJVMGC.setName(Const.EMPTY_STRING); - serviceInstanceJVMGC.setServiceInstanceId(serviceInstanceId); - serviceInstanceJVMGC.setServiceName(Const.EMPTY_STRING); - - switch (gc.getPhrase()) { - case NEW: - serviceInstanceJVMGC.setPhrase(GCPhrase.NEW); - break; - case OLD: - serviceInstanceJVMGC.setPhrase(GCPhrase.OLD); - break; - } - - serviceInstanceJVMGC.setTime(gc.getTime()); - serviceInstanceJVMGC.setCount(gc.getCount()); - serviceInstanceJVMGC.setTimeBucket(timeBucket); - sourceReceiver.receive(serviceInstanceJVMGC); - }); - } - - private void sendToMemoryMetricProcess(int serviceInstanceId, long timeBucket, List memories) { - memories.forEach(memory -> { - ServiceInstanceJVMMemory serviceInstanceJVMMemory = new ServiceInstanceJVMMemory(); - serviceInstanceJVMMemory.setId(serviceInstanceId); - serviceInstanceJVMMemory.setName(Const.EMPTY_STRING); - serviceInstanceJVMMemory.setServiceInstanceId(serviceInstanceId); - serviceInstanceJVMMemory.setServiceName(Const.EMPTY_STRING); - serviceInstanceJVMMemory.setHeapStatus(memory.getIsHeap()); - serviceInstanceJVMMemory.setInit(memory.getInit()); - serviceInstanceJVMMemory.setMax(memory.getMax()); - serviceInstanceJVMMemory.setUsed(memory.getUsed()); - serviceInstanceJVMMemory.setCommitted(memory.getCommitted()); - serviceInstanceJVMMemory.setTimeBucket(timeBucket); - sourceReceiver.receive(serviceInstanceJVMMemory); - }); - } - - private void sendToMemoryPoolMetricProcess(int serviceInstanceId, long timeBucket, - List memoryPools) { - - memoryPools.forEach(memoryPool -> { - ServiceInstanceJVMMemoryPool serviceInstanceJVMMemoryPool = new ServiceInstanceJVMMemoryPool(); - serviceInstanceJVMMemoryPool.setId(serviceInstanceId); - serviceInstanceJVMMemoryPool.setName(Const.EMPTY_STRING); - serviceInstanceJVMMemoryPool.setServiceInstanceId(serviceInstanceId); - serviceInstanceJVMMemoryPool.setServiceName(Const.EMPTY_STRING); - - switch (memoryPool.getType()) { - case NEWGEN_USAGE: - serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.NEWGEN_USAGE); - break; - case OLDGEN_USAGE: - serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.OLDGEN_USAGE); - break; - case PERMGEN_USAGE: - serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.PERMGEN_USAGE); - break; - case SURVIVOR_USAGE: - serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.SURVIVOR_USAGE); - break; - case METASPACE_USAGE: - serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.METASPACE_USAGE); - break; - case CODE_CACHE_USAGE: - serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.CODE_CACHE_USAGE); - break; - } - - serviceInstanceJVMMemoryPool.setInit(memoryPool.getInit()); - serviceInstanceJVMMemoryPool.setMax(memoryPool.getMax()); - serviceInstanceJVMMemoryPool.setUsed(memoryPool.getUsed()); - serviceInstanceJVMMemoryPool.setCommitted(memoryPool.getCommited()); - serviceInstanceJVMMemoryPool.setTimeBucket(timeBucket); - sourceReceiver.receive(serviceInstanceJVMMemoryPool); - }); - } } diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMSourceDispatcher.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMSourceDispatcher.java new file mode 100644 index 0000000000000000000000000000000000000000..ab5926cf47ffa3eca6a078b39cea2ae8f8daa952 --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMSourceDispatcher.java @@ -0,0 +1,144 @@ +/* + * 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 java.util.List; +import org.apache.skywalking.apm.network.language.agent.CPU; +import org.apache.skywalking.apm.network.language.agent.GC; +import org.apache.skywalking.apm.network.language.agent.JVMMetric; +import org.apache.skywalking.apm.network.language.agent.Memory; +import org.apache.skywalking.apm.network.language.agent.MemoryPool; +import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.source.GCPhrase; +import org.apache.skywalking.oap.server.core.source.MemoryPoolType; +import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMCPU; +import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMGC; +import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMMemory; +import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMMemoryPool; +import org.apache.skywalking.oap.server.core.source.SourceReceiver; + +/** + * @author wusheng + */ +public class JVMSourceDispatcher { + private SourceReceiver sourceReceiver; + + public JVMSourceDispatcher(SourceReceiver sourceReceiver) { + this.sourceReceiver = sourceReceiver; + } + + void sendMetric(int serviceInstanceId, long minuteTimeBucket, JVMMetric metric) { + this.sendToCpuMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getCpu()); + this.sendToMemoryMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getMemoryList()); + this.sendToMemoryPoolMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getMemoryPoolList()); + this.sendToGCMetricProcess(serviceInstanceId, minuteTimeBucket, metric.getGcList()); + } + + private void sendToCpuMetricProcess(int serviceInstanceId, long timeBucket, CPU cpu) { + ServiceInstanceJVMCPU serviceInstanceJVMCPU = new ServiceInstanceJVMCPU(); + serviceInstanceJVMCPU.setId(serviceInstanceId); + serviceInstanceJVMCPU.setName(Const.EMPTY_STRING); + serviceInstanceJVMCPU.setServiceInstanceId(serviceInstanceId); + serviceInstanceJVMCPU.setServiceName(Const.EMPTY_STRING); + serviceInstanceJVMCPU.setUsePercent(cpu.getUsagePercent()); + serviceInstanceJVMCPU.setTimeBucket(timeBucket); + sourceReceiver.receive(serviceInstanceJVMCPU); + } + + private void sendToGCMetricProcess(int serviceInstanceId, long timeBucket, List gcs) { + gcs.forEach(gc -> { + ServiceInstanceJVMGC serviceInstanceJVMGC = new ServiceInstanceJVMGC(); + serviceInstanceJVMGC.setId(serviceInstanceId); + serviceInstanceJVMGC.setName(Const.EMPTY_STRING); + serviceInstanceJVMGC.setServiceInstanceId(serviceInstanceId); + serviceInstanceJVMGC.setServiceName(Const.EMPTY_STRING); + + switch (gc.getPhrase()) { + case NEW: + serviceInstanceJVMGC.setPhrase(GCPhrase.NEW); + break; + case OLD: + serviceInstanceJVMGC.setPhrase(GCPhrase.OLD); + break; + } + + serviceInstanceJVMGC.setTime(gc.getTime()); + serviceInstanceJVMGC.setCount(gc.getCount()); + serviceInstanceJVMGC.setTimeBucket(timeBucket); + sourceReceiver.receive(serviceInstanceJVMGC); + }); + } + + private void sendToMemoryMetricProcess(int serviceInstanceId, long timeBucket, List memories) { + memories.forEach(memory -> { + ServiceInstanceJVMMemory serviceInstanceJVMMemory = new ServiceInstanceJVMMemory(); + serviceInstanceJVMMemory.setId(serviceInstanceId); + serviceInstanceJVMMemory.setName(Const.EMPTY_STRING); + serviceInstanceJVMMemory.setServiceInstanceId(serviceInstanceId); + serviceInstanceJVMMemory.setServiceName(Const.EMPTY_STRING); + serviceInstanceJVMMemory.setHeapStatus(memory.getIsHeap()); + serviceInstanceJVMMemory.setInit(memory.getInit()); + serviceInstanceJVMMemory.setMax(memory.getMax()); + serviceInstanceJVMMemory.setUsed(memory.getUsed()); + serviceInstanceJVMMemory.setCommitted(memory.getCommitted()); + serviceInstanceJVMMemory.setTimeBucket(timeBucket); + sourceReceiver.receive(serviceInstanceJVMMemory); + }); + } + + private void sendToMemoryPoolMetricProcess(int serviceInstanceId, long timeBucket, + List memoryPools) { + + memoryPools.forEach(memoryPool -> { + ServiceInstanceJVMMemoryPool serviceInstanceJVMMemoryPool = new ServiceInstanceJVMMemoryPool(); + serviceInstanceJVMMemoryPool.setId(serviceInstanceId); + serviceInstanceJVMMemoryPool.setName(Const.EMPTY_STRING); + serviceInstanceJVMMemoryPool.setServiceInstanceId(serviceInstanceId); + serviceInstanceJVMMemoryPool.setServiceName(Const.EMPTY_STRING); + + switch (memoryPool.getType()) { + case NEWGEN_USAGE: + serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.NEWGEN_USAGE); + break; + case OLDGEN_USAGE: + serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.OLDGEN_USAGE); + break; + case PERMGEN_USAGE: + serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.PERMGEN_USAGE); + break; + case SURVIVOR_USAGE: + serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.SURVIVOR_USAGE); + break; + case METASPACE_USAGE: + serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.METASPACE_USAGE); + break; + case CODE_CACHE_USAGE: + serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.CODE_CACHE_USAGE); + break; + } + + serviceInstanceJVMMemoryPool.setInit(memoryPool.getInit()); + serviceInstanceJVMMemoryPool.setMax(memoryPool.getMax()); + serviceInstanceJVMMemoryPool.setUsed(memoryPool.getUsed()); + serviceInstanceJVMMemoryPool.setCommitted(memoryPool.getCommited()); + serviceInstanceJVMMemoryPool.setTimeBucket(timeBucket); + sourceReceiver.receive(serviceInstanceJVMMemoryPool); + }); + } +} diff --git a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java index 8e8a87b66054d73c1717a9c9b38e658cc9625d28..4861955871fca95444ec0bd607c04296a3706002 100644 --- a/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java +++ b/oap-server/server-receiver-plugin/skywalking-mesh-receiver-plugin/src/main/java/org/apache/skywalking/aop/server/receiver/mesh/ServiceMeshMetricDataDecorator.java @@ -90,12 +90,12 @@ public class ServiceMeshMetricDataDecorator { if (DetectPoint.client.equals(point)) { if (sourceServiceId != Const.NONE) { endpointId = CoreRegisterLinker.getEndpointInventoryRegister().getOrCreate(sourceServiceId, endpoint, - org.apache.skywalking.oap.server.core.source.DetectPoint.fromMeshDetectPoint(point)); + org.apache.skywalking.oap.server.core.source.DetectPoint.fromNetworkProtocolDetectPoint(point)); } } else { if (destServiceId != Const.NONE) { endpointId = CoreRegisterLinker.getEndpointInventoryRegister().getOrCreate(destServiceId, endpoint, - org.apache.skywalking.oap.server.core.source.DetectPoint.fromMeshDetectPoint(point)); + org.apache.skywalking.oap.server.core.source.DetectPoint.fromNetworkProtocolDetectPoint(point)); } } diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java index c40a433cb0169517485971c5bfa96c0ccc3d4340..56d6378c4fb42f97d9dcefda9618fe40172d00d2 100644 --- a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/RegisterModuleProvider.java @@ -19,14 +19,23 @@ package org.apache.skywalking.oap.server.receiver.register.provider; import org.apache.skywalking.oap.server.core.CoreModule; -import org.apache.skywalking.oap.server.core.server.*; -import org.apache.skywalking.oap.server.library.module.*; +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.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.provider.handler.v5.grpc.ApplicationRegisterHandler; import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc.InstanceDiscoveryServiceHandler; import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc.NetworkAddressRegisterServiceHandler; import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc.ServiceNameDiscoveryHandler; -import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.*; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.ApplicationRegisterServletHandler; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.InstanceDiscoveryServletHandler; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.InstanceHeartBeatServletHandler; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.NetworkAddressRegisterServletHandler; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.rest.ServiceNameDiscoveryServiceHandler; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v6.grpc.RegisterServiceHandler; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v6.grpc.ServiceInstancePingServiceHandler; /** * @author peng-yongsheng @@ -55,6 +64,10 @@ public class RegisterModuleProvider extends ModuleProvider { grpcHandlerRegister.addHandler(new ServiceNameDiscoveryHandler(getManager())); grpcHandlerRegister.addHandler(new NetworkAddressRegisterServiceHandler(getManager())); + // v2 + grpcHandlerRegister.addHandler(new RegisterServiceHandler(getManager())); + grpcHandlerRegister.addHandler(new ServiceInstancePingServiceHandler(getManager())); + JettyHandlerRegister jettyHandlerRegister = getManager().find(CoreModule.NAME).provider().getService(JettyHandlerRegister.class); jettyHandlerRegister.addHandler(new ApplicationRegisterServletHandler(getManager())); jettyHandlerRegister.addHandler(new InstanceDiscoveryServletHandler(getManager())); diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..f08cc047590e7ebacdaeefa5cf5e3948de154b1f --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/RegisterServiceHandler.java @@ -0,0 +1,220 @@ +/* + * 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.v6.grpc; + +import io.grpc.stub.StreamObserver; +import org.apache.skywalking.apm.network.common.Commands; +import org.apache.skywalking.apm.network.common.KeyIntValuePair; +import org.apache.skywalking.apm.network.common.KeyStringValuePair; +import org.apache.skywalking.apm.network.register.v2.EndpointMapping; +import org.apache.skywalking.apm.network.register.v2.EndpointMappingElement; +import org.apache.skywalking.apm.network.register.v2.Enpoints; +import org.apache.skywalking.apm.network.register.v2.NetAddressMapping; +import org.apache.skywalking.apm.network.register.v2.NetAddresses; +import org.apache.skywalking.apm.network.register.v2.RegisterGrpc; +import org.apache.skywalking.apm.network.register.v2.ServiceAndNetworkAddressMappings; +import org.apache.skywalking.apm.network.register.v2.ServiceInstanceRegisterMapping; +import org.apache.skywalking.apm.network.register.v2.ServiceInstances; +import org.apache.skywalking.apm.network.register.v2.ServiceRegisterMapping; +import org.apache.skywalking.apm.network.register.v2.Services; +import org.apache.skywalking.apm.util.StringUtil; +import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache; +import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache; +import org.apache.skywalking.oap.server.core.register.ServiceInstanceInventory; +import org.apache.skywalking.oap.server.core.register.ServiceInventory; +import org.apache.skywalking.oap.server.core.register.service.IEndpointInventoryRegister; +import org.apache.skywalking.oap.server.core.register.service.INetworkAddressInventoryRegister; +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.core.source.DetectPoint; +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.library.util.StringUtils; +import org.apache.skywalking.oap.server.receiver.register.provider.handler.v5.grpc.InstanceDiscoveryServiceHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author wusheng + */ +public class RegisterServiceHandler extends RegisterGrpc.RegisterImplBase 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; + private final IEndpointInventoryRegister inventoryService; + private final INetworkAddressInventoryRegister networkAddressInventoryRegister; + + public RegisterServiceHandler(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); + this.inventoryService = moduleManager.find(CoreModule.NAME).provider().getService(IEndpointInventoryRegister.class); + this.networkAddressInventoryRegister = moduleManager.find(CoreModule.NAME).provider().getService(INetworkAddressInventoryRegister.class); + } + + @Override public void doServiceRegister(Services request, StreamObserver responseObserver) { + ServiceRegisterMapping.Builder builder = ServiceRegisterMapping.newBuilder(); + request.getServicesList().forEach(service -> { + String serviceName = service.getServiceName(); + if (logger.isDebugEnabled()) { + logger.debug("Register service, service code: {}", serviceName); + } + int serviceId = serviceInventoryRegister.getOrCreate(serviceName); + + if (serviceId != Const.NONE) { + KeyIntValuePair value = KeyIntValuePair.newBuilder().setKey(serviceName).setValue(serviceId).build(); + builder.addServices(value); + } + }); + + responseObserver.onNext(builder.build()); + responseObserver.onCompleted(); + } + + @Override public void doServiceInstanceRegister(ServiceInstances request, + StreamObserver responseObserver) { + + ServiceInstanceRegisterMapping.Builder builder = ServiceInstanceRegisterMapping.newBuilder(); + + request.getInstancesList().forEach(instance -> { + ServiceInventory serviceInventory = serviceInventoryCache.get(instance.getServiceId()); + + ServiceInstanceInventory.AgentOsInfo agentOsInfo = new ServiceInstanceInventory.AgentOsInfo(); + for (KeyStringValuePair property : instance.getPropertiesList()) { + String key = property.getKey(); + switch (key) { + case "OSName": + agentOsInfo.setOsName(property.getValue()); + break; + case "hostname": + agentOsInfo.setHostname(property.getValue()); + break; + case "ipv4": + agentOsInfo.getIpv4s().add(property.getValue()); + break; + case "ProcessNo": + agentOsInfo.setProcessNo(Integer.parseInt(property.getValue())); + break; + } + } + + String instanceName = serviceInventory.getName(); + if (agentOsInfo.getProcessNo() != 0) { + instanceName += "-pid:" + agentOsInfo.getProcessNo(); + } + if (StringUtils.isNotEmpty(agentOsInfo.getHostname())) { + instanceName += "@" + agentOsInfo.getHostname(); + } + + int serviceInstanceId = serviceInstanceInventoryRegister.getOrCreate(instance.getServiceId(), instanceName, instance.getInstanceUUID(), instance.getTime(), agentOsInfo); + + if (serviceInstanceId != Const.NONE) { + logger.info("register service instance id={} [UUID:{}]", serviceInstanceId, instance.getInstanceUUID()); + builder.addServiceInstances(KeyIntValuePair.newBuilder().setKey(instance.getInstanceUUID()).setValue(serviceInstanceId)); + } + }); + + responseObserver.onNext(builder.build()); + responseObserver.onCompleted(); + } + + @Override public void doEndpointRegister(Enpoints request, StreamObserver responseObserver) { + EndpointMapping.Builder builder = EndpointMapping.newBuilder(); + + request.getEndpointsList().forEach(endpoint -> { + int serviceId = endpoint.getServiceId(); + String endpointName = endpoint.getEndpointName(); + + int endpointId = inventoryService.getOrCreate(serviceId, endpointName, DetectPoint.fromNetworkProtocolDetectPoint(endpoint.getFrom())); + + if (endpointId != Const.NONE) { + builder.addElements(EndpointMappingElement.newBuilder() + .setServiceId(serviceId) + .setEndpointName(endpointName) + .setEndpointId(endpointId) + .setFrom(endpoint.getFrom())); + } + }); + + responseObserver.onNext(builder.build()); + responseObserver.onCompleted(); + } + + @Override + public void doNetworkAddressRegister(NetAddresses request, StreamObserver responseObserver) { + NetAddressMapping.Builder builder = NetAddressMapping.newBuilder(); + + request.getAddressesList().forEach(networkAddress -> { + int addressId = networkAddressInventoryRegister.getOrCreate(networkAddress); + + if (addressId != Const.NONE) { + builder.addAddressIds(KeyIntValuePair.newBuilder().setKey(networkAddress).setValue(addressId)); + } + }); + + responseObserver.onNext(builder.build()); + responseObserver.onCompleted(); + } + + @Override public void doServiceAndNetworkAddressMappingRegister(ServiceAndNetworkAddressMappings request, + StreamObserver responseObserver) { + + request.getMappingsList().forEach(mapping -> { + int serviceId = mapping.getServiceId(); + + if (serviceId == Const.NONE) { + int serviceInstanceId = mapping.getServiceInstanceId(); + if (serviceInstanceId == Const.NONE) { + serviceId = serviceInstanceInventoryCache.get(serviceInstanceId).getServiceId(); + } else { + return; + } + } + + if (serviceId == Const.NONE) { + return; + } + + int networkAddressId = mapping.getNetworkAddressId(); + if (networkAddressId == Const.NONE) { + String address = mapping.getNetworkAddress(); + if (StringUtil.isEmpty(address)) { + return; + } + + networkAddressId = networkAddressInventoryRegister.getOrCreate(address); + if (networkAddressId == Const.NONE) { + return; + } + } + + serviceInventoryRegister.updateMapping(networkAddressId, serviceId); + }); + + responseObserver.onNext(Commands.getDefaultInstance()); + responseObserver.onCompleted(); + } +} diff --git a/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/ServiceInstancePingServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/ServiceInstancePingServiceHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..348aaa60951810048b7dce2b8a52cd9be7049d0d --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-register-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v6/grpc/ServiceInstancePingServiceHandler.java @@ -0,0 +1,67 @@ +/* + * 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.v6.grpc; + +import io.grpc.stub.StreamObserver; +import java.util.Objects; +import org.apache.skywalking.apm.network.common.Commands; +import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingGrpc; +import org.apache.skywalking.apm.network.register.v2.ServiceInstancePingPkg; +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.grpc.GRPCHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author wusheng + */ +public class ServiceInstancePingServiceHandler extends ServiceInstancePingGrpc.ServiceInstancePingImplBase implements GRPCHandler { + private static final Logger logger = LoggerFactory.getLogger(ServiceInstancePingServiceHandler.class); + + private final ServiceInstanceInventoryCache serviceInstanceInventoryCache; + private final IServiceInventoryRegister serviceInventoryRegister; + private final IServiceInstanceInventoryRegister serviceInstanceInventoryRegister; + + public ServiceInstancePingServiceHandler(ModuleManager moduleManager) { + 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 doPing(ServiceInstancePingPkg request, StreamObserver responseObserver) { + int serviceInstanceId = request.getServiceInstanceId(); + long heartBeatTime = request.getTime(); + 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(Commands.getDefaultInstance()); + responseObserver.onCompleted(); + } +} diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java index 462fbf2096dbe0724c7d7c1aab35aa65600c8a35..10147a9406d0655c61b52fe619114fc4f586d67a 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java @@ -25,6 +25,7 @@ import org.apache.skywalking.oap.server.library.module.*; 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.parser.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.endpoint.MultiScopesSpanListener; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.segment.SegmentSpanListener; @@ -38,6 +39,7 @@ public class TraceModuleProvider extends ModuleProvider { private final TraceServiceModuleConfig moduleConfig; private SegmentParse.Producer segmentProducer; + private SegmentParseV2.Producer segmentProducerV2; public TraceModuleProvider() { this.moduleConfig = new TraceServiceModuleConfig(); @@ -62,7 +64,15 @@ public class TraceModuleProvider extends ModuleProvider { listenerManager.add(new SegmentSpanListener.Factory()); segmentProducer = new SegmentParse.Producer(getManager(), listenerManager); - this.registerServiceImplementation(ISegmentParserService.class, new SegmentParserServiceImpl(segmentProducer)); + + listenerManager = new SegmentParserListenerManager(); + listenerManager.add(new MultiScopesSpanListener.Factory()); + listenerManager.add(new ServiceMappingSpanListener.Factory()); + listenerManager.add(new SegmentSpanListener.Factory()); + + segmentProducerV2 = new SegmentParseV2.Producer(getManager(), listenerManager); + + this.registerServiceImplementation(ISegmentParserService.class, new SegmentParserServiceImpl(segmentProducerV2)); } @Override public void start() throws ModuleStartException { @@ -71,10 +81,14 @@ public class TraceModuleProvider extends ModuleProvider { try { grpcHandlerRegister.addHandler(new TraceSegmentServiceHandler(segmentProducer)); + grpcHandlerRegister.addHandler(new TraceSegmentReportServiceHandler(segmentProducerV2)); jettyHandlerRegister.addHandler(new TraceSegmentServletHandler(segmentProducer)); - SegmentStandardizationWorker standardizationWorker = new SegmentStandardizationWorker(segmentProducer, moduleConfig.getBufferPath(), moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart()); + SegmentStandardizationWorker standardizationWorker = new SegmentStandardizationWorker(segmentProducer, moduleConfig.getBufferPath() + "-v5", moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart()); segmentProducer.setStandardizationWorker(standardizationWorker); + + SegmentStandardizationWorker standardizationWorker2 = new SegmentStandardizationWorker(segmentProducer, moduleConfig.getBufferPath(), moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart()); + segmentProducerV2.setStandardizationWorker(standardizationWorker2); } catch (IOException e) { throw new ModuleStartException(e.getMessage(), e); } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/handler/v6/grpc/TraceSegmentReportServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/handler/v6/grpc/TraceSegmentReportServiceHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..ad759483cd34a388554346fbfa31eee5380986cd --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/handler/v6/grpc/TraceSegmentReportServiceHandler.java @@ -0,0 +1,65 @@ +/* + * 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.v6.grpc; + +import io.grpc.stub.StreamObserver; +import org.apache.skywalking.apm.network.common.Commands; +import org.apache.skywalking.apm.network.language.agent.UpstreamSegment; +import org.apache.skywalking.apm.network.language.agent.v2.TraceSegmentReportServiceGrpc; +import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler; +import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.grpc.TraceSegmentServiceHandler; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParseV2; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TraceSegmentReportServiceHandler extends TraceSegmentReportServiceGrpc.TraceSegmentReportServiceImplBase implements GRPCHandler { + + private static final Logger logger = LoggerFactory.getLogger(TraceSegmentServiceHandler.class); + + private final Boolean debug; + private final SegmentParseV2.Producer segmentProducer; + + public TraceSegmentReportServiceHandler(SegmentParseV2.Producer segmentProducer) { + this.debug = System.getProperty("debug") != null; + this.segmentProducer = segmentProducer; + } + + @Override public StreamObserver collect(StreamObserver responseObserver) { + return new StreamObserver() { + @Override public void onNext(UpstreamSegment segment) { + if (logger.isDebugEnabled()) { + logger.debug("receive segment"); + } + + segmentProducer.send(segment, SegmentSource.Agent); + } + + @Override public void onError(Throwable throwable) { + logger.error(throwable.getMessage(), throwable); + responseObserver.onCompleted(); + } + + @Override public void onCompleted() { + responseObserver.onNext(Commands.newBuilder().build()); + responseObserver.onCompleted(); + } + }; + } +} diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParse.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParse.java index 4f3e48af37b4097f5f3188f7d8623705c0480da6..d4bd8617c3451d3972c5d378418665ec7d234588 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParse.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParse.java @@ -19,16 +19,32 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser; import com.google.protobuf.InvalidProtocolBufferException; -import java.util.*; +import java.util.LinkedList; +import java.util.List; import lombok.Setter; -import org.apache.skywalking.apm.network.language.agent.*; +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.UniqueId; +import org.apache.skywalking.apm.network.language.agent.UpstreamSegment; 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.util.TimeBucketUtils; -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.slf4j.*; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.ReferenceDecorator; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SegmentCoreInfo; +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.SpanIdExchanger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author peng-yongsheng @@ -50,6 +66,7 @@ public class SegmentParse { this.segmentCoreInfo = new SegmentCoreInfo(); this.segmentCoreInfo.setStartTime(Long.MAX_VALUE); this.segmentCoreInfo.setEndTime(Long.MIN_VALUE); + this.segmentCoreInfo.setV2(false); } public boolean parse(UpstreamSegment segment, Source source) { @@ -103,19 +120,20 @@ public class SegmentParse { } segmentCoreInfo.setSegmentId(segmentIdBuilder.toString()); - segmentCoreInfo.setApplicationId(segmentDecorator.getApplicationId()); - segmentCoreInfo.setApplicationInstanceId(segmentDecorator.getApplicationInstanceId()); + segmentCoreInfo.setServiceId(segmentDecorator.getServiceId()); + segmentCoreInfo.setServiceInstanceId(segmentDecorator.getServiceInstanceId()); segmentCoreInfo.setDataBinary(segmentDecorator.toByteArray()); + segmentCoreInfo.setV2(false); for (int i = 0; i < segmentDecorator.getSpansCount(); i++) { SpanDecorator spanDecorator = segmentDecorator.getSpans(i); - if (!SpanIdExchanger.getInstance(moduleManager).exchange(spanDecorator, segmentCoreInfo.getApplicationId())) { + if (!SpanIdExchanger.getInstance(moduleManager).exchange(spanDecorator, segmentCoreInfo.getServiceId())) { return false; } else { for (int j = 0; j < spanDecorator.getRefsCount(); j++) { ReferenceDecorator referenceDecorator = spanDecorator.getRefs(j); - if (!ReferenceIdExchanger.getInstance(moduleManager).exchange(referenceDecorator, segmentCoreInfo.getApplicationId())) { + if (!ReferenceIdExchanger.getInstance(moduleManager).exchange(referenceDecorator, segmentCoreInfo.getServiceId())) { return false; } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParseV2.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParseV2.java new file mode 100644 index 0000000000000000000000000000000000000000..2058f61e80a6116434444415dc549aa78c7e54dd --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParseV2.java @@ -0,0 +1,259 @@ +/* + * 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.LinkedList; +import java.util.List; +import lombok.Setter; +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.oap.server.library.buffer.DataStreamReader; +import org.apache.skywalking.oap.server.library.module.ModuleManager; +import org.apache.skywalking.oap.server.library.util.TimeBucketUtils; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.ReferenceDecorator; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SegmentCoreInfo; +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.SpanIdExchanger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * SegmentParseV2 is a replication of SegmentParse, but be compatible with v2 trace protocol. + * + * @author wusheng + */ +public class SegmentParseV2 { + + private static final Logger logger = LoggerFactory.getLogger(SegmentParseV2.class); + + private final ModuleManager moduleManager; + private final List spanListeners; + private final SegmentParserListenerManager listenerManager; + private final SegmentCoreInfo segmentCoreInfo; + @Setter private SegmentStandardizationWorker standardizationWorker; + + private SegmentParseV2(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) { + 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(true); + } + + public boolean parse(UpstreamSegment segment, SegmentSource source) { + createSpanListeners(); + + try { + List traceIds = segment.getGlobalTraceIdsList(); + SegmentObject segmentObject = parseBinarySegment(segment); + + 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(SegmentSource.Agent)) { + writeToBufferFile(segmentCoreInfo.getSegmentId(), segment); + } + return false; + } else { + if (logger.isDebugEnabled()) { + logger.debug("This segment id exchange success, id: {}", segmentCoreInfo.getSegmentId()); + } + notifyListenerToBuild(); + return true; + } + } catch (Throwable e) { + logger.error(e.getMessage(), e); + return true; + } + } + + private SegmentObject parseBinarySegment(UpstreamSegment segment) throws InvalidProtocolBufferException { + return SegmentObject.parseFrom(segment.getSegment()); + } + + private boolean preBuild(List 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(true); + + for (int i = 0; i < segmentDecorator.getSpansCount(); i++) { + SpanDecorator spanDecorator = segmentDecorator.getSpans(i); + + if (!SpanIdExchanger.getInstance(moduleManager).exchange(spanDecorator, segmentCoreInfo.getServiceId())) { + return false; + } else { + for (int j = 0; j < spanDecorator.getRefsCount(); j++) { + ReferenceDecorator referenceDecorator = spanDecorator.getRefs(j); + if (!ReferenceIdExchanger.getInstance(moduleManager).exchange(referenceDecorator, segmentCoreInfo.getServiceId())) { + return 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()); + } + + long minuteTimeBucket = TimeBucketUtils.INSTANCE.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 true; + } + + 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))); + } + + public static class Producer implements DataStreamReader.CallBack { + + @Setter private SegmentStandardizationWorker standardizationWorker; + private final ModuleManager moduleManager; + private final SegmentParserListenerManager listenerManager; + + public Producer(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) { + this.moduleManager = moduleManager; + this.listenerManager = listenerManager; + } + + public void send(UpstreamSegment segment, SegmentSource source) { + SegmentParseV2 segmentParse = new SegmentParseV2(moduleManager, listenerManager); + segmentParse.setStandardizationWorker(standardizationWorker); + segmentParse.parse(segment, source); + } + + @Override public boolean call(UpstreamSegment segment) { + SegmentParseV2 segmentParse = new SegmentParseV2(moduleManager, listenerManager); + segmentParse.setStandardizationWorker(standardizationWorker); + return segmentParse.parse(segment, SegmentSource.Buffer); + } + } +} diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java index 2d0ab6d8f6bfa4583e2e527a05d19f94cd03b90c..5392e627c1b872eb676a404b3feba41c0b9a4f57 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentParserServiceImpl.java @@ -24,15 +24,15 @@ import org.apache.skywalking.apm.network.language.agent.UpstreamSegment; * @author wusheng */ public class SegmentParserServiceImpl implements ISegmentParserService { - private final SegmentParse.Producer segmentProducer; + private final SegmentParseV2.Producer segmentProducer; public SegmentParserServiceImpl( - SegmentParse.Producer segmentProducer) { + SegmentParseV2.Producer segmentProducer) { this.segmentProducer = segmentProducer; } @Override public void send(UpstreamSegment segment) { - segmentProducer.send(segment, SegmentParse.Source.Agent); + segmentProducer.send(segment,SegmentSource.Agent); } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentSource.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentSource.java new file mode 100644 index 0000000000000000000000000000000000000000..7bbf3f9d266ea348abbdcf6bf62a5003927b6ae0 --- /dev/null +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SegmentSource.java @@ -0,0 +1,26 @@ +/* + * 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; + +/** + * @author wusheng + */ +public enum SegmentSource { + Agent, Buffer +} diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/ReferenceDecorator.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/ReferenceDecorator.java index 964d6e8ecead9bcd53f8f0e88c94c33dce0147e4..591a5709567cf3093a6c251389dc1f817a980b79 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/ReferenceDecorator.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/ReferenceDecorator.java @@ -18,7 +18,10 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; -import org.apache.skywalking.apm.network.language.agent.*; +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; /** * @author peng-yongsheng @@ -29,131 +32,165 @@ public class ReferenceDecorator implements StandardBuilder { private StandardBuilder standardBuilder; private TraceSegmentReference referenceObject; private TraceSegmentReference.Builder referenceBuilder; + private final boolean isV2; + private SegmentReference referenceObjectV2; + 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) { + this.referenceObjectV2 = referenceObject; + this.standardBuilder = standardBuilder; + isV2 = true; + } + + public ReferenceDecorator(SegmentReference.Builder referenceBuilder, StandardBuilder standardBuilder) { + this.referenceBuilderV2 = referenceBuilder; + this.standardBuilder = standardBuilder; + this.isOrigin = false; + isV2 = true; } public RefType getRefType() { if (isOrigin) { - return referenceObject.getRefType(); + return isV2 ? referenceObjectV2.getRefType() : referenceObject.getRefType(); } else { - return referenceBuilder.getRefType(); + return isV2 ? referenceBuilderV2.getRefType() : referenceBuilder.getRefType(); } } public int getRefTypeValue() { if (isOrigin) { - return referenceObject.getRefTypeValue(); + return isV2 ? referenceObjectV2.getRefTypeValue() : referenceObject.getRefTypeValue(); } else { - return referenceBuilder.getRefTypeValue(); + return isV2 ? referenceBuilderV2.getRefTypeValue() : referenceBuilder.getRefTypeValue(); } } - public int getEntryServiceId() { + public int getEntryEndpointId() { if (isOrigin) { - return referenceObject.getEntryServiceId(); + return isV2 ? referenceObjectV2.getEntryEndpointId() : referenceObject.getEntryServiceId(); } else { - return referenceBuilder.getEntryServiceId(); + return isV2 ? referenceBuilderV2.getEntryEndpointId() : referenceBuilder.getEntryServiceId(); } } - public void setEntryServiceId(int value) { + public void setEntryEndpointId(int value) { if (isOrigin) { toBuilder(); } - referenceBuilder.setEntryServiceId(value); + if (isV2) { + referenceBuilderV2.setEntryEndpointId(value); + } else { + referenceBuilder.setEntryServiceId(value); + } } - public String getEntryServiceName() { + public String getEntryEndpointName() { if (isOrigin) { - return referenceObject.getEntryServiceName(); + return isV2 ? referenceObjectV2.getEntryEndpoint() : referenceObject.getEntryServiceName(); } else { - return referenceBuilder.getEntryServiceName(); + return isV2 ? referenceBuilderV2.getEntryEndpoint() : referenceBuilder.getEntryServiceName(); } } - public void setEntryServiceName(String value) { + public void setEntryEndpointName(String value) { if (isOrigin) { toBuilder(); } - referenceBuilder.setEntryServiceName(value); + if (isV2) { + referenceBuilderV2.setEntryEndpoint(value); + } else { + referenceBuilder.setEntryServiceName(value); + } } - public int getEntryApplicationInstanceId() { + public int getEntryServiceInstanceId() { if (isOrigin) { - return referenceObject.getEntryApplicationInstanceId(); + return isV2 ? referenceObjectV2.getEntryServiceInstanceId() : referenceObject.getEntryApplicationInstanceId(); } else { - return referenceBuilder.getEntryApplicationInstanceId(); + return isV2 ? referenceBuilderV2.getEntryServiceInstanceId() : referenceBuilder.getEntryApplicationInstanceId(); } } - public int getParentApplicationInstanceId() { + public int getParentServiceInstanceId() { if (isOrigin) { - return referenceObject.getParentApplicationInstanceId(); + return isV2 ? referenceObjectV2.getParentServiceInstanceId() : referenceObject.getParentApplicationInstanceId(); } else { - return referenceBuilder.getParentApplicationInstanceId(); + return isV2 ? referenceBuilderV2.getParentServiceInstanceId() : referenceBuilder.getParentApplicationInstanceId(); } } - public int getParentServiceId() { + public int getParentEndpointId() { if (isOrigin) { - return referenceObject.getParentServiceId(); + return isV2 ? referenceObjectV2.getParentEndpointId() : referenceObject.getParentServiceId(); } else { - return referenceBuilder.getParentServiceId(); + return isV2 ? referenceBuilderV2.getParentEndpointId() : referenceBuilder.getParentServiceId(); } } - public void setParentServiceId(int value) { + public void setParentEndpointId(int value) { if (isOrigin) { toBuilder(); } - referenceBuilder.setParentServiceId(value); + if (isV2) { + referenceBuilderV2.setParentEndpointId(value); + } else { + referenceBuilder.setParentServiceId(value); + } } public int getParentSpanId() { if (isOrigin) { - return referenceObject.getParentSpanId(); + return isV2 ? referenceObjectV2.getParentSpanId() : referenceObject.getParentSpanId(); } else { - return referenceBuilder.getParentSpanId(); + return isV2 ? referenceBuilderV2.getParentSpanId() : referenceBuilder.getParentSpanId(); } } - public String getParentServiceName() { + public String getParentEndpointName() { if (isOrigin) { - return referenceObject.getParentServiceName(); + return isV2 ? referenceObjectV2.getParentEndpoint() : referenceObject.getParentServiceName(); } else { - return referenceBuilder.getParentServiceName(); + return isV2 ? referenceBuilderV2.getParentEndpoint() : referenceBuilder.getParentServiceName(); } } - public void setParentServiceName(String value) { + public void setParentEndpointName(String value) { if (isOrigin) { toBuilder(); } - referenceBuilder.setParentServiceName(value); + if (isV2) { + referenceBuilderV2.setParentEndpoint(value); + } else { + referenceBuilder.setParentServiceName(value); + } } public UniqueId getParentTraceSegmentId() { if (isOrigin) { - return referenceObject.getParentTraceSegmentId(); + return isV2 ? referenceObjectV2.getParentTraceSegmentId() : referenceObject.getParentTraceSegmentId(); } else { - return referenceBuilder.getParentTraceSegmentId(); + return isV2 ? referenceBuilderV2.getParentTraceSegmentId() : referenceBuilder.getParentTraceSegmentId(); } } public int getNetworkAddressId() { if (isOrigin) { - return referenceObject.getNetworkAddressId(); + return isV2 ? referenceObjectV2.getNetworkAddressId() : referenceObject.getNetworkAddressId(); } else { - return referenceBuilder.getNetworkAddressId(); + return isV2 ? referenceBuilderV2.getNetworkAddressId() : referenceBuilder.getNetworkAddressId(); } } @@ -161,14 +198,18 @@ public class ReferenceDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - referenceBuilder.setNetworkAddressId(value); + if (isV2) { + referenceBuilderV2.setNetworkAddressId(value); + } else { + referenceBuilder.setNetworkAddressId(value); + } } public String getNetworkAddress() { if (isOrigin) { - return referenceObject.getNetworkAddress(); + return isV2 ? referenceObjectV2.getNetworkAddress() : referenceObject.getNetworkAddress(); } else { - return referenceBuilder.getNetworkAddress(); + return isV2 ? referenceBuilderV2.getNetworkAddress() : referenceBuilder.getNetworkAddress(); } } @@ -176,13 +217,21 @@ public class ReferenceDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - referenceBuilder.setNetworkAddress(value); + if (isV2) { + referenceBuilderV2.setNetworkAddress(value); + } else { + referenceBuilder.setNetworkAddress(value); + } } @Override public void toBuilder() { if (this.isOrigin) { this.isOrigin = false; - referenceBuilder = referenceObject.toBuilder(); + if (isV2) { + referenceBuilderV2 = referenceObjectV2.toBuilder(); + } else { + referenceBuilder = referenceObject.toBuilder(); + } standardBuilder.toBuilder(); } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentCoreInfo.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentCoreInfo.java index a0c0b7f8a082f569be0d3bec548ed998362bddc9..d78bea858153623005460fdbcf145f0228f4135a 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentCoreInfo.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentCoreInfo.java @@ -27,11 +27,12 @@ import lombok.*; @Setter public class SegmentCoreInfo { private String segmentId; - private int applicationId; - private int applicationInstanceId; + private int serviceId; + private int serviceInstanceId; private long startTime; private long endTime; private boolean isError; private long minuteTimeBucket; private byte[] dataBinary; + private boolean isV2; } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentDecorator.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentDecorator.java index 29232bdfd1b65cbcbc0a28920c069637586abb0d..061d5bdd8b918c3123ceb383ca0b367260adefd3 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentDecorator.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SegmentDecorator.java @@ -18,7 +18,9 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; -import org.apache.skywalking.apm.network.language.agent.*; +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.v2.SegmentObject; import static java.util.Objects.isNull; @@ -29,35 +31,55 @@ public class SegmentDecorator implements StandardBuilder { private boolean isOrigin = true; private final TraceSegmentObject segmentObject; private TraceSegmentObject.Builder segmentBuilder; + private final boolean isV2; + private final SegmentObject segmentObjectV2; + private SegmentObject.Builder segmentBuilderV2; private final SpanDecorator[] spanDecorators; public SegmentDecorator(TraceSegmentObject segmentObject) { this.segmentObject = segmentObject; + this.segmentObjectV2 = null; this.spanDecorators = new SpanDecorator[segmentObject.getSpansCount()]; + isV2 = false; } - public int getApplicationId() { - return segmentObject.getApplicationId(); + public SegmentDecorator(SegmentObject segmentObjectV2) { + this.segmentObjectV2 = segmentObjectV2; + this.segmentObject = null; + this.spanDecorators = new SpanDecorator[segmentObjectV2.getSpansCount()]; + isV2 = true; } - public int getApplicationInstanceId() { - return segmentObject.getApplicationInstanceId(); + public int getServiceId() { + return isV2 ? segmentObjectV2.getServiceId() : segmentObject.getApplicationId(); + } + + public int getServiceInstanceId() { + return isV2 ? segmentObjectV2.getServiceInstanceId() : segmentObject.getApplicationInstanceId(); } public UniqueId getTraceSegmentId() { - return segmentObject.getTraceSegmentId(); + return isV2 ? segmentObjectV2.getTraceSegmentId() : segmentObject.getTraceSegmentId(); } public int getSpansCount() { - return segmentObject.getSpansCount(); + return isV2 ? segmentObjectV2.getSpansCount() : segmentObject.getSpansCount(); } public SpanDecorator getSpans(int index) { if (isNull(spanDecorators[index])) { if (isOrigin) { - spanDecorators[index] = new SpanDecorator(segmentObject.getSpans(index), this); + if (isV2) { + spanDecorators[index] = new SpanDecorator(segmentObjectV2.getSpans(index), this); + } else { + spanDecorators[index] = new SpanDecorator(segmentObject.getSpans(index), this); + } } else { - spanDecorators[index] = new SpanDecorator(segmentBuilder.getSpansBuilder(index), this); + if (isV2) { + spanDecorators[index] = new SpanDecorator(segmentBuilderV2.getSpansBuilder(index), this); + } else { + spanDecorators[index] = new SpanDecorator(segmentBuilder.getSpansBuilder(index), this); + } } } return spanDecorators[index]; @@ -65,7 +87,7 @@ public class SegmentDecorator implements StandardBuilder { public byte[] toByteArray() { if (isOrigin) { - return segmentObject.toByteArray(); + return isV2 ? segmentObjectV2.toByteArray() : segmentObject.toByteArray(); } else { return segmentBuilder.build().toByteArray(); } @@ -74,7 +96,11 @@ public class SegmentDecorator implements StandardBuilder { @Override public void toBuilder() { if (isOrigin) { this.isOrigin = false; - this.segmentBuilder = segmentObject.toBuilder(); + if (isV2) { + this.segmentBuilderV2 = segmentObjectV2.toBuilder(); + } else { + this.segmentBuilder = segmentObject.toBuilder(); + } } } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SpanDecorator.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SpanDecorator.java index bb00495e28797ce269a0c513883d091464426cbe..fb4cf364c2bc8bd7261cf3d5e17b5d1773c2fbb8 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SpanDecorator.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/decorator/SpanDecorator.java @@ -18,7 +18,10 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator; -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.SpanObject; +import org.apache.skywalking.apm.network.language.agent.SpanType; +import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; import static java.util.Objects.isNull; @@ -26,16 +29,20 @@ import static java.util.Objects.isNull; * @author peng-yongsheng */ public class SpanDecorator implements StandardBuilder { + private final boolean isV2; private boolean isOrigin = true; private StandardBuilder standardBuilder; private SpanObject spanObject; + private SpanObjectV2 spanObjectV2; private SpanObject.Builder spanBuilder; + private SpanObjectV2.Builder spanBuilderV2; 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) { @@ -43,77 +50,93 @@ public class SpanDecorator implements StandardBuilder { this.standardBuilder = standardBuilder; this.isOrigin = false; this.referenceDecorators = new ReferenceDecorator[spanBuilder.getRefsCount()]; + this.isV2 = false; + } + + public SpanDecorator(SpanObjectV2 spanObject, StandardBuilder standardBuilder) { + this.spanObjectV2 = spanObject; + this.standardBuilder = standardBuilder; + this.referenceDecorators = new ReferenceDecorator[spanObject.getRefsCount()]; + this.isV2 = true; + } + + public SpanDecorator(SpanObjectV2.Builder spanBuilder, StandardBuilder standardBuilder) { + this.spanBuilderV2 = spanBuilder; + this.standardBuilder = standardBuilder; + this.isOrigin = false; + this.referenceDecorators = new ReferenceDecorator[spanBuilder.getRefsCount()]; + this.isV2 = true; } public int getSpanId() { if (isOrigin) { - return spanObject.getSpanId(); + return isV2 ? spanObjectV2.getSpanId() : spanObject.getSpanId(); } else { - return spanBuilder.getSpanId(); + return isV2 ? spanBuilderV2.getSpanId() : spanBuilder.getSpanId(); } } public int getParentSpanId() { if (isOrigin) { - return spanObject.getParentSpanId(); + return isV2 ? spanObjectV2.getParentSpanId() : spanObject.getParentSpanId(); } else { - return spanBuilder.getParentSpanId(); + return isV2 ? spanBuilderV2.getParentSpanId() : spanBuilder.getParentSpanId(); } } public SpanType getSpanType() { if (isOrigin) { - return spanObject.getSpanType(); + return isV2 ? spanObjectV2.getSpanType() : spanObject.getSpanType(); } else { - return spanBuilder.getSpanType(); + return isV2 ? spanBuilderV2.getSpanType() : spanBuilder.getSpanType(); } } public int getSpanTypeValue() { if (isOrigin) { - return spanObject.getSpanTypeValue(); + return isV2 ? spanObjectV2.getSpanTypeValue() : spanObject.getSpanTypeValue(); } else { - return spanBuilder.getSpanTypeValue(); + return isV2 ? spanBuilderV2.getSpanTypeValue() : spanBuilder.getSpanTypeValue(); } } public SpanLayer getSpanLayer() { if (isOrigin) { - return spanObject.getSpanLayer(); + return isV2 ? spanObjectV2.getSpanLayer() : spanObject.getSpanLayer(); } else { - return spanBuilder.getSpanLayer(); + return isV2 ? spanBuilderV2.getSpanLayer() : spanBuilder.getSpanLayer(); } } public int getSpanLayerValue() { if (isOrigin) { - return spanObject.getSpanLayerValue(); + return isV2 ? spanObjectV2.getSpanLayerValue() : spanObject.getSpanLayerValue(); } else { - return spanBuilder.getSpanLayerValue(); + return isV2 ? spanBuilderV2.getSpanLayerValue() : spanBuilder.getSpanLayerValue(); } } public long getStartTime() { if (isOrigin) { - return spanObject.getStartTime(); + return isV2 ? spanObjectV2.getStartTime() : spanObject.getStartTime(); } else { - return spanBuilder.getStartTime(); + return isV2 ? spanBuilderV2.getStartTime() : spanBuilder.getStartTime(); } } public long getEndTime() { if (isOrigin) { - return spanObject.getEndTime(); + return isV2 ? spanObjectV2.getEndTime() : spanObject.getEndTime(); } else { - return spanBuilder.getEndTime(); + return isV2 ? spanBuilderV2.getEndTime() : spanBuilder.getEndTime(); } } public int getComponentId() { if (isOrigin) { - return spanObject.getComponentId(); + return isV2 ? spanObjectV2.getComponentId() : spanObject.getComponentId(); } else { - return spanBuilder.getComponentId(); + return isV2 ? spanBuilderV2.getComponentId() : spanBuilder.getComponentId(); } } @@ -121,14 +144,18 @@ public class SpanDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - spanBuilder.setComponentId(value); + if (isV2) { + spanBuilderV2.setComponentId(value); + } else { + spanBuilder.setComponentId(value); + } } public String getComponent() { if (isOrigin) { - return spanObject.getComponent(); + return isV2 ? spanObjectV2.getComponent() : spanObject.getComponent(); } else { - return spanBuilder.getComponent(); + return isV2 ? spanBuilderV2.getComponent() : spanBuilder.getComponent(); } } @@ -136,14 +163,18 @@ public class SpanDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - spanBuilder.setComponent(value); + if (isV2) { + spanBuilderV2.setComponent(value); + } else { + spanBuilder.setComponent(value); + } } public int getPeerId() { if (isOrigin) { - return spanObject.getPeerId(); + return isV2 ? spanObjectV2.getPeerId() : spanObject.getPeerId(); } else { - return spanBuilder.getPeerId(); + return isV2 ? spanBuilderV2.getPeerId() : spanBuilder.getPeerId(); } } @@ -151,14 +182,18 @@ public class SpanDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - spanBuilder.setPeerId(peerId); + if (isV2) { + spanBuilderV2.setPeerId(peerId); + } else { + spanBuilder.setPeerId(peerId); + } } public String getPeer() { if (isOrigin) { - return spanObject.getPeer(); + return isV2 ? spanObjectV2.getPeer() : spanObject.getPeer(); } else { - return spanBuilder.getPeer(); + return isV2 ? spanBuilderV2.getPeer() : spanBuilder.getPeer(); } } @@ -166,14 +201,18 @@ public class SpanDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - spanBuilder.setPeer(peer); + if (isV2) { + spanBuilderV2.setPeer(peer); + } else { + spanBuilder.setPeer(peer); + } } public int getOperationNameId() { if (isOrigin) { - return spanObject.getOperationNameId(); + return isV2 ? spanObjectV2.getOperationNameId() : spanObject.getOperationNameId(); } else { - return spanBuilder.getOperationNameId(); + return isV2 ? spanBuilderV2.getOperationNameId() : spanBuilder.getOperationNameId(); } } @@ -181,14 +220,18 @@ public class SpanDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - spanBuilder.setOperationNameId(value); + if (isV2) { + spanBuilderV2.setOperationNameId(value); + } else { + spanBuilder.setOperationNameId(value); + } } public String getOperationName() { if (isOrigin) { - return spanObject.getOperationName(); + return isV2 ? spanObjectV2.getOperationName() : spanObject.getOperationName(); } else { - return spanBuilder.getOperationName(); + return isV2 ? spanBuilderV2.getOperationName() : spanBuilder.getOperationName(); } } @@ -196,31 +239,43 @@ public class SpanDecorator implements StandardBuilder { if (isOrigin) { toBuilder(); } - spanBuilder.setOperationName(value); + if (isV2) { + spanBuilderV2.setOperationName(value); + } else { + spanBuilder.setOperationName(value); + } } public boolean getIsError() { if (isOrigin) { - return spanObject.getIsError(); + return isV2 ? spanObjectV2.getIsError() : spanObject.getIsError(); } else { - return spanBuilder.getIsError(); + return isV2 ? spanBuilderV2.getIsError() : spanBuilder.getIsError(); } } public int getRefsCount() { if (isOrigin) { - return spanObject.getRefsCount(); + return isV2 ? spanObjectV2.getRefsCount() : spanObject.getRefsCount(); } else { - return spanBuilder.getRefsCount(); + return isV2 ? spanBuilderV2.getRefsCount() : spanBuilder.getRefsCount(); } } public ReferenceDecorator getRefs(int index) { if (isNull(referenceDecorators[index])) { if (isOrigin) { - referenceDecorators[index] = new ReferenceDecorator(spanObject.getRefs(index), this); + if (isV2) { + referenceDecorators[index] = new ReferenceDecorator(spanObjectV2.getRefs(index), this); + } else { + referenceDecorators[index] = new ReferenceDecorator(spanObject.getRefs(index), this); + } } else { - referenceDecorators[index] = new ReferenceDecorator(spanBuilder.getRefsBuilder(index), this); + if (isV2) { + referenceDecorators[index] = new ReferenceDecorator(spanBuilderV2.getRefsBuilder(index), this); + } else { + referenceDecorators[index] = new ReferenceDecorator(spanBuilder.getRefsBuilder(index), this); + } } } return referenceDecorators[index]; @@ -229,7 +284,11 @@ public class SpanDecorator implements StandardBuilder { @Override public void toBuilder() { if (this.isOrigin) { this.isOrigin = false; - spanBuilder = spanObject.toBuilder(); + if (isV2) { + spanBuilderV2 = spanObjectV2.toBuilder(); + } else { + spanBuilder = spanObject.toBuilder(); + } standardBuilder.toBuilder(); } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java index 4d8e65ec4be4644f29ede5e150d406df4e7ad776..217cb9cc3f90933fa80f8e21e5f9f3efdc30c0f6 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java @@ -18,15 +18,28 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.endpoint; -import java.util.*; +import java.util.LinkedList; +import java.util.List; import org.apache.skywalking.apm.network.language.agent.SpanLayer; -import org.apache.skywalking.oap.server.core.*; -import org.apache.skywalking.oap.server.core.cache.*; -import org.apache.skywalking.oap.server.core.source.*; +import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.CoreModule; +import org.apache.skywalking.oap.server.core.cache.EndpointInventoryCache; +import org.apache.skywalking.oap.server.core.cache.ServiceInstanceInventoryCache; +import org.apache.skywalking.oap.server.core.cache.ServiceInventoryCache; +import org.apache.skywalking.oap.server.core.source.DetectPoint; +import org.apache.skywalking.oap.server.core.source.EndpointRelation; +import org.apache.skywalking.oap.server.core.source.RequestType; +import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.*; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.*; -import org.slf4j.*; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.ReferenceDecorator; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.SegmentCoreInfo; +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.SpanListener; +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; @@ -74,7 +87,7 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe for (int i = 0; i < spanDecorator.getRefsCount(); i++) { ReferenceDecorator reference = spanDecorator.getRefs(i); SourceBuilder sourceBuilder = new SourceBuilder(); - sourceBuilder.setSourceEndpointId(reference.getParentServiceId()); + sourceBuilder.setSourceEndpointId(reference.getParentEndpointId()); if (spanDecorator.getSpanLayer().equals(SpanLayer.MQ)) { int serviceIdByPeerId = serviceInventoryCache.getServiceId(reference.getNetworkAddressId()); @@ -82,12 +95,12 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe sourceBuilder.setSourceServiceInstanceId(instanceIdByPeerId); sourceBuilder.setSourceServiceId(serviceIdByPeerId); } else { - sourceBuilder.setSourceServiceInstanceId(reference.getParentApplicationInstanceId()); - sourceBuilder.setSourceServiceId(instanceInventoryCache.get(reference.getParentApplicationInstanceId()).getServiceId()); + sourceBuilder.setSourceServiceInstanceId(reference.getParentServiceInstanceId()); + sourceBuilder.setSourceServiceId(instanceInventoryCache.get(reference.getParentServiceInstanceId()).getServiceId()); } sourceBuilder.setDestEndpointId(spanDecorator.getOperationNameId()); - sourceBuilder.setDestServiceInstanceId(segmentCoreInfo.getApplicationInstanceId()); - sourceBuilder.setDestServiceId(segmentCoreInfo.getApplicationId()); + sourceBuilder.setDestServiceInstanceId(segmentCoreInfo.getServiceInstanceId()); + sourceBuilder.setDestServiceId(segmentCoreInfo.getServiceId()); sourceBuilder.setDetectPoint(DetectPoint.SERVER); sourceBuilder.setComponentId(spanDecorator.getComponentId()); setPublicAttrs(sourceBuilder, spanDecorator); @@ -99,8 +112,8 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe sourceBuilder.setSourceServiceInstanceId(Const.USER_INSTANCE_ID); sourceBuilder.setSourceServiceId(Const.USER_SERVICE_ID); sourceBuilder.setDestEndpointId(spanDecorator.getOperationNameId()); - sourceBuilder.setDestServiceInstanceId(segmentCoreInfo.getApplicationInstanceId()); - sourceBuilder.setDestServiceId(segmentCoreInfo.getApplicationId()); + sourceBuilder.setDestServiceInstanceId(segmentCoreInfo.getServiceInstanceId()); + sourceBuilder.setDestServiceId(segmentCoreInfo.getServiceId()); sourceBuilder.setDetectPoint(DetectPoint.SERVER); sourceBuilder.setComponentId(spanDecorator.getComponentId()); @@ -126,8 +139,8 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe int destInstanceId = instanceInventoryCache.getServiceInstanceId(destServiceId, peerId); sourceBuilder.setSourceEndpointId(Const.USER_ENDPOINT_ID); - sourceBuilder.setSourceServiceInstanceId(segmentCoreInfo.getApplicationInstanceId()); - sourceBuilder.setSourceServiceId(segmentCoreInfo.getApplicationId()); + sourceBuilder.setSourceServiceInstanceId(segmentCoreInfo.getServiceInstanceId()); + sourceBuilder.setSourceServiceId(segmentCoreInfo.getServiceId()); sourceBuilder.setDestEndpointId(spanDecorator.getOperationNameId()); sourceBuilder.setDestServiceInstanceId(destInstanceId); if (Const.NONE == mappingServiceId) { diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java index d48864d55d929ecd4873e04de4a874e145b23ef3..9b43c53373e01bcbcf96976c3723f562ac63a335 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/segment/SegmentSpanListener.java @@ -55,13 +55,17 @@ public class SegmentSpanListener implements FirstSpanListener, EntrySpanListener long timeBucket = TimeBucketUtils.INSTANCE.getMinuteTimeBucket(segmentCoreInfo.getStartTime()); segment.setSegmentId(segmentCoreInfo.getSegmentId()); - segment.setServiceId(segmentCoreInfo.getApplicationId()); + segment.setServiceId(segmentCoreInfo.getServiceId()); segment.setLatency((int)(segmentCoreInfo.getEndTime() - segmentCoreInfo.getStartTime())); segment.setStartTime(segmentCoreInfo.getStartTime()); segment.setEndTime(segmentCoreInfo.getEndTime()); segment.setIsError(BooleanUtils.booleanToValue(segmentCoreInfo.isError())); segment.setTimeBucket(timeBucket); segment.setDataBinary(segmentCoreInfo.getDataBinary()); + /** + * Only consider v1, v2 compatible for now. + */ + segment.setVersion(segmentCoreInfo.isV2() ? 2 : 1); firstEndpointId = spanDecorator.getOperationNameId(); } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java index d67d2a270d21f00b757644c665cfe04c645c137a..9e14954f9493d1082a2f3119a41b496252b9a472 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/service/ServiceMappingSpanListener.java @@ -59,10 +59,10 @@ public class ServiceMappingSpanListener implements EntrySpanListener { for (int i = 0; i < spanDecorator.getRefsCount(); i++) { int serviceId = serviceInventoryCache.getServiceId(spanDecorator.getRefs(i).getNetworkAddressId()); int mappingServiceId = serviceInventoryCache.get(serviceId).getMappingServiceId(); - if (mappingServiceId != segmentCoreInfo.getApplicationId()) { + if (mappingServiceId != segmentCoreInfo.getServiceId()) { ServiceMapping serviceMapping = new ServiceMapping(); serviceMapping.setServiceId(serviceId); - serviceMapping.setMappingServiceId(segmentCoreInfo.getApplicationId()); + serviceMapping.setMappingServiceId(segmentCoreInfo.getServiceId()); serviceMappings.add(serviceMapping); } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java index 7169ea30c256d4871dbdfb4e6e29fb7ec5724473..8aaad1913ac69187121af6fd2e6a08a6d05b2c5c 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/standardization/ReferenceIdExchanger.java @@ -53,37 +53,37 @@ public class ReferenceIdExchanger implements IdExchanger { } @Override public boolean exchange(ReferenceDecorator standardBuilder, int serviceId) { - if (standardBuilder.getEntryServiceId() == 0) { - String entryEndpointName = StringUtils.isNotEmpty(standardBuilder.getEntryServiceName()) ? standardBuilder.getEntryServiceName() : Const.DOMAIN_OPERATION_NAME; - int entryEndpointId = endpointInventoryRegister.get(serviceInstanceInventoryCache.get(standardBuilder.getEntryApplicationInstanceId()).getServiceId(), entryEndpointName, DetectPoint.SERVER.ordinal()); + if (standardBuilder.getEntryEndpointId() == 0) { + String entryEndpointName = StringUtils.isNotEmpty(standardBuilder.getEntryEndpointName()) ? standardBuilder.getEntryEndpointName() : Const.DOMAIN_OPERATION_NAME; + int entryEndpointId = endpointInventoryRegister.get(serviceInstanceInventoryCache.get(standardBuilder.getEntryServiceInstanceId()).getServiceId(), entryEndpointName, DetectPoint.SERVER.ordinal()); if (entryEndpointId == 0) { if (logger.isDebugEnabled()) { - int entryServiceId = serviceInstanceInventoryCache.get(standardBuilder.getEntryApplicationInstanceId()).getServiceId(); + int entryServiceId = serviceInstanceInventoryCache.get(standardBuilder.getEntryServiceInstanceId()).getServiceId(); logger.debug("entry endpoint name: {} from service id: {} exchange failed", entryEndpointName, entryServiceId); } return false; } else { standardBuilder.toBuilder(); - standardBuilder.setEntryServiceId(entryEndpointId); - standardBuilder.setEntryServiceName(Const.EMPTY_STRING); + standardBuilder.setEntryEndpointId(entryEndpointId); + standardBuilder.setEntryEndpointName(Const.EMPTY_STRING); } } - if (standardBuilder.getParentServiceId() == 0) { - String parentEndpointName = StringUtils.isNotEmpty(standardBuilder.getParentServiceName()) ? standardBuilder.getParentServiceName() : Const.DOMAIN_OPERATION_NAME; - int parentEndpointId = endpointInventoryRegister.get(serviceInstanceInventoryCache.get(standardBuilder.getParentApplicationInstanceId()).getServiceId(), parentEndpointName, DetectPoint.SERVER.ordinal()); + if (standardBuilder.getParentEndpointId() == 0) { + String parentEndpointName = StringUtils.isNotEmpty(standardBuilder.getParentEndpointName()) ? standardBuilder.getParentEndpointName() : Const.DOMAIN_OPERATION_NAME; + int parentEndpointId = endpointInventoryRegister.get(serviceInstanceInventoryCache.get(standardBuilder.getParentServiceInstanceId()).getServiceId(), parentEndpointName, DetectPoint.SERVER.ordinal()); if (parentEndpointId == 0) { if (logger.isDebugEnabled()) { - int parentServiceId = serviceInstanceInventoryCache.get(standardBuilder.getParentApplicationInstanceId()).getServiceId(); + int parentServiceId = serviceInstanceInventoryCache.get(standardBuilder.getParentServiceInstanceId()).getServiceId(); logger.debug("parent endpoint name: {} from service id: {} exchange failed", parentEndpointName, parentServiceId); } return false; } else { standardBuilder.toBuilder(); - standardBuilder.setParentServiceId(parentEndpointId); - standardBuilder.setParentServiceName(Const.EMPTY_STRING); + standardBuilder.setParentEndpointId(parentEndpointId); + standardBuilder.setParentEndpointName(Const.EMPTY_STRING); } } diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/data/SkyWalkingTrace.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/data/SkyWalkingTrace.java index 9eca022bdda40a100252060e68d9a14421b2c3c7..38c59ec6b33dad5953dfe032bb802aadf9282a1b 100644 --- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/data/SkyWalkingTrace.java +++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/data/SkyWalkingTrace.java @@ -20,18 +20,18 @@ package org.apache.skywalking.oap.server.receiver.zipkin.data; import java.util.LinkedList; import java.util.List; -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.UpstreamSegment; +import org.apache.skywalking.apm.network.language.agent.v2.SegmentObject; /** * Each SkyWalkingTrace consists of segments in each application, original from {@link ZipkinTrace}s */ public class SkyWalkingTrace { private UniqueId globalTraceId; - private List segmentList; + private List segmentList; - public SkyWalkingTrace(UniqueId globalTraceId, List segmentList) { + public SkyWalkingTrace(UniqueId globalTraceId, List segmentList) { this.globalTraceId = globalTraceId; this.segmentList = segmentList; } @@ -51,7 +51,7 @@ public class SkyWalkingTrace { return globalTraceId; } - public List getSegmentList() { + public List getSegmentList() { return segmentList; } } diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SegmentBuilder.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SegmentBuilder.java index 3b06584e4fdcc88e1e588139b90875310905ed1a..a5ec97ee2328e4ad042274d4bf0b1714b60e965a 100644 --- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SegmentBuilder.java +++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SegmentBuilder.java @@ -27,14 +27,14 @@ import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; import org.apache.logging.log4j.util.Strings; -import org.apache.skywalking.apm.network.language.agent.KeyWithStringValue; -import org.apache.skywalking.apm.network.language.agent.LogMessage; +import org.apache.skywalking.apm.network.common.KeyStringValuePair; import org.apache.skywalking.apm.network.language.agent.RefType; -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.TraceSegmentObject; -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.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.apache.skywalking.oap.server.library.util.StringUtils; import org.apache.skywalking.oap.server.receiver.zipkin.CoreRegisterLinker; import org.apache.skywalking.oap.server.receiver.zipkin.ZipkinTraceOSInfoBuilder; @@ -91,7 +91,7 @@ public class SegmentBuilder { timestamp = rootSpan.timestampAsLong(); builder.context.addApp(applicationCode, rootSpan.timestampAsLong() / 1000); - SpanObject.Builder rootSpanBuilder = builder.initSpan(null, null, rootSpan, true); + SpanObjectV2.Builder rootSpanBuilder = builder.initSpan(null, null, rootSpan, true); builder.context.currentSegment().addSpan(rootSpanBuilder); builder.scanSpansFromRoot(rootSpanBuilder, rootSpan, childSpanMap); @@ -99,19 +99,19 @@ public class SegmentBuilder { } } - List segmentBuilders = new LinkedList<>(); + List segmentBuilders = new LinkedList<>(); // microseconds -> million seconds long finalTimestamp = timestamp / 1000; builder.segments.forEach(segment -> { - TraceSegmentObject.Builder traceSegmentBuilder = segment.freeze(); + SegmentObject.Builder traceSegmentBuilder = segment.freeze(); segmentBuilders.add(traceSegmentBuilder); - CoreRegisterLinker.getServiceInventoryRegister().heartbeat(traceSegmentBuilder.getApplicationId(), finalTimestamp); - CoreRegisterLinker.getServiceInstanceInventoryRegister().heartbeat(traceSegmentBuilder.getApplicationInstanceId(), finalTimestamp); + CoreRegisterLinker.getServiceInventoryRegister().heartbeat(traceSegmentBuilder.getServiceId(), finalTimestamp); + CoreRegisterLinker.getServiceInstanceInventoryRegister().heartbeat(traceSegmentBuilder.getServiceInstanceId(), finalTimestamp); }); return new SkyWalkingTrace(builder.generateTraceOrSegmentId(), segmentBuilders); } - private void scanSpansFromRoot(SpanObject.Builder parentSegmentSpan, Span parent, + private void scanSpansFromRoot(SpanObjectV2.Builder parentSegmentSpan, Span parent, Map> childSpanMap) throws Exception { String parentId = parent.id(); // get child spans by parent span id @@ -132,7 +132,7 @@ public class SegmentBuilder { if (isNewApp) { context.addApp(localServiceName, childSpan.timestampAsLong() / 1000); } - SpanObject.Builder childSpanBuilder = initSpan(parentSegmentSpan, parent, childSpan, isNewApp); + SpanObjectV2.Builder childSpanBuilder = initSpan(parentSegmentSpan, parent, childSpan, isNewApp); context.currentSegment().addSpan(childSpanBuilder); scanSpansFromRoot(childSpanBuilder, childSpan, childSpanMap); @@ -145,9 +145,9 @@ public class SegmentBuilder { } } - private SpanObject.Builder initSpan(SpanObject.Builder parentSegmentSpan, Span parentSpan, Span span, + private SpanObjectV2.Builder initSpan(SpanObjectV2.Builder parentSegmentSpan, Span parentSpan, Span span, boolean isSegmentRoot) { - SpanObject.Builder spanBuilder = SpanObject.newBuilder(); + SpanObjectV2.Builder spanBuilder = SpanObjectV2.newBuilder(); spanBuilder.setSpanId(context.currentIDs().nextSpanId()); if (isSegmentRoot) { // spanId = -1, means no parent span @@ -201,19 +201,19 @@ public class SegmentBuilder { spanBuilder.setEndTime(startTime + duration); span.tags().forEach((tagKey, tagValue) -> spanBuilder.addTags( - KeyWithStringValue.newBuilder().setKey(tagKey).setValue(tagValue).build()) + KeyStringValuePair.newBuilder().setKey(tagKey).setValue(tagValue).build()) ); span.annotations().forEach(annotation -> - spanBuilder.addLogs(LogMessage.newBuilder().setTime(annotation.timestamp() / 1000).addData( - KeyWithStringValue.newBuilder().setKey("zipkin.annotation").setValue(annotation.value()).build() + spanBuilder.addLogs(Log.newBuilder().setTime(annotation.timestamp() / 1000).addData( + KeyStringValuePair.newBuilder().setKey("zipkin.annotation").setValue(annotation.value()).build() )) ); return spanBuilder; } - private void buildRef(SpanObject.Builder spanBuilder, Span span, SpanObject.Builder parentSegmentSpan, + private void buildRef(SpanObjectV2.Builder spanBuilder, Span span, SpanObjectV2.Builder parentSegmentSpan, Span parentSpan) { Segment parentSegment = context.parentSegment(); if (parentSegment == null) { @@ -241,27 +241,27 @@ public class SegmentBuilder { return; } - TraceSegmentReference.Builder refBuilder = TraceSegmentReference.newBuilder(); - refBuilder.setEntryApplicationInstanceId(rootSegment.builder().getApplicationInstanceId()); - int serviceId = rootSegment.getEntryServiceId(); - if (serviceId == 0) { - refBuilder.setEntryServiceName(rootSegment.getEntryServiceName()); + SegmentReference.Builder refBuilder = SegmentReference.newBuilder(); + refBuilder.setEntryServiceInstanceId(rootSegment.builder().getServiceInstanceId()); + int endpointId = rootSegment.getEntryEndpointId(); + if (endpointId == 0) { + refBuilder.setEntryEndpoint(rootSegment.getEntryEndpointName()); } else { - refBuilder.setEntryServiceId(serviceId); + refBuilder.setEntryEndpointId(endpointId); } - refBuilder.setEntryApplicationInstanceId(rootSegment.builder().getApplicationInstanceId()); + refBuilder.setEntryServiceInstanceId(rootSegment.builder().getServiceInstanceId()); // parent ref info refBuilder.setNetworkAddress(peer); parentSegmentSpan.setPeer(refBuilder.getNetworkAddress()); - refBuilder.setParentApplicationInstanceId(parentSegment.builder().getApplicationInstanceId()); + refBuilder.setParentServiceInstanceId(parentSegment.builder().getServiceInstanceId()); refBuilder.setParentSpanId(parentSegmentSpan.getSpanId()); refBuilder.setParentTraceSegmentId(parentSegment.builder().getTraceSegmentId()); - int parentServiceId = parentSegment.getEntryServiceId(); - if (parentServiceId == 0) { - refBuilder.setParentServiceName(parentSegment.getEntryServiceName()); + int parentEndpointId = parentSegment.getEntryEndpointId(); + if (parentEndpointId == 0) { + refBuilder.setParentEndpoint(parentSegment.getEntryEndpointName()); } else { - refBuilder.setParentServiceId(parentServiceId); + refBuilder.setParentEndpointId(parentEndpointId); } refBuilder.setRefType(RefType.CrossProcess); @@ -312,19 +312,19 @@ public class SegmentBuilder { return StringUtils.isNotEmpty(applicationCode) && !applicationCode.equals(currentIDs().applicationCode); } - private Segment addApp(String applicationCode, long registerTime) throws Exception { + private Segment addApp(String serviceCode, long registerTime) throws Exception { int serviceId = waitForExchange(() -> - CoreRegisterLinker.getServiceInventoryRegister().getOrCreate(applicationCode), + CoreRegisterLinker.getServiceInventoryRegister().getOrCreate(serviceCode), 10 ); int serviceInstanceId = waitForExchange(() -> - CoreRegisterLinker.getServiceInstanceInventoryRegister().getOrCreate(serviceId, applicationCode, applicationCode, - registerTime, ZipkinTraceOSInfoBuilder.getOSInfoForZipkin(applicationCode)), + CoreRegisterLinker.getServiceInstanceInventoryRegister().getOrCreate(serviceId, serviceCode, serviceCode, + registerTime, ZipkinTraceOSInfoBuilder.getOSInfoForZipkin(serviceCode)), 10 ); - Segment segment = new Segment(applicationCode, serviceId, serviceInstanceId); + Segment segment = new Segment(serviceCode, serviceId, serviceInstanceId); segmentsStack.add(segment); return segment; } @@ -372,44 +372,44 @@ public class SegmentBuilder { } private class Segment { - private TraceSegmentObject.Builder segmentBuilder; + private SegmentObject.Builder segmentBuilder; private IDCollection ids; - private int entryServiceId = 0; - private String entryServiceName = null; - private List spans; + private int entryEndpointId = 0; + private String entryEndpointName = null; + private List spans; private long endTime = 0; - private Segment(String applicationCode, int serviceId, int serviceInstanceId) { - ids = new IDCollection(applicationCode, serviceId, serviceInstanceId); + private Segment(String serviceCode, int serviceId, int serviceInstanceId) { + ids = new IDCollection(serviceCode, serviceId, serviceInstanceId); spans = new LinkedList<>(); - segmentBuilder = TraceSegmentObject.newBuilder(); - segmentBuilder.setApplicationId(serviceId); - segmentBuilder.setApplicationInstanceId(serviceInstanceId); + segmentBuilder = SegmentObject.newBuilder(); + segmentBuilder.setServiceId(serviceId); + segmentBuilder.setServiceInstanceId(serviceInstanceId); segmentBuilder.setTraceSegmentId(generateTraceOrSegmentId()); } - private TraceSegmentObject.Builder builder() { + private SegmentObject.Builder builder() { return segmentBuilder; } - private void addSpan(SpanObject.Builder spanBuilder) { + private void addSpan(SpanObjectV2.Builder spanBuilder) { String operationName = spanBuilder.getOperationName(); - if (entryServiceId == 0 && StringUtils.isNotEmpty(operationName)) { + if (entryEndpointId == 0 && StringUtils.isNotEmpty(operationName)) { if (SpanType.Entry == spanBuilder.getSpanType()) { if (StringUtils.isNotEmpty(operationName)) { - entryServiceName = operationName; + entryEndpointName = operationName; } else { - entryServiceId = spanBuilder.getOperationNameId(); + entryEndpointId = spanBuilder.getOperationNameId(); } } } // init by root span - if (spanBuilder.getSpanId() == 1 && entryServiceId == 0) { + if (spanBuilder.getSpanId() == 1 && entryEndpointId == 0) { if (StringUtils.isNotEmpty(operationName)) { - entryServiceName = operationName; + entryEndpointName = operationName; } else { - entryServiceId = spanBuilder.getOperationNameId(); + entryEndpointId = spanBuilder.getOperationNameId(); } } @@ -419,20 +419,20 @@ public class SegmentBuilder { } } - public int getEntryServiceId() { - return entryServiceId; + public int getEntryEndpointId() { + return entryEndpointId; } - public String getEntryServiceName() { - return entryServiceName; + public String getEntryEndpointName() { + return entryEndpointName; } private IDCollection ids() { return ids; } - public TraceSegmentObject.Builder freeze() { - for (SpanObject.Builder span : spans) { + public SegmentObject.Builder freeze() { + for (SpanObjectV2.Builder span : spans) { segmentBuilder.addSpans(span); } return segmentBuilder; @@ -471,9 +471,9 @@ public class SegmentBuilder { private class ClientSideSpan { private Span span; - private SpanObject.Builder builder; + private SpanObjectV2.Builder builder; - public ClientSideSpan(Span span, SpanObject.Builder builder) { + public ClientSideSpan(Span span, SpanObjectV2.Builder builder) { this.span = span; this.builder = builder; } @@ -482,7 +482,7 @@ public class SegmentBuilder { return span; } - public SpanObject.Builder getBuilder() { + public SpanObjectV2.Builder getBuilder() { return builder; } } diff --git a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java index 59f1cb2ac5577fbb52c2626da5dc86bc83a3278d..b02254b7bbd8f10ba026287824834502e13a58fb 100644 --- a/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java +++ b/oap-server/server-receiver-plugin/zipkin-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/zipkin/transform/SpringSleuthSegmentBuilderTest.java @@ -18,10 +18,15 @@ package org.apache.skywalking.oap.server.receiver.zipkin.transform; -import org.apache.skywalking.apm.network.language.agent.SpanObject; +import java.io.UnsupportedEncodingException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; 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.v2.SegmentObject; +import org.apache.skywalking.apm.network.language.agent.v2.SegmentReference; +import org.apache.skywalking.apm.network.language.agent.v2.SpanObjectV2; 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; @@ -34,12 +39,6 @@ import org.powermock.reflect.Whitebox; import zipkin2.Span; import zipkin2.codec.SpanBytesDecoder; -import java.io.UnsupportedEncodingException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - /** * @author wusheng */ @@ -143,19 +142,19 @@ public class SpringSleuthSegmentBuilderTest implements SegmentListener { @Override public void notify(SkyWalkingTrace trace) { - List segments = trace.getSegmentList(); + List segments = trace.getSegmentList(); Assert.assertEquals(2, segments.size()); - TraceSegmentObject.Builder builder = segments.get(0); - TraceSegmentObject.Builder builder1 = segments.get(1); - TraceSegmentObject.Builder front, end; - if (builder.getApplicationId() == applicationRegister.get("AppCode:frontend")) { + SegmentObject.Builder builder = segments.get(0); + SegmentObject.Builder builder1 = segments.get(1); + SegmentObject.Builder front, end; + if (builder.getServiceId() == applicationRegister.get("AppCode:frontend")) { front = builder; end = builder1; - Assert.assertEquals(applicationRegister.get("AppCode:backend").longValue(), builder1.getApplicationId()); - } else if (builder.getApplicationId() == applicationRegister.get("AppCode:backend")) { + Assert.assertEquals(applicationRegister.get("AppCode:backend").longValue(), builder1.getServiceId()); + } else if (builder.getServiceId() == applicationRegister.get("AppCode:backend")) { end = builder; front = builder1; - Assert.assertEquals(applicationRegister.get("AppCode:frontend").longValue(), builder1.getApplicationId()); + Assert.assertEquals(applicationRegister.get("AppCode:frontend").longValue(), builder1.getServiceId()); } else { Assert.fail("Can't find frontend and backend applications. "); return; @@ -182,12 +181,12 @@ public class SpringSleuthSegmentBuilderTest implements SegmentListener { Assert.assertTrue(spanObject.getTagsCount() > 0); }); - SpanObject spanObject = end.getSpans(0); + SpanObjectV2 spanObject = end.getSpans(0); Assert.assertEquals(1, spanObject.getRefsCount()); - TraceSegmentReference spanObjectRef = spanObject.getRefs(0); - Assert.assertEquals("get", spanObjectRef.getEntryServiceName()); - Assert.assertEquals("get", spanObjectRef.getParentServiceName()); + SegmentReference spanObjectRef = spanObject.getRefs(0); + Assert.assertEquals("get", spanObjectRef.getEntryEndpoint()); + Assert.assertEquals("get", spanObjectRef.getParentEndpoint()); //Assert.assertEquals("192.168.72.220", spanObjectRef.getNetworkAddress()); Assert.assertEquals(1, spanObjectRef.getParentSpanId()); Assert.assertEquals(front.getTraceSegmentId(), spanObjectRef.getParentTraceSegmentId()); diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java index 04952d7febd594a069dc2e55ff78ecf217ad6efd..e1e091e052297af2118ed8f49b7d23a83c6b8736 100644 --- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java +++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/TraceQueryEsDAO.java @@ -19,15 +19,24 @@ package org.apache.skywalking.oap.server.storage.plugin.elasticsearch.query; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; import org.apache.skywalking.oap.server.core.analysis.manual.segment.SegmentRecord; -import org.apache.skywalking.oap.server.core.query.entity.*; +import org.apache.skywalking.oap.server.core.query.entity.BasicTrace; +import org.apache.skywalking.oap.server.core.query.entity.QueryOrder; +import org.apache.skywalking.oap.server.core.query.entity.TraceBrief; +import org.apache.skywalking.oap.server.core.query.entity.TraceState; import org.apache.skywalking.oap.server.core.storage.query.ITraceQueryDAO; import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient; -import org.apache.skywalking.oap.server.library.util.*; +import org.apache.skywalking.oap.server.library.util.BooleanUtils; +import org.apache.skywalking.oap.server.library.util.StringUtils; import org.apache.skywalking.oap.server.storage.plugin.elasticsearch.base.EsDAO; import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.index.query.*; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; @@ -138,6 +147,7 @@ public class TraceQueryEsDAO extends EsDAO implements ITraceQueryDAO { if (StringUtils.isNotEmpty(dataBinaryBase64)) { segmentRecord.setDataBinary(Base64.getDecoder().decode(dataBinaryBase64)); } + segmentRecord.setVersion(((Number)searchHit.getSourceAsMap().get(SegmentRecord.VERSION)).intValue()); segmentRecords.add(segmentRecord); } return segmentRecords; diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java index cf612d07ef965c4449955b27aa329f9b18254d7a..af7d03dbbbbc88d5509ace9e9c5ba21a58079e70 100644 --- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java +++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/h2/dao/H2TraceQueryDAO.java @@ -160,6 +160,7 @@ public class H2TraceQueryDAO implements ITraceQueryDAO { if (StringUtils.isNotEmpty(dataBinaryBase64)) { segmentRecord.setDataBinary(Base64.getDecoder().decode(dataBinaryBase64)); } + segmentRecord.setVersion(resultSet.getInt(SegmentRecord.VERSION)); segmentRecords.add(segmentRecord); } }