diff --git a/skywalking-collector/pom.xml b/skywalking-collector/pom.xml index 9cb030442..8cb53a051 100644 --- a/skywalking-collector/pom.xml +++ b/skywalking-collector/pom.xml @@ -5,6 +5,7 @@ skywalking-collector-cluster skywalking-collector-worker + skywalking-collector-role skywalking @@ -24,16 +25,16 @@ akka-cluster_2.11 ${akka.version} + + com.a.eye + skywalking-logging-api + ${project.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 index 86c2681eb..7c25882d1 100644 --- a/skywalking-collector/skywalking-collector-cluster/pom.xml +++ b/skywalking-collector/skywalking-collector-cluster/pom.xml @@ -16,15 +16,15 @@ - - com.a.eye - skywalking-util - ${project.version} - com.lmax disruptor 3.3.6 + + com.a.eye + skywalking-util + ${project.version} + diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/CollectorSystem.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/CollectorSystem.java new file mode 100644 index 000000000..ff7bde50c --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/CollectorSystem.java @@ -0,0 +1,76 @@ +package com.a.eye.skywalking.collector; + +import akka.actor.ActorSystem; +import akka.actor.Props; +import com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider; +import com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.UsedRoleNameException; +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.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; +import java.util.ServiceLoader; + +/** + * @author pengys5 + */ +public class CollectorSystem { + private ILog logger = LogManager.getLogger(CollectorSystem.class); + private ClusterWorkerContext clusterContext; + + public ClusterWorkerContext getClusterContext() { + return clusterContext; + } + + public void boot() throws Exception { + createAkkaSystem(); + createListener(); + loadLocalProviders(); + + createClusterWorker(); + } + + public void terminate() { + clusterContext.getAkkaSystem().terminate(); + } + + private void createAkkaSystem() { + 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 akkaSystem = ActorSystem.create("ClusterSystem", config); + + clusterContext = new ClusterWorkerContext(akkaSystem); + } + + private void createListener() { + clusterContext.getAkkaSystem().actorOf(Props.create(WorkersListener.class, clusterContext), WorkersListener.WorkName); + } + + private void createClusterWorker() throws Exception { + ServiceLoader clusterServiceLoader = ServiceLoader.load(AbstractClusterWorkerProvider.class); + for (AbstractClusterWorkerProvider provider : clusterServiceLoader) { + logger.info("create {%s} worker using java service loader", provider.workerNum()); + for (int i = 1; i <= provider.workerNum(); i++) { + provider.create(clusterContext, new LocalWorkerContext()); + } + } + } + + private void loadLocalProviders() throws UsedRoleNameException { + ServiceLoader clusterServiceLoader = ServiceLoader.load(AbstractLocalWorkerProvider.class); + for (AbstractLocalWorkerProvider provider : clusterServiceLoader) { + clusterContext.putProvider(provider); + } + } +} 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 deleted file mode 100644 index 6c848b2e1..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMember.java +++ /dev/null @@ -1,37 +0,0 @@ -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/AbstractClusterWorker.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorker.java new file mode 100644 index 000000000..8caebf18f --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorker.java @@ -0,0 +1,80 @@ +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.cluster.WorkerListenerMessage; +import com.a.eye.skywalking.collector.cluster.WorkersListener; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; + +/** + * @author pengys5 + */ +public abstract class AbstractClusterWorker extends AbstractWorker { + + public AbstractClusterWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + static class WorkerWithAkka extends UntypedActor { + private static ILog logger = LogManager.getLogger(WorkerWithAkka.class); + private Cluster cluster; + private final AbstractClusterWorker ownerWorker; + + public WorkerWithAkka(AbstractClusterWorker ownerWorker) { + this.ownerWorker = ownerWorker; + 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()); + } + + /** + * 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()); + ownerWorker.work(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(ownerWorker.getRole()); + 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/AbstractClusterWorkerProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorkerProvider.java new file mode 100644 index 000000000..b37e87584 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorkerProvider.java @@ -0,0 +1,26 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; +import akka.actor.Props; + +/** + * @author pengys5 + */ +public abstract class AbstractClusterWorkerProvider extends AbstractWorkerProvider { + + public abstract int workerNum(); + + @Override + final public WorkerRef onCreate(ClusterWorkerContext clusterContext, LocalWorkerContext localContext) throws IllegalArgumentException, ProviderNotFountException { + int num = ClusterWorkerRefCounter.INSTANCE.incrementAndGet(role()); + + T clusterWorker = (T) workerInstance(clusterContext); + clusterWorker.preStart(); + + ActorRef actorRef = clusterContext.getAkkaSystem().actorOf(Props.create(AbstractClusterWorker.WorkerWithAkka.class, clusterWorker), role() + "_" + num); + + ClusterWorkerRef workerRef = new ClusterWorkerRef(actorRef, role()); + clusterContext.put(workerRef); + return workerRef; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorker.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorker.java new file mode 100644 index 000000000..b9b167aca --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorker.java @@ -0,0 +1,49 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.lmax.disruptor.EventHandler; +import com.lmax.disruptor.RingBuffer; + +/** + * @author pengys5 + */ +public abstract class AbstractLocalAsyncWorker extends AbstractLocalWorker { + + public AbstractLocalAsyncWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + static class WorkerWithDisruptor implements EventHandler { + + private RingBuffer ringBuffer; + private AbstractLocalAsyncWorker asyncWorker; + + public WorkerWithDisruptor(RingBuffer ringBuffer, AbstractLocalAsyncWorker asyncWorker) { + this.ringBuffer = ringBuffer; + this.asyncWorker = asyncWorker; + } + + public void onEvent(MessageHolder event, long sequence, boolean endOfBatch) { + try { + Object message = event.getMessage(); + event.reset(); + asyncWorker.work(message); + if (endOfBatch) { + asyncWorker.work(new EndOfBatchCommand()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void tell(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/AbstractLocalAsyncWorkerProvider.java similarity index 50% rename from skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractAsyncMemberProvider.java rename to skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorkerProvider.java index 19ac1d319..9633e8d31 100644 --- 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/AbstractLocalAsyncWorkerProvider.java @@ -1,44 +1,43 @@ 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 class AbstractLocalAsyncWorkerProvider extends AbstractLocalWorkerProvider { 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); + final public WorkerRef onCreate(ClusterWorkerContext clusterContext, LocalWorkerContext localContext) throws IllegalArgumentException, ProviderNotFountException { + T localAsyncWorker = (T) workerInstance(clusterContext); + localAsyncWorker.preStart(); // Specify the size of the ring buffer, must be power of 2. int bufferSize = queueSize(); + if (!((((bufferSize - 1) & bufferSize) == 0) && bufferSize != 0)) { + throw new IllegalArgumentException("queue size must be power of 2"); + } + // Construct the Disruptor Disruptor disruptor = new Disruptor(MessageHolderFactory.INSTANCE, bufferSize, DaemonThreadFactory.INSTANCE); RingBuffer ringBuffer = disruptor.getRingBuffer(); - T member = (T) memberConstructor.newInstance(ringBuffer, actorRef); + T.WorkerWithDisruptor disruptorWorker = new T.WorkerWithDisruptor(ringBuffer, localAsyncWorker); // Connect the handler - disruptor.handleEventsWith(member); + disruptor.handleEventsWith(disruptorWorker); // Start the Disruptor, starts all threads running disruptor.start(); - return member; + + LocalAsyncWorkerRef workerRef = new LocalAsyncWorkerRef(role(), disruptorWorker); + localContext.put(workerRef); + return workerRef; } } diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalSyncWorker.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalSyncWorker.java new file mode 100644 index 000000000..09817d04f --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalSyncWorker.java @@ -0,0 +1,10 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public abstract class AbstractLocalSyncWorker extends AbstractLocalWorker { + public AbstractLocalSyncWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalSyncWorkerProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalSyncWorkerProvider.java new file mode 100644 index 000000000..20e50854c --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalSyncWorkerProvider.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public abstract class AbstractLocalSyncWorkerProvider extends AbstractLocalWorkerProvider { + + @Override + final public WorkerRef onCreate(ClusterWorkerContext clusterContext, LocalWorkerContext localContext) throws IllegalArgumentException, ProviderNotFountException { + T localSyncWorker = (T) workerInstance(clusterContext); + localSyncWorker.preStart(); + + LocalSyncWorkerRef workerRef = new LocalSyncWorkerRef(role(), localSyncWorker); + localContext.put(workerRef); + return workerRef; + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalWorker.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalWorker.java new file mode 100644 index 000000000..f939e9fa8 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalWorker.java @@ -0,0 +1,10 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public abstract class AbstractLocalWorker extends AbstractWorker { + public AbstractLocalWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalWorkerProvider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalWorkerProvider.java new file mode 100644 index 000000000..eefe7f412 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractLocalWorkerProvider.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public abstract class AbstractLocalWorkerProvider extends AbstractWorkerProvider { +} 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 deleted file mode 100644 index 81188e0c9..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMember.java +++ /dev/null @@ -1,52 +0,0 @@ -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 deleted file mode 100644 index a78824a80..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractMemberProvider.java +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index 68adfd163..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMember.java +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index fb83086a7..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/AbstractSyncMemberProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -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 index 8216a51f2..a3ae9f3f2 100644 --- 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 @@ -1,118 +1,34 @@ 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 { +public abstract class AbstractWorker { + private final LocalWorkerContext selfContext; - private ILog logger = LogManager.getLogger(AbstractWorker.class); + private final Role role; - private Cluster cluster = Cluster.get(getContext().system()); + private final ClusterWorkerContext clusterContext; - @Override - public void preStart() throws Exception { - cluster.subscribe(getSelf(), ClusterEvent.MemberUp.class); + public AbstractWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + this.role = role; + this.clusterContext = clusterContext; + this.selfContext = selfContext; } - @Override - public void postStop() throws Exception { - cluster.unsubscribe(getSelf()); + public abstract void preStart() throws ProviderNotFountException; + + public abstract void work(Object message) throws Exception; + + final public LocalWorkerContext getSelfContext() { + return selfContext; } - /** - * 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); - } + final public ClusterWorkerContext getClusterContext() { + return clusterContext; } - /** - * 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()); - } + final public Role getRole() { + return role; } } 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 index f5f829da4..dd0b4aee8 100644 --- 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 @@ -1,59 +1,20 @@ 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 AbstractWorkerProvider implements Provider { - public abstract Class workerClass(); + public abstract Role role(); - public abstract int workerNum(); + public abstract T workerInstance(ClusterWorkerContext clusterContext); - public void createWorker(ActorSystem system) { - if (workerClass() == null) { - throw new IllegalArgumentException("cannot createInstance() with nothing obtained from workerClass()"); + public abstract WorkerRef onCreate(ClusterWorkerContext clusterContext, LocalWorkerContext localContext) throws IllegalArgumentException, ProviderNotFountException; + + final public WorkerRef create(ClusterWorkerContext clusterContext, LocalWorkerContext localContext) throws IllegalArgumentException, ProviderNotFountException { + if (workerInstance(clusterContext) == null) { + throw new IllegalArgumentException("cannot get worker instance with nothing obtained from workerInstance()"); } - 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(); + return onCreate(clusterContext, localContext); } } diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerContext.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerContext.java new file mode 100644 index 000000000..1d937c086 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerContext.java @@ -0,0 +1,45 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorSystem; + +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author pengys5 + */ +public class ClusterWorkerContext extends WorkerContext { + private ILog logger = LogManager.getLogger(ClusterWorkerContext.class); + private final ActorSystem akkaSystem; + private Map providers = new ConcurrentHashMap<>(); + + public ClusterWorkerContext(ActorSystem akkaSystem) { + this.akkaSystem = akkaSystem; + } + + public ActorSystem getAkkaSystem() { + return akkaSystem; + } + + @Override + public AbstractWorkerProvider findProvider(Role role) throws ProviderNotFountException { + logger.debug("find role of %s provider from ClusterWorkerContext", role.roleName()); + if (providers.containsKey(role.roleName())) { + return providers.get(role.roleName()); + } else { + throw new ProviderNotFountException("role=" + role.roleName() + ", no available provider."); + } + } + + @Override + public void putProvider(AbstractWorkerProvider provider) throws UsedRoleNameException { + logger.debug("put role of %s provider into ClusterWorkerContext", provider.role().roleName()); + if (providers.containsKey(provider.role().roleName())) { + throw new UsedRoleNameException("provider with role=" + provider.role().roleName() + " duplicate each other."); + } else { + providers.put(provider.role().roleName(), provider); + } + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerRef.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerRef.java new file mode 100644 index 000000000..c0355f7eb --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerRef.java @@ -0,0 +1,21 @@ +package com.a.eye.skywalking.collector.actor; + +import akka.actor.ActorRef; + +/** + * @author pengys5 + */ +public class ClusterWorkerRef extends WorkerRef { + + private ActorRef actorRef; + + public ClusterWorkerRef(ActorRef actorRef, Role role) { + super(role); + this.actorRef = actorRef; + } + + @Override + public void tell(Object message) { + actorRef.tell(message, ActorRef.noSender()); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerRefCounter.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerRefCounter.java new file mode 100644 index 000000000..18cfb6c9e --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ClusterWorkerRefCounter.java @@ -0,0 +1,22 @@ +package com.a.eye.skywalking.collector.actor; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author pengys5 + */ +public enum ClusterWorkerRefCounter { + INSTANCE; + + private Map counter = new ConcurrentHashMap<>(); + + public int incrementAndGet(Role role) { + if (!counter.containsKey(role.roleName())) { + AtomicInteger atomic = new AtomicInteger(0); + counter.putIfAbsent(role.roleName(), atomic); + } + return counter.get(role.roleName()).incrementAndGet(); + } +} 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 deleted file mode 100644 index 7e35737d1..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/CollectorBootstrap.java +++ /dev/null @@ -1,10 +0,0 @@ -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/Context.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Context.java new file mode 100644 index 000000000..9cd13576e --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Context.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public interface Context { + + AbstractWorkerProvider findProvider(Role role) throws ProviderNotFountException; + + void putProvider(AbstractWorkerProvider provider) throws UsedRoleNameException; + + WorkerRefs lookup(Role role) throws WorkerNotFountException; + + void put(WorkerRef workerRef); + + void remove(WorkerRef workerRef); +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalAsyncWorkerRef.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalAsyncWorkerRef.java new file mode 100644 index 000000000..a9fb5c4bc --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalAsyncWorkerRef.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public class LocalAsyncWorkerRef extends WorkerRef { + + private AbstractLocalAsyncWorker.WorkerWithDisruptor workerWithDisruptor; + + public LocalAsyncWorkerRef(Role role, AbstractLocalAsyncWorker.WorkerWithDisruptor workerWithDisruptor) { + super(role); + this.workerWithDisruptor = workerWithDisruptor; + } + + @Override + public void tell(Object message) throws Exception { + workerWithDisruptor.tell(message); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalSyncWorkerRef.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalSyncWorkerRef.java new file mode 100644 index 000000000..9d6427a53 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalSyncWorkerRef.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public class LocalSyncWorkerRef extends WorkerRef { + + private AbstractLocalSyncWorker localSyncWorker; + + public LocalSyncWorkerRef(Role role, AbstractLocalSyncWorker localSyncWorker) { + super(role); + this.localSyncWorker = localSyncWorker; + } + + @Override + public void tell(Object message) throws Exception { + localSyncWorker.work(message); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalWorkerContext.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalWorkerContext.java new file mode 100644 index 000000000..09b3db05a --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/LocalWorkerContext.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public class LocalWorkerContext extends WorkerContext { + + @Override + final public AbstractWorkerProvider findProvider(Role role) throws ProviderNotFountException { + return null; + } + + @Override + final public void putProvider(AbstractWorkerProvider provider) throws UsedRoleNameException { + + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Provider.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Provider.java new file mode 100644 index 000000000..dbe8de929 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Provider.java @@ -0,0 +1,9 @@ +package com.a.eye.skywalking.collector.actor; + +/** + * @author pengys5 + */ +public interface Provider { + + WorkerRef create(ClusterWorkerContext clusterContext, LocalWorkerContext localContext) throws Exception; +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ProviderNotFountException.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ProviderNotFountException.java new file mode 100644 index 000000000..6a0917dc0 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/ProviderNotFountException.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.actor; + +public class ProviderNotFountException extends Exception { + public ProviderNotFountException(String message){ + super(message); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Role.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Role.java new file mode 100644 index 000000000..7255d98ea --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Role.java @@ -0,0 +1,13 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; + +/** + * @author pengys5 + */ +public interface Role { + + String roleName(); + + WorkerSelector workerSelector(); +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/UsedRoleNameException.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/UsedRoleNameException.java new file mode 100644 index 000000000..a597b7f6f --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/UsedRoleNameException.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.actor; + +public class UsedRoleNameException extends Exception { + public UsedRoleNameException(String message){ + super(message); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerContext.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerContext.java new file mode 100644 index 000000000..3573067ef --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerContext.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.actor; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author pengys5 + */ +public abstract class WorkerContext implements Context { + + private Map> roleWorkers = new ConcurrentHashMap<>(); + + @Override + final public WorkerRefs lookup(Role role) throws WorkerNotFountException { + if (roleWorkers.containsKey(role.roleName())) { + WorkerRefs refs = new WorkerRefs(roleWorkers.get(role.roleName()), role.workerSelector()); + return refs; + } else { + throw new WorkerNotFountException("role=" + role.roleName() + ", no available worker."); + } + } + + @Override + final public void put(WorkerRef workerRef) { + if (!roleWorkers.containsKey(workerRef.getRole().roleName())) { + roleWorkers.putIfAbsent(workerRef.getRole().roleName(), new ArrayList()); + } + roleWorkers.get(workerRef.getRole().roleName()).add(workerRef); + } + + @Override + final public void remove(WorkerRef workerRef) { + roleWorkers.remove(workerRef.getRole().roleName()); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerNotFountException.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerNotFountException.java new file mode 100644 index 000000000..d3944592e --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerNotFountException.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.actor; + +public class WorkerNotFountException extends Exception { + public WorkerNotFountException(String message){ + super(message); + } +} 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 index 92637fe8d..5c9ae2585 100644 --- 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 @@ -1,37 +1,18 @@ 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); +public abstract class WorkerRef { + private Role role; - final ActorRef actorRef; - - final String workerRole; - - public WorkerRef(ActorRef actorRef, String workerRole) { - this.actorRef = actorRef; - this.workerRole = workerRole; + public WorkerRef(Role role) { + this.role = role; } - void tell(Object message, ActorRef sender) { - logger.debug("tell %s worker", actorRef.toString()); - actorRef.tell(message, sender); + final public Role getRole() { + return role; } - public ActorPath path() { - return actorRef.path(); - } - - public String getWorkerRole() { - return workerRole; - } + public abstract void tell(Object message) throws Exception; } diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerRefs.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerRefs.java new file mode 100644 index 000000000..3de8cf501 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkerRefs.java @@ -0,0 +1,28 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; + +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import java.util.List; + +/** + * @author pengys5 + */ +public class WorkerRefs { + + private static ILog logger = LogManager.getLogger(WorkerRefs.class); + + private List workerRefs; + private WorkerSelector workerSelector; + + protected WorkerRefs(List workerRefs, WorkerSelector workerSelector) { + this.workerRefs = workerRefs; + this.workerSelector = workerSelector; + } + + public void tell(Object message) throws Exception { + logger.debug("WorkerSelector instance of %s", workerSelector.getClass()); + workerSelector.select(workerRefs, message).tell(message); + } +} 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 deleted file mode 100644 index 550956f8c..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/WorkersCreator.java +++ /dev/null @@ -1,36 +0,0 @@ -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/HashCodeSelector.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelector.java index 61877163d..a3d46df68 100644 --- 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 @@ -1,32 +1,23 @@ 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; +public class HashCodeSelector implements WorkerSelector { - /** - * 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); + if (message instanceof AbstractHashMessage) { + AbstractHashMessage hashMessage = (AbstractHashMessage) message; + int size = members.size(); + int selectIndex = Math.abs(hashMessage.getHashCode()) % size; + return members.get(selectIndex); + } else { + throw new IllegalArgumentException("the message send into HashCodeSelector must implementation of AbstractHashMessage"); + } } } 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 index 0de97621f..ec0f89822 100644 --- 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 @@ -1,31 +1,16 @@ 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 + * @author pengys5 */ -public enum RollingSelector implements WorkerSelector { - INSTANCE; +public class RollingSelector implements WorkerSelector { - /** - * 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(); 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 index 3e6d20f84..c7a607f47 100644 --- 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 @@ -1,25 +1,12 @@ 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 + * @author pengys5 */ -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); +public interface WorkerSelector { + T select(List members, Object 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 index 4bf9ac303..3f144e55a 100644 --- 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 @@ -1,5 +1,7 @@ package com.a.eye.skywalking.collector.cluster; +import com.a.eye.skywalking.collector.actor.Role; + import java.io.Serializable; /** @@ -12,14 +14,14 @@ import java.io.Serializable; public class WorkerListenerMessage { public static class RegisterMessage implements Serializable { - public final String workRole; + private final Role role; - public RegisterMessage(String workRole) { - this.workRole = workRole; + public RegisterMessage(Role role) { + this.role = role; } - public String getWorkRole() { - return workRole; + public Role getRole() { + return role; } } } 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 index 244c57645..b49f60f6e 100644 --- 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 @@ -7,6 +7,12 @@ import akka.cluster.Cluster; import akka.cluster.ClusterEvent; import com.a.eye.skywalking.logging.ILog; import com.a.eye.skywalking.logging.LogManager; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.ClusterWorkerRef; + +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * WorkersListener listening the register message from workers @@ -14,9 +20,9 @@ import com.a.eye.skywalking.logging.LogManager; * and terminated message from akka cluster. *

* when listened register message then begin to watch the state for this worker - * and register to {@link WorkersRefCenter}. + * and register to {@link ClusterWorkerContext} and {@link #relation}. *

- * when listened terminate message then unregister from {@link WorkersRefCenter}. + * when listened terminate message then unregister from {@link ClusterWorkerContext} and {@link #relation} . * * @author pengys5 */ @@ -28,6 +34,14 @@ public class WorkersListener extends UntypedActor { private Cluster cluster = Cluster.get(getContext().system()); + private Map relation = new ConcurrentHashMap<>(); + + private final ClusterWorkerContext clusterContext; + + public WorkersListener(ClusterWorkerContext clusterContext) { + this.clusterContext = clusterContext; + } + @Override public void preStart() throws Exception { cluster.subscribe(getSelf(), ClusterEvent.UnreachableMember.class); @@ -38,14 +52,26 @@ public class WorkersListener extends UntypedActor { 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()); +// logger.info("register worker of role: %s, path: %s", register.getWorkRole(), sender.toString()); + ClusterWorkerRef workerRef = new ClusterWorkerRef(sender, register.getRole()); + relation.put(sender, workerRef); + clusterContext.put(new ClusterWorkerRef(sender, register.getRole())); } else if (message instanceof Terminated) { Terminated terminated = (Terminated) message; - WorkersRefCenter.INSTANCE.unregister(terminated.getActor()); + clusterContext.remove(relation.get(terminated.getActor())); + relation.remove(terminated.getActor()); } else if (message instanceof ClusterEvent.UnreachableMember) { ClusterEvent.UnreachableMember unreachableMember = (ClusterEvent.UnreachableMember) message; - WorkersRefCenter.INSTANCE.unregister(unreachableMember.member().address()); + + Iterator> iterator = relation.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry next = iterator.next(); + + if (next.getKey().path().address().equals(unreachableMember.member().address())) { + clusterContext.remove(next.getValue()); + iterator.remove(); + } + } } 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 deleted file mode 100644 index e601652e5..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenter.java +++ /dev/null @@ -1,77 +0,0 @@ -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/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 deleted file mode 100644 index cc08b8bc5..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java +++ /dev/null @@ -1,60 +0,0 @@ -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 deleted file mode 100644 index 0ee6d4345..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorker.java +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index a76c33adc..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactory.java +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index a11db6d8b..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/SpiTestWorkerFactoryTestCase.java +++ /dev/null @@ -1,38 +0,0 @@ -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/TestClusterWorker.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorker.java new file mode 100644 index 000000000..aeee348fe --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorker.java @@ -0,0 +1,68 @@ +package com.a.eye.skywalking.collector.actor; + + +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; + +/** + * @author pengys5 + */ +public class TestClusterWorker extends AbstractClusterWorker { + + public TestClusterWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(TestLocalSyncWorker.TestLocalSyncWorkerRole.INSTANCE).create(getClusterContext(), getSelfContext()); + getClusterContext().findProvider(TestLocalAsyncWorker.TestLocalASyncWorkerRole.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { + if (message.equals("Print")) { + System.out.println(message); + } else if (message.equals("TellLocalWorker")) { + System.out.println(message); + getSelfContext().lookup(TestLocalSyncWorker.TestLocalSyncWorkerRole.INSTANCE).tell(message); + } else if (message.equals("TellLocalAsyncWorker")) { + System.out.println(message); + getSelfContext().lookup(TestLocalAsyncWorker.TestLocalASyncWorkerRole.INSTANCE).tell(message); + } else { + System.out.println("unhandled"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + + @Override + public int workerNum() { + return 5; + } + + @Override + public Role role() { + return TestClusterWorkerRole.INSTANCE; + } + + @Override + public TestClusterWorker workerInstance(ClusterWorkerContext clusterContext) { + return new TestClusterWorker(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum TestClusterWorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return TestClusterWorker.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorkerTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorkerTestCase.java new file mode 100644 index 000000000..3b056621d --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorkerTestCase.java @@ -0,0 +1,32 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.CollectorSystem; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class TestClusterWorkerTestCase { + + private CollectorSystem collectorSystem; + + public void createSystem() throws Exception { + collectorSystem = new CollectorSystem(); + collectorSystem.boot(); + } + + public void terminateSystem() { + collectorSystem.terminate(); + } + + public void testTellWorker() throws Exception { + WorkerRefs workerRefs = collectorSystem.getClusterContext().lookup(TestClusterWorker.TestClusterWorkerRole.INSTANCE); + workerRefs.tell("Print"); + workerRefs.tell("TellLocalWorker"); + workerRefs.tell("TellLocalAsyncWorker"); + + Thread.sleep(5000); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalAsyncWorker.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalAsyncWorker.java new file mode 100644 index 000000000..e2e07a13d --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalAsyncWorker.java @@ -0,0 +1,58 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; + +/** + * @author pengys5 + */ +public class TestLocalAsyncWorker extends AbstractLocalAsyncWorker { + + public TestLocalAsyncWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFountException { + + } + + @Override + public void work(Object message) throws Exception { + if (message.equals("TellLocalAsyncWorker")) { + System.out.println("hello async!"); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + @Override + public int queueSize() { + return 1024; + } + + @Override + public Role role() { + return TestLocalASyncWorkerRole.INSTANCE; + } + + @Override + public TestLocalAsyncWorker workerInstance(ClusterWorkerContext clusterContext) { + return new TestLocalAsyncWorker(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum TestLocalASyncWorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return TestLocalAsyncWorker.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorker.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorker.java new file mode 100644 index 000000000..51128712f --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorker.java @@ -0,0 +1,54 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; + +/** + * @author pengys5 + */ +public class TestLocalSyncWorker extends AbstractLocalSyncWorker { + + public TestLocalSyncWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFountException { + + } + + @Override + public void work(Object message) throws Exception { + if (message.equals("TellLocalWorker")) { + System.out.println("hello! "); + } else { + System.out.println("unhandled"); + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + @Override + public Role role() { + return TestLocalSyncWorkerRole.INSTANCE; + } + + @Override + public TestLocalSyncWorker workerInstance(ClusterWorkerContext clusterContext) { + return new TestLocalSyncWorker(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum TestLocalSyncWorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return TestLocalSyncWorker.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java new file mode 100644 index 000000000..9f61ccadc --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java @@ -0,0 +1,25 @@ +package com.a.eye.skywalking.collector.actor; + +import com.a.eye.skywalking.collector.CollectorSystem; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class TestLocalSyncWorkerTestCase { + + @Before + public void createSystem() throws Exception { + } + + @After + public void terminateSystem() { + + } + + @Test + public void testTellWorker() throws Exception { + } +} 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 deleted file mode 100644 index 4d4c0f0e5..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/WorkersCreatorTestCase.java +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index 528fe199b..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/CollectorConfigTestCase.java +++ /dev/null @@ -1,41 +0,0 @@ -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 deleted file mode 100644 index 01a4ae2ef..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkerListenerTestCase.java +++ /dev/null @@ -1,62 +0,0 @@ -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 deleted file mode 100644 index 5231ec9dc..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/cluster/WorkersRefCenterTestCase.java +++ /dev/null @@ -1,88 +0,0 @@ -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/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider b/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider new file mode 100644 index 000000000..7749305a1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider @@ -0,0 +1 @@ +com.a.eye.skywalking.collector.actor.TestClusterWorker$Factory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider b/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider new file mode 100644 index 000000000..a4384dcda --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider @@ -0,0 +1,2 @@ +com.a.eye.skywalking.collector.actor.TestLocalSyncWorker$Factory +com.a.eye.skywalking.collector.actor.TestLocalAsyncWorker$Factory \ No newline at end of file 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 deleted file mode 100644 index 8d06ff8e3..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider +++ /dev/null @@ -1 +0,0 @@ -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 index 79fd12aba..b56848752 100644 --- a/skywalking-collector/skywalking-collector-cluster/src/test/resources/application.conf +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/application.conf @@ -5,15 +5,33 @@ akka { 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 -// "java.io.Serializable" = none +// "com.a.eye.skywalking.messages.ISerializable" = data +// "com.google.gson.JsonObject" = json + // "java.io.Serializable" = none } -// serialize-messages = on + // 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-cluster/src/test/resources/collector.config b/skywalking-collector/skywalking-collector-cluster/src/test/resources/collector.config index 06d518f56..590688c07 100644 --- a/skywalking-collector/skywalking-collector-cluster/src/test/resources/collector.config +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/collector.config @@ -1,5 +1,5 @@ -cluster.current.hostname = 192.168.0.1 +cluster.current.hostname = 127.0.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 +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-cluster/src/test/resources/log4j2.xml b/skywalking-collector/skywalking-collector-cluster/src/test/resources/log4j2.xml index fd313a5d2..e8fc5bbdb 100644 --- a/skywalking-collector/skywalking-collector-cluster/src/test/resources/log4j2.xml +++ b/skywalking-collector/skywalking-collector-cluster/src/test/resources/log4j2.xml @@ -1,12 +1,12 @@ - + - + diff --git a/skywalking-collector/skywalking-collector-role/pom.xml b/skywalking-collector/skywalking-collector-role/pom.xml new file mode 100644 index 000000000..bbec608d1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-role/pom.xml @@ -0,0 +1,22 @@ + + + + skywalking-collector + com.a.eye + 3.0-2017 + + 4.0.0 + + skywalking-collector-role + jar + + + + com.a.eye + skywalking-collector-cluster + ${project.version} + + + \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-role/src/main/java/com/a/eye/skywalking/collector/role/TraceSegmentReceiverRole.java b/skywalking-collector/skywalking-collector-role/src/main/java/com/a/eye/skywalking/collector/role/TraceSegmentReceiverRole.java new file mode 100644 index 000000000..1e77636ff --- /dev/null +++ b/skywalking-collector/skywalking-collector-role/src/main/java/com/a/eye/skywalking/collector/role/TraceSegmentReceiverRole.java @@ -0,0 +1,22 @@ +package com.a.eye.skywalking.collector.role; + +import com.a.eye.skywalking.collector.actor.Role; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; + +/** + * @author pengys5 + */ +public enum TraceSegmentReceiverRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return "TraceSegmentReceiver"; + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/pom.xml b/skywalking-collector/skywalking-collector-worker/pom.xml index a152acc90..88b0d3ccf 100644 --- a/skywalking-collector/skywalking-collector-worker/pom.xml +++ b/skywalking-collector/skywalking-collector-worker/pom.xml @@ -28,6 +28,16 @@ skywalking-logging-log4j2 ${project.version} + + com.a.eye + skywalking-collector-role + ${project.version} + + + org.nanohttpd + nanohttpd + 2.3.1 + com.google.code.gson gson 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 index d7b73c605..c823ada00 100644 --- 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 @@ -1,28 +1,30 @@ 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.actor.*; 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 { +public abstract class AnalysisMember extends AbstractLocalAsyncWorker { private Logger logger = LogManager.getFormatterLogger(AnalysisMember.class); - public AnalysisMember(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public AnalysisMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } public abstract void analyse(Object message) throws Exception; @Override - public void receive(Object message) throws Exception { + public void preStart() throws ProviderNotFountException { + + } + + @Override + public void work(Object message) throws Exception { if (message instanceof EndOfBatchCommand) { aggregation(); } else { 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 index a60907557..c5b422892 100644 --- 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 @@ -1,24 +1,24 @@ 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.a.eye.skywalking.collector.worker.httpserver.HttpServer; 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 { + /** + * TODO pengys5, make the exception clear. + * @param args + * @throws Exception + */ + public static void main(String[] args) throws Exception { LogManager.setLogResolver(new Log4j2Resolver()); ClusterConfigInitializer.initialize("collector.config"); @@ -30,8 +30,9 @@ public class CollectorBootStartUp { 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(); +// ActorSystem system = ActorSystem.create(ClusterConfig.Cluster.appname, config); +// WorkersCreator.INSTANCE.boot(system); + HttpServer.INSTANCE.boot(); +// EsClient.boot(); } } 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 index 8dd0a9eda..113627fbd 100644 --- 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 @@ -1,6 +1,9 @@ package com.a.eye.skywalking.collector.worker; import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.Role; 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; @@ -17,8 +20,8 @@ public abstract class MetricAnalysisMember extends AnalysisMember { protected MetricPersistenceData persistenceData = new MetricPersistenceData(); - public MetricAnalysisMember(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public MetricAnalysisMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } public void setMetric(String id, int second, Long value) throws Exception { 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 index d1e88f573..acc9c0bca 100644 --- 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 @@ -1,11 +1,11 @@ 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.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.Role; 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; @@ -28,8 +28,8 @@ public abstract class MetricPersistenceMember extends PersistenceMember { protected MetricPersistenceData persistenceData = new MetricPersistenceData(); - public MetricPersistenceMember(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public MetricPersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override 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 index b777db0bb..5bcb3fb54 100644 --- 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 @@ -1,22 +1,19 @@ 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.actor.*; 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 { +public abstract class PersistenceMember extends AbstractLocalAsyncWorker { private Logger logger = LogManager.getFormatterLogger(PersistenceMember.class); - public PersistenceMember(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public PersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } public abstract String esIndex(); @@ -26,7 +23,12 @@ public abstract class PersistenceMember extends AbstractAsyncMember { public abstract void analyse(Object message) throws Exception; @Override - public void receive(Object message) throws Exception { + public void preStart() throws ProviderNotFountException { + + } + + @Override + public void work(Object message) throws Exception { if (message instanceof EndOfBatchCommand) { persistence(); } else { 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 index 272cc9656..69a4fde43 100644 --- 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 @@ -1,6 +1,9 @@ package com.a.eye.skywalking.collector.worker; import akka.actor.ActorRef; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.Role; 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; @@ -18,8 +21,8 @@ public abstract class RecordAnalysisMember extends AnalysisMember { private RecordPersistenceData persistenceData = new RecordPersistenceData(); - public RecordAnalysisMember(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public RecordAnalysisMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } public void setRecord(String id, JsonObject record) throws Exception { 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 index 36db75d24..108b6a896 100644 --- 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 @@ -1,11 +1,11 @@ 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.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.Role; 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; @@ -24,8 +24,8 @@ public abstract class RecordPersistenceMember extends PersistenceMember { protected RecordPersistenceData persistenceData = new RecordPersistenceData(); - public RecordPersistenceMember(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public RecordPersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override 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 index d488088a7..0edc51612 100644 --- 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 @@ -1,9 +1,9 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,40 +11,40 @@ import com.a.eye.skywalking.collector.worker.application.analysis.ResponseSummar 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.TraceSegment; import com.a.eye.skywalking.trace.TraceSegmentRef; import com.a.eye.skywalking.trace.tag.Tags; +import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class ApplicationMain extends AbstractSyncMember { +public class ApplicationMain extends AbstractLocalSyncWorker { 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); + public ApplicationMain(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Exception { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(DAGNodeAnalysis.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + getClusterContext().findProvider(NodeInstanceAnalysis.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + getClusterContext().findProvider(ResponseCostAnalysis.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + getClusterContext().findProvider(ResponseSummaryAnalysis.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + getClusterContext().findProvider(TraceSegmentRecordPersistence.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(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); + getSelfContext().lookup(TraceSegmentRecordPersistence.Role.INSTANCE).tell(traceSegment); sendToDAGNodePersistence(traceSegment); sendToNodeInstanceAnalysis(traceSegment); @@ -53,12 +53,31 @@ public class ApplicationMain extends AbstractSyncMember { } } - public static class Factory extends AbstractSyncMemberProvider { + public static class Factory extends AbstractLocalSyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return ApplicationMain.class; + public Role role() { + return null; + } + + @Override + public ApplicationMain workerInstance(ClusterWorkerContext clusterContext) { + return new ApplicationMain(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ApplicationMain.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); } } @@ -75,18 +94,21 @@ public class ApplicationMain extends AbstractSyncMember { } DAGNodeAnalysis.Metric node = new DAGNodeAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, component, layer); - dagNodeAnalysis.beTold(node); + getSelfContext().lookup(DAGNodeAnalysis.Role.INSTANCE).tell(node); } private void sendToNodeInstanceAnalysis(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { - TraceSegmentRef traceSegmentRef = traceSegment.getTraceSegment().getPrimaryRef(); + TraceSegment segment = traceSegment.getTraceSegment(); + List refs = segment.getRefs(); - if (traceSegmentRef != null && !StringUtil.isEmpty(traceSegmentRef.getApplicationCode())) { - String code = traceSegmentRef.getApplicationCode(); - String address = traceSegmentRef.getPeerHost(); + if (refs != null) { + for (TraceSegmentRef ref : refs) { + String code = segment.getApplicationCode(); + String address = ref.getPeerHost(); - NodeInstanceAnalysis.Metric property = new NodeInstanceAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, address); - nodeInstanceAnalysis.beTold(property); + NodeInstanceAnalysis.Metric property = new NodeInstanceAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, address); + getSelfContext().lookup(NodeInstanceAnalysis.Role.INSTANCE).tell(property); + } } } @@ -106,7 +128,7 @@ public class ApplicationMain extends AbstractSyncMember { } ResponseCostAnalysis.Metric cost = new ResponseCostAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, isError, startTime, endTime); - responseCostAnalysis.beTold(cost); + getSelfContext().lookup(ResponseCostAnalysis.Role.INSTANCE).tell(cost); } private void sendToResponseSummaryPersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { @@ -120,6 +142,6 @@ public class ApplicationMain extends AbstractSyncMember { } ResponseSummaryAnalysis.Metric summary = new ResponseSummaryAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, isError); - responseSummaryAnalysis.beTold(summary); + getSelfContext().lookup(ResponseSummaryAnalysis.Role.INSTANCE).tell(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 index 4f409a542..f91a5785c 100644 --- 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 @@ -1,16 +1,16 @@ 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.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; -import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -21,8 +21,8 @@ public class DAGNodeAnalysis extends RecordAnalysisMember { private Logger logger = LogManager.getFormatterLogger(DAGNodeAnalysis.class); - public DAGNodeAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public DAGNodeAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -47,16 +47,21 @@ public class DAGNodeAnalysis extends RecordAnalysisMember { protected void aggregation() throws Exception { RecordData oneRecord; while ((oneRecord = pushOne()) != null) { - tell(DAGNodeReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneRecord); + getClusterContext().lookup(DAGNodeReceiver.Role.INSTANCE).tell(oneRecord); } } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return DAGNodeAnalysis.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public DAGNodeAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new DAGNodeAnalysis(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -65,6 +70,20 @@ public class DAGNodeAnalysis extends RecordAnalysisMember { } } + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return DAGNodeAnalysis.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } + public static class Metric extends AbstractTimeSlice { private final String code; private final String component; 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 index fe7dd8d92..56aeeb0aa 100644 --- 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 @@ -1,9 +1,10 @@ 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.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; -import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,7 +12,6 @@ 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; @@ -22,8 +22,8 @@ public class NodeInstanceAnalysis extends RecordAnalysisMember { private Logger logger = LogManager.getFormatterLogger(NodeInstanceAnalysis.class); - public NodeInstanceAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public NodeInstanceAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -47,16 +47,21 @@ public class NodeInstanceAnalysis extends RecordAnalysisMember { protected void aggregation() throws Exception { RecordData oneRecord; while ((oneRecord = pushOne()) != null) { - tell(NodeInstanceReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneRecord); + getClusterContext().lookup(NodeInstanceReceiver.Role.INSTANCE).tell(oneRecord); } } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return NodeInstanceAnalysis.class; + public Role role() { + return null; + } + + @Override + public NodeInstanceAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeInstanceAnalysis(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -65,7 +70,21 @@ public class NodeInstanceAnalysis extends RecordAnalysisMember { } } - public static class Metric extends AbstractTimeSlice{ + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeInstanceAnalysis.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } + + public static class Metric extends AbstractTimeSlice { private final String code; private final String 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 index 8eba11256..fd31469d5 100644 --- 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 @@ -1,15 +1,15 @@ 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.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; -import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -20,8 +20,8 @@ public class ResponseCostAnalysis extends MetricAnalysisMember { private Logger logger = LogManager.getFormatterLogger(ResponseCostAnalysis.class); - public ResponseCostAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public ResponseCostAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -41,16 +41,21 @@ public class ResponseCostAnalysis extends MetricAnalysisMember { protected void aggregation() throws Exception { MetricData oneMetric; while ((oneMetric = pushOne()) != null) { - tell(ResponseCostReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneMetric); + getClusterContext().lookup(ResponseCostReceiver.Role.INSTANCE).tell(oneMetric); } } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return ResponseCostAnalysis.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public ResponseCostAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new ResponseCostAnalysis(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -59,6 +64,20 @@ public class ResponseCostAnalysis extends MetricAnalysisMember { } } + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ResponseCostAnalysis.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } + public static class Metric extends AbstractTimeSlice { private final String code; private final Boolean isError; 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 index 08a360177..9dae5cccb 100644 --- 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 @@ -1,15 +1,15 @@ 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.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; -import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -20,8 +20,8 @@ public class ResponseSummaryAnalysis extends MetricAnalysisMember { private Logger logger = LogManager.getFormatterLogger(ResponseSummaryAnalysis.class); - public ResponseSummaryAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public ResponseSummaryAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -38,16 +38,21 @@ public class ResponseSummaryAnalysis extends MetricAnalysisMember { protected void aggregation() throws Exception { MetricData oneMetric; while ((oneMetric = pushOne()) != null) { - tell(ResponseSummaryReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneMetric); + getClusterContext().lookup(ResponseSummaryReceiver.Role.INSTANCE).tell(oneMetric); } } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return ResponseSummaryAnalysis.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public ResponseSummaryAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new ResponseSummaryAnalysis(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -56,6 +61,20 @@ public class ResponseSummaryAnalysis extends MetricAnalysisMember { } } + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ResponseSummaryAnalysis.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } + public static class Metric extends AbstractTimeSlice { private final String code; private final Boolean 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 index 8d1c632c3..941f03809 100644 --- 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 @@ -1,12 +1,12 @@ 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.actor.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -17,8 +17,8 @@ public class DAGNodePersistence extends RecordPersistenceMember { private Logger logger = LogManager.getFormatterLogger(DAGNodePersistence.class); - public DAGNodePersistence(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public DAGNodePersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -31,12 +31,17 @@ public class DAGNodePersistence extends RecordPersistenceMember { return "dag_node"; } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return DAGNodePersistence.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public DAGNodePersistence workerInstance(ClusterWorkerContext clusterContext) { + return new DAGNodePersistence(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -44,4 +49,18 @@ public class DAGNodePersistence extends RecordPersistenceMember { return WorkerConfig.Queue.Persistence.DAGNodePersistence.Size; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return DAGNodePersistence.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index 18cd2cdf2..0b70b33b1 100644 --- 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 @@ -1,11 +1,12 @@ 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.actor.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -16,8 +17,8 @@ public class NodeInstancePersistence extends RecordPersistenceMember { private Logger logger = LogManager.getFormatterLogger(NodeInstancePersistence.class); - public NodeInstancePersistence(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public NodeInstancePersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -30,12 +31,17 @@ public class NodeInstancePersistence extends RecordPersistenceMember { return "node_instance"; } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return NodeInstancePersistence.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeInstancePersistence workerInstance(ClusterWorkerContext clusterContext) { + return new NodeInstancePersistence(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -43,4 +49,18 @@ public class NodeInstancePersistence extends RecordPersistenceMember { return WorkerConfig.Queue.Persistence.NodeInstancePersistence.Size; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeInstancePersistence.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index 1cd74be3e..e950a13b0 100644 --- 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 @@ -1,11 +1,12 @@ 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.actor.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -16,8 +17,8 @@ public class ResponseCostPersistence extends MetricPersistenceMember { private Logger logger = LogManager.getFormatterLogger(ResponseCostPersistence.class); - public ResponseCostPersistence(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public ResponseCostPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -30,12 +31,17 @@ public class ResponseCostPersistence extends MetricPersistenceMember { return "response_cost"; } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return ResponseCostPersistence.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public ResponseCostPersistence workerInstance(ClusterWorkerContext clusterContext) { + return new ResponseCostPersistence(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -43,4 +49,18 @@ public class ResponseCostPersistence extends MetricPersistenceMember { return WorkerConfig.Queue.Persistence.ResponseCostPersistence.Size; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ResponseCostPersistence.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index cce483597..6517b2ace 100644 --- 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 @@ -1,11 +1,12 @@ 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.actor.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -16,8 +17,8 @@ public class ResponseSummaryPersistence extends MetricPersistenceMember { private Logger logger = LogManager.getFormatterLogger(ResponseSummaryPersistence.class); - public ResponseSummaryPersistence(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public ResponseSummaryPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -30,12 +31,17 @@ public class ResponseSummaryPersistence extends MetricPersistenceMember { return "response_summary"; } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return ResponseSummaryPersistence.class; + public Role role() { + return null; + } + + @Override + public ResponseSummaryPersistence workerInstance(ClusterWorkerContext clusterContext) { + return new ResponseSummaryPersistence(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -43,4 +49,18 @@ public class ResponseSummaryPersistence extends MetricPersistenceMember { return WorkerConfig.Queue.Persistence.ResponseSummaryPersistence.Size; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ResponseSummaryPersistence.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index d6a5dfcf1..c62f59e48 100644 --- 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 @@ -1,9 +1,11 @@ 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.actor.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -14,7 +16,6 @@ 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; @@ -38,8 +39,8 @@ public class TraceSegmentRecordPersistence extends RecordPersistenceMember { return "trace_segment"; } - public TraceSegmentRecordPersistence(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public TraceSegmentRecordPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -54,17 +55,36 @@ public class TraceSegmentRecordPersistence extends RecordPersistenceMember { } } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); + @Override + public Role role() { + return Role.INSTANCE; + } + @Override public int queueSize() { return WorkerConfig.Queue.TraceSegmentRecordAnalysis.Size; } @Override - public Class memberClass() { - return TraceSegmentRecordPersistence.class; + public TraceSegmentRecordPersistence workerInstance(ClusterWorkerContext clusterContext) { + return new TraceSegmentRecordPersistence(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return TraceSegmentRecordPersistence.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); } } @@ -76,11 +96,6 @@ public class TraceSegmentRecordPersistence extends RecordPersistenceMember { 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); @@ -96,15 +111,6 @@ public class TraceSegmentRecordPersistence extends RecordPersistenceMember { 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) { 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 index e63bd6edf..fb9cf3fab 100644 --- 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 @@ -1,7 +1,8 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,33 +12,39 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class DAGNodeReceiver extends AbstractWorker { +public class DAGNodeReceiver extends AbstractClusterWorker { private Logger logger = LogManager.getFormatterLogger(DAGNodeReceiver.class); - private DAGNodePersistence persistence; - - @Override - public void preStart() throws Exception { - super.preStart(); - persistence = DAGNodePersistence.Factory.INSTANCE.createWorker(getSelf()); + public DAGNodeReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Throwable { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(DAGNodePersistence.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { if (message instanceof RecordData) { - persistence.beTold(message); + getSelfContext().lookup(DAGNodePersistence.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class workerClass() { - return DAGNodeReceiver.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public DAGNodeReceiver workerInstance(ClusterWorkerContext clusterContext) { + return new DAGNodeReceiver(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -45,4 +52,18 @@ public class DAGNodeReceiver extends AbstractWorker { return WorkerConfig.Worker.DAGNodeReceiver.Num; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return DAGNodeReceiver.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index 977601519..739b51461 100644 --- 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 @@ -1,7 +1,8 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,33 +12,39 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class NodeInstanceReceiver extends AbstractWorker { +public class NodeInstanceReceiver extends AbstractClusterWorker { private Logger logger = LogManager.getFormatterLogger(NodeInstanceReceiver.class); - private NodeInstancePersistence persistence; - - @Override - public void preStart() throws Exception { - super.preStart(); - persistence = NodeInstancePersistence.Factory.INSTANCE.createWorker(getSelf()); + public NodeInstanceReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Throwable { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(NodeInstancePersistence.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { if (message instanceof RecordData) { - persistence.beTold(message); + getSelfContext().lookup(NodeInstancePersistence.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class workerClass() { - return NodeInstanceReceiver.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeInstanceReceiver workerInstance(ClusterWorkerContext clusterContext) { + return new NodeInstanceReceiver(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -45,4 +52,18 @@ public class NodeInstanceReceiver extends AbstractWorker { return WorkerConfig.Worker.NodeInstanceReceiver.Num; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeInstanceReceiver.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index f086d393e..788b19a03 100644 --- 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 @@ -1,7 +1,8 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,33 +12,39 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class ResponseCostReceiver extends AbstractWorker { +public class ResponseCostReceiver extends AbstractClusterWorker { private Logger logger = LogManager.getFormatterLogger(ResponseCostReceiver.class); - private ResponseCostPersistence persistence; - - @Override - public void preStart() throws Exception { - super.preStart(); - persistence = ResponseCostPersistence.Factory.INSTANCE.createWorker(getSelf()); + public ResponseCostReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Throwable { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(ResponseCostPersistence.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { if (message instanceof MetricData) { - persistence.beTold(message); + getSelfContext().lookup(ResponseCostPersistence.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class workerClass() { - return ResponseCostReceiver.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public ResponseCostReceiver workerInstance(ClusterWorkerContext clusterContext) { + return new ResponseCostReceiver(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -45,4 +52,18 @@ public class ResponseCostReceiver extends AbstractWorker { return WorkerConfig.Worker.ResponseCostReceiver.Num; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ResponseCostReceiver.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index e264e6e0d..e533305b5 100644 --- 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 @@ -1,7 +1,8 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,33 +12,39 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class ResponseSummaryReceiver extends AbstractWorker { +public class ResponseSummaryReceiver extends AbstractClusterWorker { private Logger logger = LogManager.getFormatterLogger(ResponseSummaryReceiver.class); - private ResponseSummaryPersistence persistence; - - @Override - public void preStart() throws Exception { - super.preStart(); - persistence = ResponseSummaryPersistence.Factory.INSTANCE.createWorker(getSelf()); + public ResponseSummaryReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Throwable { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(ResponseSummaryPersistence.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { if (message instanceof MetricData) { - persistence.beTold(message); + getSelfContext().lookup(ResponseSummaryPersistence.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class workerClass() { - return ResponseSummaryReceiver.class; + public Role role() { + return null; + } + + @Override + public ResponseSummaryReceiver workerInstance(ClusterWorkerContext clusterContext) { + return new ResponseSummaryReceiver(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -45,4 +52,18 @@ public class ResponseSummaryReceiver extends AbstractWorker { return WorkerConfig.Worker.ResponseSummaryReceiver.Num; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ResponseSummaryReceiver.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index 5fd19b558..c930a8dd6 100644 --- 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 @@ -1,45 +1,74 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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.TraceSegment; import com.a.eye.skywalking.trace.TraceSegmentRef; +import java.util.List; /** * @author pengys5 */ -public class ApplicationRefMain extends AbstractSyncMember { +public class ApplicationRefMain extends AbstractLocalSyncWorker { private DAGNodeRefAnalysis dagNodeRefAnalysis; - public ApplicationRefMain(ActorRef actorRef) throws Throwable { - super(actorRef); - dagNodeRefAnalysis = DAGNodeRefAnalysis.Factory.INSTANCE.createWorker(actorRef); + public ApplicationRefMain(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @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 void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(DAGNodeRefAnalysis.Role.INSTANCE).create(getClusterContext(), getSelfContext()); } - public static class Factory extends AbstractSyncMemberProvider { + @Override + public void work(Object message) throws Exception { + TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment = (TraceSegmentReceiver.TraceSegmentTimeSlice) message; + + TraceSegment segment = traceSegment.getTraceSegment(); + List refs = segment.getRefs(); + if(refs != null){ + for (TraceSegmentRef ref : refs) { + String front = ref.getApplicationCode(); + String behind = segment.getApplicationCode(); + + DAGNodeRefAnalysis.Metric nodeRef = new DAGNodeRefAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), front, behind); + getSelfContext().lookup(DAGNodeRefAnalysis.Role.INSTANCE).tell(nodeRef); + } + } + + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return ApplicationRefMain.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public ApplicationRefMain workerInstance(ClusterWorkerContext clusterContext) { + return new ApplicationRefMain(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return ApplicationRefMain.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); } } } 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 index 4fb35491e..3b026dbd2 100644 --- 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 @@ -1,9 +1,10 @@ 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.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; -import com.a.eye.skywalking.collector.queue.MessageHolder; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,7 +12,6 @@ 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; @@ -22,8 +22,8 @@ public class DAGNodeRefAnalysis extends RecordAnalysisMember { private Logger logger = LogManager.getFormatterLogger(DAGNodeRefAnalysis.class); - public DAGNodeRefAnalysis(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public DAGNodeRefAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -45,17 +45,22 @@ public class DAGNodeRefAnalysis extends RecordAnalysisMember { protected void aggregation() throws Exception { RecordData oneRecord; while ((oneRecord = pushOne()) != null) { - tell(DAGNodeRefReceiver.Factory.INSTANCE, HashCodeSelector.INSTANCE, oneRecord); + getClusterContext().lookup(DAGNodeRefReceiver.Role.INSTANCE).tell(oneRecord); } } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return DAGNodeRefAnalysis.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public DAGNodeRefAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new DAGNodeRefAnalysis(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -64,6 +69,20 @@ public class DAGNodeRefAnalysis extends RecordAnalysisMember { } } + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return DAGNodeRefAnalysis.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } + public static class Metric extends AbstractTimeSlice { private final String frontCode; private final String 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 index b34018a58..901d31c1d 100644 --- 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 @@ -1,11 +1,12 @@ 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.actor.AbstractLocalAsyncWorkerProvider; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -16,8 +17,8 @@ public class DAGNodeRefPersistence extends RecordPersistenceMember { private Logger logger = LogManager.getFormatterLogger(DAGNodeRefPersistence.class); - public DAGNodeRefPersistence(RingBuffer ringBuffer, ActorRef actorRef) { - super(ringBuffer, actorRef); + public DAGNodeRefPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override @@ -30,13 +31,18 @@ public class DAGNodeRefPersistence extends RecordPersistenceMember { return "node_ref"; } - public static class Factory extends AbstractAsyncMemberProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class memberClass() { - return DAGNodeRefPersistence.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public DAGNodeRefPersistence workerInstance(ClusterWorkerContext clusterContext) { + return new DAGNodeRefPersistence(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -44,4 +50,18 @@ public class DAGNodeRefPersistence extends RecordPersistenceMember { return WorkerConfig.Queue.Persistence.DAGNodeRefPersistence.Size; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return DAGNodeRefPersistence.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } 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 index 1e4b53850..4c10298f1 100644 --- 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 @@ -1,7 +1,8 @@ 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.actor.*; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; 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; @@ -11,33 +12,41 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class DAGNodeRefReceiver extends AbstractWorker { +public class DAGNodeRefReceiver extends AbstractClusterWorker { private Logger logger = LogManager.getFormatterLogger(DAGNodeRefReceiver.class); private DAGNodeRefPersistence persistence; - @Override - public void preStart() throws Exception { - super.preStart(); - persistence = DAGNodeRefPersistence.Factory.INSTANCE.createWorker(getSelf()); + public DAGNodeRefReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Throwable { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(DAGNodeRefPersistence.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { if (message instanceof RecordData) { - persistence.beTold(message); + getSelfContext().lookup(DAGNodeRefPersistence.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override - public Class workerClass() { - return DAGNodeRefReceiver.class; + public Role role() { + return Role.INSTANCE; + } + + @Override + public DAGNodeRefReceiver workerInstance(ClusterWorkerContext clusterContext) { + return new DAGNodeRefReceiver(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -45,4 +54,18 @@ public class DAGNodeRefReceiver extends AbstractWorker { return WorkerConfig.Worker.DAGNodeRefReceiver.Num; } } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return DAGNodeRefReceiver.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/Controller.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/Controller.java new file mode 100644 index 000000000..56535702a --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/Controller.java @@ -0,0 +1,23 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.a.eye.skywalking.collector.actor.Role; +import com.google.gson.JsonElement; +import fi.iki.elonen.NanoHTTPD; + +import java.util.Map; + +/** + * @author pengys5 + */ +public abstract class Controller { + + protected abstract NanoHTTPD.Method httpMethod(); + + protected abstract String path(); + + protected abstract JsonElement execute(Map parms); + + protected void tell(Role role, Object message) throws Exception { +// targetMember.beTold(message); + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCenter.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCenter.java new file mode 100644 index 000000000..855e7ba7f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCenter.java @@ -0,0 +1,43 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import fi.iki.elonen.NanoHTTPD; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author pengys5 + */ +public enum ControllerCenter { + INSTANCE; + + private Map getControllers = new ConcurrentHashMap(); + + private Map postControllers = new ConcurrentHashMap(); + + protected void register(NanoHTTPD.Method method, String path, Controller controller) throws DuplicateControllerException { + if (NanoHTTPD.Method.GET.equals(method)) { + if (getControllers.containsKey(path)) { + throw new DuplicateControllerException("method: " + method + "with path: " + path + " duplicate each other"); + } else { + getControllers.put(path, controller); + } + } else if (NanoHTTPD.Method.POST.equals(method)) { + if (postControllers.containsKey(path)) { + throw new DuplicateControllerException("method: " + method + "with path: " + path + " duplicate each other"); + } else { + postControllers.put(path, controller); + } + } + } + + protected Controller find(NanoHTTPD.Method method, String path) { + if (NanoHTTPD.Method.GET.equals(method)) { + return getControllers.get(path); + } else if (NanoHTTPD.Method.POST.equals(method)) { + return postControllers.get(path); + } else { + return null; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCreator.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCreator.java new file mode 100644 index 000000000..d5ee6cdf8 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCreator.java @@ -0,0 +1,18 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import java.util.ServiceLoader; + +/** + * @author pengys5 + */ +public enum ControllerCreator { + INSTANCE; + + public void boot() throws Exception { + ServiceLoader controllerLoader = java.util.ServiceLoader.load(ControllerProvider.class); + for (ControllerProvider provider : controllerLoader) { + Controller controller = provider.create(); + ControllerCenter.INSTANCE.register(controller.httpMethod(), controller.path(), controller); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerNotFoundException.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerNotFoundException.java new file mode 100644 index 000000000..6cd1ad996 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerNotFoundException.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +public class ControllerNotFoundException extends Exception { + public ControllerNotFoundException(String message){ + super(message); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerProvider.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerProvider.java new file mode 100644 index 000000000..1d7aecb02 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerProvider.java @@ -0,0 +1,14 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +/** + * @author pengys5 + */ +public abstract class ControllerProvider { + + public abstract Class clazz(); + + public Controller create() throws Exception { + Controller controller = (Controller) clazz().newInstance(); + return controller; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/DuplicateControllerException.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/DuplicateControllerException.java new file mode 100644 index 000000000..901822139 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/DuplicateControllerException.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +public class DuplicateControllerException extends Exception { + public DuplicateControllerException(String message){ + super(message); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/HttpServer.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/HttpServer.java new file mode 100644 index 000000000..fd570763a --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/HttpServer.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.google.gson.JsonElement; +import fi.iki.elonen.NanoHTTPD; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.util.Map; + +/** + * @author pengys5 + */ +public enum HttpServer { + INSTANCE; + + private Logger logger = LogManager.getFormatterLogger(HttpServer.class); + + public void boot() throws Exception { + NanoHttpServer server = new NanoHttpServer(7001); + ControllerCreator.INSTANCE.boot(); + } + + public class NanoHttpServer extends NanoHTTPD { + + public NanoHttpServer(int port) throws IOException { + super(port); + start(NanoHTTPD.SOCKET_READ_TIMEOUT, false); + logger.info("Running! Point your browsers to http://localhost:%d/", port); + } + + @Override + public Response serve(IHTTPSession session) { + Method method = session.getMethod(); + String uri = session.getUri(); + Map parms = session.getParms(); + logger.debug("request method: %s, uri: %s, parms: %s", method.toString(), uri, parms); + + try { + JsonElement response = RequestDispatcher.INSTANCE.dispatch(method, uri, parms); + return newFixedLengthResponse(Response.Status.OK, "text/json", response.toString()); + } catch (ControllerNotFoundException e) { + String errorMessage = e.getMessage(); + return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/html", errorMessage); + } + } + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/RequestDispatcher.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/RequestDispatcher.java new file mode 100644 index 000000000..c8affc457 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/RequestDispatcher.java @@ -0,0 +1,22 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.google.gson.JsonElement; +import fi.iki.elonen.NanoHTTPD; + +import java.util.Map; + +/** + * @author pengys5 + */ +public enum RequestDispatcher { + INSTANCE; + + public JsonElement dispatch(NanoHTTPD.Method method, String uri, Map parms) throws ControllerNotFoundException { + Controller controller = ControllerCenter.INSTANCE.find(method, uri); + if (controller != null) { + return controller.execute(parms); + } else { + throw new ControllerNotFoundException("Could not found controller for [method: " + method.name() + ", uri: " + uri + "]"); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/controller/DagController.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/controller/DagController.java new file mode 100644 index 000000000..e85c21716 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/controller/DagController.java @@ -0,0 +1,39 @@ +package com.a.eye.skywalking.collector.worker.httpserver.controller; + +import com.a.eye.skywalking.collector.worker.httpserver.Controller; +import com.a.eye.skywalking.collector.worker.httpserver.ControllerProvider; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import fi.iki.elonen.NanoHTTPD; + +import java.util.Map; + +/** + * @author pengys5 + */ +public class DagController extends Controller { + + @Override + public NanoHTTPD.Method httpMethod() { + return NanoHTTPD.Method.GET; + } + + @Override + public String path() { + return "/getNodes"; + } + + @Override + public JsonElement execute(Map parms) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("test", "aaaa"); + return jsonObject; + } + + public static class Factory extends ControllerProvider { + @Override + public Class clazz() { + return DagController.class; + } + } +} 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 index 0e16f6b1e..679dc55b4 100644 --- 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 @@ -1,7 +1,7 @@ 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.actor.*; +import com.a.eye.skywalking.collector.role.TraceSegmentReceiverRole; 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; @@ -14,22 +14,22 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class TraceSegmentReceiver extends AbstractWorker { +public class TraceSegmentReceiver extends AbstractClusterWorker { 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()); + public TraceSegmentReceiver(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); } @Override - public void receive(Object message) throws Throwable { + public void preStart() throws ProviderNotFountException { + getClusterContext().findProvider(ApplicationMain.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + getClusterContext().findProvider(ApplicationRefMain.Role.INSTANCE).create(getClusterContext(), getSelfContext()); + } + + @Override + public void work(Object message) throws Exception { if (message instanceof TraceSegment) { TraceSegment traceSegment = (TraceSegment) message; logger.debug("receive message instanceof TraceSegment, traceSegmentId is %s", traceSegment.getTraceSegmentId()); @@ -37,23 +37,28 @@ public class TraceSegmentReceiver extends AbstractWorker { int second = DateTools.timeStampToSecond(traceSegment.getStartTime()); TraceSegmentTimeSlice segmentTimeSlice = new TraceSegmentTimeSlice(timeSlice, second, traceSegment); - tell(applicationMain, segmentTimeSlice); - tell(applicationRefMain, segmentTimeSlice); + getSelfContext().lookup(ApplicationMain.Role.INSTANCE).tell(segmentTimeSlice); + getSelfContext().lookup(ApplicationRefMain.Role.INSTANCE).tell(segmentTimeSlice); } } - public static class Factory extends AbstractWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); - @Override - public Class workerClass() { - return TraceSegmentReceiver.class; - } - @Override public int workerNum() { return WorkerConfig.Worker.TraceSegmentReceiver.Num; } + + @Override + public Role role() { + return TraceSegmentReceiverRole.INSTANCE; + } + + @Override + public TraceSegmentReceiver workerInstance(ClusterWorkerContext clusterContext) { + return new TraceSegmentReceiver(role(), clusterContext, new LocalWorkerContext()); + } } public static class TraceSegmentTimeSlice extends AbstractTimeSlice { diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.ControllerProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.ControllerProvider new file mode 100644 index 000000000..64fd663e3 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.ControllerProvider @@ -0,0 +1 @@ +com.a.eye.skywalking.collector.worker.httpserver.controller.DagController$Factory \ 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 index ca7a1e199..e8fc5bbdb 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml @@ -1,12 +1,12 @@ - + - + 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 index 3e24b08bd..6aa78f085 100644 --- 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 @@ -3,10 +3,8 @@ 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; @@ -16,7 +14,6 @@ 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 @@ -35,7 +32,7 @@ public class StartUpTestCase { 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); +// WorkersCreator.INSTANCE.boot(system); EsClient.boot(); @@ -43,6 +40,7 @@ public class StartUpTestCase { SegmentMessage.Builder clientBuilder = dubboClientData.serialize().toBuilder(); clientBuilder.setApplicationCode("Tomcat_DubboClient"); + dubboClientData = new TraceSegment(clientBuilder.build()); TraceSegment dubboServerData = TraceSegmentBuilderFactory.INSTANCE.traceOf_DubboServer_MySQL(); @@ -50,14 +48,14 @@ public class StartUpTestCase { SegmentMessage serializeServer = dubboServerData.serialize(); SegmentMessage.Builder builder = serializeServer.toBuilder(); - SegmentRefMessage.Builder builderRef = builder.getPrimaryRef().toBuilder(); + SegmentRefMessage.Builder builderRef = builder.getRefs(0).toBuilder(); builderRef.setApplicationCode(dubboClientData.getApplicationCode()); builderRef.setPeerHost(Tags.PEER_HOST.get(dubboClientData.getSpans().get(1))); builder.setApplicationCode("DubboServer_MySQL"); - builder.setPrimaryRef(builderRef); + builder.addRefs(builderRef); dubboServerData = new TraceSegment(builder.build()); Thread.sleep(5000); 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 fade4273d..7860d3e76 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 @@ -106,6 +106,9 @@ public class TraceSegment implements ISerializable { * @param refSegment {@link TraceSegmentRef} */ public void ref(TraceSegmentRef refSegment) { + if (refs == null) { + refs = new LinkedList(); + } if(!refs.contains(refSegment)){ refs.add(refSegment); } diff --git a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java index cd120c079..cd02abee4 100644 --- a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java +++ b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/TraceSegmentTestCase.java @@ -24,24 +24,24 @@ public class TraceSegmentTestCase { TraceSegmentRef ref1 = new TraceSegmentRef(); ref1.setTraceSegmentId("parent_trace_0"); ref1.setSpanId(1); - segment.ref(ref1, false); + segment.ref(ref1); TraceSegmentRef ref2 = new TraceSegmentRef(); ref2.setTraceSegmentId("parent_trace_1"); ref2.setSpanId(5); - segment.ref(ref2, false); + segment.ref(ref2); TraceSegmentRef ref3 = new TraceSegmentRef(); - ref3.setTraceSegmentId("parent_trace_1"); + ref3.setTraceSegmentId("parent_trace_3"); ref3.setSpanId(5); - segment.ref(ref3, false); + segment.ref(ref3); - Assert.assertEquals(ref1, segment.getPrimaryRef()); - Assert.assertEquals(ref2, segment.getRefs().get(0)); - Assert.assertEquals(ref3, segment.getRefs().get(1)); + Assert.assertEquals(ref1, segment.getRefs().get(0)); + Assert.assertEquals(ref2, segment.getRefs().get(1)); + Assert.assertEquals(ref3, segment.getRefs().get(2)); - Assert.assertEquals("parent_trace_0", segment.getPrimaryRef().getTraceSegmentId()); - Assert.assertEquals(1, segment.getPrimaryRef().getSpanId()); + Assert.assertEquals("parent_trace_0", segment.getRefs().get(0).getTraceSegmentId()); + Assert.assertEquals(1, segment.getRefs().get(0).getSpanId()); } @Test @@ -75,21 +75,21 @@ public class TraceSegmentTestCase { ref1.setSpanId(1); ref1.setApplicationCode("REMOTE_APP"); ref1.setPeerHost("10.2.3.16:8080"); - segment.ref(ref1, false); + segment.ref(ref1); TraceSegmentRef ref2 = new TraceSegmentRef(); ref2.setTraceSegmentId("parent_trace_1"); ref2.setSpanId(5); ref2.setApplicationCode("REMOTE_APP"); ref2.setPeerHost("10.2.3.16:8080"); - segment.ref(ref2, false); + segment.ref(ref2); TraceSegmentRef ref3 = new TraceSegmentRef(); - ref3.setTraceSegmentId("parent_trace_1"); + ref3.setTraceSegmentId("parent_trace_2"); ref3.setSpanId(5); ref3.setApplicationCode("REMOTE_APP"); ref3.setPeerHost("10.2.3.16:8080"); - segment.ref(ref3, false); + segment.ref(ref3); Span span1 = new Span(1, "/serviceA"); Tags.SPAN_LAYER.asHttp(span1); @@ -103,8 +103,8 @@ public class TraceSegmentTestCase { TraceSegment newSegment = new TraceSegment(segment.serialize()); Assert.assertEquals(segment.getSpans().size(), newSegment.getSpans().size()); - Assert.assertEquals(segment.getPrimaryRef().getTraceSegmentId(), newSegment.getPrimaryRef().getTraceSegmentId()); - Assert.assertEquals(Tags.SPAN_LAYER.get(segment.getSpans().get(0)), Tags.SPAN_LAYER.get(newSegment.getSpans().get(0))); + Assert.assertEquals(segment.getRefs().get(0).getTraceSegmentId(), newSegment.getRefs().get(0).getTraceSegmentId()); + Assert.assertEquals(Tags.SPAN_LAYER.get(segment.getSpans().get(1)), Tags.SPAN_LAYER.get(newSegment.getSpans().get(1))); Assert.assertEquals(segment.getSpans().get(1).getLogs().get(0).getTime(), newSegment.getSpans().get(1).getLogs().get(0).getTime()); } } diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/TracerContextTestCase.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/TracerContextTestCase.java index 4e0b69723..ec557298d 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/TracerContextTestCase.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/TracerContextTestCase.java @@ -92,8 +92,8 @@ public class TracerContextTestCase { context.stopSpan(span); - Assert.assertEquals("trace_id_1", finishedSegmentCarrier[0].getPrimaryRef().getTraceSegmentId()); - Assert.assertEquals(5, finishedSegmentCarrier[0].getPrimaryRef().getSpanId()); + Assert.assertEquals("trace_id_1", finishedSegmentCarrier[0].getRefs().get(0).getTraceSegmentId()); + Assert.assertEquals(5, finishedSegmentCarrier[0].getRefs().get(0).getSpanId()); } @After 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 44812bd44..4e479b039 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 @@ -205,7 +205,7 @@ public class DubboInterceptorTest { public void call(TraceSegment traceSegment) { assertThat(traceSegment.getSpans().size(), is(1)); assertProviderSpan(traceSegment.getSpans().get(0)); - assertTraceSegmentRef(traceSegment.getPrimaryRef(), expect); + assertTraceSegmentRef(traceSegment.getRefs().get(0), expect); } }); } diff --git a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptorTest.java b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptorTest.java index 360c871b2..140bc34f4 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptorTest.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/motan-plugin/src/test/java/com/a/eye/skywalking/plugin/motan/MotanProviderInterceptorTest.java @@ -1,5 +1,6 @@ package com.a.eye.skywalking.plugin.motan; +import com.a.eye.skywalking.api.boot.ServiceManager; 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.ConstructorInvokeContext; @@ -57,6 +58,8 @@ public class MotanProviderInterceptorTest { @Before public void setUp() { + ServiceManager.INSTANCE.boot(); + invokeInterceptor = new MotanProviderInterceptor(); contextListener = new MockTracerContextListener(); url = URL.valueOf("motan://127.0.0.1:34000/com.a.eye.skywalking.test.TestService"); @@ -83,7 +86,7 @@ public class MotanProviderInterceptorTest { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertMotanProviderSpan(span); - assertTrue(traceSegment.getPrimaryRef() == null); + assertTrue(traceSegment.getRefs() == null); } }); } @@ -104,7 +107,7 @@ public class MotanProviderInterceptorTest { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertMotanProviderSpan(span); - assertRefSegment(traceSegment.getPrimaryRef()); + assertRefSegment(traceSegment.getRefs().get(0)); } }); } 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 0f4ce83f8..6d2b4e38a 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 @@ -93,7 +93,7 @@ public class TomcatInterceptorTest { assertThat(traceSegment.getSpans().size(), is(1)); Span span = traceSegment.getSpans().get(0); assertHttpSpan(span); - assertTraceSegmentRef(traceSegment.getPrimaryRef()); + assertTraceSegmentRef(traceSegment.getRefs().get(0)); } }); }