diff --git a/pom.xml b/pom.xml index 7f544d500..c3eb91467 100644 --- a/pom.xml +++ b/pom.xml @@ -1,59 +1,60 @@ - - 4.0.0 + + 4.0.0 - com.a.eye - skywalking - 3.0-2017 + com.a.eye + skywalking + 3.0-2017 - - - GNU GENERAL PUBLIC LICENSE V3 - https://github.com/wu-sheng/sky-walking/blob/master/LICENSE - - + + + GNU GENERAL PUBLIC LICENSE V3 + https://github.com/wu-sheng/sky-walking/blob/master/LICENSE + + - - - Wu Sheng - wu.sheng@foxmail.com - https://wu-sheng.github.io/me/ - - - Zhang Xin - https://github.com/ascrutae - - + + + Wu Sheng + wu.sheng@foxmail.com + https://wu-sheng.github.io/me/ + + + Zhang Xin + https://github.com/ascrutae + + - - skywalking-commons - skywalking-sniffer - skywalking-application-toolkit - - pom + + skywalking-commons + skywalking-sniffer + skywalking-application-toolkit + skywalking-collector + + pom - skywalking - https://github.com/wu-sheng/sky-walking + skywalking + https://github.com/wu-sheng/sky-walking - - GitHub - https://github.com/wu-sheng/sky-walking/issues - + + GitHub + https://github.com/wu-sheng/sky-walking/issues + - - travis - https://travis-ci.org/wu-sheng/sky-walking - + + travis + https://travis-ci.org/wu-sheng/sky-walking + - - UTF-8 - 1.8 - 1.6.4 - 0.4.13 - 2.1-2017 - + + UTF-8 + 1.8 + 2.11.7 + 1.6.4 + 0.4.13 + 2.1-2017 + @@ -161,5 +162,4 @@ - diff --git a/skywalking-collector/pom.xml b/skywalking-collector/pom.xml new file mode 100644 index 000000000..9cb030442 --- /dev/null +++ b/skywalking-collector/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + skywalking-collector-cluster + skywalking-collector-worker + + + skywalking + com.a.eye + 3.0-2017 + + skywalking-collector + pom + + + 2.4.17 + + + + + com.typesafe.akka + akka-cluster_2.11 + ${akka.version} + + + com.typesafe.akka + akka-testkit_2.11 + ${akka.version} + test + + + com.a.eye + skywalking-logging-api + ${project.version} + + + diff --git a/skywalking-collector/skywalking-collector-cluster/pom.xml b/skywalking-collector/skywalking-collector-cluster/pom.xml new file mode 100644 index 000000000..86c2681eb --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/pom.xml @@ -0,0 +1,30 @@ + + + + skywalking-collector + com.a.eye + 3.0-2017 + + 4.0.0 + + skywalking-collector-cluster + jar + + + + + + + com.a.eye + skywalking-util + ${project.version} + + + com.lmax + disruptor + 3.3.6 + + + diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMember.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMember.java new file mode 100644 index 000000000..6c848b2e1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMember.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.lmax.disruptor.RingBuffer; + +/** + * @author pengys5 + */ +public abstract class AbstractAsyncMember extends AbstractMember { + + private RingBuffer ringBuffer; + + public AbstractAsyncMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(actorRef); + this.ringBuffer = ringBuffer; + } + + public void onEvent(MessageHolder event, long sequence, boolean endOfBatch) throws Exception { + Object message = event.getMessage(); + event.reset(); + receive(message); + if (endOfBatch) { + receive(new EndOfBatchCommand()); + } + } + + public void beTold(Object message) throws Exception { + long sequence = ringBuffer.next(); + try { + ringBuffer.get(sequence).setMessage(message); + } finally { + ringBuffer.publish(sequence); + } + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMemberProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMemberProvider.java new file mode 100644 index 000000000..19ac1d319 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMemberProvider.java @@ -0,0 +1,44 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.DaemonThreadFactory; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.queue.MessageHolderFactory; +import com.lmax.disruptor.EventHandler; +import com.lmax.disruptor.RingBuffer; +import com.lmax.disruptor.dsl.Disruptor; + +import java.lang.reflect.Constructor; + +/** + * @author pengys5 + */ +public abstract class AbstractAsyncMemberProvider extends AbstractMemberProvider { + + public abstract int queueSize(); + + @Override + public T createWorker(ActorRef actorRef) throws Exception { + if (memberClass() == null) { + throw new IllegalArgumentException("cannot createInstance() with nothing obtained from memberClass()"); + } + + Constructor memberConstructor = memberClass().getDeclaredConstructor(new Class[]{RingBuffer.class, ActorRef.class}); + memberConstructor.setAccessible(true); + + // Specify the size of the ring buffer, must be power of 2. + int bufferSize = queueSize(); + // Construct the Disruptor + Disruptor disruptor = new Disruptor(MessageHolderFactory.INSTANCE, bufferSize, DaemonThreadFactory.INSTANCE); + + RingBuffer ringBuffer = disruptor.getRingBuffer(); + T member = (T) memberConstructor.newInstance(ringBuffer, actorRef); + + // Connect the handler + disruptor.handleEventsWith(member); + + // Start the Disruptor, starts all threads running + disruptor.start(); + return member; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMember.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMember.java new file mode 100644 index 000000000..81188e0c9 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMember.java @@ -0,0 +1,52 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.cluster.WorkersRefCenter; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import com.lmax.disruptor.EventHandler; +import java.util.List; + +/** + * @author pengys5 + */ +public abstract class AbstractMember implements EventHandler { + + private ILog logger = LogManager.getLogger(AbstractMember.class); + + private ActorRef actorRef; + + private ActorRef getSelf() { + return actorRef; + } + + public AbstractMember(ActorRef actorRef) { + this.actorRef = actorRef; + } + + protected abstract void beTold(Object message) throws Exception; + + /** + * Receive the message to analyse. + * + * @param message is the data send from the forward worker + * @throws Exception is the exception thrown by that worker implementation processing + */ + public abstract void receive(Object message) throws Exception; + + /** + * 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 Exception + */ + public void tell(AbstractWorkerProvider targetWorkerProvider, WorkerSelector selector, Object message) throws Exception { + logger.debug("worker provider: %s ,role name: %s", targetWorkerProvider.getClass().getName(), targetWorkerProvider.roleName()); + List availableWorks = WorkersRefCenter.INSTANCE.availableWorks(targetWorkerProvider.roleName()); + selector.select(availableWorks, message).tell(message, getSelf()); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMemberProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMemberProvider.java new file mode 100644 index 000000000..a78824a80 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMemberProvider.java @@ -0,0 +1,13 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; + +/** + * @author pengys5 + */ +public abstract class AbstractMemberProvider { + + public abstract Class memberClass(); + + public abstract T createWorker(ActorRef actorRef) throws Exception; +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMember.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMember.java new file mode 100644 index 000000000..68adfd163 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMember.java @@ -0,0 +1,23 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.MessageHolder; + +/** + * @author pengys5 + */ +public abstract class AbstractSyncMember extends AbstractMember { + + public AbstractSyncMember(ActorRef actorRef) { + super(actorRef); + } + + @Override + public void onEvent(MessageHolder event, long sequence, boolean endOfBatch) throws Exception { + } + + @Override + public void beTold(Object message) throws Exception { + receive(message); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMemberProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMemberProvider.java new file mode 100644 index 000000000..fb83086a7 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMemberProvider.java @@ -0,0 +1,23 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; + +import java.lang.reflect.Constructor; + +/** + * @author pengys5 + */ +public abstract class AbstractSyncMemberProvider extends AbstractMemberProvider { + + @Override + public T createWorker(ActorRef actorRef) throws Exception { + if (memberClass() == null) { + throw new IllegalArgumentException("cannot createInstance() with nothing obtained from memberClass()"); + } + + Constructor memberConstructor = memberClass().getDeclaredConstructor(new Class[]{ActorRef.class}); + memberConstructor.setAccessible(true); + T member = (T) memberConstructor.newInstance(actorRef); + return member; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractWorker.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractWorker.java new file mode 100644 index 000000000..8216a51f2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractWorker.java @@ -0,0 +1,118 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.UntypedActor; +import akka.cluster.Cluster; +import akka.cluster.ClusterEvent; +import akka.cluster.Member; +import akka.cluster.MemberStatus; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.cluster.WorkerListenerMessage; +import com.a.eye.skywalking.collector.cluster.WorkersListener; +import com.a.eye.skywalking.collector.cluster.WorkersRefCenter; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import java.util.List; + +/** + * Abstract implementation of the {@link akka.actor.UntypedActor} that represents an + * analysis unit. 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 availableWorks = WorkersRefCenter.INSTANCE.availableWorks(targetWorkerProvider.roleName()); + selector.select(availableWorks, message).tell(message, getSelf()); + } + + public void tell(AbstractMember targetMember, Object message) throws Exception { + targetMember.beTold(message); + } + + /** + * When member role is {@link WorkersListener#WorkName} then Select actor from context + * and send register message to {@link WorkersListener} + * + * @param member is the new created or restart worker + */ + void register(Member member) { + if (member.hasRole(WorkersListener.WorkName)) { + WorkerListenerMessage.RegisterMessage registerMessage = new WorkerListenerMessage.RegisterMessage(getClass().getSimpleName()); + logger.info("member address: %s, worker path: %s", member.address().toString(), getSelf().path().toString()); + getContext().actorSelection(member.address() + "/user/" + WorkersListener.WorkName).tell(registerMessage, getSelf()); + } + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProvider.java new file mode 100644 index 000000000..f5f829da4 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProvider.java @@ -0,0 +1,59 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorSystem; +import akka.actor.Props; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; + +/** + * The 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. + *

+ * 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; + +/** + * 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); + + ServiceLoader clusterServiceLoader = ServiceLoader.load(AbstractWorkerProvider.class); + for (AbstractWorkerProvider provider : clusterServiceLoader) { + logger.info("create worker {%s} using java service loader", provider.workerClass().getName()); + provider.createWorker(system); + } + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/AbstractHashMessage.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/AbstractHashMessage.java new file mode 100644 index 000000000..0a5f64a14 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/AbstractHashMessage.java @@ -0,0 +1,16 @@ +package com.a.eye.skywalking.collector.actor.selector; + +/** + * @author pengys5 + */ +public abstract class AbstractHashMessage { + private int hashCode; + + public AbstractHashMessage(String key) { + this.hashCode = key.hashCode(); + } + + protected int getHashCode() { + return hashCode; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelector.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelector.java new file mode 100644 index 000000000..61877163d --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelector.java @@ -0,0 +1,32 @@ +package com.a.eye.skywalking.collector.actor.selector; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.WorkerRef; + +import java.util.List; + +/** + * The HashCodeSelector 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(List members, Object message) { + AbstractHashMessage hashMessage = (AbstractHashMessage) message; + int size = members.size(); + int selectIndex = Math.abs(hashMessage.getHashCode()) % size; + return members.get(selectIndex); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/RollingSelector.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/RollingSelector.java new file mode 100644 index 000000000..0de97621f --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/RollingSelector.java @@ -0,0 +1,36 @@ +package com.a.eye.skywalking.collector.actor.selector; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.WorkerRef; + +import java.util.List; + +/** + * The RollingSelector 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(List members, Object message) { + int size = members.size(); + index++; + int selectIndex = Math.abs(index) % size; + return members.get(selectIndex); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/WorkerSelector.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/WorkerSelector.java new file mode 100644 index 000000000..3e6d20f84 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/WorkerSelector.java @@ -0,0 +1,25 @@ +package com.a.eye.skywalking.collector.actor.selector; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.WorkerRef; + +import java.util.List; + +/** + * The WorkerSelector 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(List members, Object message); +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java new file mode 100644 index 000000000..42c13016e --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java @@ -0,0 +1,30 @@ +package com.a.eye.skywalking.collector.cluster; + +import akka.actor.ActorSystem; + +/** + * A static class contains some config values of cluster. + * {@link Cluster.Current#hostname} is a ip address of server which start this process. + * {@link Cluster.Current#port} is a port of server use to bind + * {@link Cluster.Current#roles} is a roles of workers that use to create workers which + * has those role in this process. + * {@link Cluster#nodes} is a nodes which cluster have. + * {@link Cluster#appname} is a name of {@link ActorSystem} in cluster. + * + * @author pengys5 + */ +public class ClusterConfig { + + public static class Cluster { + public static class Current { + public static String hostname = "127.0.0.1"; + public static String port = "2551"; + public static String roles = ""; + } + + public static String nodes = "127.0.0.1:2551"; + + public static final String appname = "CollectorSystem"; + public static final String provider = "akka.cluster.ClusterActorRefProvider"; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java new file mode 100644 index 000000000..f16ad7d86 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java @@ -0,0 +1,60 @@ +package com.a.eye.skywalking.collector.cluster; + +import com.a.eye.skywalking.api.util.ConfigInitializer; +import com.a.eye.skywalking.api.util.StringUtil; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import java.io.InputStream; +import java.util.Properties; + +/** + * ClusterConfigInitializer Contains static methods for setting + * {@link ClusterConfig} attributes value. + * + *

+ * 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 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. + *

+ * 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; + +/** + * 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 Map> roleToWorkerRef = new ConcurrentHashMap(); + + private Map actorRefToWorkerRef = new ConcurrentHashMap<>(); + + public void register(ActorRef newActorRef, String workerRole) { + if (!roleToWorkerRef.containsKey(workerRole)) { + List actorList = Collections.synchronizedList(new ArrayList()); + roleToWorkerRef.putIfAbsent(workerRole, actorList); + } + + WorkerRef newWorkerRef = new WorkerRef(newActorRef, workerRole); + + roleToWorkerRef.get(workerRole).add(newWorkerRef); + actorRefToWorkerRef.put(newActorRef, newWorkerRef); + } + + public void unregister(ActorRef oldActorRef) { + WorkerRef oldWorkerRef = actorRefToWorkerRef.get(oldActorRef); + roleToWorkerRef.get(oldWorkerRef.getWorkerRole()).remove(oldWorkerRef); + actorRefToWorkerRef.remove(oldActorRef); + } + + public void unregister(Address address) { + Iterator actorRefToWorkerRefIterator = actorRefToWorkerRef.keySet().iterator(); + while (actorRefToWorkerRefIterator.hasNext()) { + if (address.equals(actorRefToWorkerRefIterator.next().path().address())) { + actorRefToWorkerRefIterator.remove(); + } + } + + Iterator>> roleToWorkerRefIterator = roleToWorkerRef.entrySet().iterator(); + while (roleToWorkerRefIterator.hasNext()) { + List workerRefList = roleToWorkerRefIterator.next().getValue(); + + Iterator workerRefIterator = workerRefList.iterator(); + while (workerRefIterator.hasNext()) { + if (workerRefIterator.next().path().address().equals(address)) { + workerRefIterator.remove(); + } + } + } + } + + /** + * Get all available {@link WorkerRef} list, by the given worker role. + * + * @param workerRole the given role + * @return available {@link WorkerRef} list + * @throws NoAvailableWorkerException , when no available worker. + */ + public List availableWorks(String workerRole) throws NoAvailableWorkerException { + List refs = roleToWorkerRef.get(workerRole); + if (refs == null || refs.size() == 0) { + throw new NoAvailableWorkerException("role=" + workerRole + ", no available worker."); + } + return Collections.unmodifiableList(refs); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/DaemonThreadFactory.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/DaemonThreadFactory.java new file mode 100644 index 000000000..ff51aeb7d --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/DaemonThreadFactory.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.collector.queue; + +import java.util.concurrent.ThreadFactory; + +/** + * @author pengys5 + */ +public enum DaemonThreadFactory implements ThreadFactory { + INSTANCE; + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setDaemon(true); + return t; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/EndOfBatchCommand.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/EndOfBatchCommand.java new file mode 100644 index 000000000..69e2b9a91 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/EndOfBatchCommand.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.queue; + +/** + * @author pengys5 + */ +public class EndOfBatchCommand { +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/MessageHolder.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/MessageHolder.java new file mode 100644 index 000000000..fb83f5e66 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/MessageHolder.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.collector.queue; + +/** + * @author pengys5 + */ +public class MessageHolder { + private Object message; + + public Object getMessage() { + return message; + } + + public void setMessage(Object message) { + this.message = message; + } + + public void reset() { + message = null; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/MessageHolderFactory.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/MessageHolderFactory.java new file mode 100644 index 000000000..972843e46 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/queue/MessageHolderFactory.java @@ -0,0 +1,15 @@ +package com.a.eye.skywalking.collector.queue; + +import com.lmax.disruptor.EventFactory; + +/** + * @author pengys5 + */ +public class MessageHolderFactory implements EventFactory { + + public static MessageHolderFactory INSTANCE = new MessageHolderFactory(); + + public MessageHolder newInstance() { + return new MessageHolder(); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java new file mode 100644 index 000000000..cc08b8bc5 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java @@ -0,0 +1,60 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorSystem; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class AbstractWorkerProviderTestCase { + ActorSystem system; + + @Before + public void createSystem() { + system = ActorSystem.create(); + } + + @After + public void terminateSystem() throws IllegalAccessException { + system.terminate(); + system.awaitTermination(); + system = null; + } + + @Test(expected = IllegalArgumentException.class) + public void testCreateWorkerWhenWorkerClassIsNull() { + AbstractWorkerProvider aWorkerProvider = new AbstractWorkerProvider() { + @Override + public Class workerClass() { + return Object.class; + } + + @Override + public int workerNum() { + return 1; + } + }; + + aWorkerProvider.createWorker(system); + } + + @Test(expected = IllegalArgumentException.class) + public void testCreateWorkerWhenWorkerNumLessThan_1() { + AbstractWorkerProvider aWorkerProvider = new AbstractWorkerProvider() { + + @Override + public Class workerClass() { + return null; + } + + @Override + public int workerNum() { + return 0; + } + }; + + aWorkerProvider.createWorker(system); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorker.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorker.java new file mode 100644 index 000000000..0ee6d4345 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorker.java @@ -0,0 +1,21 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; + +/** + * @author pengys5 + */ +public class SpiTestWorker extends AbstractWorker { + + @Override + public void receive(Object message) throws Throwable { + if (message.equals("Test1")) { + getSender().tell("Yes", getSelf()); + } else if (message.equals("Test2")) { + getSender().tell("No", getSelf()); + } else if (message.equals("Test3")) { + Object sendMessage = new Object(); + tell(new SpiTestWorkerFactory(), RollingSelector.INSTANCE, sendMessage); + } + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactory.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactory.java new file mode 100644 index 000000000..a76c33adc --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactory.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public class SpiTestWorkerFactory extends AbstractWorkerProvider { + + @Override + public Class workerClass() { + return SpiTestWorker.class; + } + + @Override + public int workerNum() { + return 2; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactoryTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactoryTestCase.java new file mode 100644 index 000000000..a11db6d8b --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactoryTestCase.java @@ -0,0 +1,38 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorSystem; +import akka.testkit.JavaTestKit; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class SpiTestWorkerFactoryTestCase { + ActorSystem system; + + @Before + public void createSystem() { + system = ActorSystem.create(); + } + + @After + public void terminateSystem() throws IllegalAccessException { + system.terminate(); + system.awaitTermination(); + system = null; + } + + @Test + public void testCreateWorker() { + new JavaTestKit(system) {{ + SpiTestWorkerFactory aWorkerProvider = new SpiTestWorkerFactory(); + aWorkerProvider.createWorker(system); + system.actorSelection("/user/" + aWorkerProvider.roleName() + "_1").tell("Test1", getRef()); + expectMsgEquals(duration("1 second"), "Yes"); + system.actorSelection("/user/" + aWorkerProvider.roleName() + "_2").tell("Test2", getRef()); + expectMsgEquals(duration("1 second"), "No"); + }}; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/WorkersCreatorTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/WorkersCreatorTestCase.java new file mode 100644 index 000000000..4d4c0f0e5 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/WorkersCreatorTestCase.java @@ -0,0 +1,38 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorSystem; +import akka.testkit.JavaTestKit; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class WorkersCreatorTestCase { + ActorSystem system; + + @Before + public void createSystem() { + system = ActorSystem.create(); + } + + @After + public void terminateSystem() throws IllegalAccessException { + system.terminate(); + system.awaitTermination(); + system = null; + } + + @Test + public void testBoot() { + new JavaTestKit(system) {{ + WorkersCreator.INSTANCE.boot(system); + + system.actorSelection("/user/SpiTestWorker_1").tell("Test1", getRef()); + expectMsgEquals(duration("1 second"), "Yes"); + system.actorSelection("/user/SpiTestWorker_2").tell("Test2", getRef()); + expectMsgEquals(duration("1 second"), "No"); + }}; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/CollectorConfigTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/CollectorConfigTestCase.java new file mode 100644 index 000000000..528fe199b --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/CollectorConfigTestCase.java @@ -0,0 +1,41 @@ +package com.a.eye.skywalking.collector.cluster; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class CollectorConfigTestCase { + + @Before + public void resetArguments() { + System.clearProperty("cluster.current.hostname"); + System.clearProperty("cluster.current.port"); + System.clearProperty("cluster.current.roles"); + System.clearProperty("cluster.nodes"); + } + + @Test + public void testInitializeUseConfigFile() { + ClusterConfigInitializer.initialize("collector.config"); + Assert.assertEquals("192.168.0.1", ClusterConfig.Cluster.Current.hostname); + Assert.assertEquals("1000", ClusterConfig.Cluster.Current.port); + Assert.assertEquals("[Test, Test1]", ClusterConfig.Cluster.Current.roles); + Assert.assertEquals("[192.168.0.1:1000, 192.168.0.2:1000]", ClusterConfig.Cluster.nodes); + } + + @Test + public void testInitializeUseArguments() { + System.setProperty("cluster.current.hostname", "192.168.0.2"); + System.setProperty("cluster.current.port", "1001"); + System.setProperty("cluster.current.roles", "Test3, Test4"); + System.setProperty("cluster.nodes", "[192.168.0.2:1000, 192.168.0.2:1000]"); + ClusterConfigInitializer.initialize("collector.config"); + Assert.assertEquals("192.168.0.2", ClusterConfig.Cluster.Current.hostname); + Assert.assertEquals("1001", ClusterConfig.Cluster.Current.port); + Assert.assertEquals("Test3, Test4", ClusterConfig.Cluster.Current.roles); + Assert.assertEquals("[192.168.0.2:1000, 192.168.0.2:1000]", ClusterConfig.Cluster.nodes); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkerListenerTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkerListenerTestCase.java new file mode 100644 index 000000000..01a4ae2ef --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkerListenerTestCase.java @@ -0,0 +1,62 @@ +package com.a.eye.skywalking.collector.cluster; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.Props; +import akka.actor.Terminated; +import akka.pattern.Patterns; +import akka.testkit.TestActorRef; +import com.a.eye.skywalking.collector.actor.WorkerRef; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.powermock.api.support.membermodification.MemberModifier; +import scala.concurrent.Future; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author pengys5 + */ +public class WorkerListenerTestCase { + + ActorSystem system; + TestActorRef senderActorRef; + TestActorRef receiveactorRef; + + @Before + public void initData() { + system = ActorSystem.create(); + + final Props props = Props.create(WorkersListener.class); + senderActorRef = TestActorRef.create(system, props, "WorkersListenerSender"); + receiveactorRef = TestActorRef.create(system, props, "WorkersListenerReceive"); + + WorkerListenerMessage.RegisterMessage message = new WorkerListenerMessage.RegisterMessage("WorkersListener"); + receiveactorRef.tell(message, senderActorRef); + } + + @After + public void terminateSystem() throws IllegalAccessException { + system.terminate(); + system.awaitTermination(); + system = null; + MemberModifier.field(WorkersRefCenter.class, "roleToWorkerRef").set(WorkersRefCenter.INSTANCE, new ConcurrentHashMap()); + MemberModifier.field(WorkersRefCenter.class, "actorRefToWorkerRef").set(WorkersRefCenter.INSTANCE, new ConcurrentHashMap()); + } + + @Test + public void testRegister() throws IllegalAccessException { + Map actorRefToWorkerRef = (Map) MemberModifier.field(WorkersRefCenter.class, "actorRefToWorkerRef").get(WorkersRefCenter.INSTANCE); + ActorRef senderRefInWorkerRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(actorRefToWorkerRef.get(senderActorRef)); + Assert.assertEquals(senderActorRef, senderRefInWorkerRef); + + Map> roleToWorkerRef = (Map>) MemberModifier.field(WorkersRefCenter.class, "roleToWorkerRef").get(WorkersRefCenter.INSTANCE); + WorkerRef workerRef = roleToWorkerRef.get("WorkersListener").get(0); + senderRefInWorkerRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(workerRef); + Assert.assertEquals(senderActorRef, senderRefInWorkerRef); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenterTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenterTestCase.java new file mode 100644 index 000000000..5231ec9dc --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenterTestCase.java @@ -0,0 +1,88 @@ +package com.a.eye.skywalking.collector.cluster; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.actor.Props; +import akka.testkit.TestActorRef; +import com.a.eye.skywalking.collector.actor.WorkerRef; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.powermock.api.support.membermodification.MemberModifier; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author pengys5 + */ +public class WorkersRefCenterTestCase { + + ActorSystem system; + TestActorRef actorRef1; + TestActorRef actorRef2; + TestActorRef actorRef3; + + @Before + public void createSystem() { + system = ActorSystem.create(); + final Props props = Props.create(WorkersListener.class); + actorRef1 = TestActorRef.create(system, props, "WorkersListener1"); + actorRef2 = TestActorRef.create(system, props, "WorkersListener2"); + actorRef3 = TestActorRef.create(system, props, "WorkersListener3"); + + WorkersRefCenter.INSTANCE.register(actorRef1, "WorkersListener"); + WorkersRefCenter.INSTANCE.register(actorRef2, "WorkersListener"); + WorkersRefCenter.INSTANCE.register(actorRef3, "WorkersListener"); + } + + @After + public void terminateSystem() throws IllegalAccessException { + system.terminate(); + system.awaitTermination(); + system = null; + + MemberModifier.field(WorkersRefCenter.class, "roleToWorkerRef").set(WorkersRefCenter.INSTANCE, new ConcurrentHashMap()); + MemberModifier.field(WorkersRefCenter.class, "actorRefToWorkerRef").set(WorkersRefCenter.INSTANCE, new ConcurrentHashMap()); + } + + @Test + public void testRegister() throws IllegalAccessException { + Map> roleToActor = (Map>) MemberModifier.field(WorkersRefCenter.class, "roleToWorkerRef").get(WorkersRefCenter.INSTANCE); + List workerRefs = roleToActor.get("WorkersListener"); + + ActorRef actorRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(workerRefs.get(0)); + Assert.assertEquals(actorRef1, actorRef); + actorRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(workerRefs.get(1)); + Assert.assertEquals(actorRef2, actorRef); + actorRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(workerRefs.get(2)); + Assert.assertEquals(actorRef3, actorRef); + + Map actorToRole = (Map) MemberModifier.field(WorkersRefCenter.class, "actorRefToWorkerRef").get(WorkersRefCenter.INSTANCE); + Assert.assertEquals("WorkersListener", actorToRole.get(actorRef1).getWorkerRole()); + Assert.assertEquals("WorkersListener", actorToRole.get(actorRef2).getWorkerRole()); + Assert.assertEquals("WorkersListener", actorToRole.get(actorRef3).getWorkerRole()); + } + + @Test + public void testUnRegister() throws IllegalAccessException { + WorkersRefCenter.INSTANCE.unregister(actorRef1); + + Map> roleToWorkerRef = (Map>) MemberModifier.field(WorkersRefCenter.class, "roleToWorkerRef").get(WorkersRefCenter.INSTANCE); + ActorRef actorRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(roleToWorkerRef.get("WorkersListener").get(0)); + Assert.assertEquals(actorRef2, actorRef); + + actorRef = (ActorRef) MemberModifier.field(WorkerRef.class, "actorRef").get(roleToWorkerRef.get("WorkersListener").get(1)); + Assert.assertEquals(actorRef3, actorRef); + + Map actorRefToWorkerRef = (Map) MemberModifier.field(WorkersRefCenter.class, "actorRefToWorkerRef").get(WorkersRefCenter.INSTANCE); + Assert.assertEquals(null, actorRefToWorkerRef.get(actorRef1)); + } + + @Test + public void testSizeOf() throws NoAvailableWorkerException { + Assert.assertEquals(3, WorkersRefCenter.INSTANCE.availableWorks("WorkersListener").size()); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java new file mode 100644 index 000000000..7549ef20e --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java @@ -0,0 +1,13 @@ +package com.a.eye.skywalking.collector.queue; + +import org.junit.Test; + +/** + * @author pengys5 + */ +public class QueueTestCase { + + @Test + public void testProducer() throws InterruptedException { + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider b/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider new file mode 100644 index 000000000..8d06ff8e3 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider @@ -0,0 +1 @@ +com.a.eye.skywalking.collector.actor.SpiTestWorkerFactory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/resources/application.conf b/skywalking-collector/skywalking-collector-cluster/src/test/resources/application.conf new file mode 100644 index 000000000..79fd12aba --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/application.conf @@ -0,0 +1,19 @@ +akka { + actor { + provider = "akka.cluster.ClusterActorRefProvider" + + serializers { + java = "akka.serialization.JavaSerializer" + proto = "akka.remote.serialization.ProtobufSerializer" + } + + serialization-bindings { + "java.lang.String" = java + "com.google.protobuf.Message" = proto +// "java.io.Serializable" = none + } + +// serialize-messages = on + warn-about-java-serializer-usage = on + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/resources/collector.config b/skywalking-collector/skywalking-collector-cluster/src/test/resources/collector.config new file mode 100644 index 000000000..06d518f56 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/collector.config @@ -0,0 +1,5 @@ +cluster.current.hostname = 192.168.0.1 +cluster.current.port = 1000 +cluster.current.roles = [Test, Test1] + +cluster.nodes = [192.168.0.1:1000, 192.168.0.2:1000] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/resources/log4j2.xml b/skywalking-collector/skywalking-collector-cluster/src/test/resources/log4j2.xml new file mode 100644 index 000000000..fd313a5d2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/skywalking-collector/skywalking-collector-worker/pom.xml b/skywalking-collector/skywalking-collector-worker/pom.xml new file mode 100644 index 000000000..58087d109 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/pom.xml @@ -0,0 +1,48 @@ + + + + skywalking-collector + com.a.eye + 3.0-2017 + + 4.0.0 + + skywalking-collector-worker + jar + + + + com.a.eye + skywalking-collector-cluster + ${project.version} + + + com.a.eye + skywalking-trace + ${project.version} + + + com.a.eye + skywalking-logging-log4j2 + ${project.version} + + + com.google.code.gson + gson + 2.8.0 + + + org.elasticsearch.client + transport + 5.2.2 + + + com.a.eye + skywalking-sniffer-mock + ${project.version} + test + + + diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/AnalysisMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/AnalysisMember.java new file mode 100644 index 000000000..d7b73c605 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/AnalysisMember.java @@ -0,0 +1,34 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMember; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public abstract class AnalysisMember extends AbstractAsyncMember { + + private Logger logger = LogManager.getFormatterLogger(AnalysisMember.class); + + public AnalysisMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + public abstract void analyse(Object message) throws Exception; + + @Override + public void receive(Object message) throws Exception { + if (message instanceof EndOfBatchCommand) { + aggregation(); + } else { + analyse(message); + } + } + + protected abstract void aggregation() throws Exception; +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/CollectorBootStartUp.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/CollectorBootStartUp.java new file mode 100644 index 000000000..a60907557 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/CollectorBootStartUp.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorSystem; +import com.a.eye.skywalking.collector.actor.WorkersCreator; +import com.a.eye.skywalking.collector.cluster.ClusterConfig; +import com.a.eye.skywalking.collector.cluster.ClusterConfigInitializer; +import com.a.eye.skywalking.collector.cluster.NoAvailableWorkerException; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.logging.LogManager; +import com.a.eye.skywalking.logging.log4j2.Log4j2Resolver; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; + +import java.net.UnknownHostException; + +/** + * @author pengys5 + */ +public class CollectorBootStartUp { + + public static void main(String[] args) throws NoAvailableWorkerException, InterruptedException, UnknownHostException { + LogManager.setLogResolver(new Log4j2Resolver()); + + ClusterConfigInitializer.initialize("collector.config"); + + final Config config = ConfigFactory.parseString("akka.remote.netty.tcp.hostname=" + ClusterConfig.Cluster.Current.hostname). + withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.port=" + ClusterConfig.Cluster.Current.port)). + withFallback(ConfigFactory.parseString("akka.cluster.roles=" + ClusterConfig.Cluster.Current.roles)). + withFallback(ConfigFactory.parseString("akka.actor.provider=" + ClusterConfig.Cluster.provider)). + withFallback(ConfigFactory.parseString("akka.cluster.seed-nodes=" + ClusterConfig.Cluster.nodes)). + withFallback(ConfigFactory.load("application.conf")); + + ActorSystem system = ActorSystem.create(ClusterConfig.Cluster.appname, config); + WorkersCreator.INSTANCE.boot(system); + EsClient.boot(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/JsonSerializer.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/JsonSerializer.java new file mode 100644 index 000000000..bade0def9 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/JsonSerializer.java @@ -0,0 +1,32 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.serialization.JSerializer; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class JsonSerializer extends JSerializer { + @Override + public boolean includeManifest() { + return false; + } + + @Override + public int identifier() { + return 123; + } + + @Override + public byte[] toBinary(Object o) { + JsonObject jsonObject = (JsonObject) o; + return jsonObject.toString().getBytes(); + } + + @Override + public Object fromBinaryJava(byte[] bytes, Class manifest) { + Gson gson = new Gson(); + return gson.fromJson(new String(bytes), JsonObject.class); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricAnalysisMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricAnalysisMember.java new file mode 100644 index 000000000..8dd0a9eda --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricAnalysisMember.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import com.a.eye.skywalking.collector.worker.storage.MetricPersistenceData; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public abstract class MetricAnalysisMember extends AnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(MetricAnalysisMember.class); + + protected MetricPersistenceData persistenceData = new MetricPersistenceData(); + + public MetricAnalysisMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + public void setMetric(String id, int second, Long value) throws Exception { + persistenceData.getElseCreate(id).setMetric(second, value); + if (persistenceData.size() >= WorkerConfig.Persistence.Data.size) { + aggregation(); + } + } + + public MetricData pushOne() { + if (persistenceData.iterator().hasNext()) { + return persistenceData.pushOne(); + } + return null; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricPersistenceMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricPersistenceMember.java new file mode 100644 index 000000000..d1e88f573 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricPersistenceMember.java @@ -0,0 +1,90 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import com.a.eye.skywalking.collector.worker.storage.MetricPersistenceData; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.bulk.BulkRequestBuilder; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.get.MultiGetItemResponse; +import org.elasticsearch.action.get.MultiGetRequestBuilder; +import org.elasticsearch.action.get.MultiGetResponse; +import org.elasticsearch.client.Client; + +import java.util.Iterator; +import java.util.Map; + +/** + * @author pengys5 + */ +public abstract class MetricPersistenceMember extends PersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(MetricPersistenceMember.class); + + protected MetricPersistenceData persistenceData = new MetricPersistenceData(); + + public MetricPersistenceMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof MetricData) { + MetricData metricData = (MetricData) message; + persistenceData.getElseCreate(metricData.getId()).merge(metricData); + if (persistenceData.size() >= WorkerConfig.Persistence.Data.size) { + persistence(); + } + } else { + logger.error("message unhandled"); + } + } + + protected void persistence() { + MultiGetResponse multiGetResponse = searchFromEs(); + for (MultiGetItemResponse itemResponse : multiGetResponse) { + GetResponse response = itemResponse.getResponse(); + if (response != null && response.isExists()) { + persistenceData.getElseCreate(response.getId()).merge(response.getSource()); + } + } + + boolean success = saveToEs(); + if (success) { + persistenceData.clear(); + } + } + + public MultiGetResponse searchFromEs() { + Client client = EsClient.getClient(); + MultiGetRequestBuilder multiGetRequestBuilder = client.prepareMultiGet(); + + Iterator> iterator = persistenceData.iterator(); + while (iterator.hasNext()) { + multiGetRequestBuilder.add(esIndex(), esType(), iterator.next().getKey()); + } + + MultiGetResponse multiGetResponse = multiGetRequestBuilder.get(); + return multiGetResponse; + } + + public boolean saveToEs() { + Client client = EsClient.getClient(); + BulkRequestBuilder bulkRequest = client.prepareBulk(); + logger.debug("persistenceData size: %s", persistenceData.size()); + + Iterator> iterator = persistenceData.iterator(); + while (iterator.hasNext()) { + MetricData metricData = iterator.next().getValue(); + bulkRequest.add(client.prepareIndex(esIndex(), esType(), metricData.getId()).setSource(metricData.toMap())); + } + + BulkResponse bulkResponse = bulkRequest.execute().actionGet(); + return !bulkResponse.hasFailures(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/PersistenceMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/PersistenceMember.java new file mode 100644 index 000000000..b777db0bb --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/PersistenceMember.java @@ -0,0 +1,38 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMember; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public abstract class PersistenceMember extends AbstractAsyncMember { + + private Logger logger = LogManager.getFormatterLogger(PersistenceMember.class); + + public PersistenceMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + public abstract String esIndex(); + + public abstract String esType(); + + public abstract void analyse(Object message) throws Exception; + + @Override + public void receive(Object message) throws Exception { + if (message instanceof EndOfBatchCommand) { + persistence(); + } else { + analyse(message); + } + } + + protected abstract void persistence(); +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordAnalysisMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordAnalysisMember.java new file mode 100644 index 000000000..272cc9656 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordAnalysisMember.java @@ -0,0 +1,38 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.storage.RecordPersistenceData; +import com.google.gson.JsonObject; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public abstract class RecordAnalysisMember extends AnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(RecordAnalysisMember.class); + + private RecordPersistenceData persistenceData = new RecordPersistenceData(); + + public RecordAnalysisMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + public void setRecord(String id, JsonObject record) throws Exception { + persistenceData.getElseCreate(id).setRecord(record); + if (persistenceData.size() >= WorkerConfig.Analysis.Data.size) { + aggregation(); + } + } + + public RecordData pushOne() { + if (persistenceData.hasNext()) { + return persistenceData.pushOne(); + } + return null; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordPersistenceMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordPersistenceMember.java new file mode 100644 index 000000000..36db75d24 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordPersistenceMember.java @@ -0,0 +1,66 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.storage.RecordPersistenceData; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.bulk.BulkRequestBuilder; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.client.Client; + +import java.util.Iterator; +import java.util.Map; + +/** + * @author pengys5 + */ +public abstract class RecordPersistenceMember extends PersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(RecordPersistenceMember.class); + + protected RecordPersistenceData persistenceData = new RecordPersistenceData(); + + public RecordPersistenceMember(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof RecordData) { + RecordData recordData = (RecordData) message; + persistenceData.getElseCreate(recordData.getId()).setRecord(recordData.getRecord()); + if (persistenceData.size() >= WorkerConfig.Persistence.Data.size) { + persistence(); + } + } else { + logger.error("message unhandled"); + } + } + + protected void persistence() { + boolean success = saveToEs(); + if (success) { + persistenceData.clear(); + } + } + + public boolean saveToEs() { + Client client = EsClient.getClient(); + BulkRequestBuilder bulkRequest = client.prepareBulk(); + logger.debug("persistenceData size: %s", persistenceData.size()); + + Iterator> iterator = persistenceData.iterator(); + + while (iterator.hasNext()) { + Map.Entry recordData = iterator.next(); + bulkRequest.add(client.prepareIndex(esIndex(), esType(), recordData.getKey()).setSource(recordData.getValue().getRecord().toString())); + } + + BulkResponse bulkResponse = bulkRequest.execute().actionGet(); + return !bulkResponse.hasFailures(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/TraceSegmentSerializer.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/TraceSegmentSerializer.java new file mode 100644 index 000000000..f3aab1eb1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/TraceSegmentSerializer.java @@ -0,0 +1,40 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.serialization.JSerializer; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.proto.SegmentMessage; +import com.google.protobuf.InvalidProtocolBufferException; + +/** + * @author pengys5 + */ +public class TraceSegmentSerializer extends JSerializer { + @Override + public boolean includeManifest() { + return false; + } + + @Override + public int identifier() { + return 0; + } + + @Override + public byte[] toBinary(Object o) { +// System.out.println("toBinary"); + TraceSegment traceSegment = (TraceSegment) o; + return traceSegment.serialize().toByteArray(); + } + + @Override + public Object fromBinaryJava(byte[] bytes, Class manifest) { +// System.out.println("fromBinaryJava"); + TraceSegment traceSegment = null; + try { + traceSegment = new TraceSegment(SegmentMessage.parseFrom(bytes)); + } catch (InvalidProtocolBufferException e) { + e.printStackTrace(); + } + return traceSegment; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java new file mode 100644 index 000000000..d92ba1340 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java @@ -0,0 +1,97 @@ +package com.a.eye.skywalking.collector.worker; + +import com.a.eye.skywalking.collector.cluster.ClusterConfig; + +/** + * @author pengys5 + */ +public class WorkerConfig extends ClusterConfig { + + public static class Analysis { + public static class Data { + public static int size = 1000; + } + } + + public static class Persistence { + public static class Data { + public static int size = 1000; + } + } + + public static class Worker { + public static class TraceSegmentReceiver { + public static int Num = 10; + } + + public static class DAGNodeReceiver { + public static int Num = 10; + } + + public static class NodeInstanceReceiver { + public static int Num = 10; + } + + public static class ResponseCostReceiver { + public static int Num = 10; + } + + public static class ResponseSummaryReceiver { + public static int Num = 10; + } + + public static class DAGNodeRefReceiver { + public static int Num = 10; + } + } + + public static class Queue { + public static class Persistence { + public static class DAGNodePersistence { + public static int Size = 1024; + } + + public static class NodeInstancePersistence { + public static int Size = 1024; + } + + public static class ResponseCostPersistence { + public static int Size = 1024; + } + + public static class ResponseSummaryPersistence { + public static int Size = 1024; + } + + public static class DAGNodeRefPersistence { + public static int Size = 1024; + } + } + + + public static class TraceSegmentRecordAnalysis { + public static int Size = 1024; + } + + public static class NodeInstanceAnalysis { + public static int Size = 1024; + } + + public static class DAGNodeAnalysis { + public static int Size = 1024; + } + + public static class ResponseCostAnalysis { + public static int Size = 1024; + } + + public static class ResponseSummaryAnalysis { + public static int Size = 1024; + } + + public static class DAGNodeRefAnalysis { + public static int Size = 1024; + } + + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/ApplicationMain.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/ApplicationMain.java new file mode 100644 index 000000000..d488088a7 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/ApplicationMain.java @@ -0,0 +1,125 @@ +package com.a.eye.skywalking.collector.worker.application; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.api.util.StringUtil; +import com.a.eye.skywalking.collector.actor.AbstractSyncMember; +import com.a.eye.skywalking.collector.actor.AbstractSyncMemberProvider; +import com.a.eye.skywalking.collector.worker.application.analysis.DAGNodeAnalysis; +import com.a.eye.skywalking.collector.worker.application.analysis.NodeInstanceAnalysis; +import com.a.eye.skywalking.collector.worker.application.analysis.ResponseCostAnalysis; +import com.a.eye.skywalking.collector.worker.application.analysis.ResponseSummaryAnalysis; +import com.a.eye.skywalking.collector.worker.application.persistence.TraceSegmentRecordPersistence; +import com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegmentRef; +import com.a.eye.skywalking.trace.tag.Tags; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ApplicationMain extends AbstractSyncMember { + + private Logger logger = LogManager.getFormatterLogger(ApplicationMain.class); + + private DAGNodeAnalysis dagNodeAnalysis; + private NodeInstanceAnalysis nodeInstanceAnalysis; + private ResponseCostAnalysis responseCostAnalysis; + private ResponseSummaryAnalysis responseSummaryAnalysis; + private TraceSegmentRecordPersistence recordPersistence; + + public ApplicationMain(ActorRef actorRef) throws Exception { + super(actorRef); + dagNodeAnalysis = DAGNodeAnalysis.Factory.INSTANCE.createWorker(actorRef); + nodeInstanceAnalysis = NodeInstanceAnalysis.Factory.INSTANCE.createWorker(actorRef); + responseCostAnalysis = ResponseCostAnalysis.Factory.INSTANCE.createWorker(actorRef); + responseSummaryAnalysis = ResponseSummaryAnalysis.Factory.INSTANCE.createWorker(actorRef); + recordPersistence = TraceSegmentRecordPersistence.Factory.INSTANCE.createWorker(actorRef); + } + + @Override + public void receive(Object message) throws Exception { + if (message instanceof TraceSegmentReceiver.TraceSegmentTimeSlice) { + logger.debug("begin translate TraceSegment Object to JsonObject"); + TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment = (TraceSegmentReceiver.TraceSegmentTimeSlice) message; + + recordPersistence.beTold(traceSegment); + + sendToDAGNodePersistence(traceSegment); + sendToNodeInstanceAnalysis(traceSegment); + sendToResponseCostPersistence(traceSegment); + sendToResponseSummaryPersistence(traceSegment); + } + } + + public static class Factory extends AbstractSyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return ApplicationMain.class; + } + } + + private void sendToDAGNodePersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { + String code = traceSegment.getTraceSegment().getApplicationCode(); + + String component = null; + String layer = null; + for (Span span : traceSegment.getTraceSegment().getSpans()) { + if (span.getParentSpanId() == -1) { + component = Tags.COMPONENT.get(span); + layer = Tags.SPAN_LAYER.get(span); + } + } + + DAGNodeAnalysis.Metric node = new DAGNodeAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, component, layer); + dagNodeAnalysis.beTold(node); + } + + private void sendToNodeInstanceAnalysis(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { + TraceSegmentRef traceSegmentRef = traceSegment.getTraceSegment().getPrimaryRef(); + + if (traceSegmentRef != null && !StringUtil.isEmpty(traceSegmentRef.getApplicationCode())) { + String code = traceSegmentRef.getApplicationCode(); + String address = traceSegmentRef.getPeerHost(); + + NodeInstanceAnalysis.Metric property = new NodeInstanceAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, address); + nodeInstanceAnalysis.beTold(property); + } + } + + private void sendToResponseCostPersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { + String code = traceSegment.getTraceSegment().getApplicationCode(); + + long startTime = -1; + long endTime = -1; + Boolean isError = false; + + for (Span span : traceSegment.getTraceSegment().getSpans()) { + if (span.getParentSpanId() == -1) { + startTime = span.getStartTime(); + endTime = span.getEndTime(); + isError = Tags.ERROR.get(span); + } + } + + ResponseCostAnalysis.Metric cost = new ResponseCostAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, isError, startTime, endTime); + responseCostAnalysis.beTold(cost); + } + + private void sendToResponseSummaryPersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { + String code = traceSegment.getTraceSegment().getApplicationCode(); + boolean isError = false; + + for (Span span : traceSegment.getTraceSegment().getSpans()) { + if (span.getParentSpanId() == -1) { + isError = Tags.ERROR.get(span); + } + } + + ResponseSummaryAnalysis.Metric summary = new ResponseSummaryAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, isError); + responseSummaryAnalysis.beTold(summary); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/DAGNodeAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/DAGNodeAnalysis.java new file mode 100644 index 000000000..4f409a542 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/DAGNodeAnalysis.java @@ -0,0 +1,80 @@ +package com.a.eye.skywalking.collector.worker.application.analysis; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordAnalysisMember; +import com.a.eye.skywalking.collector.worker.application.receiver.DAGNodeReceiver; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.google.gson.JsonObject; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class DAGNodeAnalysis extends RecordAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(DAGNodeAnalysis.class); + + public DAGNodeAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof Metric) { + Metric metric = (Metric) message; + JsonObject propertyJsonObj = new JsonObject(); + propertyJsonObj.addProperty("code", metric.code); + propertyJsonObj.addProperty(DateTools.Time_Slice_Column_Name, metric.getMinute()); + propertyJsonObj.addProperty("component", metric.component); + propertyJsonObj.addProperty("layer", metric.layer); + + String id = metric.getMinute() + "-" + metric.code; + logger.debug("dag node: %s", propertyJsonObj.toString()); + setRecord(id, propertyJsonObj); + } else { + logger.error("message unhandled"); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + tell(DAGNodeReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneRecord); + } + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return DAGNodeAnalysis.class; + } + + @Override + public int queueSize() { + return 1024; + } + } + + public static class Metric extends AbstractTimeSlice { + private final String code; + private final String component; + private final String layer; + + public Metric(long minute, int second, String code, String component, String layer) { + super(minute, second); + this.code = code; + this.component = component; + this.layer = layer; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/NodeInstanceAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/NodeInstanceAnalysis.java new file mode 100644 index 000000000..fe7dd8d92 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/NodeInstanceAnalysis.java @@ -0,0 +1,78 @@ +package com.a.eye.skywalking.collector.worker.application.analysis; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordAnalysisMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.receiver.NodeInstanceReceiver; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.google.gson.JsonObject; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class NodeInstanceAnalysis extends RecordAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(NodeInstanceAnalysis.class); + + public NodeInstanceAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof Metric) { + Metric metric = (Metric) message; + JsonObject propertyJsonObj = new JsonObject(); + propertyJsonObj.addProperty("code", metric.code); + propertyJsonObj.addProperty(DateTools.Time_Slice_Column_Name, metric.getMinute()); + propertyJsonObj.addProperty("address", metric.address); + + String id = metric.getMinute() + "-" + metric.address; + setRecord(id, propertyJsonObj); + logger.debug("node instance: %s", propertyJsonObj.toString()); + } else { + logger.error("message unhandled"); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + tell(NodeInstanceReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneRecord); + } + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return NodeInstanceAnalysis.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.NodeInstanceAnalysis.Size; + } + } + + public static class Metric extends AbstractTimeSlice{ + private final String code; + private final String address; + + public Metric(long minute, int second, String code, String address) { + super(minute, second); + this.code = code; + this.address = address; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseCostAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseCostAnalysis.java new file mode 100644 index 000000000..8eba11256 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseCostAnalysis.java @@ -0,0 +1,76 @@ +package com.a.eye.skywalking.collector.worker.application.analysis; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.MetricAnalysisMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.receiver.ResponseCostReceiver; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ResponseCostAnalysis extends MetricAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(ResponseCostAnalysis.class); + + public ResponseCostAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof Metric) { + Metric metric = (Metric) message; + long cost = metric.endTime - metric.startTime; + if (cost <= 1000 && !metric.isError) { + String id = metric.getMinute() + "-" + metric.code; + setMetric(id, metric.getSecond(), cost); + } +// logger.debug("response cost metric: %s", data.toString()); + } + } + + @Override + protected void aggregation() throws Exception { + MetricData oneMetric; + while ((oneMetric = pushOne()) != null) { + tell(ResponseCostReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneMetric); + } + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return ResponseCostAnalysis.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.ResponseCostAnalysis.Size; + } + } + + public static class Metric extends AbstractTimeSlice { + private final String code; + private final Boolean isError; + private final Long startTime; + private final Long endTime; + + public Metric(long minute, int second, String code, Boolean isError, Long startTime, Long endTime) { + super(minute, second); + this.code = code; + this.isError = isError; + this.startTime = startTime; + this.endTime = endTime; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseSummaryAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseSummaryAnalysis.java new file mode 100644 index 000000000..08a360177 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseSummaryAnalysis.java @@ -0,0 +1,69 @@ +package com.a.eye.skywalking.collector.worker.application.analysis; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.MetricAnalysisMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.receiver.ResponseSummaryReceiver; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ResponseSummaryAnalysis extends MetricAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(ResponseSummaryAnalysis.class); + + public ResponseSummaryAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof Metric) { + Metric metric = (Metric) message; + String id = metric.getMinute() + "-" + metric.code; + setMetric(id, metric.getSecond(), 1L); +// logger.debug("response summary metric: %s", data.toString()); + } + } + + @Override + protected void aggregation() throws Exception { + MetricData oneMetric; + while ((oneMetric = pushOne()) != null) { + tell(ResponseSummaryReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneMetric); + } + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return ResponseSummaryAnalysis.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.ResponseSummaryAnalysis.Size; + } + } + + public static class Metric extends AbstractTimeSlice { + private final String code; + private final Boolean isError; + + public Metric(long minute, int second, String code, Boolean isError) { + super(minute, second); + this.code = code; + this.isError = isError; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/DAGNodePersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/DAGNodePersistence.java new file mode 100644 index 000000000..8d1c632c3 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/DAGNodePersistence.java @@ -0,0 +1,47 @@ +package com.a.eye.skywalking.collector.worker.application.persistence; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.RecordPersistenceData; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class DAGNodePersistence extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(DAGNodePersistence.class); + + public DAGNodePersistence(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public String esIndex() { + return "application"; + } + + @Override + public String esType() { + return "dag_node"; + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return DAGNodePersistence.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodePersistence.Size; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/NodeInstancePersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/NodeInstancePersistence.java new file mode 100644 index 000000000..18cd2cdf2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/NodeInstancePersistence.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.collector.worker.application.persistence; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class NodeInstancePersistence extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(NodeInstancePersistence.class); + + public NodeInstancePersistence(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public String esIndex() { + return "application"; + } + + @Override + public String esType() { + return "node_instance"; + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return NodeInstancePersistence.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.NodeInstancePersistence.Size; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseCostPersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseCostPersistence.java new file mode 100644 index 000000000..1cd74be3e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseCostPersistence.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.collector.worker.application.persistence; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.MetricPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ResponseCostPersistence extends MetricPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(ResponseCostPersistence.class); + + public ResponseCostPersistence(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public String esIndex() { + return "application_metric"; + } + + @Override + public String esType() { + return "response_cost"; + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return ResponseCostPersistence.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.ResponseCostPersistence.Size; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseSummaryPersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseSummaryPersistence.java new file mode 100644 index 000000000..cce483597 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseSummaryPersistence.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.collector.worker.application.persistence; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.MetricPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ResponseSummaryPersistence extends MetricPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(ResponseSummaryPersistence.class); + + public ResponseSummaryPersistence(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public String esIndex() { + return "application_metric"; + } + + @Override + public String esType() { + return "response_summary"; + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return ResponseSummaryPersistence.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.ResponseSummaryPersistence.Size; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/TraceSegmentRecordPersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/TraceSegmentRecordPersistence.java new file mode 100644 index 000000000..d6a5dfcf1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/TraceSegmentRecordPersistence.java @@ -0,0 +1,144 @@ +package com.a.eye.skywalking.collector.worker.application.persistence; + + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.TraceSegmentRef; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; +import java.util.Map; + +/** + * @author pengys5 + */ +public class TraceSegmentRecordPersistence extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(TraceSegmentRecordPersistence.class); + + @Override + public String esIndex() { + return "application_record"; + } + + @Override + public String esType() { + return "trace_segment"; + } + + public TraceSegmentRecordPersistence(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof TraceSegmentReceiver.TraceSegmentTimeSlice) { + TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment = (TraceSegmentReceiver.TraceSegmentTimeSlice) message; + JsonObject jsonObject = parseTraceSegment(traceSegment.getTraceSegment(), traceSegment.getMinute()); + + RecordData recordData = new RecordData(traceSegment.getTraceSegment().getTraceSegmentId()); + recordData.setRecord(jsonObject); + super.analyse(recordData); + } + } + + public static class Factory extends AbstractAsyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public int queueSize() { + return WorkerConfig.Queue.TraceSegmentRecordAnalysis.Size; + } + + @Override + public Class memberClass() { + return TraceSegmentRecordPersistence.class; + } + } + + private JsonObject parseTraceSegment(TraceSegment traceSegment, long minute) { + JsonObject traceJsonObj = new JsonObject(); + traceJsonObj.addProperty("segmentId", traceSegment.getTraceSegmentId()); + traceJsonObj.addProperty(DateTools.Time_Slice_Column_Name, minute); + traceJsonObj.addProperty("startTime", traceSegment.getStartTime()); + traceJsonObj.addProperty("endTime", traceSegment.getEndTime()); + traceJsonObj.addProperty("appCode", traceSegment.getApplicationCode()); + + if (traceSegment.getPrimaryRef() != null) { + JsonObject primaryRefJsonObj = parsePrimaryRef(traceSegment.getPrimaryRef()); + traceJsonObj.add("primaryRef", primaryRefJsonObj); + } + + if (traceSegment.getRefs() != null) { + JsonArray refsJsonArray = parseRefs(traceSegment.getRefs()); + traceJsonObj.add("refs", refsJsonArray); + } + + JsonArray spanJsonArray = new JsonArray(); + for (Span span : traceSegment.getSpans()) { + JsonObject spanJsonObj = parseSpan(span); + spanJsonArray.add(spanJsonObj); + } + traceJsonObj.add("spans", spanJsonArray); + + return traceJsonObj; + } + + private JsonObject parsePrimaryRef(TraceSegmentRef primaryRef) { + JsonObject primaryRefJsonObj = new JsonObject(); + primaryRefJsonObj.addProperty("appCode", primaryRef.getApplicationCode()); + primaryRefJsonObj.addProperty("spanId", primaryRef.getSpanId()); + primaryRefJsonObj.addProperty("peerHost", primaryRef.getPeerHost()); + primaryRefJsonObj.addProperty("segmentId", primaryRef.getTraceSegmentId()); + return primaryRefJsonObj; + } + + private JsonArray parseRefs(List refs) { + JsonArray refsJsonArray = new JsonArray(); + for (TraceSegmentRef ref : refs) { + JsonObject refJsonObj = new JsonObject(); + refJsonObj.addProperty("spanId", ref.getSpanId()); + refJsonObj.addProperty("appCode", ref.getApplicationCode()); + refJsonObj.addProperty("segmentId", ref.getTraceSegmentId()); + refJsonObj.addProperty("peerHost", ref.getPeerHost()); + refsJsonArray.add(refJsonObj); + } + return refsJsonArray; + } + + private JsonObject parseSpan(Span span) { + JsonObject spanJsonObj = new JsonObject(); + spanJsonObj.addProperty("spanId", span.getSpanId()); + spanJsonObj.addProperty("parentSpanId", span.getParentSpanId()); + spanJsonObj.addProperty("startTime", span.getStartTime()); + spanJsonObj.addProperty("endTime", span.getEndTime()); + spanJsonObj.addProperty("operationName", span.getOperationName()); + + JsonObject tagsJsonObj = parseSpanTag(span.getTags()); + spanJsonObj.add("tags", tagsJsonObj); + return spanJsonObj; + } + + private JsonObject parseSpanTag(Map tags) { + JsonObject tagsJsonObj = new JsonObject(); + + for (Map.Entry entry : tags.entrySet()) { + String key = entry.getKey(); + String value = String.valueOf(entry.getValue()); + tagsJsonObj.addProperty(key, value); + } + return tagsJsonObj; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/DAGNodeReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/DAGNodeReceiver.java new file mode 100644 index 000000000..e63bd6edf --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/DAGNodeReceiver.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.application.receiver; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.AbstractWorkerProvider; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.persistence.DAGNodePersistence; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class DAGNodeReceiver extends AbstractWorker { + + private Logger logger = LogManager.getFormatterLogger(DAGNodeReceiver.class); + + private DAGNodePersistence persistence; + + @Override + public void preStart() throws Exception { + super.preStart(); + persistence = DAGNodePersistence.Factory.INSTANCE.createWorker(getSelf()); + } + + @Override + public void receive(Object message) throws Throwable { + if (message instanceof RecordData) { + persistence.beTold(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class workerClass() { + return DAGNodeReceiver.class; + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.DAGNodeReceiver.Num; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/NodeInstanceReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/NodeInstanceReceiver.java new file mode 100644 index 000000000..977601519 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/NodeInstanceReceiver.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.application.receiver; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.AbstractWorkerProvider; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.persistence.NodeInstancePersistence; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class NodeInstanceReceiver extends AbstractWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeInstanceReceiver.class); + + private NodeInstancePersistence persistence; + + @Override + public void preStart() throws Exception { + super.preStart(); + persistence = NodeInstancePersistence.Factory.INSTANCE.createWorker(getSelf()); + } + + @Override + public void receive(Object message) throws Throwable { + if (message instanceof RecordData) { + persistence.beTold(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class workerClass() { + return NodeInstanceReceiver.class; + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.NodeInstanceReceiver.Num; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseCostReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseCostReceiver.java new file mode 100644 index 000000000..f086d393e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseCostReceiver.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.application.receiver; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.AbstractWorkerProvider; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.persistence.ResponseCostPersistence; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ResponseCostReceiver extends AbstractWorker { + + private Logger logger = LogManager.getFormatterLogger(ResponseCostReceiver.class); + + private ResponseCostPersistence persistence; + + @Override + public void preStart() throws Exception { + super.preStart(); + persistence = ResponseCostPersistence.Factory.INSTANCE.createWorker(getSelf()); + } + + @Override + public void receive(Object message) throws Throwable { + if (message instanceof MetricData) { + persistence.beTold(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class workerClass() { + return ResponseCostReceiver.class; + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.ResponseCostReceiver.Num; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseSummaryReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseSummaryReceiver.java new file mode 100644 index 000000000..e264e6e0d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseSummaryReceiver.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.application.receiver; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.AbstractWorkerProvider; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.persistence.ResponseSummaryPersistence; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class ResponseSummaryReceiver extends AbstractWorker { + + private Logger logger = LogManager.getFormatterLogger(ResponseSummaryReceiver.class); + + private ResponseSummaryPersistence persistence; + + @Override + public void preStart() throws Exception { + super.preStart(); + persistence = ResponseSummaryPersistence.Factory.INSTANCE.createWorker(getSelf()); + } + + @Override + public void receive(Object message) throws Throwable { + if (message instanceof MetricData) { + persistence.beTold(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class workerClass() { + return ResponseSummaryReceiver.class; + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.ResponseSummaryReceiver.Num; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/ApplicationRefMain.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/ApplicationRefMain.java new file mode 100644 index 000000000..5fd19b558 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/ApplicationRefMain.java @@ -0,0 +1,45 @@ +package com.a.eye.skywalking.collector.worker.applicationref; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.api.util.StringUtil; +import com.a.eye.skywalking.collector.actor.AbstractSyncMember; +import com.a.eye.skywalking.collector.actor.AbstractSyncMemberProvider; +import com.a.eye.skywalking.collector.worker.applicationref.analysis.DAGNodeRefAnalysis; +import com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver; +import com.a.eye.skywalking.trace.TraceSegmentRef; + +/** + * @author pengys5 + */ +public class ApplicationRefMain extends AbstractSyncMember { + + private DAGNodeRefAnalysis dagNodeRefAnalysis; + + public ApplicationRefMain(ActorRef actorRef) throws Throwable { + super(actorRef); + dagNodeRefAnalysis = DAGNodeRefAnalysis.Factory.INSTANCE.createWorker(actorRef); + } + + @Override + public void receive(Object message) throws Exception { + TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment = (TraceSegmentReceiver.TraceSegmentTimeSlice) message; + + TraceSegmentRef traceSegmentRef = traceSegment.getTraceSegment().getPrimaryRef(); + if (traceSegmentRef != null && !StringUtil.isEmpty(traceSegmentRef.getApplicationCode())) { + String front = traceSegmentRef.getApplicationCode(); + String behind = traceSegment.getTraceSegment().getApplicationCode(); + + DAGNodeRefAnalysis.Metric nodeRef = new DAGNodeRefAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), front, behind); + dagNodeRefAnalysis.beTold(nodeRef); + } + } + + public static class Factory extends AbstractSyncMemberProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return ApplicationRefMain.class; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/analysis/DAGNodeRefAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/analysis/DAGNodeRefAnalysis.java new file mode 100644 index 000000000..4fb35491e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/analysis/DAGNodeRefAnalysis.java @@ -0,0 +1,77 @@ +package com.a.eye.skywalking.collector.worker.applicationref.analysis; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordAnalysisMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.applicationref.receiver.DAGNodeRefReceiver; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.google.gson.JsonObject; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class DAGNodeRefAnalysis extends RecordAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(DAGNodeRefAnalysis.class); + + public DAGNodeRefAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof Metric) { + Metric metric = (Metric) message; + JsonObject propertyJsonObj = new JsonObject(); + propertyJsonObj.addProperty("frontCode", metric.frontCode); + propertyJsonObj.addProperty("behindCode", metric.behindCode); + propertyJsonObj.addProperty(DateTools.Time_Slice_Column_Name, metric.getMinute()); + + String id = metric.getMinute() + "-" + metric.frontCode + "-" + metric.behindCode; + setRecord(id, propertyJsonObj); + logger.debug("dag node ref: %s", propertyJsonObj.toString()); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + tell(DAGNodeRefReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneRecord); + } + } + + public static class Factory extends AbstractAsyncMemberProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return DAGNodeRefAnalysis.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.DAGNodeRefAnalysis.Size; + } + } + + public static class Metric extends AbstractTimeSlice { + private final String frontCode; + private final String behindCode; + + public Metric(long minute, int second, String frontCode, String behindCode) { + super(minute, second); + this.frontCode = frontCode; + this.behindCode = behindCode; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/persistence/DAGNodeRefPersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/persistence/DAGNodeRefPersistence.java new file mode 100644 index 000000000..b34018a58 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/persistence/DAGNodeRefPersistence.java @@ -0,0 +1,47 @@ +package com.a.eye.skywalking.collector.worker.applicationref.persistence; + +import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.AbstractAsyncMemberProvider; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.worker.RecordPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.lmax.disruptor.RingBuffer; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class DAGNodeRefPersistence extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(DAGNodeRefPersistence.class); + + public DAGNodeRefPersistence(RingBuffer ringBuffer, ActorRef actorRef) { + super(ringBuffer, actorRef); + } + + @Override + public String esIndex() { + return "node_ref"; + } + + @Override + public String esType() { + return "node_ref"; + } + + public static class Factory extends AbstractAsyncMemberProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Class memberClass() { + return DAGNodeRefPersistence.class; + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodeRefPersistence.Size; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/receiver/DAGNodeRefReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/receiver/DAGNodeRefReceiver.java new file mode 100644 index 000000000..1e4b53850 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/receiver/DAGNodeRefReceiver.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.applicationref.receiver; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.AbstractWorkerProvider; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.applicationref.persistence.DAGNodeRefPersistence; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class DAGNodeRefReceiver extends AbstractWorker { + + private Logger logger = LogManager.getFormatterLogger(DAGNodeRefReceiver.class); + + private DAGNodeRefPersistence persistence; + + @Override + public void preStart() throws Exception { + super.preStart(); + persistence = DAGNodeRefPersistence.Factory.INSTANCE.createWorker(getSelf()); + } + + @Override + public void receive(Object message) throws Throwable { + if (message instanceof RecordData) { + persistence.beTold(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class workerClass() { + return DAGNodeRefReceiver.class; + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.DAGNodeRefReceiver.Num; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/receiver/TraceSegmentReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/receiver/TraceSegmentReceiver.java new file mode 100644 index 000000000..0e16f6b1e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/receiver/TraceSegmentReceiver.java @@ -0,0 +1,71 @@ +package com.a.eye.skywalking.collector.worker.receiver; + +import com.a.eye.skywalking.collector.actor.AbstractWorker; +import com.a.eye.skywalking.collector.actor.AbstractWorkerProvider; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.application.ApplicationMain; +import com.a.eye.skywalking.collector.worker.applicationref.ApplicationRefMain; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.a.eye.skywalking.trace.TraceSegment; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class TraceSegmentReceiver extends AbstractWorker { + + private Logger logger = LogManager.getFormatterLogger(TraceSegmentReceiver.class); + + private ApplicationMain applicationMain; + + private ApplicationRefMain applicationRefMain; + + + public TraceSegmentReceiver() throws Exception { + applicationMain = ApplicationMain.Factory.INSTANCE.createWorker(getSelf()); + applicationRefMain = ApplicationRefMain.Factory.INSTANCE.createWorker(getSelf()); + } + + @Override + public void receive(Object message) throws Throwable { + if (message instanceof TraceSegment) { + TraceSegment traceSegment = (TraceSegment) message; + logger.debug("receive message instanceof TraceSegment, traceSegmentId is %s", traceSegment.getTraceSegmentId()); + long timeSlice = DateTools.timeStampToTimeSlice(traceSegment.getStartTime()); + int second = DateTools.timeStampToSecond(traceSegment.getStartTime()); + + TraceSegmentTimeSlice segmentTimeSlice = new TraceSegmentTimeSlice(timeSlice, second, traceSegment); + tell(applicationMain, segmentTimeSlice); + tell(applicationRefMain, segmentTimeSlice); + } + } + + public static class Factory extends AbstractWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Class workerClass() { + return TraceSegmentReceiver.class; + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.TraceSegmentReceiver.Num; + } + } + + public static class TraceSegmentTimeSlice extends AbstractTimeSlice { + private final TraceSegment traceSegment; + + public TraceSegmentTimeSlice(long timeSliceMinute, int second, TraceSegment traceSegment) { + super(timeSliceMinute, second); + this.traceSegment = traceSegment; + } + + public TraceSegment getTraceSegment() { + return traceSegment; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java new file mode 100644 index 000000000..bb0ade6e1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java @@ -0,0 +1,22 @@ +package com.a.eye.skywalking.collector.worker.storage; + +/** + * @author pengys5 + */ +public abstract class AbstractTimeSlice { + private final long minute; + private final int second; + + public AbstractTimeSlice(long minute, int second) { + this.minute = minute; + this.second = second; + } + + public long getMinute() { + return minute; + } + + public int getSecond() { + return second; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java new file mode 100644 index 000000000..badd094e9 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java @@ -0,0 +1,34 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.transport.InetSocketTransportAddress; +import org.elasticsearch.transport.client.PreBuiltTransportClient; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +/** + * @author pengys5 + */ +public class EsClient { + + private static Logger logger = LogManager.getFormatterLogger(EsClient.class); + + private static Client client; + + public static void boot() throws UnknownHostException { + Settings settings = Settings.builder() + .put("cluster.name", "CollectorCluster") + .put("client.transport.sniff", true).build(); + + client = new PreBuiltTransportClient(settings) + .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); + } + + public static Client getClient() { + return client; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java new file mode 100644 index 000000000..89341c910 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java @@ -0,0 +1,106 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import com.a.eye.skywalking.collector.actor.selector.AbstractHashMessage; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author pengys5 + */ +public class MetricData extends AbstractHashMessage { + + public MetricData(String key) { + super(key); + this.id = key; + } + + private String id; + + private static final String s10 = "s10"; + private static final String s20 = "s20"; + private static final String s30 = "s30"; + private static final String s40 = "s40"; + private static final String s50 = "s50"; + private static final String s60 = "s60"; + + private Long s10Value = 0L; + private Long s20Value = 0L; + private Long s30Value = 0L; + private Long s40Value = 0L; + private Long s50Value = 0L; + private Long s60Value = 0L; + + public void setMetric(int second, Long value) { + if (second <= 10) { + s10Value += value; + } else if (second > 10 && second <= 20) { + s20Value += value; + } else if (second > 20 && second <= 30) { + s30Value += value; + } else if (second > 30 && second <= 40) { + s40Value += value; + } else if (second > 40 && second <= 50) { + s50Value += value; + } else { + s60Value += value; + } + } + + public void merge(MetricData metricData) { + s10Value += metricData.s10Value; + s20Value += metricData.s20Value; + s30Value += metricData.s30Value; + s40Value += metricData.s40Value; + s50Value += metricData.s50Value; + s60Value += metricData.s60Value; + } + + public void merge(Map dbData) { + s10Value += Long.valueOf(dbData.get(s10).toString()); + s20Value += Long.valueOf(dbData.get(s20).toString()); + s30Value += Long.valueOf(dbData.get(s30).toString()); + s40Value += Long.valueOf(dbData.get(s40).toString()); + s50Value += Long.valueOf(dbData.get(s50).toString()); + s60Value += Long.valueOf(dbData.get(s60).toString()); + } + + public Map toMap() { + Map map = new HashMap<>(); + map.put(s10, s10Value); + map.put(s20, s20Value); + map.put(s30, s30Value); + map.put(s40, s40Value); + map.put(s50, s50Value); + map.put(s60, s60Value); + return map; + } + + public String getId() { + return id; + } + + protected Long getS10Value() { + return s10Value; + } + + protected Long getS20Value() { + return s20Value; + } + + protected Long getS30Value() { + return s30Value; + } + + protected Long getS40Value() { + return s40Value; + } + + protected Long getS50Value() { + return s50Value; + } + + protected Long getS60Value() { + return s60Value; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java new file mode 100644 index 000000000..0b2467f68 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java @@ -0,0 +1,51 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Spliterator; +import java.util.function.Consumer; + +/** + * @author pengys5 + */ +public class MetricPersistenceData implements Iterable { + + private Map persistenceData = new HashMap(); + + public MetricData getElseCreate(String id) { + if (!persistenceData.containsKey(id)) { + persistenceData.put(id, new MetricData(id)); + } + return persistenceData.get(id); + } + + public int size() { + return persistenceData.size(); + } + + public void clear() { + persistenceData.clear(); + } + + public MetricData pushOne() { + MetricData one = persistenceData.entrySet().iterator().next().getValue(); + persistenceData.remove(one.getId()); + return one; + } + + @Override + public void forEach(Consumer action) { + throw new UnsupportedOperationException("forEach"); + } + + @Override + public Spliterator spliterator() { + throw new UnsupportedOperationException("spliterator"); + } + + @Override + public Iterator> iterator() { + return persistenceData.entrySet().iterator(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java new file mode 100644 index 000000000..8eba5110b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java @@ -0,0 +1,30 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import com.a.eye.skywalking.collector.actor.selector.AbstractHashMessage; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class RecordData extends AbstractHashMessage { + + private String id; + private JsonObject record; + + public RecordData(String key) { + super(key); + this.id = key; + } + + public String getId() { + return id; + } + + public JsonObject getRecord() { + return record; + } + + public void setRecord(JsonObject record) { + this.record = record; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordPersistenceData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordPersistenceData.java new file mode 100644 index 000000000..cfcf54505 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordPersistenceData.java @@ -0,0 +1,55 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Spliterator; +import java.util.function.Consumer; + +/** + * @author pengys5 + */ +public class RecordPersistenceData implements Iterable { + + private Map persistenceData = new HashMap(); + + public RecordData getElseCreate(String id) { + if (!persistenceData.containsKey(id)) { + persistenceData.put(id, new RecordData(id)); + } + return persistenceData.get(id); + } + + public int size() { + return persistenceData.size(); + } + + public void clear() { + persistenceData.clear(); + } + + public boolean hasNext() { + return persistenceData.entrySet().iterator().hasNext(); + } + + public RecordData pushOne() { + RecordData one = persistenceData.entrySet().iterator().next().getValue(); + persistenceData.remove(one.getId()); + return one; + } + + @Override + public void forEach(Consumer action) { + throw new UnsupportedOperationException("forEach"); + } + + @Override + public Spliterator spliterator() { + throw new UnsupportedOperationException("spliterator"); + } + + @Override + public Iterator> iterator() { + return persistenceData.entrySet().iterator(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java new file mode 100644 index 000000000..bf61c67cf --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java @@ -0,0 +1,27 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * @author pengys5 + */ +public class DateTools { + + private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); + + public static final String Time_Slice_Column_Name = "timeSlice"; + + public static int timeStampToSecond(long time) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(time); + return calendar.get(Calendar.SECOND); + } + + public static long timeStampToTimeSlice(long time) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(time); + String timeStr = sdf.format(calendar.getTime()); + return Long.valueOf(timeStr); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider new file mode 100644 index 000000000..1416bc9e5 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider @@ -0,0 +1,6 @@ +com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver$Factory +com.a.eye.skywalking.collector.worker.application.receiver.DAGNodeReceiver$Factory +com.a.eye.skywalking.collector.worker.application.receiver.NodeInstanceReceiver$Factory +com.a.eye.skywalking.collector.worker.application.receiver.ResponseCostReceiver$Factory +com.a.eye.skywalking.collector.worker.application.receiver.ResponseSummaryReceiver$Factory +com.a.eye.skywalking.collector.worker.applicationref.receiver.DAGNodeRefReceiver$Factory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/application.conf b/skywalking-collector/skywalking-collector-worker/src/main/resources/application.conf new file mode 100644 index 000000000..ab9bb7e3f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/application.conf @@ -0,0 +1,37 @@ +akka { + actor { + provider = "akka.cluster.ClusterActorRefProvider" + + serializers { + java = "akka.serialization.JavaSerializer" + proto = "akka.remote.serialization.ProtobufSerializer" + data = "com.a.eye.skywalking.collector.worker.TraceSegmentSerializer" + json = "com.a.eye.skywalking.collector.worker.JsonSerializer" + } + + serialization-bindings { + "java.lang.String" = java + "com.google.protobuf.Message" = proto + "com.a.eye.skywalking.messages.ISerializable" = data + "com.google.gson.JsonObject" = json + // "java.io.Serializable" = none + } + + // serialize-messages = on + warn-about-java-serializer-usage = on + } + + remote { + log-remote-lifecycle-events = off + + netty.tcp { + hostname = "127.0.0.1" + port = 1000 + } + } + + cluster { + auto-down-unreachable-after = off + metrics.enabled = off + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/collector.config b/skywalking-collector/skywalking-collector-worker/src/main/resources/collector.config new file mode 100644 index 000000000..901420e88 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/collector.config @@ -0,0 +1,4 @@ +cluster.current.hostname=127.0.0.1 +cluster.current.port=1000 +cluster.current.roles=[WorkersListener, TraceSegmentReceiver, NodeInstancePersistence] +cluster.nodes=["akka.tcp://CollectorSystem@127.0.0.1:1000", "akka.tcp://CollectorSystem@127.0.0.1:1001", "akka.tcp://CollectorSystem@127.0.0.1:1002"] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml b/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml new file mode 100644 index 000000000..ca7a1e199 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/StartUpTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/StartUpTestCase.java new file mode 100644 index 000000000..3e24b08bd --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/StartUpTestCase.java @@ -0,0 +1,76 @@ +package com.a.eye.skywalking.collector.worker; + +import akka.actor.ActorRef; +import akka.actor.ActorSelection; +import akka.actor.ActorSystem; +import com.a.eye.skywalking.collector.actor.WorkersCreator; +import com.a.eye.skywalking.collector.cluster.ClusterConfig; +import com.a.eye.skywalking.collector.cluster.ClusterConfigInitializer; +import com.a.eye.skywalking.collector.cluster.WorkersListener; +import com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilderFactory; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.proto.SegmentMessage; +import com.a.eye.skywalking.trace.proto.SegmentRefMessage; +import com.a.eye.skywalking.trace.tag.Tags; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class StartUpTestCase { + + public void test() throws Exception { + System.out.println(TraceSegmentReceiver.class.getSimpleName()); + ClusterConfigInitializer.initialize("collector.config"); + System.out.println(ClusterConfig.Cluster.Current.roles); + + final Config config = ConfigFactory.parseString("akka.remote.netty.tcp.hostname=" + ClusterConfig.Cluster.Current.hostname). + withFallback(ConfigFactory.parseString("akka.remote.netty.tcp.port=" + ClusterConfig.Cluster.Current.port)). + withFallback(ConfigFactory.parseString("akka.cluster.roles=" + ClusterConfig.Cluster.Current.roles)). + withFallback(ConfigFactory.parseString("akka.actor.provider=" + ClusterConfig.Cluster.provider)). + withFallback(ConfigFactory.parseString("akka.cluster.seed-nodes=" + ClusterConfig.Cluster.nodes)). + withFallback(ConfigFactory.load("application.conf")); + ActorSystem system = ActorSystem.create(ClusterConfig.Cluster.appname, config); + WorkersCreator.INSTANCE.boot(system); + + EsClient.boot(); + + TraceSegment dubboClientData = TraceSegmentBuilderFactory.INSTANCE.traceOf_Tomcat_DubboClient(); + + SegmentMessage.Builder clientBuilder = dubboClientData.serialize().toBuilder(); + clientBuilder.setApplicationCode("Tomcat_DubboClient"); + dubboClientData = new TraceSegment(clientBuilder.build()); + + TraceSegment dubboServerData = TraceSegmentBuilderFactory.INSTANCE.traceOf_DubboServer_MySQL(); + + SegmentMessage serializeServer = dubboServerData.serialize(); + SegmentMessage.Builder builder = serializeServer.toBuilder(); + + SegmentRefMessage.Builder builderRef = builder.getPrimaryRef().toBuilder(); + builderRef.setApplicationCode(dubboClientData.getApplicationCode()); + + + builderRef.setPeerHost(Tags.PEER_HOST.get(dubboClientData.getSpans().get(1))); + + builder.setApplicationCode("DubboServer_MySQL"); + builder.setPrimaryRef(builderRef); + dubboServerData = new TraceSegment(builder.build()); + + Thread.sleep(5000); + + ActorSelection selection = system.actorSelection("/user/TraceSegmentReceiver_1"); + + for (int i = 0; i < 100; i++) { + selection.tell(dubboClientData, ActorRef.noSender()); + selection.tell(dubboServerData, ActorRef.noSender()); + + Thread.sleep(200); + } + + Thread.sleep(1000000); + } +} diff --git a/skywalking-commons/pom.xml b/skywalking-commons/pom.xml index 6a5ef732e..dd721fcf4 100644 --- a/skywalking-commons/pom.xml +++ b/skywalking-commons/pom.xml @@ -13,6 +13,8 @@ skywalking-trace skywalking-util + skywalking-logging-api + skywalking-logging-log4j2 skywalking-commons diff --git a/skywalking-commons/skywalking-logging-api/pom.xml b/skywalking-commons/skywalking-logging-api/pom.xml new file mode 100644 index 000000000..df272ae6b --- /dev/null +++ b/skywalking-commons/skywalking-logging-api/pom.xml @@ -0,0 +1,15 @@ + + + + skywalking-commons + com.a.eye + 3.0-2017 + + 4.0.0 + + skywalking-logging-api + + + diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/ILog.java b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/ILog.java similarity index 94% rename from skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/ILog.java rename to skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/ILog.java index a7de245d5..9cb718d2e 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/ILog.java +++ b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/ILog.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.api.logging; +package com.a.eye.skywalking.logging; /** * The Log interface. diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogManager.java b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/LogManager.java similarity index 96% rename from skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogManager.java rename to skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/LogManager.java index e290ac040..f9e69b756 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogManager.java +++ b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/LogManager.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.api.logging; +package com.a.eye.skywalking.logging; /** * LogManager is the {@link LogResolver} implementation manager. diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogResolver.java b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/LogResolver.java similarity index 88% rename from skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogResolver.java rename to skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/LogResolver.java index 3c751c6ef..c465afb35 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogResolver.java +++ b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/LogResolver.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.api.logging; +package com.a.eye.skywalking.logging; /** * {@link LogResolver} just do only one thing: return the {@link ILog} implementation. diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/NoopLogger.java b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/NoopLogger.java similarity index 96% rename from skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/NoopLogger.java rename to skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/NoopLogger.java index be261815e..30b48a752 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/NoopLogger.java +++ b/skywalking-commons/skywalking-logging-api/src/main/java/com/a/eye/skywalking/logging/NoopLogger.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.api.logging; +package com.a.eye.skywalking.logging; /** diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/LogManagerTest.java b/skywalking-commons/skywalking-logging-api/src/test/java/com/a/eye/skywalking/logging/LogManagerTest.java similarity index 77% rename from skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/LogManagerTest.java rename to skywalking-commons/skywalking-logging-api/src/test/java/com/a/eye/skywalking/logging/LogManagerTest.java index 7a44a3215..f3ae1f708 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/LogManagerTest.java +++ b/skywalking-commons/skywalking-logging-api/src/test/java/com/a/eye/skywalking/logging/LogManagerTest.java @@ -1,4 +1,4 @@ -package com.a.eye.skywalking.api.logging; +package com.a.eye.skywalking.logging; import org.junit.After; import org.junit.Assert; @@ -7,21 +7,9 @@ import org.junit.Test; import org.powermock.api.support.membermodification.MemberModifier; /** - * Created by wusheng on 2017/2/27. + * @author wusheng */ public class LogManagerTest { - @Test - public void testGetLogger() { - final TestLogger logger = new TestLogger(); - LogManager.setLogResolver(new LogResolver() { - @Override - public ILog getLogger(Class clazz) { - return logger; - } - }); - - Assert.assertEquals(logger, LogManager.getLogger(LogManagerTest.class)); - } @Test public void testGetNoopLogger(){ @@ -86,5 +74,5 @@ public class LogManagerTest { } } -} +} diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/NoopLoggerTest.java b/skywalking-commons/skywalking-logging-api/src/test/java/com/a/eye/skywalking/logging/NoopLoggerTest.java similarity index 87% rename from skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/NoopLoggerTest.java rename to skywalking-commons/skywalking-logging-api/src/test/java/com/a/eye/skywalking/logging/NoopLoggerTest.java index 7aafebb55..3b4fa1bb6 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/NoopLoggerTest.java +++ b/skywalking-commons/skywalking-logging-api/src/test/java/com/a/eye/skywalking/logging/NoopLoggerTest.java @@ -1,9 +1,8 @@ -package com.a.eye.skywalking.api.logging; - +package com.a.eye.skywalking.logging; import org.junit.Assert; import org.junit.Test; -import static com.a.eye.skywalking.api.logging.NoopLogger.INSTANCE; +import static com.a.eye.skywalking.logging.NoopLogger.INSTANCE; /** * Created by wusheng on 2017/2/27. diff --git a/skywalking-commons/skywalking-logging-log4j2/pom.xml b/skywalking-commons/skywalking-logging-log4j2/pom.xml new file mode 100644 index 000000000..5fbe227ba --- /dev/null +++ b/skywalking-commons/skywalking-logging-log4j2/pom.xml @@ -0,0 +1,31 @@ + + + + skywalking-commons + com.a.eye + 3.0-2017 + + 4.0.0 + + skywalking-logging-log4j2 + + + + com.a.eye + skywalking-logging-api + ${project.version} + + + org.apache.logging.log4j + log4j-core + 2.8 + + + org.apache.logging.log4j + log4j-api + 2.8 + + + diff --git a/skywalking-commons/skywalking-logging-log4j2/src/main/java/com/a/eye/skywalking/logging/log4j2/Log4j2Logger.java b/skywalking-commons/skywalking-logging-log4j2/src/main/java/com/a/eye/skywalking/logging/log4j2/Log4j2Logger.java new file mode 100644 index 000000000..ea6d4a65c --- /dev/null +++ b/skywalking-commons/skywalking-logging-log4j2/src/main/java/com/a/eye/skywalking/logging/log4j2/Log4j2Logger.java @@ -0,0 +1,76 @@ +package com.a.eye.skywalking.logging.log4j2; + +import com.a.eye.skywalking.logging.ILog; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author wusheng + */ +public class Log4j2Logger implements ILog { + private Logger delegateLogger; + + Log4j2Logger(Class targetClass){ + delegateLogger = LogManager.getFormatterLogger(targetClass); + } + + @Override + public void info(String format) { + delegateLogger.info(format); + } + + @Override + public void info(String format, Object... arguments) { + delegateLogger.info(format, arguments); + } + + @Override + public void warn(String format, Object... arguments) { + delegateLogger.warn(format, arguments); + } + + @Override + public void error(String format, Throwable e) { + delegateLogger.error(format, e); + } + + @Override + public void error(Throwable e, String format, Object... arguments) { + delegateLogger.error(format, e, arguments); + } + + @Override + public boolean isDebugEnable() { + return delegateLogger.isDebugEnabled(); + } + + @Override + public boolean isInfoEnable() { + return delegateLogger.isInfoEnabled(); + } + + @Override + public boolean isWarnEnable() { + return delegateLogger.isWarnEnabled(); + } + + @Override + public boolean isErrorEnable() { + return delegateLogger.isErrorEnabled(); + } + + @Override + public void debug(String format) { + delegateLogger.debug(format); + } + + @Override + public void debug(String format, Object... arguments) { + delegateLogger.debug(format, arguments); + } + + @Override + public void error(String format) { + delegateLogger.error(format); + } +} diff --git a/skywalking-commons/skywalking-logging-log4j2/src/main/java/com/a/eye/skywalking/logging/log4j2/Log4j2Resolver.java b/skywalking-commons/skywalking-logging-log4j2/src/main/java/com/a/eye/skywalking/logging/log4j2/Log4j2Resolver.java new file mode 100644 index 000000000..47008ccdc --- /dev/null +++ b/skywalking-commons/skywalking-logging-log4j2/src/main/java/com/a/eye/skywalking/logging/log4j2/Log4j2Resolver.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.logging.log4j2; + +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogResolver; + +/** + * The LogResolver 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 { public SpanMessage serialize() { SpanMessage.Builder builder = SpanMessage.newBuilder(); builder.setSpanId(spanId); + builder.setParentSpanId(parentSpanId); builder.setStartTime(startTime); builder.setEndTime(endTime); builder.setOperationName(operationName); @@ -292,6 +293,7 @@ public class Span implements ISerializable { @Override public void deserialize(SpanMessage message) { spanId = message.getSpanId(); + parentSpanId = message.getParentSpanId(); startTime = message.getStartTime(); endTime = message.getEndTime(); operationName = message.getOperationName(); diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java index 56b1727d1..53f3151b8 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegment.java @@ -158,6 +158,9 @@ public class TraceSegment implements ISerializable { } public List getRefs() { + if(refs == null){ + return null; + } return Collections.unmodifiableList(refs); } @@ -186,9 +189,13 @@ public class TraceSegment implements ISerializable { segmentBuilder.setStartTime(startTime); segmentBuilder.setEndTime(endTime); segmentBuilder.setApplicationCode(applicationCode); - segmentBuilder.setPrimaryRef(primaryRef.serialize()); - for (TraceSegmentRef ref : refs) { - segmentBuilder.addRefs(ref.serialize()); + if(primaryRef != null) { + segmentBuilder.setPrimaryRef(primaryRef.serialize()); + } + if(refs != null && refs.size() > 0) { + for (TraceSegmentRef ref : refs) { + segmentBuilder.addRefs(ref.serialize()); + } } for (Span span : spans) { segmentBuilder.addSpans(span.serialize()); @@ -202,9 +209,12 @@ public class TraceSegment implements ISerializable { startTime = message.getStartTime(); endTime = message.getEndTime(); applicationCode = message.getApplicationCode(); - (primaryRef = new TraceSegmentRef()).deserialize(message.getPrimaryRef()); + SegmentRefMessage messagePrimaryRef = message.getPrimaryRef(); + if(messagePrimaryRef != null) { + (primaryRef = new TraceSegmentRef()).deserialize(messagePrimaryRef); + } List refsList = message.getRefsList(); - if (refsList != null) { + if (refsList != null && refsList.size() > 0) { this.refs = new LinkedList(); for (SegmentRefMessage refMessage : refsList) { TraceSegmentRef ref = new TraceSegmentRef(); diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java index 25de949d9..9f3a780f2 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java @@ -4,12 +4,16 @@ import com.a.eye.skywalking.trace.Span; /** * Do the same thing as {@link StringTag}, just with a {@link Boolean} value. - * + *

* Created by wusheng on 2017/2/17. */ -public class BooleanTag extends AbstractTag{ - public BooleanTag(String key) { +public class BooleanTag extends AbstractTag { + + private boolean defaultValue; + + public BooleanTag(String key, boolean defaultValue) { super(key); + this.defaultValue = defaultValue; } @Override @@ -18,8 +22,8 @@ public class BooleanTag extends AbstractTag{ } /** - * Get a tag value, type of {@link Boolean}. - * After akka-message/serialize, all tags values are type of {@link String}, convert to {@link Boolean}, if necessary. + * Get a tag value, type of {@link Boolean}. After akka-message/serialize, all tags values are type of {@link + * String}, convert to {@link Boolean}, if necessary. * * @param span * @return tag value @@ -27,9 +31,11 @@ public class BooleanTag extends AbstractTag{ @Override public Boolean get(Span span) { Object tagValue = span.getTag(super.key); - if(tagValue instanceof Boolean){ - return (Boolean)tagValue; - }else { + if (tagValue == null) { + return defaultValue; + } else if (tagValue instanceof Boolean) { + return (Boolean) tagValue; + } else { return Boolean.valueOf(tagValue.toString()); } } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java index 2157ff993..8af1fec9a 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java @@ -27,7 +27,9 @@ public class IntTag extends AbstractTag { @Override public Integer get(Span span) { Object tagValue = span.getTag(super.key); - if(tagValue instanceof Integer){ + if (tagValue == null) { + return null; + } else if(tagValue instanceof Integer){ return (Integer)tagValue; }else { return Integer.valueOf(tagValue.toString()); diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java index 5d0116e03..ebd93a607 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java @@ -26,7 +26,9 @@ public class ShortTag extends AbstractTag { */ @Override public Short get(Span span) { Object tagValue = span.getTag(super.key); - if(tagValue instanceof Short){ + if (tagValue == null) { + return null; + } else if(tagValue instanceof Short){ return (Short)tagValue; }else { return Short.valueOf(tagValue.toString()); diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/Tags.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/Tags.java index 6f80d42c2..c534db86c 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/Tags.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/Tags.java @@ -5,7 +5,7 @@ import com.a.eye.skywalking.trace.Span; /** * The span tags are supported by sky-walking engine. * As default, all tags will be stored, but these ones have particular meanings. - * + *

* 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 @@ ${shade.com.lmax.disruptor.source} ${shade.com.lmax.disruptor.target} + + ${shade.akka.source} + ${shade.akka.target} + + + ${shade.com.google.source} + ${shade.com.google.target} + + + ${shade.all.org.source} + ${shade.all.org.target} + + + ${shade.scala.source} + ${shade.scala.target} + + + ${shade.io.aeron.source} + ${shade.io.aeron.target} + + + ${shade.com.typesafe.source} + ${shade.com.typesafe.target} + @@ -112,13 +136,25 @@ - ${shade.package}.${shade.net.bytebuddy.source} - com.a.eye.skywalking.api.dependencies - UTF-8 - com.lmax.disruptor + ${shade.package}.${shade.com.typesafe.source} ${shade.package}.${shade.com.lmax.disruptor.source} net.bytebuddy + ${shade.package}.${shade.akka.source} + ${shade.package}.${shade.io.aeron.source} + ${shade.package}.${shade.all.org.source} + UTF-8 + scala + ${shade.package}.${shade.net.bytebuddy.source} + com.a.eye.skywalking.dependencies + com.google + ${shade.package}.${shade.scala.source} + com.typesafe + com.lmax.disruptor + akka com.a.eye.skywalking.agent.SkyWalkingAgent + io.aeron + org + ${shade.package}.${shade.com.google.source} diff --git a/skywalking-sniffer/skywalking-agent/pom.xml b/skywalking-sniffer/skywalking-agent/pom.xml index 513a9b4e2..69a6b93c8 100644 --- a/skywalking-sniffer/skywalking-agent/pom.xml +++ b/skywalking-sniffer/skywalking-agent/pom.xml @@ -16,13 +16,24 @@ UTF-8 - com.a.eye.skywalking.api.dependencies + com.a.eye.skywalking.dependencies com.a.eye.skywalking.agent.SkyWalkingAgent net.bytebuddy ${shade.package}.${shade.net.bytebuddy.source} - com.lmax.disruptor ${shade.package}.${shade.com.lmax.disruptor.source} + akka + ${shade.package}.${shade.akka.source} + scala + ${shade.package}.${shade.scala.source} + org + ${shade.package}.${shade.all.org.source} + com.google + ${shade.package}.${shade.com.google.source} + io.aeron + ${shade.package}.${shade.io.aeron.source} + com.typesafe + ${shade.package}.${shade.com.typesafe.source} @@ -127,6 +138,30 @@ ${shade.com.lmax.disruptor.source} ${shade.com.lmax.disruptor.target} + + ${shade.akka.source} + ${shade.akka.target} + + + ${shade.com.google.source} + ${shade.com.google.target} + + + ${shade.all.org.source} + ${shade.all.org.target} + + + ${shade.scala.source} + ${shade.scala.target} + + + ${shade.io.aeron.source} + ${shade.io.aeron.target} + + + ${shade.com.typesafe.source} + ${shade.com.typesafe.target} + diff --git a/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java b/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java index 173ca6d4c..8e9cdeca7 100644 --- a/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java +++ b/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java @@ -1,16 +1,17 @@ package com.a.eye.skywalking.agent; import com.a.eye.skywalking.agent.junction.SkyWalkingEnhanceMatcher; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.conf.Config; import com.a.eye.skywalking.api.conf.SnifferConfigInitializer; import com.a.eye.skywalking.api.logging.EasyLogResolver; -import com.a.eye.skywalking.api.logging.ILog; -import com.a.eye.skywalking.api.logging.LogManager; import com.a.eye.skywalking.api.plugin.AbstractClassEnhancePluginDefine; import com.a.eye.skywalking.api.plugin.PluginBootstrap; import com.a.eye.skywalking.api.plugin.PluginFinder; import com.a.eye.skywalking.api.plugin.PluginException; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.NamedElement; import net.bytebuddy.description.type.TypeDescription; @@ -53,6 +54,8 @@ public class SkyWalkingAgent { final PluginFinder pluginFinder = new PluginFinder(new PluginBootstrap().loadPlugins()); + ServiceStarter.INSTANCE.boot(); + new AgentBuilder.Default().type(enhanceClassMatcher(pluginFinder).and(not(isInterface()))).transform(new AgentBuilder.Transformer() { public DynamicType.Builder transform(DynamicType.Builder builder, TypeDescription typeDescription, ClassLoader classLoader) { AbstractClassEnhancePluginDefine pluginDefine = pluginFinder.find(typeDescription.getTypeName()); diff --git a/skywalking-sniffer/skywalking-api/pom.xml b/skywalking-sniffer/skywalking-api/pom.xml index 943a1f8a5..9b94ddb5c 100644 --- a/skywalking-sniffer/skywalking-api/pom.xml +++ b/skywalking-sniffer/skywalking-api/pom.xml @@ -20,16 +20,26 @@ - - net.bytebuddy - byte-buddy - 1.5.7 - com.a.eye skywalking-trace ${project.version} + + com.a.eye + skywalking-logging-api + ${project.version} + + + com.a.eye + skywalking-collector-cluster + ${project.version} + + + net.bytebuddy + byte-buddy + 1.5.7 + com.lmax disruptor diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/BootService.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/BootService.java new file mode 100644 index 000000000..3bf4bf6ec --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/BootService.java @@ -0,0 +1,12 @@ +package com.a.eye.skywalking.api.boot; + +/** + * The 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 Map bootedServices; + + public void boot() { + if (!isStarted) { + try { + bootedServices = new HashMap<>(); + Iterator serviceIterator = load().iterator(); + while (serviceIterator.hasNext()) { + BootService bootService = serviceIterator.next(); + try { + bootService.bootUp(); + bootedServices.put(bootService.getClass(), bootService); + } catch (Exception e) { + logger.error(e, "ServiceStarter try to start [{}] fail.", bootService.getClass().getName()); + } + } + } finally { + isStarted = true; + } + } + } + + /** + * Find a {@link BootService} implementation, which is already started. + * @param serviceClass class name. + * @param {@link BootService} implementation class. + * @return {@link BootService} instance + */ + public T findService(Class serviceClass){ + return (T)bootedServices.get(serviceClass); + } + + ServiceLoader load() { + return ServiceLoader.load(BootService.class); + } +} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/StatusBootService.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/StatusBootService.java new file mode 100644 index 000000000..39ee43b18 --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/StatusBootService.java @@ -0,0 +1,32 @@ +package com.a.eye.skywalking.api.boot; + +/** + * The StatusBootService 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 ThreadLocal CONTEXT = new ThreadLocal<>(); - private TracerContext get() { + private static TracerContext get() { TracerContext segment = CONTEXT.get(); if (segment == null) { segment = new TracerContext(); @@ -42,28 +32,28 @@ public enum ContextManager implements TracerContextListener { /** * @see {@link TracerContext#inject(ContextCarrier)} */ - public void inject(ContextCarrier carrier) { + public static void inject(ContextCarrier carrier) { get().inject(carrier); } /** *@see {@link TracerContext#extract(ContextCarrier)} */ - public void extract(ContextCarrier carrier) { + public static void extract(ContextCarrier carrier) { get().extract(carrier); } /** * @see {@link TracerContext#extract(ContextCarrier)} */ - public void multiExtract(ContextCarrier carrier){ + public static void multiExtract(ContextCarrier carrier){ get().extract(carrier); } /** * @return the {@link TraceSegment#traceSegmentId} if exist. Otherwise, "N/A". */ - public String getTraceSegmentId(){ + public static String getTraceSegmentId(){ TracerContext segment = CONTEXT.get(); if(segment == null){ return "N/A"; @@ -72,27 +62,37 @@ public enum ContextManager implements TracerContextListener { } } - public Span createSpan(String operationName) { + public static Span createSpan(String operationName) { return get().createSpan(operationName); } - public Span createSpan(String operationName, long startTime) { - return get().createSpan(operationName); + public static Span createSpan(String operationName, long startTime) { + return get().createSpan(operationName, startTime); } - public Span activeSpan() { + public static Span activeSpan() { return get().activeSpan(); } - public void stopSpan(Span span) { + public static void stopSpan(Span span) { get().stopSpan(span); } - public void stopSpan(Long endTime) { + public static void stopSpan(Long endTime) { get().stopSpan(activeSpan(), endTime); } - public void stopSpan() { + public static void stopSpan() { stopSpan(activeSpan()); } + + @Override + public void bootUp(){ + TracerContext.ListenerManager.add(this); + } + + @Override + public void afterFinished(TraceSegment traceSegment) { + CONTEXT.remove(); + } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogResolver.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogResolver.java index 31f33e38d..268d83474 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogResolver.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogResolver.java @@ -1,5 +1,8 @@ package com.a.eye.skywalking.api.logging; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogResolver; + /** * Created by wusheng on 2016/11/26. */ diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java index ac8ee73b8..200c255e3 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java @@ -1,6 +1,7 @@ package com.a.eye.skywalking.api.logging; +import com.a.eye.skywalking.logging.ILog; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/AbstractClassEnhancePluginDefine.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/AbstractClassEnhancePluginDefine.java index dda08f385..0430c4af3 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/AbstractClassEnhancePluginDefine.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/AbstractClassEnhancePluginDefine.java @@ -1,7 +1,7 @@ package com.a.eye.skywalking.api.plugin; -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.plugin.interceptor.enhance.ClassEnhancePluginDefine; import com.a.eye.skywalking.api.util.StringUtil; import net.bytebuddy.dynamic.DynamicType; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginBootstrap.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginBootstrap.java index 67ed10029..5926c77cb 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginBootstrap.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginBootstrap.java @@ -1,7 +1,8 @@ package com.a.eye.skywalking.api.plugin; -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 net.bytebuddy.pool.TypePool; import java.net.URL; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginResourcesResolver.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginResourcesResolver.java index d5e871436..a59269cad 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginResourcesResolver.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/PluginResourcesResolver.java @@ -1,7 +1,7 @@ package com.a.eye.skywalking.api.plugin; -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 java.io.IOException; import java.net.URL; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/TracingBootstrap.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/TracingBootstrap.java index d886ec395..5a2e960c5 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/TracingBootstrap.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/TracingBootstrap.java @@ -1,7 +1,7 @@ package com.a.eye.skywalking.api.plugin; -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 net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.ClassFileLocator; import net.bytebuddy.dynamic.DynamicType; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassConstructorInterceptor.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassConstructorInterceptor.java index c5dd3e8ec..4093ed1d7 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassConstructorInterceptor.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassConstructorInterceptor.java @@ -1,7 +1,7 @@ package com.a.eye.skywalking.api.plugin.interceptor.enhance; -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.plugin.interceptor.loader.InterceptorInstanceLoader; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import net.bytebuddy.implementation.bind.annotation.AllArguments; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassEnhancePluginDefine.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassEnhancePluginDefine.java index 79336c34f..8c9ccc336 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassEnhancePluginDefine.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassEnhancePluginDefine.java @@ -1,7 +1,7 @@ package com.a.eye.skywalking.api.plugin.interceptor.enhance; -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.plugin.AbstractClassEnhancePluginDefine; import com.a.eye.skywalking.api.plugin.PluginException; import com.a.eye.skywalking.api.plugin.interceptor.ConstructorInterceptPoint; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java index e0e17414c..5a2a23903 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java @@ -1,7 +1,7 @@ package com.a.eye.skywalking.api.plugin.interceptor.enhance; -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.plugin.interceptor.loader.InterceptorInstanceLoader; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import net.bytebuddy.implementation.bind.annotation.*; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java index 0c2d01f17..863f6d5db 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/ClassStaticMethodsInterceptor.java @@ -1,12 +1,12 @@ package com.a.eye.skywalking.api.plugin.interceptor.enhance; -import com.a.eye.skywalking.api.logging.ILog; -import com.a.eye.skywalking.api.logging.LogManager; import com.a.eye.skywalking.api.plugin.interceptor.loader.InterceptorInstanceLoader; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.Origin; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; import java.lang.reflect.Method; import java.util.concurrent.Callable; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/DefaultClassConstructorInterceptor.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/DefaultClassConstructorInterceptor.java index 9f240a98f..4155e8a03 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/DefaultClassConstructorInterceptor.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/enhance/DefaultClassConstructorInterceptor.java @@ -1,7 +1,8 @@ package com.a.eye.skywalking.api.plugin.interceptor.enhance; -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.plugin.interceptor.EnhancedClassInstanceContext; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.FieldProxy; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/loader/InterceptorInstanceLoader.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/loader/InterceptorInstanceLoader.java index 9cfc7d050..78addb934 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/loader/InterceptorInstanceLoader.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/loader/InterceptorInstanceLoader.java @@ -1,8 +1,7 @@ package com.a.eye.skywalking.api.plugin.interceptor.loader; -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 java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java index 5da3cc5ec..f8eff6e6f 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.api.queue; +import com.a.eye.skywalking.api.boot.StatusBootService; import com.a.eye.skywalking.api.conf.Config; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.context.TracerContextListener; @@ -15,9 +16,24 @@ import com.lmax.disruptor.util.DaemonThreadFactory; * * Created by wusheng on 2017/2/17. */ -public enum TraceSegmentProcessQueue implements TracerContextListener { - INSTANCE { - @Override public void afterFinished(TraceSegment traceSegment) { +public class TraceSegmentProcessQueue extends StatusBootService implements TracerContextListener { + private Disruptor disruptor; + private RingBuffer buffer; + + public TraceSegmentProcessQueue() { + disruptor = new Disruptor<>(TraceSegmentHolder.Factory.INSTANCE, Config.Disruptor.BUFFER_SIZE, DaemonThreadFactory.INSTANCE); + buffer = disruptor.getRingBuffer(); + } + + @Override + protected void bootUpWithStatus() { + TracerContext.ListenerManager.add(this); + disruptor.start(); + } + + @Override + public void afterFinished(TraceSegment traceSegment) { + if(isStarted()) { long sequence = this.buffer.next(); // Grab the next sequence try { TraceSegmentHolder data = this.buffer.get(sequence); @@ -26,19 +42,5 @@ public enum TraceSegmentProcessQueue implements TracerContextListener { this.buffer.publish(sequence); } } - }; - - private Disruptor disruptor; - RingBuffer buffer; - - TraceSegmentProcessQueue() { - disruptor = new Disruptor<>(TraceSegmentHolder.Factory.INSTANCE, Config.Disruptor.BUFFER_SIZE, DaemonThreadFactory.INSTANCE); - buffer = disruptor.getRingBuffer(); - } - - public void start() { - TracerContext.ListenerManager.add(this); - disruptor.start(); - } } diff --git a/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService b/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService new file mode 100644 index 000000000..a305b07a5 --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService @@ -0,0 +1,2 @@ +com.a.eye.skywalking.api.queue.TraceSegmentProcessQueue +com.a.eye.skywalking.api.context.ContextManager diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java index 017d70cac..f0b092a0b 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java @@ -13,13 +13,13 @@ import org.junit.Test; public class ContextManagerTestCase { @Test public void testDelegateToTracerContext(){ - Span span = ContextManager.INSTANCE.createSpan("serviceA"); + Span span = ContextManager.createSpan("serviceA"); Tags.COMPONENT.set(span, "test"); - Assert.assertEquals(span, ContextManager.INSTANCE.activeSpan()); + Assert.assertEquals(span, ContextManager.activeSpan()); TracerContext.ListenerManager.add(TestTracerContextListener.INSTANCE); - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); TraceSegment segment = TestTracerContextListener.INSTANCE.finishedSegmentCarrier[0]; diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java index 048b2ae5f..f3c19f4bf 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java @@ -8,10 +8,10 @@ import org.junit.Test; */ public class ThrowableFormatterTest { @Test - public void testFormat(){ + public void testFormat() { NullPointerException exception = new NullPointerException(); String formatLines = ThrowableFormatter.format(exception); - String[] lines = formatLines.split("\n"); + String[] lines = formatLines.split(System.lineSeparator()); Assert.assertEquals("java.lang.NullPointerException", lines[0]); Assert.assertEquals("\tat com.a.eye.skywalking.api.logging.ThrowableFormatterTest.testFormat(ThrowableFormatterTest.java:12)", lines[1]); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptor.java index c070bf887..604012482 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/main/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptor.java @@ -51,7 +51,7 @@ public class DubboInterceptor implements InstanceMethodsAroundInterceptor { boolean isConsumer = rpcContext.isConsumerSide(); URL requestURL = invoker.getUrl(); - Span span = ContextManager.INSTANCE.createSpan(generateOperationName(requestURL, invocation)); + Span span = ContextManager.createSpan(generateOperationName(requestURL, invocation)); Tags.URL.set(span, generateRequestURL(requestURL, invocation)); Tags.COMPONENT.set(span, DUBBO_COMPONENT); Tags.SPAN_LAYER.asRPCFramework(span); @@ -61,7 +61,7 @@ public class DubboInterceptor implements InstanceMethodsAroundInterceptor { if (isConsumer) { Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); ContextCarrier contextCarrier = new ContextCarrier(); - ContextManager.INSTANCE.inject(contextCarrier); + ContextManager.inject(contextCarrier); if (!BugFixActive.isActive()) { //invocation.getAttachments().put("contextData", contextDataStr); //@see https://github.com/alibaba/dubbo/blob/dubbo-2.5.3/dubbo-rpc/dubbo-rpc-api/src/main/java/com/alibaba/dubbo/rpc/RpcInvocation.java#L154-L161 @@ -80,7 +80,7 @@ public class DubboInterceptor implements InstanceMethodsAroundInterceptor { } if (contextCarrier != null) { - ContextManager.INSTANCE.extract(contextCarrier); + ContextManager.extract(contextCarrier); } } } @@ -98,7 +98,7 @@ public class DubboInterceptor implements InstanceMethodsAroundInterceptor { dealException(result.getException()); } - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); return ret; } @@ -112,7 +112,7 @@ public class DubboInterceptor implements InstanceMethodsAroundInterceptor { * Log the throwable, which occurs in Dubbo RPC service. */ private void dealException(Throwable throwable) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.ERROR.set(span, true); span.log(throwable); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/test/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/test/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptorTest.java index f0714dfc0..65afb04f3 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/test/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/src/test/java/com/a/eye/skywalking/plugin/dubbo/DubboInterceptorTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.dubbo; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; @@ -59,6 +60,8 @@ public class DubboInterceptorTest { @Before public void setUp() throws Exception { + ServiceStarter.INSTANCE.boot(); + dubboInterceptor = new DubboInterceptor(); testParam = new RequestParamForTestBelow283(); mockTracerContextListener = new MockTracerContextListener(); @@ -226,4 +229,4 @@ public class DubboInterceptorTest { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml index 9ffbd6fec..4d13cff6b 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml @@ -23,7 +23,7 @@ com.a.eye skywalking-api - 3.0-2017 + ${project.version} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptor.java index e2bf4650e..7030ddc6c 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/main/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptor.java @@ -48,7 +48,7 @@ public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterc Tags.SPAN_LAYER.asHttp(span); ContextCarrier contextCarrier = new ContextCarrier(); - ContextManager.INSTANCE.inject(contextCarrier); + ContextManager.inject(contextCarrier); httpRequest.setHeader(HEADER_NAME_OF_CONTEXT_DATA, contextCarrier.serialize()); } @@ -68,9 +68,9 @@ public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterc Span span; try { URL url = new URL(httpRequest.getRequestLine().getUri()); - span = ContextManager.INSTANCE.createSpan(url.getPath()); + span = ContextManager.createSpan(url.getPath()); } catch (MalformedURLException e) { - span = ContextManager.INSTANCE.createSpan(httpRequest.getRequestLine().getUri()); + span = ContextManager.createSpan(httpRequest.getRequestLine().getUri()); } return span; } @@ -85,20 +85,20 @@ public class HttpClientExecuteInterceptor implements InstanceMethodsAroundInterc HttpResponse response = (HttpResponse) ret; int statusCode = response.getStatusLine().getStatusCode(); - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); if (statusCode != 200) { Tags.ERROR.set(span, true); } Tags.STATUS_CODE.set(span, statusCode); - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - Tags.ERROR.set(ContextManager.INSTANCE.activeSpan(), true); - ContextManager.INSTANCE.activeSpan().log(t); + Tags.ERROR.set(ContextManager.activeSpan(), true); + ContextManager.activeSpan().log(t); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/test/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/test/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java index d8c7f3faa..7a0c26f89 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/test/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/src/test/java/com/a/eye/skywalking/plugin/httpClient/v4/HttpClientExecuteInterceptorTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.httpClient.v4; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; @@ -56,6 +57,8 @@ public class HttpClientExecuteInterceptorTest { @Before public void setUp() throws Exception { mockTracerContextListener = new MockTracerContextListener(); + + ServiceStarter.INSTANCE.boot(); httpClientExecuteInterceptor = new HttpClientExecuteInterceptor(); PowerMockito.mock(HttpHost.class); @@ -163,4 +166,4 @@ public class HttpClientExecuteInterceptorTest { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java index 1fb3a011b..1c1463577 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java @@ -22,7 +22,7 @@ public class CallableStatementTracing { ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - Span span = ContextManager.INSTANCE.createSpan(connectInfo.getDBType() + "/JDBI/CallableStatement/" + method); + Span span = ContextManager.createSpan("JDBC/CallableStatement/" + method); Tags.DB_TYPE.set(span, "sql"); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); @@ -36,12 +36,12 @@ public class CallableStatementTracing { } return exec.exe(realStatement, sql); } catch (SQLException e) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.ERROR.set(span, true); span.log(e); throw e; } finally { - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java index 8ef0c6bfd..6bfb1706a 100755 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java @@ -22,7 +22,7 @@ public class ConnectionTracing { ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - Span span = ContextManager.INSTANCE.createSpan(connectInfo.getDBType() + "/JDBI/Connection/" + method); + Span span = ContextManager.createSpan("JDBC/Connection/" + method); Tags.DB_TYPE.set(span, "sql"); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); @@ -36,12 +36,12 @@ public class ConnectionTracing { } return exec.exe(realConnection, sql); } catch (SQLException e) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.ERROR.set(span, true); span.log(e); throw e; } finally { - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java index 5dc8ceb0e..09ca3c5e3 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java @@ -21,7 +21,7 @@ public class PreparedStatementTracing { ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - Span span = ContextManager.INSTANCE.createSpan(connectInfo.getDBType() + "/JDBI/PreparedStatement/" + method); + Span span = ContextManager.createSpan("JDBC/PreparedStatement/" + method); Tags.DB_TYPE.set(span, "sql"); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); @@ -35,12 +35,12 @@ public class PreparedStatementTracing { Tags.SPAN_LAYER.asDB(span); return exec.exe(realStatement, sql); } catch (SQLException e) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.ERROR.set(span, true); span.log(e); throw e; } finally { - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java index 0c6723bb9..8d4776521 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java @@ -21,7 +21,7 @@ public class StatementTracing { ConnectionInfo connectInfo, String method, String sql, Executable exec) throws SQLException { try { - Span span = ContextManager.INSTANCE.createSpan(connectInfo.getDBType() + "/JDBI/Statement/" + method); + Span span = ContextManager.createSpan("JDBC/Statement/" + method); Tags.DB_TYPE.set(span, "sql"); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); @@ -35,12 +35,12 @@ public class StatementTracing { } return exec.exe(realStatement, sql); } catch (SQLException e) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.ERROR.set(span, true); span.log(e); throw e; } finally { - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/define/OracleInstrumentation.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/define/OracleInstrumentation.java index c19bca7ba..59a34eee9 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/define/OracleInstrumentation.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/define/OracleInstrumentation.java @@ -9,6 +9,6 @@ package com.a.eye.skywalking.plugin.jdbc.define; public class OracleInstrumentation extends AbstractDatabaseInstrumentation { @Override protected String enhanceClassName() { - return "oracle.jdbc.OracleDriver"; + return "oracle.jdbc.driver.OracleDriver"; } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWCallableStatementTest.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWCallableStatementTest.java index a2c9f47c8..839fb90ec 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWCallableStatementTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWCallableStatementTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.jdbc; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert; @@ -89,6 +90,7 @@ public class SWCallableStatementTest extends AbstractStatementTest { @Before public void setUp() throws Exception { mockTracerContextListener = new MockTracerContextListener(); + ServiceStarter.INSTANCE.boot(); swConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306/test", new Properties(), jdbcConnection); multiHostConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306,127.0.0.1:3309/test", new Properties(), jdbcConnection); @@ -749,4 +751,4 @@ public class SWCallableStatementTest extends AbstractStatementTest { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWConnectionTest.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWConnectionTest.java index cb42ceab1..b97d7109e 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWConnectionTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWConnectionTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.jdbc; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert; @@ -46,6 +47,7 @@ public class SWConnectionTest extends AbstractStatementTest { @Before public void setUp() throws Exception { + ServiceStarter.INSTANCE.boot(); mockTracerContextListener = new MockTracerContextListener(); swConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306/test", new Properties(), jdbcConnection); multiHostConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306,127.0.0.1:3309/test", new Properties(), jdbcConnection); @@ -358,4 +360,4 @@ public class SWConnectionTest extends AbstractStatementTest { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWStatementTest.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWStatementTest.java index 39d5bd12d..eaf85b467 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWStatementTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SWStatementTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.jdbc; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert; @@ -48,6 +49,8 @@ public class SWStatementTest extends AbstractStatementTest { @Before public void setUp() throws Exception { mockTracerContextListener = new MockTracerContextListener(); + + ServiceStarter.INSTANCE.boot(); swConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306/test", new Properties(), jdbcConnection); multiHostConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306,127.0.0.1:3309/test", new Properties(), jdbcConnection); @@ -306,4 +309,4 @@ public class SWStatementTest extends AbstractStatementTest { public void tearDown() throws Exception { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SwPreparedStatementTest.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SwPreparedStatementTest.java index d07472ee9..9217d71fa 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SwPreparedStatementTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/test/java/com/a/eye/skywalking/plugin/jdbc/SwPreparedStatementTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.jdbc; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; import com.a.eye.skywalking.sniffer.mock.context.SegmentAssert; @@ -89,6 +90,8 @@ public class SwPreparedStatementTest extends AbstractStatementTest { @Before public void setUp() throws Exception { mockTracerContextListener = new MockTracerContextListener(); + + ServiceStarter.INSTANCE.boot(); swConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306/test", new Properties(), jdbcConnection); multiHostConnection = new SWConnection("jdbc:mysql://127.0.0.1:3306,127.0.0.1:3309/test", new Properties(), jdbcConnection); @@ -580,4 +583,4 @@ public class SwPreparedStatementTest extends AbstractStatementTest { public void tearDown() throws Exception { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java index b7d795433..01b9655c7 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java @@ -46,7 +46,7 @@ public class JedisMethodInterceptor extends NoCocurrencyAceessObject { this.whenEnter(context, new Runnable() { @Override public void run() { - Span span = ContextManager.INSTANCE.createSpan("Jedis/" + interceptorContext.methodName()); + Span span = ContextManager.createSpan("Jedis/" + interceptorContext.methodName()); Tags.COMPONENT.set(span, REDIS_COMPONENT); Tags.DB_TYPE.set(span, REDIS_COMPONENT); tagPeer(span, context); @@ -84,7 +84,7 @@ public class JedisMethodInterceptor extends NoCocurrencyAceessObject { this.whenExist(context, new Runnable() { @Override public void run() { - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); } }); return ret; @@ -92,6 +92,6 @@ public class JedisMethodInterceptor extends NoCocurrencyAceessObject { @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - ContextManager.INSTANCE.activeSpan().log(t); + ContextManager.activeSpan().log(t); } } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptorTest.java index 650d3191e..f447bd39f 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/test/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptorTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.jedis.v2; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; @@ -46,6 +47,8 @@ public class JedisMethodInterceptorTest { @Before public void setUp() throws Exception { + ServiceStarter.INSTANCE.boot(); + interceptor = new JedisMethodInterceptor(); mockTracerContextListener = new MockTracerContextListener(); @@ -149,4 +152,4 @@ public class JedisMethodInterceptorTest { TracerContext.ListenerManager.remove(mockTracerContextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptor.java index bbddc5899..28f9bf128 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptor.java @@ -49,7 +49,7 @@ public class MotanConsumerInterceptor implements InstanceConstructorInterceptor, URL url = (URL) context.get(KEY_NAME_OF_REQUEST_URL); Request request = (Request) interceptorContext.allArguments()[0]; if (url != null) { - Span span = ContextManager.INSTANCE.createSpan(generateOperationName(url, request)); + Span span = ContextManager.createSpan(generateOperationName(url, request)); Tags.PEER_HOST.set(span, url.getHost()); Tags.PEER_PORT.set(span, url.getPort()); Tags.COMPONENT.set(span, MOTAN_COMPONENT); @@ -58,7 +58,7 @@ public class MotanConsumerInterceptor implements InstanceConstructorInterceptor, Tags.SPAN_LAYER.asRPCFramework(span); ContextCarrier contextCarrier = new ContextCarrier(); - ContextManager.INSTANCE.inject(contextCarrier); + ContextManager.inject(contextCarrier); request.setAttachment(ATTACHMENT_KEY_OF_CONTEXT_DATA, contextCarrier.serialize()); } } @@ -68,18 +68,18 @@ public class MotanConsumerInterceptor implements InstanceConstructorInterceptor, Object ret) { Response response = (Response) ret; if (response != null && response.getException() != null) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.ERROR.set(span, true); span.log(response.getException()); } - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - ContextManager.INSTANCE.activeSpan().log(t); + ContextManager.activeSpan().log(t); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptor.java index 51d4a94e2..20d9611a5 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/main/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptor.java @@ -37,14 +37,14 @@ public class MotanProviderInterceptor implements InstanceMethodsAroundIntercepto public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { Request request = (Request) interceptorContext.allArguments()[0]; - Span span = ContextManager.INSTANCE.createSpan(generateViewPoint(request)); + Span span = ContextManager.createSpan(generateViewPoint(request)); Tags.COMPONENT.set(span, MOTAN_COMPONENT); Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); Tags.SPAN_LAYER.asRPCFramework(span); String serializedContextData = request.getAttachments().get(ATTACHMENT_KEY_OF_CONTEXT_DATA); if (!StringUtil.isEmpty(serializedContextData)) { - ContextManager.INSTANCE.extract(new ContextCarrier().deserialize(serializedContextData)); + ContextManager.extract(new ContextCarrier().deserialize(serializedContextData)); } } @@ -53,19 +53,19 @@ public class MotanProviderInterceptor implements InstanceMethodsAroundIntercepto Object ret) { Response response = (Response) ret; if (response != null && response.getException() != null) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); span.log(response.getException()); Tags.ERROR.set(span, true); } - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - ContextManager.INSTANCE.activeSpan().log(t); + ContextManager.activeSpan().log(t); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptorTest.java index 199c79678..fe25327c8 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanConsumerInterceptorTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.motan; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; @@ -51,6 +52,8 @@ public class MotanConsumerInterceptorTest { @Before public void setUp() { + ServiceStarter.INSTANCE.boot(); + contextListener = new MockTracerContextListener(); invokeInterceptor = new MotanConsumerInterceptor(); url = URL.valueOf("motan://127.0.0.1:34000/com.a.eye.skywalking.test.TestService"); @@ -139,4 +142,4 @@ public class MotanConsumerInterceptorTest { public void tearDown() { TracerContext.ListenerManager.remove(contextListener); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptor.java index 63592cfcd..c0eeb5586 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/main/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptor.java @@ -41,7 +41,7 @@ public class TomcatInterceptor implements InstanceMethodsAroundInterceptor { Object[] args = interceptorContext.allArguments(); HttpServletRequest request = (HttpServletRequest) args[0]; - Span span = ContextManager.INSTANCE.createSpan(request.getRequestURI()); + Span span = ContextManager.createSpan(request.getRequestURI()); Tags.COMPONENT.set(span, TOMCAT_COMPONENT); Tags.PEER_HOST.set(span, fetchRequestPeerHost(request)); Tags.PEER_PORT.set(span, request.getRemotePort()); @@ -51,7 +51,7 @@ public class TomcatInterceptor implements InstanceMethodsAroundInterceptor { String tracingHeaderValue = request.getHeader(HEADER_NAME_OF_CONTEXT_DATA); if (!StringUtil.isEmpty(tracingHeaderValue)) { - ContextManager.INSTANCE.extract(new ContextCarrier().deserialize(tracingHeaderValue)); + ContextManager.extract(new ContextCarrier().deserialize(tracingHeaderValue)); } } @@ -59,21 +59,21 @@ public class TomcatInterceptor implements InstanceMethodsAroundInterceptor { public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { HttpServletResponse response = (HttpServletResponse) interceptorContext.allArguments()[1]; - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); Tags.STATUS_CODE.set(span, response.getStatus()); if (response.getStatus() != 200) { Tags.ERROR.set(span, true); } - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); return ret; } @Override public void handleMethodException(Throwable t, EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext) { - Span span = ContextManager.INSTANCE.activeSpan(); + Span span = ContextManager.activeSpan(); span.log(t); Tags.ERROR.set(span, true); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptorTest.java index 61f8501d8..47c19cc13 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/tomcat-7.x-8.x-plugin/src/test/java/com/a/eye/skywalking/plugin/tomcat78x/TomcatInterceptorTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.tomcat78x; +import com.a.eye.skywalking.api.boot.ServiceStarter; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; @@ -48,6 +49,9 @@ public class TomcatInterceptorTest { @Before public void setUp() throws Exception { + + ServiceStarter.INSTANCE.boot(); + tomcatInterceptor = new TomcatInterceptor(); contextListener = new MockTracerContextListener(); @@ -139,4 +143,4 @@ public class TomcatInterceptorTest { TracerContext.ListenerManager.remove(new MockTracerContextListener()); } -} \ No newline at end of file +} diff --git a/skywalking-sniffer/skywalking-sniffer-mock/pom.xml b/skywalking-sniffer/skywalking-sniffer-mock/pom.xml index b18693f11..0c9310acf 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/pom.xml +++ b/skywalking-sniffer/skywalking-sniffer-mock/pom.xml @@ -9,7 +9,7 @@ 4.0.0 skywalking-sniffer-mock - This is a sniffer mock module, test for test-dependency, only. + This is a sniffer mock module. Simulate a sniffer, assemble one or more trace segments. Test-dependency, only. diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java index f13b49a8f..3407ec21d 100644 --- a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/TraceSegmentBuilderFactory.java @@ -2,9 +2,11 @@ package com.a.eye.skywalking.sniffer.mock.trace; import com.a.eye.skywalking.api.context.TracerContext; import com.a.eye.skywalking.sniffer.mock.context.MockTracerContextListener; +import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.DubboServerMysqlTraceBuilder; import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.SingleTomcat200TraceBuilder; import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.SingleTomcat404TraceBuilder; import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.SingleTomcat500TraceBuilder; +import com.a.eye.skywalking.sniffer.mock.trace.builders.trace.TomcatDubboClientTraceBuilder; import com.a.eye.skywalking.trace.TraceSegment; /** @@ -19,7 +21,6 @@ public enum TraceSegmentBuilderFactory { /** * @see {@link SingleTomcat200TraceBuilder} * - * @return */ public TraceSegment singleTomcat200Trace(){ return this.build(SingleTomcat200TraceBuilder.INSTANCE); @@ -28,7 +29,6 @@ public enum TraceSegmentBuilderFactory { /** * @see {@link SingleTomcat404TraceBuilder} * - * @return */ public TraceSegment singleTomcat404Trace(){ return this.build(SingleTomcat404TraceBuilder.INSTANCE); @@ -37,12 +37,25 @@ public enum TraceSegmentBuilderFactory { /** * @see {@link SingleTomcat500TraceBuilder} * - * @return */ public TraceSegment singleTomcat500Trace(){ return this.build(SingleTomcat500TraceBuilder.INSTANCE); } + /** + * @see {@link TomcatDubboClientTraceBuilder} + */ + public TraceSegment traceOf_Tomcat_DubboClient(){ + return this.build(TomcatDubboClientTraceBuilder.INSTANCE); + } + + /** + * @see {@link DubboServerMysqlTraceBuilder} + */ + public TraceSegment traceOf_DubboServer_MySQL() { + return this.build(DubboServerMysqlTraceBuilder.INSTANCE); + } + private TraceSegment build(TraceSegmentBuilder builder){ MockTracerContextListener listener = new MockTracerContextListener(); try{ diff --git a/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/DubboSpanGenerator.java b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/DubboSpanGenerator.java new file mode 100644 index 000000000..d9c709a2b --- /dev/null +++ b/skywalking-sniffer/skywalking-sniffer-mock/src/main/java/com/a/eye/skywalking/sniffer/mock/trace/builders/span/DubboSpanGenerator.java @@ -0,0 +1,44 @@ +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 DubboSpanGenerator 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 @@ com.a.eye skywalking-toolkit-opentracing ${project.version} + provided diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanFinishInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanFinishInterceptor.java index e008ffcf7..d3a74ec60 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanFinishInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanFinishInterceptor.java @@ -22,9 +22,9 @@ public class SpanFinishInterceptor implements InstanceMethodsAroundInterceptor { Object[] allArguments = interceptorContext.allArguments(); if(allArguments.length == 1) { - ContextManager.INSTANCE.stopSpan(((Long)allArguments[0])); + ContextManager.stopSpan(((Long)allArguments[0])); }else{ - ContextManager.INSTANCE.stopSpan(); + ContextManager.stopSpan(); } return ret; diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanNewInstanceInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanNewInstanceInterceptor.java index 73967ca7a..c1099782b 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanNewInstanceInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanNewInstanceInterceptor.java @@ -19,7 +19,7 @@ public class SpanNewInstanceInterceptor implements InstanceConstructorIntercepto String operationName = ((String)allArguments[0]); long startTime = ((Long)allArguments[1]); Map tags = ((Map)allArguments[2]); - Span span = ContextManager.INSTANCE.createSpan(operationName, startTime); + Span span = ContextManager.createSpan(operationName, startTime); for (Map.Entry entry : tags.entrySet()) { span.setTag(entry.getKey(), entry.getValue()); diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetOperationNameInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetOperationNameInterceptor.java index 7f46ac393..f324ddfd3 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetOperationNameInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetOperationNameInterceptor.java @@ -15,7 +15,7 @@ public class SpanSetOperationNameInterceptor implements InstanceMethodsAroundInt @Override public void beforeMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, MethodInterceptResult result) { String operationName = (String)interceptorContext.allArguments()[0]; - ContextManager.INSTANCE.activeSpan().setOperationName(operationName); + ContextManager.activeSpan().setOperationName(operationName); } @Override diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java index 35d5ae3ec..028ea37c6 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java @@ -21,11 +21,11 @@ public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor { String key = (String)interceptorContext.allArguments()[0]; Object value = interceptorContext.allArguments()[1]; if (value instanceof String) - ContextManager.INSTANCE.activeSpan().setTag(key, (String)value); + ContextManager.activeSpan().setTag(key, (String)value); else if (value instanceof Boolean) - ContextManager.INSTANCE.activeSpan().setTag(key, (Boolean)value); + ContextManager.activeSpan().setTag(key, (Boolean)value); else if (value instanceof Number) - ContextManager.INSTANCE.activeSpan().setTag(key, (Number)value); + ContextManager.activeSpan().setTag(key, (Number)value); } @Override diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java index f8c978c38..9c5c2b181 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessByteBufferContextInterceptor.java @@ -29,7 +29,7 @@ public class TracerExtractCrossProcessByteBufferContextInterceptor implements In ContextCarrier carrier = new ContextCarrier(); carrier.deserialize(contextDataStr); - ContextManager.INSTANCE.extract(carrier); + ContextManager.extract(carrier); return ret; } diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java index 5541a219f..9e4223930 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerExtractCrossProcessTextMapContextInterceptor.java @@ -35,7 +35,7 @@ public class TracerExtractCrossProcessTextMapContextInterceptor implements Insta ContextCarrier carrier = new ContextCarrier(); carrier.deserialize(entry.getValue()); - ContextManager.INSTANCE.extract(carrier); + ContextManager.extract(carrier); } } return ret; diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java index ed87a94d0..9152e6e2c 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/tracer/interceptor/TracerFormatCrossProcessContextInterceptor.java @@ -20,7 +20,7 @@ public class TracerFormatCrossProcessContextInterceptor implements InstanceMetho @Override public Object afterMethod(EnhancedClassInstanceContext context, InstanceMethodInvokeContext interceptorContext, Object ret) { ContextCarrier carrier = new ContextCarrier(); - ContextManager.INSTANCE.inject(carrier); + ContextManager.inject(carrier); return carrier.serialize(); } diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java index d7f8a57c6..f3715e652 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java @@ -2,8 +2,8 @@ package com.a.eye.skywalking.toolkit.activation.trace; import com.a.eye.skywalking.api.context.ContextCarrier; import com.a.eye.skywalking.api.context.ContextManager; -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.plugin.interceptor.enhance.MethodInterceptResult; import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInvokeContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.StaticMethodInvokeContext; @@ -25,7 +25,7 @@ public class TraceContextInterceptor implements StaticMethodsAroundInterceptor { @Override public Object afterMethod(StaticMethodInvokeContext interceptorContext, Object ret) { ContextCarrier carrier = new ContextCarrier(); - ContextManager.INSTANCE.inject(carrier); + ContextManager.inject(carrier); return carrier.getTraceSegmentId(); }