AbstractWorker implementation process the message in
+ * {@link #receive(Object)} method.
+ * + *
+ * Subclasses must implement the abstract {@link #receive(Object)} method to process message. + * Subclasses forbid to override the {@link #onReceive(Object)} method. + *
+ * Here is an example on how to create and use an {@link AbstractWorker}: + *
+ * {{{
+ * public class SampleWorker extends AbstractWorker {
+ *
+ * @author pengys5
+ * @Override public void receive(Object message) throws Throwable {
+ * if (message.equals("Tell Next")) {
+ * Object sendMessage = new Object();
+ * tell(new NextSampleWorkerFactory(), RollingSelector.INSTANCE, sendMessage);
+ * }
+ * }
+ * }
+ * }}}
+ */
+public abstract class AbstractWorker extends UntypedActor {
+
+ private ILog logger = LogManager.getLogger(AbstractWorker.class);
+
+ private Cluster cluster = Cluster.get(getContext().system());
+
+ @Override
+ public void preStart() throws Exception {
+ cluster.subscribe(getSelf(), ClusterEvent.MemberUp.class);
+ }
+
+ @Override
+ public void postStop() throws Exception {
+ cluster.unsubscribe(getSelf());
+ }
+
+ /**
+ * Receive the message to analyse.
+ *
+ * @param message is the data send from the forward worker
+ * @throws Throwable is the exception thrown by that worker implementation processing
+ */
+ public abstract void receive(Object message) throws Throwable;
+
+ /**
+ * Listening {@link ClusterEvent.MemberUp} and {@link ClusterEvent.CurrentClusterState}
+ * cluster event, when event send from the member of {@link WorkersListener} then tell
+ * the sender to register self.
+ */
+ @Override
+ public void onReceive(Object message) throws Throwable {
+ if (message instanceof ClusterEvent.CurrentClusterState) {
+ ClusterEvent.CurrentClusterState state = (ClusterEvent.CurrentClusterState) message;
+ for (Member member : state.getMembers()) {
+ if (member.status().equals(MemberStatus.up())) {
+ register(member);
+ }
+ }
+ } else if (message instanceof ClusterEvent.MemberUp) {
+ ClusterEvent.MemberUp memberUp = (ClusterEvent.MemberUp) message;
+ logger.info("receive ClusterEvent.MemberUp message, address: %s", memberUp.member().address().toString());
+ register(memberUp.member());
+ } else {
+ logger.debug("worker class: %s, message class: %s", this.getClass().getName(), message.getClass().getName());
+ receive(message);
+ }
+ }
+
+ /**
+ * Send analysed data to next Worker.
+ *
+ * @param targetWorkerProvider is the worker provider to create worker instance.
+ * @param selector is the selector to select a same role worker instance form cluster.
+ * @param message is the data used to send to next worker.
+ * @throws Throwable
+ */
+ public void tell(AbstractWorkerProvider targetWorkerProvider, WorkerSelector selector, Object message) throws Throwable {
+ List
+ * Here is an example on how to create and use an {@link AbstractWorkerProvider}:
+ *
+ * {{{
+ * public class SampleWorkerFactory extends AbstractWorkerProvider {
+ *
+ * @author pengys5
+ * @Override public Class workerClass() {
+ * return SampleWorker.class;
+ * }
+ * @Override public int workerNum() {
+ * return Config.SampleWorkerNum;
+ * }
+ * }
+ * }}}
+ *
+ */
+public abstract class AbstractWorkerProvider {
+ private ILog logger = LogManager.getLogger(AbstractWorkerProvider.class);
+
+ public abstract Class workerClass();
+
+ public abstract int workerNum();
+
+ public void createWorker(ActorSystem system) {
+ if (workerClass() == null) {
+ throw new IllegalArgumentException("cannot createInstance() with nothing obtained from workerClass()");
+ }
+ if (workerNum() <= 0) {
+ throw new IllegalArgumentException("cannot createInstance() with obtained from workerNum() must greater than 0");
+ }
+
+ for (int i = 1; i <= workerNum(); i++) {
+ system.actorOf(Props.create(workerClass()), roleName() + "_" + i);
+ logger.info("create akka actor, actor id is %s", roleName() + "_" + i);
+ }
+ }
+
+ /**
+ * Use {@link #workerClass()} method returned class's simple name as a role name.
+ *
+ * @return is role of Worker
+ */
+ protected String roleName() {
+ return workerClass().getSimpleName();
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/CollectorBootstrap.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/CollectorBootstrap.java
new file mode 100644
index 000000000..7e35737d1
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/CollectorBootstrap.java
@@ -0,0 +1,10 @@
+package com.a.eye.skywalking.collector.actor;
+
+/**
+ * @author pengys5
+ */
+public class CollectorBootstrap {
+ public static void main(String[] args) {
+// ActorSystem system = ActorSystem.create("ClusterSystem", config);
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerRef.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerRef.java
new file mode 100644
index 000000000..92637fe8d
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerRef.java
@@ -0,0 +1,37 @@
+package com.a.eye.skywalking.collector.actor;
+
+import akka.actor.ActorPath;
+import akka.actor.ActorRef;
+import com.a.eye.skywalking.logging.ILog;
+import com.a.eye.skywalking.logging.LogManager;
+
+/**
+ * The Worker reference
+ *
+ * @author pengys5
+ */
+public class WorkerRef {
+ private ILog logger = LogManager.getLogger(WorkerRef.class);
+
+ final ActorRef actorRef;
+
+ final String workerRole;
+
+ public WorkerRef(ActorRef actorRef, String workerRole) {
+ this.actorRef = actorRef;
+ this.workerRole = workerRole;
+ }
+
+ void tell(Object message, ActorRef sender) {
+ logger.debug("tell %s worker", actorRef.toString());
+ actorRef.tell(message, sender);
+ }
+
+ public ActorPath path() {
+ return actorRef.path();
+ }
+
+ public String getWorkerRole() {
+ return workerRole;
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkersCreator.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkersCreator.java
new file mode 100644
index 000000000..550956f8c
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkersCreator.java
@@ -0,0 +1,36 @@
+package com.a.eye.skywalking.collector.actor;
+
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import com.a.eye.skywalking.collector.cluster.WorkersListener;
+import com.a.eye.skywalking.logging.ILog;
+import com.a.eye.skywalking.logging.LogManager;
+
+import java.util.ServiceLoader;
+
+/**
+ *
+ * The priority of value setting is
+ * system property -> collector.config -> {@link ClusterConfig} default value
+ *
+ *
+ * @author pengys5
+ */
+public class ClusterConfigInitializer {
+
+ private static ILog logger = LogManager.getLogger(ClusterConfigInitializer.class);
+
+ public static final String ConfigFileName = "collector.config";
+
+ /**
+ * Read config file to setting {@link ClusterConfig} then get system property to overwrite it.
+ *
+ * @param configFileName is the config file name, the file format is key-value pairs
+ */
+ public static void initialize(String configFileName) {
+ InputStream configFileStream = ClusterConfigInitializer.class.getResourceAsStream("/" + configFileName);
+
+ if (configFileStream == null) {
+ logger.info("Not provide sky-walking certification documents, sky-walking api run in default config.");
+ } else {
+ try {
+ Properties properties = new Properties();
+ properties.load(configFileStream);
+ ConfigInitializer.initialize(properties, ClusterConfig.class);
+ } catch (Exception e) {
+ logger.error("Failed to read the config file, sky-walking api run in default config.", e);
+ }
+ }
+
+ if (!StringUtil.isEmpty(System.getProperty("cluster.current.hostname"))) {
+ ClusterConfig.Cluster.Current.hostname = System.getProperty("cluster.current.hostname");
+ }
+ if (!StringUtil.isEmpty(System.getProperty("cluster.current.port"))) {
+ ClusterConfig.Cluster.Current.port = System.getProperty("cluster.current.port");
+ }
+ if (!StringUtil.isEmpty(System.getProperty("cluster.current.roles"))) {
+ ClusterConfig.Cluster.Current.roles = System.getProperty("cluster.current.roles");
+ }
+ if (!StringUtil.isEmpty(System.getProperty("cluster.nodes"))) {
+ ClusterConfig.Cluster.nodes = System.getProperty("cluster.nodes");
+ }
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/NoAvailableWorkerException.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/NoAvailableWorkerException.java
new file mode 100644
index 000000000..08bf4f051
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/NoAvailableWorkerException.java
@@ -0,0 +1,15 @@
+package com.a.eye.skywalking.collector.cluster;
+
+/**
+ * The
+ * when listened register message then begin to watch the state for this worker
+ * and register to {@link WorkersRefCenter}.
+ *
+ * when listened terminate message then unregister from {@link WorkersRefCenter}.
+ *
+ * @author pengys5
+ */
+public class WorkersListener extends UntypedActor {
+
+ private ILog logger = LogManager.getLogger(WorkersListener.class);
+
+ public static final String WorkName = "WorkersListener";
+
+ private Cluster cluster = Cluster.get(getContext().system());
+
+ @Override
+ public void preStart() throws Exception {
+ cluster.subscribe(getSelf(), ClusterEvent.UnreachableMember.class);
+ }
+
+ @Override
+ public void onReceive(Object message) throws Throwable {
+ if (message instanceof WorkerListenerMessage.RegisterMessage) {
+ WorkerListenerMessage.RegisterMessage register = (WorkerListenerMessage.RegisterMessage) message;
+ ActorRef sender = getSender();
+ logger.info("register worker of role: %s, path: %s", register.getWorkRole(), sender.toString());
+ WorkersRefCenter.INSTANCE.register(sender, register.getWorkRole());
+ } else if (message instanceof Terminated) {
+ Terminated terminated = (Terminated) message;
+ WorkersRefCenter.INSTANCE.unregister(terminated.getActor());
+ } else if (message instanceof ClusterEvent.UnreachableMember) {
+ ClusterEvent.UnreachableMember unreachableMember = (ClusterEvent.UnreachableMember) message;
+ WorkersRefCenter.INSTANCE.unregister(unreachableMember.member().address());
+ } else {
+ unhandled(message);
+ }
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenter.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenter.java
new file mode 100644
index 000000000..e601652e5
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenter.java
@@ -0,0 +1,77 @@
+package com.a.eye.skywalking.collector.cluster;
+
+import akka.actor.ActorRef;
+import akka.actor.Address;
+import com.a.eye.skywalking.collector.actor.WorkerRef;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ *
* Created by wusheng on 2017/2/17.
*/
-public class BooleanTag extends AbstractTag
* Created by wusheng on 2017/2/17.
*/
public final class Tags {
@@ -39,7 +39,7 @@ public final class Tags {
/**
* SPAN_LAYER represents the kind of span.
- *
+ *
* e.g.
* db=database;
* rpc=Remote Procedure Call Framework, like motan, thift;
@@ -91,7 +91,7 @@ public final class Tags {
/**
* ERROR indicates whether a Span ended in an error state.
*/
- public static final BooleanTag ERROR = new BooleanTag("error");
+ public static final BooleanTag ERROR = new BooleanTag("error", false);
/**
* PEER_HOST records host address (ip:port, or ip1:port1,ip2:port2) of the peer, maybe IPV4, IPV6 or hostname.
diff --git a/skywalking-commons/skywalking-trace/src/main/proto/trace.proto b/skywalking-commons/skywalking-trace/src/main/proto/trace.proto
index acf7ed6e1..a5e4d77f4 100644
--- a/skywalking-commons/skywalking-trace/src/main/proto/trace.proto
+++ b/skywalking-commons/skywalking-trace/src/main/proto/trace.proto
@@ -22,11 +22,12 @@ message SegmentRefMessage {
message SpanMessage {
int32 spanId = 1;
- int64 startTime = 2;
- int64 endTime = 3;
- string operationName = 4;
- repeated KeyValue tags = 5;
- repeated LogDataMessage logs = 6;
+ int32 parentSpanId = 2;
+ int64 startTime = 3;
+ int64 endTime = 4;
+ string operationName = 5;
+ repeated KeyValue tags = 6;
+ repeated LogDataMessage logs = 7;
}
message LogDataMessage {
diff --git a/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml b/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml
index 2f7d3c750..47d71df53 100644
--- a/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml
+++ b/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml
@@ -45,6 +45,30 @@
AbstractWorkerProvider should be implemented by any class whose
+ * instances are intended to provide create instance of the {@link AbstractWorker}.
+ * The {@link WorkersCreator} use java service loader to load provider implementer,
+ * so you should config the service file.
+ * WorkersCreator is a util that use Java Spi to create
+ * workers by META-INF config file.
+ *
+ * @author pengys5
+ */
+public enum WorkersCreator {
+ INSTANCE;
+
+ private ILog logger = LogManager.getLogger(WorkersCreator.class);
+
+ /**
+ * create worker to use Java Spi.
+ *
+ * @param system is create by akka {@link ActorSystem}
+ */
+ public void boot(ActorSystem system) {
+ system.actorOf(Props.create(WorkersListener.class), WorkersListener.WorkName);
+
+ ServiceLoaderHashCodeSelector is a simple implementation of {@link WorkerSelector}.
+ * It choose {@link WorkerRef} by message hashcode, so it can use to send the same hashcode
+ * message to same {@link WorkerRef}. Usually, use to database operate which avoid dirty data.
+ *
+ * @author pengys5
+ */
+public enum HashCodeSelector implements WorkerSelector {
+ INSTANCE;
+
+ /**
+ * Use message hashcode to select {@link WorkerRef}.
+ *
+ * @param members given {@link WorkerRef} list, which size is greater than 0;
+ * @param message the {@link AbstractWorker} is going to send.
+ * @return the selected {@link WorkerRef}
+ */
+ @Override
+ public WorkerRef select(ListRollingSelector is a simple implementation of {@link WorkerSelector}.
+ * It choose {@link WorkerRef} nearly random, by round-robin.
+ *
+ * @author wusheng
+ */
+public enum RollingSelector implements WorkerSelector {
+ INSTANCE;
+
+ /**
+ * A simple round variable.
+ */
+ private int index = 0;
+
+ /**
+ * Use round-robin to select {@link WorkerRef}.
+ *
+ * @param members given {@link WorkerRef} list, which size is greater than 0;
+ * @param message the {@link AbstractWorker} is going to send.
+ * @return the selected {@link WorkerRef}
+ */
+ @Override
+ public WorkerRef select(ListWorkerSelector should be implemented
+ * by any class whose instances are intended to provide select a {@link WorkerRef} from a {@link WorkerRef} list.
+ *
+ * Actually, the WorkerRef is designed to provide a routing ability in the collector cluster.
+ *
+ * @author wusheng
+ */
+public interface WorkerSelector {
+ /**
+ * select a {@link WorkerRef} from a {@link WorkerRef} list.
+ *
+ * @param members given {@link WorkerRef} list, which size is greater than 0;
+ * @param message the {@link AbstractWorker} is going to send.
+ * @return the selected {@link WorkerRef}
+ */
+ WorkerRef select(ListClusterConfigInitializer Contains static methods for setting
+ * {@link ClusterConfig} attributes value.
+ *
+ * NoAvailableWorkerException represents no available member,
+ * when the {@link WorkersRefCenter#availableWorks(String)} try to get the list.
+ *
+ * Most likely, in the cluster, these is no active worker of the particular role.
+ *
+ * @author wusheng
+ */
+public class NoAvailableWorkerException extends Exception {
+ public NoAvailableWorkerException(String message){
+ super(message);
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkerListenerMessage.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkerListenerMessage.java
new file mode 100644
index 000000000..4bf9ac303
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkerListenerMessage.java
@@ -0,0 +1,25 @@
+package com.a.eye.skywalking.collector.cluster;
+
+import java.io.Serializable;
+
+/**
+ * WorkerListenerMessage is a message just for the worker
+ * implementation of the {@link com.a.eye.skywalking.collector.actor.AbstractWorker}
+ * to register.
+ *
+ * @author pengys5
+ */
+public class WorkerListenerMessage {
+
+ public static class RegisterMessage implements Serializable {
+ public final String workRole;
+
+ public RegisterMessage(String workRole) {
+ this.workRole = workRole;
+ }
+
+ public String getWorkRole() {
+ return workRole;
+ }
+ }
+}
diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersListener.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersListener.java
new file mode 100644
index 000000000..244c57645
--- /dev/null
+++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersListener.java
@@ -0,0 +1,53 @@
+package com.a.eye.skywalking.collector.cluster;
+
+import akka.actor.ActorRef;
+import akka.actor.Terminated;
+import akka.actor.UntypedActor;
+import akka.cluster.Cluster;
+import akka.cluster.ClusterEvent;
+import com.a.eye.skywalking.logging.ILog;
+import com.a.eye.skywalking.logging.LogManager;
+
+/**
+ * WorkersListener listening the register message from workers
+ * implementation of the {@link com.a.eye.skywalking.collector.actor.AbstractWorker}
+ * and terminated message from akka cluster.
+ * WorkersRefCenter represent a cache center,
+ * store all {@link ActorRef}s, each of them represent a Akka Actor instance.
+ * All the Actors in this JVM, can find alive-actor in here, and send message.
+ *
+ * @author wusheng
+ */
+public enum WorkersRefCenter {
+ INSTANCE;
+
+ private MapLogResolver is an implementation of {@link LogResolver},
+ *
+ *
+ * @author wusheng
+ */
+public class Log4j2Resolver implements LogResolver {
+ @Override
+ public ILog getLogger(Class> clazz) {
+ return new Log4j2Logger(clazz);
+ }
+}
diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java
index 6e2017497..90c456965 100644
--- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java
+++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java
@@ -270,6 +270,7 @@ public class Span implements ISerializable
BootService is an interface to all services, which need to boot when plugin mechanism begins to
+ * work.
+ * {@link #bootUp()} will be called when BootService start up.
+ *
+ * @author wusheng
+ */
+public interface BootService {
+ void bootUp();
+}
diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceStarter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceStarter.java
new file mode 100644
index 000000000..a01e82b71
--- /dev/null
+++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceStarter.java
@@ -0,0 +1,56 @@
+package com.a.eye.skywalking.api.boot;
+
+import com.a.eye.skywalking.logging.ILog;
+import com.a.eye.skywalking.logging.LogManager;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.ServiceLoader;
+
+/**
+ * The ServiceStarter bases on {@link ServiceLoader},
+ * load all {@link BootService} implementations.
+ *
+ * @author wusheng
+ */
+public enum ServiceStarter {
+ INSTANCE;
+
+ private static ILog logger = LogManager.getLogger(StatusBootService.class);
+ private volatile boolean isStarted = false;
+ private MapStatusBootService is an abstract implementations of {@link BootService},
+ * it extends {@link BootService}'s ability like this:
+ *
+ * If an implementation extends StatusBootService, it can know whether this service starts up successfully or not.
+ * It's based on {@link #bootUp()} function finished with or without an exception. if no exception, means start up successfully.
+ *
+ *
+ * @author wusheng
+ */
+public abstract class StatusBootService implements BootService {
+ private volatile boolean started = false;
+
+ protected boolean isStarted(){
+ return this.started;
+ }
+
+ @Override
+ public final void bootUp(){
+ try {
+ bootUpWithStatus();
+ started = true;
+ } catch (Throwable e) {
+ started = false;
+ throw e;
+ }
+ }
+
+ protected abstract void bootUpWithStatus();
+}
diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClientService.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClientService.java
new file mode 100644
index 000000000..84b4a1ad1
--- /dev/null
+++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClientService.java
@@ -0,0 +1,13 @@
+package com.a.eye.skywalking.api.client;
+
+import com.a.eye.skywalking.api.boot.BootService;
+
+/**
+ * @author wusheng
+ */
+public class CollectorClientService implements BootService {
+ @Override
+ public void bootUp() {
+
+ }
+}
diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java
index dd37d05a6..40e3a4648 100644
--- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java
+++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java
@@ -1,7 +1,7 @@
package com.a.eye.skywalking.api.conf;
-import com.a.eye.skywalking.api.logging.ILog;
-import com.a.eye.skywalking.api.logging.LogManager;
+import com.a.eye.skywalking.logging.ILog;
+import com.a.eye.skywalking.logging.LogManager;
import com.a.eye.skywalking.api.util.ConfigInitializer;
import com.a.eye.skywalking.api.util.StringUtil;
diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextManager.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextManager.java
index 415fd9c23..0b0a4a7e2 100644
--- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextManager.java
+++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextManager.java
@@ -1,5 +1,6 @@
package com.a.eye.skywalking.api.context;
+import com.a.eye.skywalking.api.boot.BootService;
import com.a.eye.skywalking.api.queue.TraceSegmentProcessQueue;
import com.a.eye.skywalking.trace.Span;
import com.a.eye.skywalking.trace.TraceSegment;
@@ -16,21 +17,10 @@ import com.a.eye.skywalking.trace.TraceSegment;
*
* Created by wusheng on 2017/2/17.
*/
-public enum ContextManager implements TracerContextListener {
- INSTANCE {
- @Override public void afterFinished(TraceSegment traceSegment) {
- CONTEXT.remove();
- }
- };
-
- ContextManager() {
- TracerContext.ListenerManager.add(this);
- TraceSegmentProcessQueue.INSTANCE.start();
- }
-
+public class ContextManager implements TracerContextListener, BootService {
private static ThreadLocalDubboSpanGenerator generates all possible spans, by tracing Dubbo rpc.
+ * Including client/server side span.
+ *
+ * @author wusheng
+ */
+public class DubboSpanGenerator {
+ public static class Client extends SpanGeneration{
+ @Override protected void before() {
+ Span span = ContextManager.createSpan("/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query");
+ Tags.COMPONENT.set(span, "Dubbo");
+ Tags.URL.set(span, "rest://192.168.1.8:20880/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query(String)");
+ Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER);
+ Tags.PEER_HOST.set(span, "192.168.1.8");
+ Tags.PEER_PORT.set(span, 20880);
+ Tags.SPAN_LAYER.asHttp(span);
+ }
+
+ @Override protected void after() {
+ ContextManager.stopSpan();
+ }
+ }
+
+ public static class Server extends SpanGeneration{
+ @Override protected void before() {
+ Span span = ContextManager.createSpan("/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query");
+ Tags.COMPONENT.set(span, "Dubbo");
+ Tags.URL.set(span, "rest://192.168.1.8:20880/default_rpc/com.a.eye.skywalking.test.persistence.PersistenceService.query(String)");
+ Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT);
+ Tags.PEER_HOST.set(span, "10.21.9.35");
+ Tags.SPAN_LAYER.asHttp(span);
+ }
+
+ @Override protected void after() {
+ ContextManager.stopSpan();
+ }
+ }
+}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/MySQLGenerator.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/MySQLGenerator.java
new file mode 100644
index 000000000..e08324c28
--- /dev/null
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/MySQLGenerator.java
@@ -0,0 +1,30 @@
+package com.a.eye.skywalking.sniffer.mock.trace.builders.span;
+
+import com.a.eye.skywalking.api.context.ContextManager;
+import com.a.eye.skywalking.trace.Span;
+import com.a.eye.skywalking.trace.tag.Tags;
+
+/**
+ * The MySQLGenerator generates all possible spans, by tracing mysql client access.
+ *
+ * @author wusheng
+ */
+public class MySQLGenerator {
+ public static class Query extends SpanGeneration {
+ @Override protected void before() {
+ Span span = ContextManager.createSpan("mysql/jdbi/statement/executeQuery");
+ Tags.COMPONENT.set(span, "Mysql");
+ Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT);
+ Tags.PEER_HOST.set(span, "10.5.34.18");
+ Tags.PEER_PORT.set(span, 30088);
+ Tags.DB_INSTANCE.set(span, "mysql-instance");
+ Tags.DB_STATEMENT.set(span, "select * from users where user_id = 1");
+ Tags.DB_TYPE.set(span, "sql");
+ Tags.SPAN_LAYER.asDB(span);
+ }
+
+ @Override protected void after() {
+ ContextManager.stopSpan();
+ }
+ }
+}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java
index 099c7469b..e148a3de0 100644
--- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/SpanGeneration.java
@@ -1,18 +1,20 @@
package com.a.eye.skywalking.sniffer.mock.trace.builders.span;
/**
- * Created by wusheng on 2017/2/28.
+ * The SpanGeneration implementations can generate several kinds of spans.
+ *
+ * @author wusheng
*/
public abstract class SpanGeneration {
- private SpanGeneration next;
+ private SpanGeneration[] next;
public SpanGeneration build(SpanGeneration next){
- this.next = next;
+ this.next = new SpanGeneration[]{next};
return next;
}
- public SpanGeneration build(){
- return this;
+ public void build(SpanGeneration... next){
+ this.next = next;
}
protected abstract void before();
@@ -22,7 +24,9 @@ public abstract class SpanGeneration {
public void generate(){
this.before();
if(next != null){
- next.generate();
+ for (SpanGeneration generation : next) {
+ generation.generate();
+ }
}
this.after();
}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java
index 78b69ed56..1db497352 100644
--- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/TomcatSpanGenerator.java
@@ -14,16 +14,19 @@ public class TomcatSpanGenerator{
public static final ON200 INSTANCE = new ON200();
@Override protected void before() {
- Span webSpan = ContextManager.INSTANCE.createSpan("/web/serviceA");
- Tags.COMPONENT.set(webSpan, "tomcat");
+ Span webSpan = ContextManager.createSpan("/web/serviceA");
+ Tags.COMPONENT.set(webSpan, "Tomcat");
Tags.URL.set(webSpan, "http://10.21.9.35/web/serviceA");
Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER);
+ Tags.PEER_HOST.set(webSpan, "10.21.9.35");
+ Tags.PEER_PORT.set(webSpan, 80);
+ Tags.SPAN_LAYER.asHttp(webSpan);
}
@Override protected void after() {
- Span webSpan = ContextManager.INSTANCE.activeSpan();
+ Span webSpan = ContextManager.activeSpan();
Tags.STATUS_CODE.set(webSpan, 200);
- ContextManager.INSTANCE.stopSpan();
+ ContextManager.stopSpan();
}
}
@@ -31,35 +34,41 @@ public class TomcatSpanGenerator{
public static final ON404 INSTANCE = new ON404();
@Override protected void before() {
- Span webSpan = ContextManager.INSTANCE.createSpan("/web/service/unknown");
- Tags.COMPONENT.set(webSpan, "tomcat");
+ Span webSpan = ContextManager.createSpan("/web/service/unknown");
+ Tags.COMPONENT.set(webSpan, "Tomcat");
Tags.URL.set(webSpan, "http://10.21.9.35/web/unknown");
Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER);
+ Tags.PEER_HOST.set(webSpan, "10.21.9.35");
+ Tags.PEER_PORT.set(webSpan, 80);
+ Tags.SPAN_LAYER.asHttp(webSpan);
}
@Override protected void after() {
- Span webSpan = ContextManager.INSTANCE.activeSpan();
+ Span webSpan = ContextManager.activeSpan();
Tags.STATUS_CODE.set(webSpan, 404);
Tags.ERROR.set(webSpan,true);
- ContextManager.INSTANCE.stopSpan();
+ ContextManager.stopSpan();
}
}
public static class ON500 extends SpanGeneration{
public static final ON500 INSTANCE = new ON500();
@Override protected void before() {
- Span webSpan = ContextManager.INSTANCE.createSpan("/web/error/service");
- Tags.COMPONENT.set(webSpan, "tomcat");
+ Span webSpan = ContextManager.createSpan("/web/error/service");
+ Tags.COMPONENT.set(webSpan, "Tomcat");
Tags.URL.set(webSpan, "http://10.21.9.35/web/error/service");
Tags.SPAN_KIND.set(webSpan, Tags.SPAN_KIND_SERVER);
+ Tags.PEER_HOST.set(webSpan, "10.21.9.35");
+ Tags.PEER_PORT.set(webSpan, 80);
+ Tags.SPAN_LAYER.asHttp(webSpan);
}
@Override protected void after() {
- Span webSpan = ContextManager.INSTANCE.activeSpan();
+ Span webSpan = ContextManager.activeSpan();
Tags.STATUS_CODE.set(webSpan, 500);
Tags.ERROR.set(webSpan,true);
webSpan.log(new NumberFormatException("Can't convert 'abc' to int."));
- ContextManager.INSTANCE.stopSpan();
+ ContextManager.stopSpan();
}
}
}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/DubboServerMysqlTraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/DubboServerMysqlTraceBuilder.java
new file mode 100644
index 000000000..c5f14b58d
--- /dev/null
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/DubboServerMysqlTraceBuilder.java
@@ -0,0 +1,21 @@
+package com.a.eye.skywalking.sniffer.mock.trace.builders.trace;
+
+import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener;
+import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilder;
+import com.a.eye.skywalking.sniffer.mock.trace.builders.span.DubboSpanGenerator;
+import com.a.eye.skywalking.sniffer.mock.trace.builders.span.MySQLGenerator;
+import com.a.eye.skywalking.trace.TraceSegment;
+
+/**
+ * @author wusheng
+ */
+public enum DubboServerMysqlTraceBuilder implements TraceSegmentBuilder {
+ INSTANCE;
+
+ @Override public TraceSegment build(MockTracerContextListener listener) {
+ DubboSpanGenerator.Server rootSpan = new DubboSpanGenerator.Server();
+ rootSpan.build(new MySQLGenerator.Query());
+ rootSpan.generate();
+ return listener.getFinished(0);
+ }
+}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java
index 5b827f701..56b227417 100644
--- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat200TraceBuilder.java
@@ -14,7 +14,7 @@ public enum SingleTomcat200TraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override public TraceSegment build(MockTracerContextListener listener) {
- TomcatSpanGenerator.ON200.INSTANCE.build().generate();
+ TomcatSpanGenerator.ON200.INSTANCE.generate();
return listener.getFinished(0);
}
}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java
index 6000fb1b6..d1998e100 100644
--- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat404TraceBuilder.java
@@ -14,7 +14,7 @@ public enum SingleTomcat404TraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override public TraceSegment build(MockTracerContextListener listener) {
- TomcatSpanGenerator.ON404.INSTANCE.build().generate();
+ TomcatSpanGenerator.ON404.INSTANCE.generate();
return listener.getFinished(0);
}
}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java
index 5251f45f9..2f7d8ec92 100644
--- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/SingleTomcat500TraceBuilder.java
@@ -14,7 +14,7 @@ public enum SingleTomcat500TraceBuilder implements TraceSegmentBuilder {
INSTANCE;
@Override public TraceSegment build(MockTracerContextListener listener) {
- TomcatSpanGenerator.ON500.INSTANCE.build().generate();
+ TomcatSpanGenerator.ON500.INSTANCE.generate();
return listener.getFinished(0);
}
}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/TomcatDubboClientTraceBuilder.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/TomcatDubboClientTraceBuilder.java
new file mode 100644
index 000000000..8ce8b718b
--- /dev/null
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/trace/TomcatDubboClientTraceBuilder.java
@@ -0,0 +1,25 @@
+package com.a.eye.skywalking.sniffer.mock.trace.builders.trace;
+
+import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener;
+import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilder;
+import com.a.eye.skywalking.sniffer.mock.trace.builders.span.DubboSpanGenerator;
+import com.a.eye.skywalking.sniffer.mock.trace.builders.span.TomcatSpanGenerator;
+import com.a.eye.skywalking.trace.TraceSegment;
+
+/**
+ * A Trace segment contains two spans with ChildOf relations,
+ * the parent is a Tomcat span,
+ * the child is a Dubbo client span.
+ *
+ * @author wusheng
+ */
+public enum TomcatDubboClientTraceBuilder implements TraceSegmentBuilder {
+ INSTANCE;
+
+ @Override public TraceSegment build(MockTracerContextListener listener) {
+ TomcatSpanGenerator.ON200 rootSpan = new TomcatSpanGenerator.ON200();
+ rootSpan.build(new DubboSpanGenerator.Client());
+ rootSpan.generate();
+ return listener.getFinished(0);
+ }
+}
diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java b/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java
index ce43770c8..abf074a3d 100644
--- a/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java
+++ b/skywalking-sniffer/skywalking-sniffer-mock/src/test/java/com/a/eye/skywalking/sniffer/mock/MockTracerContextListenerTestCase.java
@@ -1,16 +1,23 @@
package com.a.eye.skywalking.sniffer.mock;
+import com.a.eye.skywalking.api.boot.ServiceStarter;
import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener;
import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert;
import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilderFactory;
import com.a.eye.skywalking.trace.TraceSegment;
import org.junit.Assert;
+import org.junit.BeforeClass;
import org.junit.Test;
/**
* Created by wusheng on 2017/2/21.
*/
public class MockTracerContextListenerTestCase {
+ @BeforeClass
+ public static void setup(){
+ ServiceStarter.INSTANCE.boot();
+ }
+
@Test
public void testAfterFinished(){
MockTracerContextListener listener = new MockTracerContextListener();
@@ -49,4 +56,18 @@ public class MockTracerContextListenerTestCase {
listener.clear();
listener.assertValidIndex(0);
}
+
+ @Test
+ public void testTraceOf_Tomcat_DubboClient(){
+ TraceSegment segment = TraceSegmentBuilderFactory.INSTANCE.traceOf_Tomcat_DubboClient();
+
+ Assert.assertEquals(2, segment.getSpans().size());
+ }
+
+ @Test
+ public void testTraceOf_DubboServer_MySQL(){
+ TraceSegment segment = TraceSegmentBuilderFactory.INSTANCE.traceOf_DubboServer_MySQL();
+
+ Assert.assertEquals(2, segment.getSpans().size());
+ }
}
diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v1/x/PrintTraceIdInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v1/x/PrintTraceIdInterceptor.java
index 83a46851c..917a57e77 100644
--- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v1/x/PrintTraceIdInterceptor.java
+++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v1/x/PrintTraceIdInterceptor.java
@@ -26,7 +26,7 @@ public class PrintTraceIdInterceptor implements InstanceMethodsAroundInterceptor
*/
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) {
- return "TID:" + ContextManager.INSTANCE.getTraceSegmentId();
+ return "TID:" + ContextManager.getTraceSegmentId();
}
@Override
diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-2.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v2/x/PrintTraceIdInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-2.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v2/x/PrintTraceIdInterceptor.java
index fa848a18c..3ced73776 100644
--- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-2.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v2/x/PrintTraceIdInterceptor.java
+++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-log4j-2.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/log4j/v2/x/PrintTraceIdInterceptor.java
@@ -19,7 +19,7 @@ public class PrintTraceIdInterceptor implements StaticMethodsAroundInterceptor {
*/
@Override
public void beforeMethod(StaticMethodInvokeContext interceptorContext, MethodInterceptResult result) {
- ((StringBuilder) interceptorContext.allArguments()[0]).append("TID:" + ContextManager.INSTANCE.getTraceSegmentId());
+ ((StringBuilder) interceptorContext.allArguments()[0]).append("TID:" + ContextManager.getTraceSegmentId());
//make sure origin method do not invoke.
result.defineReturnValue(null);
diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/LogbackPatternConverterActivation.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/LogbackPatternConverterActivation.java
index 02ff96d6d..8c2512d2a 100644
--- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/LogbackPatternConverterActivation.java
+++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/LogbackPatternConverterActivation.java
@@ -47,7 +47,7 @@ public class LogbackPatternConverterActivation extends ClassInstanceMethodsEnhan
@Override
public String getMethodsInterceptor() {
- return "com.a.eye.skywalking.toolkit.log.logback.v1.x.PrintTraceIdInterceptor";
+ return "com.a.eye.skywalking.toolkit.activation.log.logback.v1.x.PrintTraceIdInterceptor";
}
}};
}
diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/PrintTraceIdInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/PrintTraceIdInterceptor.java
index f1d4c52c6..afa630192 100644
--- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/PrintTraceIdInterceptor.java
+++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-logback-1.x-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/log/logback/v1/x/PrintTraceIdInterceptor.java
@@ -25,7 +25,7 @@ public class PrintTraceIdInterceptor implements InstanceMethodsAroundInterceptor
*/
@Override
public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) {
- return "TID:" + ContextManager.INSTANCE.getTraceSegmentId();
+ return "TID:" + ContextManager.getTraceSegmentId();
}
@Override
diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml
index 6b26be230..d159c4e6b 100644
--- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml
+++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml
@@ -21,6 +21,7 @@