diff --git a/README.md b/README.md index f0d3abc5c..d7d0f24b5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Sky Walking ========== -Sky Walking logo +Sky Walking logo SkyWalking: Large-Scale Distributed Systems Tracing Infrastructure, also known Distributed Tracer. @@ -13,81 +13,46 @@ SkyWalking: Large-Scale Distributed Systems Tracing Infrastructure, also known D [![OpenTracing-1.0 Badge](https://img.shields.io/badge/OpenTracing--1.0-enabled-blue.svg)](http://opentracing.io) [![Release Version](https://img.shields.io/badge/stable-2.3--2017-brightgreen.svg)](https://github.com/wu-sheng/sky-walking/releases) -# News -* sky-walking v3.0 iteration begins... The top 2 important features are: [`Update the trace-structure`](https://github.com/wu-sheng/sky-walking/issues/83) and [`Analyze trace, and bring metric/analytic/cause up`](https://github.com/wu-sheng/sky-walking/issues/84) -* See feature codes at [branch feature/3.0](https://github.com/wu-sheng/sky-walking/tree/feature/3.0) -* The new UI release on [wu-sheng/sky-walking-ui](https://github.com/wu-sheng/sky-walking-ui) -# Abstract -* An open source Large-Scale Distributed Systems Tracing Infrastructure, also known a ditributed tracer. -* Based on [Google Dapper Paper: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure](http://research.google.com/pubs/pub36356.html), read [Simplified Chinese Version](http://duanple.blog.163.com/blog/static/70971767201329113141336/) -* Support popular rpc frameworks, such as [dubbo](https://github.com/alibaba/dubbo), [dubbox](https://github.com/dangdangdotcom/dubbox), [motan](https://github.com/weibocom/motan) etc., trigger email-alert when application occurs unexpected exception. -* Auto-instrumentation mechenism, **no need to CHANGE any application source code**. -* Easy to deploy, **even in product mode** (since 2.0) . No need of Hadoop, HBase, or Cassandra Cluster. -* Pure Java server implementation. provide gRPC (since 2.0) and HTTP (since 2.1) cross-platform spans collecting service. - - -# Supported components - -### web containers -* Tomcat 7 -* Tomcat 8 - -### databases -* mysql -* oracle -* h2 -* easily extend to support sybase, sqlserver, jtds, db2, informix - -### rpc frameworks -* dubbo -* dubbox -* httpClient -* motan - -### cache -* jedis - -### opentracing supported frameworks -* motan -* hprose-java - -# Contributors -* 吴晟 [wusheng](https://github.com/wu-sheng)   wu.sheng@foxmail.com -* 张鑫 [zhangxin](https://github.com/ascrutae)    - - -_Chinese Articles about sky-walking and distributed tracer_ - -Sky Walking TouTiao - -_If you are Chinese Developer, you can join QQ Group: 392443393, and **Tagged** Sky-Walking._ +* Auto-instrumentation mechanism, **no need to CHANGE any application source code**. Supported [frameworks](https://github.com/wu-sheng/sky-walking/wiki/3.0-supported-list). +* Pure Java server implementation, with RESTful Web service. +* High performance streaming analysis. +* The UI released on [wu-sheng/sky-walking-ui](https://github.com/wu-sheng/sky-walking-ui) ___ -OneAPM Open Source Achievement Award +OneAPM Open Source Achievement Award In October 2016, Sky Walking won `OneAPM Open Source Achievement Award`. The award appreciates sky walking for its "*contribution to popularization of APM technology*".
-[OneAPM](http://www.oneapm.com/) will provide financial support for the project in 2016-2017.

+[OneAPM](http://www.oneapm.com/) provides financial support for the project in 2016-2017.

Thanks all users of sky walking project. ___ +# Contributors +_In chronological order_ +* 吴晟 [@wu-sheng](https://github.com/wu-sheng) +* 张鑫 [@ascrutae](https://github.com/ascrutae) +* 谭真 [@mircoteam](https://github.com/mircoteam) +* 徐妍 [@TastySummer](https://github.com/TastySummer) +* 彭勇升 [@pengys5](https://github.com/pengys5) +* 戴文 -# Quick View -* distributed trace -![追踪连路图1](docs/resources/callChain.png?1=1) +# Screenshots +- Topological graph of application clusters. + -![追踪连路图2](docs/resources/callChainDetail.png?1=1) +- Trace query. + -![追踪连路图3](docs/resources/callChainLog.png?1=1) +- Span detail. + -* alarm mail - -![告警邮件](docs/resources/alarmMail.png?1=1) # Document * [WIKI](https://github.com/wu-sheng/sky-walking/wiki) + +_Chat with us on gitter, in English. As a Chinese Developer, you can join QQ Group: 392443393, and **Tagged** Sky-Walking._ diff --git a/docs/donate.jpg b/docs/donate.jpg deleted file mode 100644 index d739d34ed..000000000 Binary files a/docs/donate.jpg and /dev/null differ diff --git a/docs/resources/SkyWalkingArch.jpg b/docs/resources/SkyWalkingArch.jpg deleted file mode 100644 index d63fadade..000000000 Binary files a/docs/resources/SkyWalkingArch.jpg and /dev/null differ diff --git a/docs/resources/alarmMail.png b/docs/resources/alarmMail.png deleted file mode 100644 index 0e62fdcf0..000000000 Binary files a/docs/resources/alarmMail.png and /dev/null differ diff --git a/docs/resources/callChain.png b/docs/resources/callChain.png deleted file mode 100644 index 8be0fa7f2..000000000 Binary files a/docs/resources/callChain.png and /dev/null differ diff --git a/docs/resources/callChainDetail.png b/docs/resources/callChainDetail.png deleted file mode 100644 index 06297c610..000000000 Binary files a/docs/resources/callChainDetail.png and /dev/null differ diff --git a/docs/resources/callChainLog.png b/docs/resources/callChainLog.png deleted file mode 100644 index 05a42fe9f..000000000 Binary files a/docs/resources/callChainLog.png and /dev/null differ diff --git a/docs/resources/demo-application-cluster-tracer.jpg b/docs/resources/demo-application-cluster-tracer.jpg deleted file mode 100644 index 8be0fa7f2..000000000 Binary files a/docs/resources/demo-application-cluster-tracer.jpg and /dev/null differ diff --git a/docs/resources/oneapm-award.png b/docs/resources/oneapm-award.png deleted file mode 100644 index 142ae190e..000000000 Binary files a/docs/resources/oneapm-award.png and /dev/null differ diff --git a/docs/resources/skywalking.png b/docs/resources/skywalking.png deleted file mode 100644 index 3e26a5766..000000000 Binary files a/docs/resources/skywalking.png and /dev/null differ diff --git a/docs/resources/skywalking_ot.png b/docs/resources/skywalking_ot.png deleted file mode 100644 index 37be52ced..000000000 Binary files a/docs/resources/skywalking_ot.png and /dev/null differ diff --git a/docs/resources/toutiao.JPG b/docs/resources/toutiao.JPG deleted file mode 100644 index 533a2f521..000000000 Binary files a/docs/resources/toutiao.JPG and /dev/null differ diff --git a/pom.xml b/pom.xml index a10be42bd..2445e2397 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,21 @@ Zhang Xin https://github.com/ascrutae + + Tan Zhen + https://github.com/mircoteam + + + Xu Yan + https://github.com/TastySummer + + + Peng Yongsheng + https://github.com/pengys5 + + + Dai Wen + diff --git a/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingSpanBuilder.java b/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingSpanBuilder.java index 15cc19d21..e5a3ca5d5 100644 --- a/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingSpanBuilder.java +++ b/skywalking-application-toolkit/skywalking-toolkit-opentracing/src/main/java/com/a/eye/skywalking/toolkit/opentracing/SkyWalkingSpanBuilder.java @@ -94,6 +94,9 @@ public class SkyWalkingSpanBuilder implements Tracer.SpanBuilder { @Override public Span start() { + if (startTime == 0){ + startTime = System.currentTimeMillis(); + } return new SkyWalkingSpan(this.operationName, this.startTime, this.tags); } diff --git a/skywalking-collector/pom.xml b/skywalking-collector/pom.xml index 3981bd464..ad1ed0fbc 100644 --- a/skywalking-collector/pom.xml +++ b/skywalking-collector/pom.xml @@ -17,6 +17,7 @@ 2.4.17 + 2.8.1 @@ -26,9 +27,14 @@ ${akka.version} - com.a.eye - skywalking-logging-api - ${project.version} + org.apache.logging.log4j + log4j-core + ${log4j.version} + + + org.apache.logging.log4j + log4j-api + ${log4j.version} com.typesafe.akka 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 index 8218845fd..83b0d2334 100644 --- 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 @@ -2,14 +2,15 @@ package com.a.eye.skywalking.collector; import akka.actor.ActorSystem; import akka.actor.Props; +import com.a.eye.skywalking.api.util.StringUtil; import com.a.eye.skywalking.collector.actor.*; import com.a.eye.skywalking.collector.cluster.ClusterConfig; -import com.a.eye.skywalking.collector.cluster.ClusterConfigInitializer; +import com.a.eye.skywalking.collector.cluster.Const; 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 org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.ServiceLoader; @@ -17,7 +18,8 @@ import java.util.ServiceLoader; * @author pengys5 */ public class CollectorSystem { - private ILog logger = LogManager.getLogger(CollectorSystem.class); + private Logger logger = LogManager.getFormatterLogger(CollectorSystem.class); + private ClusterWorkerContext clusterContext; public LookUp getClusterContext() { @@ -36,14 +38,13 @@ public class CollectorSystem { } 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.cluster.seed-nodes=" + ClusterConfig.Cluster.seed_nodes)). withFallback(ConfigFactory.load("application.conf")); - ActorSystem akkaSystem = ActorSystem.create("ClusterSystem", config); + if (!StringUtil.isEmpty(ClusterConfig.Cluster.seed_nodes)) { + config.withFallback(ConfigFactory.parseString("akka.cluster.seed-nodes=" + ClusterConfig.Cluster.seed_nodes)); + } + ActorSystem akkaSystem = ActorSystem.create(Const.SystemName, config); clusterContext = new ClusterWorkerContext(akkaSystem); } @@ -66,6 +67,7 @@ public class CollectorSystem { private void loadLocalProviders() throws UsedRoleNameException { ServiceLoader clusterServiceLoader = ServiceLoader.load(AbstractLocalWorkerProvider.class); for (AbstractLocalWorkerProvider provider : clusterServiceLoader) { + logger.info("loadLocalProviders provider name: %s", provider.getClass().getName()); provider.setClusterContext(clusterContext); clusterContext.putProvider(provider); } 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 index 8caebf18f..207075aba 100644 --- 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 @@ -7,20 +7,27 @@ 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; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author pengys5 */ public abstract class AbstractClusterWorker extends AbstractWorker { - public AbstractClusterWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + protected AbstractClusterWorker(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } + final public void allocateJob(Object message) throws Exception { + onWork(message); + } + + protected abstract void onWork(Object message) throws Exception; + static class WorkerWithAkka extends UntypedActor { - private static ILog logger = LogManager.getLogger(WorkerWithAkka.class); + private Logger logger = LogManager.getFormatterLogger(WorkerWithAkka.class); + private Cluster cluster; private final AbstractClusterWorker ownerWorker; @@ -59,7 +66,7 @@ public abstract class AbstractClusterWorker extends AbstractWorker { register(memberUp.member()); } else { logger.debug("worker class: %s, message class: %s", this.getClass().getName(), message.getClass().getName()); - ownerWorker.work(message); + ownerWorker.allocateJob(message); } } 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 index 75fe25a2f..421d44112 100644 --- 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 @@ -17,7 +17,7 @@ public abstract class AbstractClusterWorkerProvider { private RingBuffer ringBuffer; @@ -28,9 +38,10 @@ public abstract class AbstractLocalAsyncWorker extends AbstractLocalWorker { try { Object message = event.getMessage(); event.reset(); - asyncWorker.work(message); + + asyncWorker.allocateJob(message); if (endOfBatch) { - asyncWorker.work(new EndOfBatchCommand()); + asyncWorker.allocateJob(new EndOfBatchCommand()); } } catch (Exception e) { e.printStackTrace(); 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 index 77843adbe..471a17197 100644 --- 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 @@ -8,9 +8,13 @@ public abstract class AbstractLocalSyncWorker extends AbstractLocalWorker { super(role, clusterContext, selfContext); } - @Override - final public void work(Object message) throws Exception { + final public void allocateJob(Object request, Object response) throws Exception { + onWork(request, response); } - public abstract Object onWork(Object message) throws Exception; + protected abstract void onWork(Object request, Object response) throws Exception; + + @Override + public void preStart() throws ProviderNotFoundException { + } } 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 ab7950751..9b180c093 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 @@ -18,8 +18,6 @@ public abstract class AbstractWorker { public abstract void preStart() throws ProviderNotFoundException; - public abstract void work(Object message) throws Exception; - final public LookUp getSelfContext() { return selfContext; } 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 index 496f312bb..cb72ad3af 100644 --- 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 @@ -1,9 +1,9 @@ package com.a.eye.skywalking.collector.actor; import akka.actor.ActorSystem; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -import com.a.eye.skywalking.logging.ILog; -import com.a.eye.skywalking.logging.LogManager; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -11,7 +11,8 @@ import java.util.concurrent.ConcurrentHashMap; * @author pengys5 */ public class ClusterWorkerContext extends WorkerContext { - private ILog logger = LogManager.getLogger(ClusterWorkerContext.class); + private Logger logger = LogManager.getFormatterLogger(ClusterWorkerContext.class); + private final ActorSystem akkaSystem; private Map providers = new ConcurrentHashMap<>(); 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 index 9d6427a53..880e5f122 100644 --- 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 @@ -14,6 +14,10 @@ public class LocalSyncWorkerRef extends WorkerRef { @Override public void tell(Object message) throws Exception { - localSyncWorker.work(message); + localSyncWorker.allocateJob(message, null); + } + + public void ask(Object request, Object response) throws Exception { + localSyncWorker.allocateJob(request, response); } } 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 index 7f0e87492..a9ae4cf2c 100644 --- 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 @@ -1,5 +1,8 @@ package com.a.eye.skywalking.collector.actor; +import java.util.List; +import java.util.Map; + /** * @author pengys5 */ diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Promise.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Promise.java deleted file mode 100644 index 7e5ff7adf..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/actor/Promise.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.a.eye.skywalking.collector.actor; - -/** - * @author pengys5 - */ -public class Promise { - private boolean isTold = false; - private Object value; - - protected void completed(Object value) { - this.value = value; - isTold = true; - } - - public boolean isTold() { - return isTold; - } -} 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 index de53dc7ba..a46683de0 100644 --- 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 @@ -10,12 +10,20 @@ import java.util.concurrent.ConcurrentHashMap; */ public abstract class WorkerContext implements Context { - private Map> roleWorkers = new ConcurrentHashMap<>(); + private Map> roleWorkers; + + public WorkerContext() { + this.roleWorkers = new ConcurrentHashMap<>(); + } + + private Map> getRoleWorkers() { + return this.roleWorkers; + } @Override final public WorkerRefs lookup(Role role) throws WorkerNotFoundException { - if (roleWorkers.containsKey(role.roleName())) { - WorkerRefs refs = new WorkerRefs(roleWorkers.get(role.roleName()), role.workerSelector()); + if (getRoleWorkers().containsKey(role.roleName())) { + WorkerRefs refs = new WorkerRefs(getRoleWorkers().get(role.roleName()), role.workerSelector()); return refs; } else { throw new WorkerNotFoundException("role=" + role.roleName() + ", no available worker."); @@ -24,14 +32,14 @@ public abstract class WorkerContext implements Context { @Override final public void put(WorkerRef workerRef) { - if (!roleWorkers.containsKey(workerRef.getRole().roleName())) { - roleWorkers.putIfAbsent(workerRef.getRole().roleName(), new ArrayList()); + if (!getRoleWorkers().containsKey(workerRef.getRole().roleName())) { + getRoleWorkers().putIfAbsent(workerRef.getRole().roleName(), new ArrayList()); } - roleWorkers.get(workerRef.getRole().roleName()).add(workerRef); + getRoleWorkers().get(workerRef.getRole().roleName()).add(workerRef); } @Override final public void remove(WorkerRef workerRef) { - roleWorkers.remove(workerRef.getRole().roleName()); + getRoleWorkers().remove(workerRef.getRole().roleName()); } } 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 index 3de8cf501..9496b20df 100644 --- 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 @@ -1,9 +1,9 @@ package com.a.eye.skywalking.collector.actor; import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; -import com.a.eye.skywalking.logging.ILog; -import com.a.eye.skywalking.logging.LogManager; import java.util.List; /** @@ -11,7 +11,7 @@ import java.util.List; */ public class WorkerRefs { - private static ILog logger = LogManager.getLogger(WorkerRefs.class); + private Logger logger = LogManager.getFormatterLogger(WorkerRefs.class); private List workerRefs; private WorkerSelector workerSelector; @@ -25,4 +25,13 @@ public class WorkerRefs { logger.debug("WorkerSelector instance of %s", workerSelector.getClass()); workerSelector.select(workerRefs, message).tell(message); } + + public void ask(Object request, Object response) throws Exception { + WorkerRef workerRef = workerSelector.select(workerRefs, request); + if (workerRef instanceof LocalSyncWorkerRef) { + ((LocalSyncWorkerRef) workerRef).ask(request, response); + } else { + throw new IllegalAccessError("only local sync worker can ask"); + } + } } diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java index 843cc9b2f..56cc5b2ce 100644 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfig.java @@ -6,7 +6,7 @@ package com.a.eye.skywalking.collector.cluster; * {@link Cluster.Current#port} is a port of server use to bind * {@link Cluster.Current#roles} is a roles of workers that use to create workers which * has those role in this process. - * {@link Cluster#seed_nodes} is a seed_nodes which cluster have. + * {@link Cluster#seed_nodes} is a seed_nodes which cluster have, List of strings, e.g. seed_nodes = "ip:port,ip:port".. * * @author pengys5 */ @@ -19,6 +19,6 @@ public class ClusterConfig { public static String roles = ""; } - public static String seed_nodes = "127.0.0.1:2551"; + public static String seed_nodes = ""; } } diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java index 11ff2b5d2..edd55fc16 100644 --- a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/ClusterConfigInitializer.java @@ -2,8 +2,9 @@ package com.a.eye.skywalking.collector.cluster; import com.a.eye.skywalking.api.util.ConfigInitializer; import com.a.eye.skywalking.api.util.StringUtil; -import com.a.eye.skywalking.logging.ILog; -import com.a.eye.skywalking.logging.LogManager; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import java.io.InputStream; import java.util.Properties; @@ -20,7 +21,7 @@ import java.util.Properties; */ public class ClusterConfigInitializer { - private static ILog logger = LogManager.getLogger(ClusterConfigInitializer.class); + private static Logger logger = LogManager.getFormatterLogger(ClusterConfigInitializer.class); public static final String ConfigFileName = "collector.config"; diff --git a/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/Const.java b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/Const.java new file mode 100644 index 000000000..551964a56 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/main/java/com/a/eye/skywalking/collector/cluster/Const.java @@ -0,0 +1,8 @@ +package com.a.eye.skywalking.collector.cluster; + +/** + * @author pengys5 + */ +public class Const { + public static final String SystemName = "ClusterSystem"; +} 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 b49f60f6e..85778f447 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 @@ -5,10 +5,10 @@ import akka.actor.Terminated; import akka.actor.UntypedActor; import akka.cluster.Cluster; import akka.cluster.ClusterEvent; -import com.a.eye.skywalking.logging.ILog; -import com.a.eye.skywalking.logging.LogManager; import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; import com.a.eye.skywalking.collector.actor.ClusterWorkerRef; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.Iterator; import java.util.Map; @@ -28,7 +28,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class WorkersListener extends UntypedActor { - private ILog logger = LogManager.getLogger(WorkersListener.class); + private Logger logger = LogManager.getFormatterLogger(WorkersListener.class); public static final String WorkName = "WorkersListener"; @@ -52,7 +52,7 @@ 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()); + logger.info("register worker of role: %s, path: %s", register.getRole().roleName(), sender.toString()); ClusterWorkerRef workerRef = new ClusterWorkerRef(sender, register.getRole()); relation.put(sender, workerRef); clusterContext.put(new ClusterWorkerRef(sender, register.getRole())); diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorkerTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorkerTestCase.java new file mode 100644 index 000000000..968ff41ed --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorkerTestCase.java @@ -0,0 +1,21 @@ +package com.a.eye.skywalking.collector.actor; + +import org.junit.Test; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; + +/** + * @author pengys5 + */ +public class AbstractClusterWorkerTestCase { + + @Test + public void testAllocateJob() throws Exception { + AbstractClusterWorker worker = PowerMockito.mock(AbstractClusterWorker.class); + + String jobStr = "TestJob"; + worker.allocateJob(jobStr); + + Mockito.verify(worker).onWork(jobStr); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorkerTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorkerTestCase.java new file mode 100644 index 000000000..29b640833 --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorkerTestCase.java @@ -0,0 +1,60 @@ +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.RingBuffer; +import org.junit.Test; +import org.mockito.ArgumentMatcher; + +import static org.mockito.Mockito.*; + +/** + * @author pengys5 + */ +public class AbstractLocalAsyncWorkerTestCase { + + @Test + public void testAllocateJob() throws Exception { + AbstractLocalAsyncWorker worker = mock(AbstractLocalAsyncWorker.class); + + String message = "Test"; + worker.allocateJob(message); + verify(worker).onWork(message); + } + + @Test + public void testOnEventWhenNotEnd() throws Exception { + AbstractLocalAsyncWorker worker = mock(AbstractLocalAsyncWorker.class); + + AbstractLocalAsyncWorker.WorkerWithDisruptor disruptor = new AbstractLocalAsyncWorker.WorkerWithDisruptor(null, worker); + + MessageHolder holder = new MessageHolder(); + String message = "Test"; + holder.setMessage(message); + disruptor.onEvent(holder, 0, false); + + verify(worker).onWork(message); + } + + @Test + public void testOnEventWhenEnd() throws Exception { + AbstractLocalAsyncWorker worker = mock(AbstractLocalAsyncWorker.class); + + AbstractLocalAsyncWorker.WorkerWithDisruptor disruptor = new AbstractLocalAsyncWorker.WorkerWithDisruptor(null, worker); + + MessageHolder holder = new MessageHolder(); + String message = "Test"; + holder.setMessage(message); + disruptor.onEvent(holder, 0, true); + + verify(worker, times(1)).onWork(message); + verify(worker, times(1)).onWork(argThat(new IsEndOfBatchCommandClass())); + } + + class IsEndOfBatchCommandClass extends ArgumentMatcher { + public boolean matches(Object para) { + return para.getClass() == EndOfBatchCommand.class; + } + } + +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java new file mode 100644 index 000000000..5ff6ca51f --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java @@ -0,0 +1,75 @@ +package com.a.eye.skywalking.collector.actor; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.powermock.api.mockito.PowerMockito.*; + +import org.mockito.Mockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({AbstractWorker.class}) +public class AbstractWorkerProviderTestCase { + + @Test(expected = IllegalArgumentException.class) + public void testNullWorkerInstanceCreate() throws ProviderNotFoundException { + AbstractWorkerProvider provider = mock(AbstractWorkerProvider.class); + when(provider.workerInstance(null)).thenReturn(null); + + AbstractWorker worker = mock(AbstractWorker.class); + provider.create(worker); + } + + @Test + public void testNoneWorkerOwner() throws ProviderNotFoundException { + AbstractWorkerProvider provider = mock(AbstractWorkerProvider.class); + + ClusterWorkerContext context = mock(ClusterWorkerContext.class); + provider.setClusterContext(context); + + AbstractWorker worker = mock(AbstractWorker.class); + when(provider.workerInstance(context)).thenReturn(worker); + + provider.create(null); + Mockito.verify(provider).onCreate(null); + } + + @Test + public void testHasWorkerOwner() throws ProviderNotFoundException { + AbstractWorkerProvider provider = mock(AbstractWorkerProvider.class); + + ClusterWorkerContext context = mock(ClusterWorkerContext.class); + provider.setClusterContext(context); + + AbstractWorker worker = mock(AbstractWorker.class); + when(provider.workerInstance(context)).thenReturn(worker); + + AbstractWorker workerOwner = mock(AbstractWorker.class); + LocalWorkerContext localWorkerContext = mock(LocalWorkerContext.class); + when(workerOwner.getSelfContext()).thenReturn(localWorkerContext); + + provider.create(workerOwner); + Mockito.verify(provider).onCreate(localWorkerContext); + } + + @Test(expected = IllegalArgumentException.class) + public void testHasWorkerOwnerButNoneContext() throws ProviderNotFoundException { + AbstractWorkerProvider provider = mock(AbstractWorkerProvider.class); + + ClusterWorkerContext context = mock(ClusterWorkerContext.class); + provider.setClusterContext(context); + + AbstractWorker worker = mock(AbstractWorker.class); + when(provider.workerInstance(context)).thenReturn(worker); + + AbstractWorker workerOwner = mock(AbstractWorker.class); + when(workerOwner.getSelfContext()).thenReturn(null); + + provider.create(workerOwner); + } +} 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 deleted file mode 100644 index b7d09525e..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorker.java +++ /dev/null @@ -1,68 +0,0 @@ -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 ProviderNotFoundException { - getClusterContext().findProvider(TestLocalSyncWorker.TestLocalSyncWorkerRole.INSTANCE).create(this); - getClusterContext().findProvider(TestLocalAsyncWorker.TestLocalASyncWorkerRole.INSTANCE).create(this); - } - - @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 deleted file mode 100644 index bdb75e8f5..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorkerTestCase.java +++ /dev/null @@ -1,35 +0,0 @@ -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; - -// @Before - public void createSystem() throws Exception { - collectorSystem = new CollectorSystem(); - collectorSystem.boot(); - } - -// @Before - public void terminateSystem() { - collectorSystem.terminate(); - } - -// @Test - 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 deleted file mode 100644 index dde3656a3..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalAsyncWorker.java +++ /dev/null @@ -1,58 +0,0 @@ -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 ProviderNotFoundException { - - } - - @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 deleted file mode 100644 index 5c496e10f..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorker.java +++ /dev/null @@ -1,55 +0,0 @@ -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 ProviderNotFoundException { - - } - - @Override - public Object onWork(Object message) throws Exception { - if (message.equals("TellLocalWorker")) { - System.out.println("hello! "); - } else { - System.out.println("unhandled"); - } - return "Hello"; - } - - 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 deleted file mode 100644 index 9f61ccadc..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java +++ /dev/null @@ -1,25 +0,0 @@ -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/selector/HashCodeSelectorTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelectorTestCase.java new file mode 100644 index 000000000..13cfda87c --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelectorTestCase.java @@ -0,0 +1,49 @@ +package com.a.eye.skywalking.collector.actor.selector; + +import com.a.eye.skywalking.collector.actor.WorkerRef; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +public class HashCodeSelectorTestCase { + + @Test + public void testSelect() { + List members = new ArrayList<>(); + WorkerRef workerRef_1 = mock(WorkerRef.class); + WorkerRef workerRef_2 = mock(WorkerRef.class); + WorkerRef workerRef_3 = mock(WorkerRef.class); + + members.add(workerRef_1); + members.add(workerRef_2); + members.add(workerRef_3); + + AbstractHashMessage message_1 = mock(AbstractHashMessage.class); + when(message_1.getHashCode()).thenReturn(9); + + AbstractHashMessage message_2 = mock(AbstractHashMessage.class); + when(message_2.getHashCode()).thenReturn(10); + + AbstractHashMessage message_3 = mock(AbstractHashMessage.class); + when(message_3.getHashCode()).thenReturn(11); + + HashCodeSelector selector = new HashCodeSelector(); + + WorkerRef select_1 = selector.select(members, message_1); + Assert.assertEquals(workerRef_1.hashCode(), select_1.hashCode()); + + WorkerRef select_2 = selector.select(members, message_2); + Assert.assertEquals(workerRef_2.hashCode(), select_2.hashCode()); + + WorkerRef select_3 = selector.select(members, message_3); + Assert.assertEquals(workerRef_3.hashCode(), select_3.hashCode()); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/RollingSelectorTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/RollingSelectorTestCase.java new file mode 100644 index 000000000..95f92154d --- /dev/null +++ b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/RollingSelectorTestCase.java @@ -0,0 +1,41 @@ +package com.a.eye.skywalking.collector.actor.selector; + +import com.a.eye.skywalking.collector.actor.WorkerRef; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.powermock.api.mockito.PowerMockito.*; + +/** + * @author pengys5 + */ +public class RollingSelectorTestCase { + + @Test + public void testSelect() { + List members = new ArrayList<>(); + WorkerRef workerRef_1 = mock(WorkerRef.class); + WorkerRef workerRef_2 = mock(WorkerRef.class); + WorkerRef workerRef_3 = mock(WorkerRef.class); + + members.add(workerRef_1); + members.add(workerRef_2); + members.add(workerRef_3); + + Object message = new Object(); + + RollingSelector selector = new RollingSelector(); + + WorkerRef selected_1 = selector.select(members, message); + Assert.assertEquals(workerRef_2.hashCode(), selected_1.hashCode()); + + WorkerRef selected_2 = selector.select(members, message); + Assert.assertEquals(workerRef_3.hashCode(), selected_2.hashCode()); + + WorkerRef selected_3 = selector.select(members, message); + Assert.assertEquals(workerRef_1.hashCode(), selected_3.hashCode()); + } +} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java deleted file mode 100644 index 7549ef20e..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.a.eye.skywalking.collector.queue; - -import org.junit.Test; - -/** - * @author pengys5 - */ -public class QueueTestCase { - - @Test - public void testProducer() throws InterruptedException { - } -} diff --git a/skywalking-collector/skywalking-collector-commons/src/main/java/com/a/eye/skywalking/collector/commons/config/SeedNodesFormatter.java b/skywalking-collector/skywalking-collector-commons/src/main/java/com/a/eye/skywalking/collector/commons/config/SeedNodesFormatter.java new file mode 100644 index 000000000..18d741f03 --- /dev/null +++ b/skywalking-collector/skywalking-collector-commons/src/main/java/com/a/eye/skywalking/collector/commons/config/SeedNodesFormatter.java @@ -0,0 +1,12 @@ +package com.a.eye.skywalking.collector.commons.config; + +/** + * @author pengys5 + */ +public enum SeedNodesFormatter { + INSTANCE; + + public String formatter(String seedNodes) { + return null; + } +} diff --git a/skywalking-collector/skywalking-collector-commons/src/main/resources/application.conf b/skywalking-collector/skywalking-collector-commons/src/main/resources/application.conf index b61bc838c..fe62c052c 100644 --- a/skywalking-collector/skywalking-collector-commons/src/main/resources/application.conf +++ b/skywalking-collector/skywalking-collector-commons/src/main/resources/application.conf @@ -5,14 +5,14 @@ akka { serializers { java = "akka.serialization.JavaSerializer" proto = "akka.remote.serialization.ProtobufSerializer" - TraceSegment = "com.a.eye.skywalking.collector.worker.TraceSegmentSerializer" +// TraceSegment = "com.a.eye.skywalking.collector.worker.TraceSegmentSerializer" json = "com.a.eye.skywalking.collector.commons.serializer.JsonSerializer" } serialization-bindings { "java.lang.String" = java "com.google.protobuf.Message" = proto - "com.a.eye.skywalking.trace.TraceSegment" = TraceSegment +// "com.a.eye.skywalking.trace.TraceSegment" = TraceSegment "com.google.gson.JsonObject" = json } @@ -29,5 +29,6 @@ akka { cluster { auto-down-unreachable-after = off metrics.enabled = off + roles = ["WorkersListener"] } } diff --git a/skywalking-collector/skywalking-collector-worker/pom.xml b/skywalking-collector/skywalking-collector-worker/pom.xml index 12ee2668c..65c0e4d5b 100644 --- a/skywalking-collector/skywalking-collector-worker/pom.xml +++ b/skywalking-collector/skywalking-collector-worker/pom.xml @@ -12,26 +12,30 @@ skywalking-collector-worker jar + + 9.4.2.v20170220 + + com.a.eye skywalking-collector-cluster ${project.version} - - com.a.eye - skywalking-logging-log4j2 - ${project.version} - com.a.eye skywalking-collector-commons ${project.version} - org.nanohttpd - nanohttpd - 2.3.1 + org.eclipse.jetty + jetty-server + ${jetty.version} + + + org.eclipse.jetty + jetty-servlet + ${jetty.version} org.elasticsearch.client 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 5433f252b..ec3155b18 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 @@ -20,15 +20,19 @@ public abstract class AnalysisMember extends AbstractLocalAsyncWorker { @Override public void preStart() throws ProviderNotFoundException { - + } @Override - public void work(Object message) throws Exception { + final public void onWork(Object message) throws Exception { if (message instanceof EndOfBatchCommand) { aggregation(); } else { - analyse(message); + try { + analyse(message); + } catch (Exception e) { + e.printStackTrace(); + } } } 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 08eb5e47b..c7958e256 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,37 +1,29 @@ package com.a.eye.skywalking.collector.worker; -import com.a.eye.skywalking.collector.cluster.ClusterConfig; +import com.a.eye.skywalking.collector.CollectorSystem; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; import com.a.eye.skywalking.collector.cluster.ClusterConfigInitializer; -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 com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.storage.IndexCreator; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * @author pengys5 */ public class CollectorBootStartUp { - /** - * TODO pengys5, make the exception clear. - * @param args - * @throws Exception - */ - public static void main(String[] args) throws Exception { - LogManager.setLogResolver(new Log4j2Resolver()); + private static Logger logger = LogManager.getFormatterLogger(CollectorBootStartUp.class); + public static void main(String[] args) throws Exception { + logger.info("collector system starting...."); 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.cluster.seed-nodes=" + ClusterConfig.Cluster.seed_nodes)). - withFallback(ConfigFactory.load("application.conf")); - -// ActorSystem system = ActorSystem.create(ClusterConfig.Cluster.appname, config); -// WorkersCreator.INSTANCE.boot(system); - HttpServer.INSTANCE.boot(); -// EsClient.boot(); + CollectorSystem collectorSystem = new CollectorSystem(); + collectorSystem.boot(); + EsClient.boot(); +// IndexCreator.INSTANCE.create(); + HttpServer.INSTANCE.boot((ClusterWorkerContext) collectorSystem.getClusterContext()); } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/Const.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/Const.java new file mode 100644 index 000000000..337aa3ccc --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/Const.java @@ -0,0 +1,13 @@ +package com.a.eye.skywalking.collector.worker; + +/** + * @author pengys5 + */ +public class Const { + public static final String ID_SPLIT = "..-.."; + public static final String IDS_SPLIT = "\\.\\.-\\.\\."; + public static final String PEERS_FRONT_SPLIT = "["; + public static final String PEERS_BEHIND_SPLIT = "]"; + public static final String USER_CODE = "User"; + public static final String RESULT = "result"; +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMember.java new file mode 100644 index 000000000..a2e4df59b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMember.java @@ -0,0 +1,38 @@ +package com.a.eye.skywalking.collector.worker; + +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.MergeData; +import com.a.eye.skywalking.collector.worker.storage.MergePersistenceData; + +/** + * @author pengys5 + */ +public abstract class MergeAnalysisMember extends AnalysisMember { + + private MergePersistenceData persistenceData; + + protected MergeAnalysisMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + persistenceData = new MergePersistenceData(); + } + + private MergePersistenceData getPersistenceData() { + return persistenceData; + } + + final protected void setMergeData(String id, String column, String value) throws Exception { + getPersistenceData().getElseCreate(id).setMergeData(column, value); + if (getPersistenceData().size() >= WorkerConfig.Persistence.Data.size) { + aggregation(); + } + } + + final public MergeData pushOne() { + if (getPersistenceData().iterator().hasNext()) { + return getPersistenceData().pushOne(); + } + return null; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergePersistenceMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergePersistenceMember.java new file mode 100644 index 000000000..2eacb7e5e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergePersistenceMember.java @@ -0,0 +1,90 @@ +package com.a.eye.skywalking.collector.worker; + +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.MergeData; +import com.a.eye.skywalking.collector.worker.storage.MergePersistenceData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.bulk.BulkRequestBuilder; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.get.MultiGetItemResponse; +import org.elasticsearch.action.get.MultiGetRequestBuilder; +import org.elasticsearch.action.get.MultiGetResponse; +import org.elasticsearch.client.Client; + +import java.util.Iterator; +import java.util.Map; + +/** + * @author pengys5 + */ +public abstract class MergePersistenceMember extends PersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(MergePersistenceMember.class); + + private MergePersistenceData persistenceData = new MergePersistenceData(); + + protected MergePersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + final public void analyse(Object message) throws Exception { + if (message instanceof MergeData) { + MergeData mergeData = (MergeData) message; + persistenceData.getElseCreate(mergeData.getId()).merge(mergeData); + if (persistenceData.size() >= WorkerConfig.Persistence.Data.size) { + persistence(); + } + } else { + logger.error("message unhandled"); + } + } + + final protected void persistence() { + MultiGetResponse multiGetResponse = searchFromEs(); + for (MultiGetItemResponse itemResponse : multiGetResponse) { + GetResponse response = itemResponse.getResponse(); + if (response != null && response.isExists()) { + persistenceData.getElseCreate(response.getId()).merge(response.getSource()); + } + } + + boolean success = saveToEs(); + if (success) { + persistenceData.clear(); + } + } + + private MultiGetResponse searchFromEs() { + Client client = EsClient.getClient(); + MultiGetRequestBuilder multiGetRequestBuilder = client.prepareMultiGet(); + + Iterator> iterator = persistenceData.iterator(); + + while (iterator.hasNext()) { + multiGetRequestBuilder.add(esIndex(), esType(), iterator.next().getKey()); + } + + return multiGetRequestBuilder.get(); + } + + private boolean saveToEs() { + Client client = EsClient.getClient(); + BulkRequestBuilder bulkRequest = client.prepareBulk(); + logger.debug("persistenceData size: %s", persistenceData.size()); + + Iterator> iterator = persistenceData.iterator(); + while (iterator.hasNext()) { + MergeData mergeData = iterator.next().getValue(); + bulkRequest.add(client.prepareIndex(esIndex(), esType(), mergeData.getId()).setSource(mergeData.toMap())); + } + + BulkResponse bulkResponse = bulkRequest.execute().actionGet(); + return !bulkResponse.hasFailures(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricAnalysisMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricAnalysisMember.java index 113627fbd..701c907e0 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,37 +1,30 @@ 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; -import com.lmax.disruptor.RingBuffer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; /** * @author pengys5 */ public abstract class MetricAnalysisMember extends AnalysisMember { - private Logger logger = LogManager.getFormatterLogger(MetricAnalysisMember.class); - - protected MetricPersistenceData persistenceData = new MetricPersistenceData(); + private MetricPersistenceData persistenceData = new MetricPersistenceData(); public MetricAnalysisMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } - public void setMetric(String id, int second, Long value) throws Exception { - persistenceData.getElseCreate(id).setMetric(second, value); + final protected void setMetric(String id, String column, Long value) throws Exception { + persistenceData.getElseCreate(id).setMetric(column, value); if (persistenceData.size() >= WorkerConfig.Persistence.Data.size) { aggregation(); } } - public MetricData pushOne() { + final public MetricData pushOne() { if (persistenceData.iterator().hasNext()) { return persistenceData.pushOne(); } 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 acc9c0bca..33a1d0d5f 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 @@ -26,14 +26,14 @@ public abstract class MetricPersistenceMember extends PersistenceMember { private Logger logger = LogManager.getFormatterLogger(MetricPersistenceMember.class); - protected MetricPersistenceData persistenceData = new MetricPersistenceData(); + private MetricPersistenceData persistenceData = new MetricPersistenceData(); public MetricPersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override - public void analyse(Object message) throws Exception { + final public void analyse(Object message) throws Exception { if (message instanceof MetricData) { MetricData metricData = (MetricData) message; persistenceData.getElseCreate(metricData.getId()).merge(metricData); @@ -45,7 +45,7 @@ public abstract class MetricPersistenceMember extends PersistenceMember { } } - protected void persistence() { + final protected void persistence() { MultiGetResponse multiGetResponse = searchFromEs(); for (MultiGetItemResponse itemResponse : multiGetResponse) { GetResponse response = itemResponse.getResponse(); @@ -60,11 +60,12 @@ public abstract class MetricPersistenceMember extends PersistenceMember { } } - public MultiGetResponse searchFromEs() { + private MultiGetResponse searchFromEs() { Client client = EsClient.getClient(); MultiGetRequestBuilder multiGetRequestBuilder = client.prepareMultiGet(); Iterator> iterator = persistenceData.iterator(); + while (iterator.hasNext()) { multiGetRequestBuilder.add(esIndex(), esType(), iterator.next().getKey()); } @@ -73,7 +74,7 @@ public abstract class MetricPersistenceMember extends PersistenceMember { return multiGetResponse; } - public boolean saveToEs() { + private boolean saveToEs() { Client client = EsClient.getClient(); BulkRequestBuilder bulkRequest = client.prepareBulk(); logger.debug("persistenceData size: %s", persistenceData.size()); 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 4ee3b1c51..a4032a225 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 @@ -23,12 +23,12 @@ public abstract class PersistenceMember extends AbstractLocalAsyncWorker { public abstract void analyse(Object message) throws Exception; @Override - public void preStart() throws ProviderNotFoundException { - + final public void preStart() throws ProviderNotFoundException { + } @Override - public void work(Object message) throws Exception { + final protected void onWork(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 69a4fde43..2ea6a20bb 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 @@ -25,14 +25,14 @@ public abstract class RecordAnalysisMember extends AnalysisMember { super(role, clusterContext, selfContext); } - public void setRecord(String id, JsonObject record) throws Exception { + final public void setRecord(String id, JsonObject record) throws Exception { persistenceData.getElseCreate(id).setRecord(record); if (persistenceData.size() >= WorkerConfig.Analysis.Data.size) { aggregation(); } } - public RecordData pushOne() { + final public RecordData pushOne() { if (persistenceData.hasNext()) { return persistenceData.pushOne(); } 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 108b6a896..1f9828c8b 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 @@ -22,18 +22,24 @@ public abstract class RecordPersistenceMember extends PersistenceMember { private Logger logger = LogManager.getFormatterLogger(RecordPersistenceMember.class); - protected RecordPersistenceData persistenceData = new RecordPersistenceData(); + private RecordPersistenceData persistenceData; public RecordPersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); + persistenceData = new RecordPersistenceData(); + } + + private RecordPersistenceData getPersistenceData() { + return this.persistenceData; } @Override public void analyse(Object message) throws Exception { if (message instanceof RecordData) { RecordData recordData = (RecordData) message; - persistenceData.getElseCreate(recordData.getId()).setRecord(recordData.getRecord()); - if (persistenceData.size() >= WorkerConfig.Persistence.Data.size) { + logger.debug("setRecord: id: %s, data: %s", recordData.getId(), recordData.getRecord()); + getPersistenceData().getElseCreate(recordData.getId()).setRecord(recordData.getRecord()); + if (getPersistenceData().size() >= WorkerConfig.Persistence.Data.size) { persistence(); } } else { @@ -44,23 +50,27 @@ public abstract class RecordPersistenceMember extends PersistenceMember { protected void persistence() { boolean success = saveToEs(); if (success) { - persistenceData.clear(); + getPersistenceData().clear(); } } - public boolean saveToEs() { + private boolean saveToEs() { Client client = EsClient.getClient(); BulkRequestBuilder bulkRequest = client.prepareBulk(); - logger.debug("persistenceData size: %s", persistenceData.size()); + logger.debug("persistenceData size: %s", getPersistenceData().size()); - Iterator> iterator = persistenceData.iterator(); + Iterator> iterator = getPersistenceData().iterator(); while (iterator.hasNext()) { Map.Entry recordData = iterator.next(); + logger.debug("saveToEs: key: %s, data: %s", recordData.getKey(), recordData.getValue().getRecord().toString()); bulkRequest.add(client.prepareIndex(esIndex(), esType(), recordData.getKey()).setSource(recordData.getValue().getRecord().toString())); } BulkResponse bulkResponse = bulkRequest.execute().actionGet(); + if (bulkResponse.hasFailures()) { + logger.error(bulkResponse.buildFailureMessage()); + } return !bulkResponse.hasFailures(); } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/TimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/TimeSlice.java new file mode 100644 index 000000000..7e3ec6feb --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/TimeSlice.java @@ -0,0 +1,28 @@ +package com.a.eye.skywalking.collector.worker; + +/** + * @author pengys5 + */ +public abstract class TimeSlice { + private String sliceType; + private long startTime; + private long endTime; + + public TimeSlice(String sliceType,long startTime, long endTime) { + this.startTime = startTime; + this.endTime = endTime; + this.sliceType = sliceType; + } + + public String getSliceType() { + return sliceType; + } + + public long getStartTime() { + return startTime; + } + + public long getEndTime() { + return endTime; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java index d92ba1340..fcb5e902b 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/WorkerConfig.java @@ -45,7 +45,88 @@ public class WorkerConfig extends ClusterConfig { } } + public static class WorkerNum { + public static class Node { + public static class NodeDayAgg { + public static int Value = 10; + } + + public static class NodeHourAgg { + public static int Value = 10; + } + + public static class NodeMinuteAgg { + public static int Value = 10; + } + + public static class NodeMappingDayAgg { + public static int Value = 10; + } + + public static class NodeMappingHourAgg { + public static int Value = 10; + } + + public static class NodeMappingMinuteAgg { + public static int Value = 10; + } + } + } + public static class Queue { + public static class Segment { + public static class SegmentCostSave { + public static int Size = 1024; + } + + public static class SegmentSave { + public static int Size = 1024; + } + + public static class SegmentExceptionSave { + public static int Size = 1024; + } + } + + public static class Node { + public static class NodeDayAnalysis { + public static int Size = 1024; + } + + public static class NodeHourAnalysis { + public static int Size = 1024; + } + + public static class NodeMinuteAnalysis { + public static int Size = 1024; + } + + public static class NodeRefDayAnalysis { + public static int Size = 1024; + } + + public static class NodeRefHourAnalysis { + public static int Size = 1024; + } + + public static class NodeRefMinuteAnalysis { + public static int Size = 1024; + } + + public static class NodeMappingDayAnalysis { + public static int Size = 1024; + } + + public static class NodeMappingHourAnalysis { + public static int Size = 1024; + } + + public static class NodeMappingMinuteAnalysis { + public static int Size = 1024; + } + } + + public static class Persistence { public static class DAGNodePersistence { public static int Size = 1024; @@ -92,6 +173,5 @@ public class WorkerConfig extends ClusterConfig { public static class DAGNodeRefAnalysis { public static int Size = 1024; } - } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/ApplicationMain.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/ApplicationMain.java deleted file mode 100644 index d28522454..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/ApplicationMain.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.a.eye.skywalking.collector.worker.application; - -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; -import com.a.eye.skywalking.collector.worker.application.analysis.ResponseSummaryAnalysis; -import com.a.eye.skywalking.collector.worker.application.persistence.TraceSegmentRecordPersistence; -import com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver; -import com.a.eye.skywalking.trace.Span; -import com.a.eye.skywalking.trace.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 AbstractLocalSyncWorker { - - private Logger logger = LogManager.getFormatterLogger(ApplicationMain.class); - - public ApplicationMain(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(DAGNodeAnalysis.Role.INSTANCE).create(this); - getClusterContext().findProvider(NodeInstanceAnalysis.Role.INSTANCE).create(this); - getClusterContext().findProvider(ResponseCostAnalysis.Role.INSTANCE).create(this); - getClusterContext().findProvider(ResponseSummaryAnalysis.Role.INSTANCE).create(this); - getClusterContext().findProvider(TraceSegmentRecordPersistence.Role.INSTANCE).create(this); - } - - @Override - public Object onWork(Object message) throws Exception { - if (message instanceof TraceSegmentReceiver.TraceSegmentTimeSlice) { - logger.debug("begin translate TraceSegment Object to JsonObject"); - TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment = (TraceSegmentReceiver.TraceSegmentTimeSlice) message; - - getSelfContext().lookup(TraceSegmentRecordPersistence.Role.INSTANCE).tell(traceSegment); - - sendToDAGNodePersistence(traceSegment); - sendToNodeInstanceAnalysis(traceSegment); - sendToResponseCostPersistence(traceSegment); - sendToResponseSummaryPersistence(traceSegment); - } - return null; - } - - public static class Factory extends AbstractLocalSyncWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @Override - 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(); - } - } - - private void sendToDAGNodePersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { - String code = traceSegment.getTraceSegment().getApplicationCode(); - - String component = null; - String layer = null; - for (Span span : traceSegment.getTraceSegment().getSpans()) { - if (span.getParentSpanId() == -1) { - component = Tags.COMPONENT.get(span); - layer = Tags.SPAN_LAYER.get(span); - } - } - - DAGNodeAnalysis.Metric node = new DAGNodeAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, component, layer); - getSelfContext().lookup(DAGNodeAnalysis.Role.INSTANCE).tell(node); - } - - private void sendToNodeInstanceAnalysis(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { - TraceSegment segment = traceSegment.getTraceSegment(); - List refs = segment.getRefs(); - - 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); - getSelfContext().lookup(NodeInstanceAnalysis.Role.INSTANCE).tell(property); - } - } - } - - private void sendToResponseCostPersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { - String code = traceSegment.getTraceSegment().getApplicationCode(); - - long startTime = -1; - long endTime = -1; - Boolean isError = false; - - for (Span span : traceSegment.getTraceSegment().getSpans()) { - if (span.getParentSpanId() == -1) { - startTime = span.getStartTime(); - endTime = span.getEndTime(); - isError = Tags.ERROR.get(span); - } - } - - ResponseCostAnalysis.Metric cost = new ResponseCostAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, isError, startTime, endTime); - getSelfContext().lookup(ResponseCostAnalysis.Role.INSTANCE).tell(cost); - } - - private void sendToResponseSummaryPersistence(TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment) throws Exception { - String code = traceSegment.getTraceSegment().getApplicationCode(); - boolean isError = false; - - for (Span span : traceSegment.getTraceSegment().getSpans()) { - if (span.getParentSpanId() == -1) { - isError = Tags.ERROR.get(span); - } - } - - ResponseSummaryAnalysis.Metric summary = new ResponseSummaryAnalysis.Metric(traceSegment.getMinute(), traceSegment.getSecond(), code, isError); - 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 deleted file mode 100644 index f91a5785c..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/DAGNodeAnalysis.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.a.eye.skywalking.collector.worker.application.analysis; - -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.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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @author pengys5 - */ -public class DAGNodeAnalysis extends RecordAnalysisMember { - - private Logger logger = LogManager.getFormatterLogger(DAGNodeAnalysis.class); - - public DAGNodeAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void analyse(Object message) throws Exception { - if (message instanceof Metric) { - Metric metric = (Metric) message; - JsonObject propertyJsonObj = new JsonObject(); - propertyJsonObj.addProperty("code", metric.code); - propertyJsonObj.addProperty(DateTools.Time_Slice_Column_Name, metric.getMinute()); - propertyJsonObj.addProperty("component", metric.component); - propertyJsonObj.addProperty("layer", metric.layer); - - String id = metric.getMinute() + "-" + metric.code; - logger.debug("dag node: %s", propertyJsonObj.toString()); - setRecord(id, propertyJsonObj); - } else { - logger.error("message unhandled"); - } - } - - @Override - protected void aggregation() throws Exception { - RecordData oneRecord; - while ((oneRecord = pushOne()) != null) { - getClusterContext().lookup(DAGNodeReceiver.Role.INSTANCE).tell(oneRecord); - } - } - - public static class Factory extends AbstractLocalAsyncWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @Override - public Role role() { - return Role.INSTANCE; - } - - @Override - public DAGNodeAnalysis workerInstance(ClusterWorkerContext clusterContext) { - return new DAGNodeAnalysis(role(), clusterContext, new LocalWorkerContext()); - } - - @Override - public int queueSize() { - return 1024; - } - } - - 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; - private final String layer; - - public Metric(long minute, int second, String code, String component, String layer) { - super(minute, second); - this.code = code; - this.component = component; - this.layer = layer; - } - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/NodeInstanceAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/NodeInstanceAnalysis.java deleted file mode 100644 index 56aeeb0aa..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/NodeInstanceAnalysis.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.a.eye.skywalking.collector.worker.application.analysis; - -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.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; -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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @author pengys5 - */ -public class NodeInstanceAnalysis extends RecordAnalysisMember { - - private Logger logger = LogManager.getFormatterLogger(NodeInstanceAnalysis.class); - - public NodeInstanceAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void analyse(Object message) throws Exception { - if (message instanceof Metric) { - Metric metric = (Metric) message; - JsonObject propertyJsonObj = new JsonObject(); - propertyJsonObj.addProperty("code", metric.code); - propertyJsonObj.addProperty(DateTools.Time_Slice_Column_Name, metric.getMinute()); - propertyJsonObj.addProperty("address", metric.address); - - String id = metric.getMinute() + "-" + metric.address; - setRecord(id, propertyJsonObj); - logger.debug("node instance: %s", propertyJsonObj.toString()); - } else { - logger.error("message unhandled"); - } - } - - @Override - protected void aggregation() throws Exception { - RecordData oneRecord; - while ((oneRecord = pushOne()) != null) { - getClusterContext().lookup(NodeInstanceReceiver.Role.INSTANCE).tell(oneRecord); - } - } - - public static class Factory extends AbstractLocalAsyncWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @Override - public Role role() { - return null; - } - - @Override - public NodeInstanceAnalysis workerInstance(ClusterWorkerContext clusterContext) { - return new NodeInstanceAnalysis(role(), clusterContext, new LocalWorkerContext()); - } - - @Override - public int queueSize() { - return WorkerConfig.Queue.NodeInstanceAnalysis.Size; - } - } - - 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; - - public Metric(long minute, int second, String code, String address) { - super(minute, second); - this.code = code; - this.address = address; - } - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseCostAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseCostAnalysis.java deleted file mode 100644 index fd31469d5..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseCostAnalysis.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.a.eye.skywalking.collector.worker.application.analysis; - -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.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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @author pengys5 - */ -public class ResponseCostAnalysis extends MetricAnalysisMember { - - private Logger logger = LogManager.getFormatterLogger(ResponseCostAnalysis.class); - - public ResponseCostAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void analyse(Object message) throws Exception { - if (message instanceof Metric) { - Metric metric = (Metric) message; - long cost = metric.endTime - metric.startTime; - if (cost <= 1000 && !metric.isError) { - String id = metric.getMinute() + "-" + metric.code; - setMetric(id, metric.getSecond(), cost); - } -// logger.debug("response cost metric: %s", data.toString()); - } - } - - @Override - protected void aggregation() throws Exception { - MetricData oneMetric; - while ((oneMetric = pushOne()) != null) { - getClusterContext().lookup(ResponseCostReceiver.Role.INSTANCE).tell(oneMetric); - } - } - - public static class Factory extends AbstractLocalAsyncWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @Override - public Role role() { - return Role.INSTANCE; - } - - @Override - public ResponseCostAnalysis workerInstance(ClusterWorkerContext clusterContext) { - return new ResponseCostAnalysis(role(), clusterContext, new LocalWorkerContext()); - } - - @Override - public int queueSize() { - return WorkerConfig.Queue.ResponseCostAnalysis.Size; - } - } - - 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; - private final Long startTime; - private final Long endTime; - - public Metric(long minute, int second, String code, Boolean isError, Long startTime, Long endTime) { - super(minute, second); - this.code = code; - this.isError = isError; - this.startTime = startTime; - this.endTime = endTime; - } - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseSummaryAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseSummaryAnalysis.java deleted file mode 100644 index 9dae5cccb..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/analysis/ResponseSummaryAnalysis.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.a.eye.skywalking.collector.worker.application.analysis; - -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.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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @author pengys5 - */ -public class ResponseSummaryAnalysis extends MetricAnalysisMember { - - private Logger logger = LogManager.getFormatterLogger(ResponseSummaryAnalysis.class); - - public ResponseSummaryAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void analyse(Object message) throws Exception { - if (message instanceof Metric) { - Metric metric = (Metric) message; - String id = metric.getMinute() + "-" + metric.code; - setMetric(id, metric.getSecond(), 1L); -// logger.debug("response summary metric: %s", data.toString()); - } - } - - @Override - protected void aggregation() throws Exception { - MetricData oneMetric; - while ((oneMetric = pushOne()) != null) { - getClusterContext().lookup(ResponseSummaryReceiver.Role.INSTANCE).tell(oneMetric); - } - } - - public static class Factory extends AbstractLocalAsyncWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @Override - public Role role() { - return Role.INSTANCE; - } - - @Override - public ResponseSummaryAnalysis workerInstance(ClusterWorkerContext clusterContext) { - return new ResponseSummaryAnalysis(role(), clusterContext, new LocalWorkerContext()); - } - - @Override - public int queueSize() { - return WorkerConfig.Queue.ResponseSummaryAnalysis.Size; - } - } - - 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; - - public Metric(long minute, int second, String code, Boolean isError) { - super(minute, second); - this.code = code; - this.isError = isError; - } - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/TraceSegmentRecordPersistence.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/TraceSegmentRecordPersistence.java deleted file mode 100644 index c62f59e48..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/TraceSegmentRecordPersistence.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.a.eye.skywalking.collector.worker.application.persistence; - - -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; -import com.a.eye.skywalking.collector.worker.storage.RecordData; -import com.a.eye.skywalking.collector.worker.tools.DateTools; -import com.a.eye.skywalking.trace.Span; -import com.a.eye.skywalking.trace.TraceSegment; -import com.a.eye.skywalking.trace.TraceSegmentRef; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.util.List; -import java.util.Map; - -/** - * @author pengys5 - */ -public class TraceSegmentRecordPersistence extends RecordPersistenceMember { - - private Logger logger = LogManager.getFormatterLogger(TraceSegmentRecordPersistence.class); - - @Override - public String esIndex() { - return "application_record"; - } - - @Override - public String esType() { - return "trace_segment"; - } - - public TraceSegmentRecordPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void analyse(Object message) throws Exception { - if (message instanceof TraceSegmentReceiver.TraceSegmentTimeSlice) { - TraceSegmentReceiver.TraceSegmentTimeSlice traceSegment = (TraceSegmentReceiver.TraceSegmentTimeSlice) message; - JsonObject jsonObject = parseTraceSegment(traceSegment.getTraceSegment(), traceSegment.getMinute()); - - RecordData recordData = new RecordData(traceSegment.getTraceSegment().getTraceSegmentId()); - recordData.setRecord(jsonObject); - super.analyse(recordData); - } - } - - public static class Factory extends 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 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(); - } - } - - private JsonObject parseTraceSegment(TraceSegment traceSegment, long minute) { - JsonObject traceJsonObj = new JsonObject(); - traceJsonObj.addProperty("segmentId", traceSegment.getTraceSegmentId()); - traceJsonObj.addProperty(DateTools.Time_Slice_Column_Name, minute); - traceJsonObj.addProperty("startTime", traceSegment.getStartTime()); - traceJsonObj.addProperty("endTime", traceSegment.getEndTime()); - traceJsonObj.addProperty("appCode", traceSegment.getApplicationCode()); - - if (traceSegment.getRefs() != null) { - JsonArray refsJsonArray = parseRefs(traceSegment.getRefs()); - traceJsonObj.add("refs", refsJsonArray); - } - - JsonArray spanJsonArray = new JsonArray(); - for (Span span : traceSegment.getSpans()) { - JsonObject spanJsonObj = parseSpan(span); - spanJsonArray.add(spanJsonObj); - } - traceJsonObj.add("spans", spanJsonArray); - - return traceJsonObj; - } - - private JsonArray parseRefs(List refs) { - JsonArray refsJsonArray = new JsonArray(); - for (TraceSegmentRef ref : refs) { - JsonObject refJsonObj = new JsonObject(); - refJsonObj.addProperty("spanId", ref.getSpanId()); - refJsonObj.addProperty("appCode", ref.getApplicationCode()); - refJsonObj.addProperty("segmentId", ref.getTraceSegmentId()); - refJsonObj.addProperty("peerHost", ref.getPeerHost()); - refsJsonArray.add(refJsonObj); - } - return refsJsonArray; - } - - private JsonObject parseSpan(Span span) { - JsonObject spanJsonObj = new JsonObject(); - spanJsonObj.addProperty("spanId", span.getSpanId()); - spanJsonObj.addProperty("parentSpanId", span.getParentSpanId()); - spanJsonObj.addProperty("startTime", span.getStartTime()); - spanJsonObj.addProperty("endTime", span.getEndTime()); - spanJsonObj.addProperty("operationName", span.getOperationName()); - - JsonObject tagsJsonObj = parseSpanTag(span.getTags()); - spanJsonObj.add("tags", tagsJsonObj); - return spanJsonObj; - } - - private JsonObject parseSpanTag(Map tags) { - JsonObject tagsJsonObj = new JsonObject(); - - for (Map.Entry entry : tags.entrySet()) { - String key = entry.getKey(); - String value = String.valueOf(entry.getValue()); - tagsJsonObj.addProperty(key, value); - } - return tagsJsonObj; - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/ApplicationRefMain.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/ApplicationRefMain.java deleted file mode 100644 index fcc72ce44..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/ApplicationRefMain.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.a.eye.skywalking.collector.worker.applicationref; - -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 AbstractLocalSyncWorker { - - private DAGNodeRefAnalysis dagNodeRefAnalysis; - - public ApplicationRefMain(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(DAGNodeRefAnalysis.Role.INSTANCE).create(this); - } - - @Override - public Object onWork(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); - } - } - return null; - } - - public static class Factory extends AbstractLocalSyncWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @Override - 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 deleted file mode 100644 index 3b026dbd2..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/analysis/DAGNodeRefAnalysis.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.a.eye.skywalking.collector.worker.applicationref.analysis; - -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.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; -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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @author pengys5 - */ -public class DAGNodeRefAnalysis extends RecordAnalysisMember { - - private Logger logger = LogManager.getFormatterLogger(DAGNodeRefAnalysis.class); - - public DAGNodeRefAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void analyse(Object message) throws Exception { - if (message instanceof Metric) { - Metric metric = (Metric) message; - JsonObject propertyJsonObj = new JsonObject(); - propertyJsonObj.addProperty("frontCode", metric.frontCode); - propertyJsonObj.addProperty("behindCode", metric.behindCode); - propertyJsonObj.addProperty(DateTools.Time_Slice_Column_Name, metric.getMinute()); - - String id = metric.getMinute() + "-" + metric.frontCode + "-" + metric.behindCode; - setRecord(id, propertyJsonObj); - logger.debug("dag node ref: %s", propertyJsonObj.toString()); - } - } - - @Override - protected void aggregation() throws Exception { - RecordData oneRecord; - while ((oneRecord = pushOne()) != null) { - getClusterContext().lookup(DAGNodeRefReceiver.Role.INSTANCE).tell(oneRecord); - } - } - - public static class Factory extends AbstractLocalAsyncWorkerProvider { - - public static Factory INSTANCE = new Factory(); - - @Override - public Role role() { - return Role.INSTANCE; - } - - @Override - public DAGNodeRefAnalysis workerInstance(ClusterWorkerContext clusterContext) { - return new DAGNodeRefAnalysis(role(), clusterContext, new LocalWorkerContext()); - } - - @Override - public int queueSize() { - return WorkerConfig.Queue.DAGNodeRefAnalysis.Size; - } - } - - 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; - - public Metric(long minute, int second, String frontCode, String behindCode) { - super(minute, second); - this.frontCode = frontCode; - this.behindCode = behindCode; - } - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceGetWithGlobalId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceGetWithGlobalId.java new file mode 100644 index 000000000..38eee9fa5 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceGetWithGlobalId.java @@ -0,0 +1,79 @@ +package com.a.eye.skywalking.collector.worker.globaltrace; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.globaltrace.persistence.GlobalTraceSearchWithGlobalId; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class GlobalTraceGetWithGlobalId extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(GlobalTraceGetWithGlobalId.class); + + private GlobalTraceGetWithGlobalId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(GlobalTraceSearchWithGlobalId.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("globalId")) { + throw new IllegalArgumentException("the request parameter must contains globalId"); + } + logger.debug("globalId: %s", Arrays.toString(request.get("globalId"))); + + String globalId = ParameterTools.INSTANCE.toString(request, "globalId"); + + getSelfContext().lookup(GlobalTraceSearchWithGlobalId.WorkerRole.INSTANCE).ask(globalId, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public GlobalTraceGetWithGlobalId workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceGetWithGlobalId(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/globalTrace/globalId"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return GlobalTraceGetWithGlobalId.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/globaltrace/GlobalTraceIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceIndex.java new file mode 100644 index 000000000..c9c460fe2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceIndex.java @@ -0,0 +1,41 @@ +package com.a.eye.skywalking.collector.worker.globaltrace; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class GlobalTraceIndex extends AbstractIndex { + + public static final String Index = "global_trace_idx"; + public static final String SubSegIds = "subSegIds"; + + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return true; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(SubSegIds) + .field("type", "text") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/analysis/GlobalTraceAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/analysis/GlobalTraceAnalysis.java new file mode 100644 index 000000000..89bb239dc --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/analysis/GlobalTraceAnalysis.java @@ -0,0 +1,84 @@ +package com.a.eye.skywalking.collector.worker.globaltrace.analysis; + +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.MergeAnalysisMember; +import com.a.eye.skywalking.collector.worker.globaltrace.GlobalTraceIndex; +import com.a.eye.skywalking.collector.worker.globaltrace.persistence.GlobalTraceAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.MergeData; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.TraceId.DistributedTraceId; +import com.a.eye.skywalking.trace.TraceSegment; + +import java.util.List; + +/** + * @author pengys5 + */ +public class GlobalTraceAnalysis extends MergeAnalysisMember { + + private GlobalTraceAnalysis(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + String subSegmentId = segment.getTraceSegmentId(); + List globalTraceIdList = segment.getRelatedGlobalTraces(); + if (CollectionTools.isNotEmpty(globalTraceIdList)) { + for (DistributedTraceId disTraceId : globalTraceIdList) { + String traceId = disTraceId.get(); + setMergeData(traceId, GlobalTraceIndex.SubSegIds, subSegmentId); + } + } + } + } + + @Override + protected void aggregation() throws Exception { + MergeData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(GlobalTraceAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public GlobalTraceAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return 1024; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return GlobalTraceAnalysis.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/globaltrace/entity/TreeNode.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/entity/TreeNode.java new file mode 100644 index 000000000..7f7f22cbc --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/entity/TreeNode.java @@ -0,0 +1,23 @@ +package com.a.eye.skywalking.collector.worker.globaltrace.entity; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author pengys5 + */ +public class TreeNode { + + private String spanId; + + private List childNodes; + + public TreeNode(String spanId) { + this.spanId = spanId; + childNodes = new ArrayList<>(); + } + + public void addChild(TreeNode childNode) { + childNodes.add(childNode); + } +} 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/globaltrace/persistence/GlobalTraceAgg.java similarity index 53% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/DAGNodeReceiver.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceAgg.java index a0e498e84..0a6cf9079 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/globaltrace/persistence/GlobalTraceAgg.java @@ -1,40 +1,39 @@ -package com.a.eye.skywalking.collector.worker.application.receiver; +package com.a.eye.skywalking.collector.worker.globaltrace.persistence; import com.a.eye.skywalking.collector.actor.*; -import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; 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; +import com.a.eye.skywalking.collector.worker.storage.MergeData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class DAGNodeReceiver extends AbstractClusterWorker { +public class GlobalTraceAgg extends AbstractClusterWorker { - private Logger logger = LogManager.getFormatterLogger(DAGNodeReceiver.class); + private Logger logger = LogManager.getFormatterLogger(GlobalTraceAgg.class); - public DAGNodeReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + private GlobalTraceAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(DAGNodePersistence.Role.INSTANCE).create(this); + getClusterContext().findProvider(GlobalTraceSave.Role.INSTANCE).create(this); } @Override - public void work(Object message) throws Exception { - if (message instanceof RecordData) { - getSelfContext().lookup(DAGNodePersistence.Role.INSTANCE).tell(message); + protected void onWork(Object message) throws Exception { + if (message instanceof MergeData) { + getSelfContext().lookup(GlobalTraceSave.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractClusterWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -43,8 +42,8 @@ public class DAGNodeReceiver extends AbstractClusterWorker { } @Override - public DAGNodeReceiver workerInstance(ClusterWorkerContext clusterContext) { - return new DAGNodeReceiver(role(), clusterContext, new LocalWorkerContext()); + public GlobalTraceAgg workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceAgg(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -58,12 +57,12 @@ public class DAGNodeReceiver extends AbstractClusterWorker { @Override public String roleName() { - return DAGNodeReceiver.class.getSimpleName(); + return GlobalTraceAgg.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } 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/globaltrace/persistence/GlobalTraceSave.java similarity index 55% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/NodeInstancePersistence.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSave.java index 0b70b33b1..6954e9b4d 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/globaltrace/persistence/GlobalTraceSave.java @@ -1,37 +1,35 @@ -package com.a.eye.skywalking.collector.worker.application.persistence; +package com.a.eye.skywalking.collector.worker.globaltrace.persistence; + 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.MergePersistenceMember; import com.a.eye.skywalking.collector.worker.WorkerConfig; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.globaltrace.GlobalTraceIndex; /** * @author pengys5 */ -public class NodeInstancePersistence extends RecordPersistenceMember { +public class GlobalTraceSave extends MergePersistenceMember { - private Logger logger = LogManager.getFormatterLogger(NodeInstancePersistence.class); - - public NodeInstancePersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + private GlobalTraceSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public String esIndex() { - return "application"; + return GlobalTraceIndex.Index; } @Override public String esType() { - return "node_instance"; + return GlobalTraceIndex.Type_Record; } - public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -40,13 +38,13 @@ public class NodeInstancePersistence extends RecordPersistenceMember { } @Override - public NodeInstancePersistence workerInstance(ClusterWorkerContext clusterContext) { - return new NodeInstancePersistence(role(), clusterContext, new LocalWorkerContext()); + public int queueSize() { + return WorkerConfig.Queue.TraceSegmentRecordAnalysis.Size; } @Override - public int queueSize() { - return WorkerConfig.Queue.Persistence.NodeInstancePersistence.Size; + public GlobalTraceSave workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceSave(role(), clusterContext, new LocalWorkerContext()); } } @@ -55,7 +53,7 @@ public class NodeInstancePersistence extends RecordPersistenceMember { @Override public String roleName() { - return NodeInstancePersistence.class.getSimpleName(); + return GlobalTraceSave.class.getSimpleName(); } @Override diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSearchWithGlobalId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSearchWithGlobalId.java new file mode 100644 index 000000000..525482393 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSearchWithGlobalId.java @@ -0,0 +1,181 @@ +package com.a.eye.skywalking.collector.worker.globaltrace.persistence; + +import com.a.eye.skywalking.api.util.StringUtil; +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.globaltrace.GlobalTraceIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.segment.logic.Segment; +import com.a.eye.skywalking.collector.worker.segment.logic.SegmentDeserialize; +import com.a.eye.skywalking.collector.worker.segment.logic.SpanView; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.storage.MergeData; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegmentRef; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.client.Client; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author pengys5 + */ +public class GlobalTraceSearchWithGlobalId extends AbstractLocalSyncWorker { + + private Logger logger = LogManager.getFormatterLogger(this.getClass()); + + private Gson gson = new Gson(); + + public GlobalTraceSearchWithGlobalId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + protected void onWork(Object request, Object response) throws Exception { + if (request instanceof String) { + Client client = EsClient.getClient(); + String globalId = (String) request; + String globalTraceData = client.prepareGet(GlobalTraceIndex.Index, GlobalTraceIndex.Type_Record, globalId).get().getSourceAsString(); + JsonObject globalTraceObj = gson.fromJson(globalTraceData, JsonObject.class); + + String subSegIdsStr = globalTraceObj.get(GlobalTraceIndex.SubSegIds).getAsString(); + String[] subSegIds = subSegIdsStr.split(MergeData.Split); + + List spanViewList = new ArrayList<>(); + for (String subSegId : subSegIds) { + logger.debug("subSegId: %s", subSegId); + String segmentSource = client.prepareGet(SegmentIndex.Index, SegmentIndex.Type_Record, subSegId).get().getSourceAsString(); + Segment segment = SegmentDeserialize.INSTANCE.deserializeFromES(segmentSource); + String segmentId = segment.getTraceSegmentId(); + List refsList = segment.getRefs(); + + for (Span span : segment.getSpans()) { + logger.debug(span.getOperationName()); + spansDataBuild(span, segment.getApplicationCode(), segmentId, spanViewList, refsList); + } + } + + SpanView rootSpan = findRoot(spanViewList); + findChild(rootSpan, spanViewList, rootSpan.getStartTime()); + + List viewList = new ArrayList<>(); + viewList.add(rootSpan); + + Gson gson = new Gson(); + String globalTraceStr = gson.toJson(viewList); + JsonObject responseObj = (JsonObject) response; + responseObj.addProperty("result", globalTraceStr); + } + } + + private SpanView findRoot(List spanViewList) { + for (SpanView spanView : spanViewList) { + if (StringUtil.isEmpty(spanView.getParentSpanSegId())) { + spanView.setRelativeStartTime(0); + spanView.setParentSpanSegId("-1"); + return spanView; + } + } + return null; + } + + private void findChild(SpanView parentSpan, List spanViewList, long rootStartTime) { + String spanSegId = parentSpan.getSpanSegId(); + logger.debug("findChild spanSegId: %s", spanSegId); + + List childSpanSort = sortChildSpan(spanViewList, spanSegId); + for (SpanView spanView : childSpanSort) { + spanView.setRelativeStartTime(spanView.getStartTime() - rootStartTime); + parentSpan.addChild(spanView); + findChild(spanView, spanViewList, rootStartTime); + } + } + + private List sortChildSpan(List spanViewList, String parentSpanId) { + List tempList = new ArrayList<>(); + + for (SpanView spanView : spanViewList) { + if (parentSpanId.equals(spanView.getParentSpanSegId())) { + tempList.add(spanView); + } + } + + Collections.sort(tempList); + return tempList; + } + + private void spansDataBuild(Span span, String appCode, String segmentId, List spanViewList, List refsList) { + int spanId = span.getSpanId(); + String spanSegId = segmentId + "--" + String.valueOf(spanId); + + SpanView spanView = new SpanView(); + spanView.setSpanId(spanId); + spanView.setSegId(segmentId); + spanView.setSpanSegId(spanSegId); + spanView.setStartTime(span.getStartTime()); + spanView.setOperationName(span.getOperationName()); + spanView.setAppCode(appCode); + long cost = span.getEndTime() - span.getStartTime(); + if (cost == 0) { + spanView.setCost(1); + } else { + spanView.setCost(cost); + } + + if (spanId == 0) { + if (CollectionTools.isNotEmpty(refsList)) { + if (refsList.size() > 1) { + throw new UnsupportedOperationException("not support batch call"); + } else { + TraceSegmentRef segmentRef = refsList.get(0); + int parentSpanId = segmentRef.getSpanId(); + String parentSegId = segmentRef.getTraceSegmentId(); + + String parentSpanSegId = parentSegId + "--" + String.valueOf(parentSpanId); + spanView.setParentSpanSegId(parentSpanSegId); + } + } + } else { + int parentSpanId = span.getParentSpanId(); + String parentSpanSegId = segmentId + "--" + String.valueOf(parentSpanId); + spanView.setParentSpanSegId(parentSpanSegId); + } + + spanViewList.add(spanView); + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public GlobalTraceSearchWithGlobalId workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceSearchWithGlobalId(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return GlobalTraceSearchWithGlobalId.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/AbstractGet.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractGet.java new file mode 100644 index 000000000..176bf9bb3 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractGet.java @@ -0,0 +1,57 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.a.eye.skywalking.collector.actor.*; +import com.google.gson.JsonObject; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +/** + * @author pengys5 + */ +public abstract class AbstractGet extends AbstractLocalSyncWorker { + + public AbstractGet(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + final public void onWork(Object request, Object response) throws Exception { + Map parameterMap = (Map) request; + try { + onSearch(parameterMap, (JsonObject) response); + } catch (Exception e) { + e.printStackTrace(); + ((JsonObject) response).addProperty("isSuccess", false); + ((JsonObject) response).addProperty("reason", e.getMessage()); + } + } + + protected abstract void onSearch(Map request, JsonObject response) throws Exception; + + static class GetWithHttpServlet extends AbstractHttpServlet { + + private final LocalSyncWorkerRef ownerWorkerRef; + + GetWithHttpServlet(LocalSyncWorkerRef ownerWorkerRef) { + this.ownerWorkerRef = ownerWorkerRef; + } + + @Override + final protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + Map parameterMap = request.getParameterMap(); + + JsonObject resJson = new JsonObject(); + try { + ownerWorkerRef.ask(parameterMap, resJson); + reply(response, resJson, HttpServletResponse.SC_OK); + } catch (Exception e) { + resJson.addProperty("error", e.getMessage()); + reply(response, resJson, HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractGetProvider.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractGetProvider.java new file mode 100644 index 000000000..72ac9adf2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractGetProvider.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.a.eye.skywalking.collector.actor.*; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +/** + * @author pengys5 + */ +public abstract class AbstractGetProvider extends AbstractLocalSyncWorkerProvider { + + public abstract String servletPath(); + + final protected void create(ServletContextHandler context) throws IllegalArgumentException, ProviderNotFoundException { + LocalSyncWorkerRef workerRef = (LocalSyncWorkerRef) super.create(AbstractWorker.noOwner()); + AbstractGet.GetWithHttpServlet getWithHttpServlet = new AbstractGet.GetWithHttpServlet(workerRef); + context.addServlet(new ServletHolder(getWithHttpServlet), servletPath()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractHttpServlet.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractHttpServlet.java new file mode 100644 index 000000000..f5c4e30a4 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractHttpServlet.java @@ -0,0 +1,25 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.google.gson.JsonObject; + +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * @author pengys5 + */ +public abstract class AbstractHttpServlet extends HttpServlet { + + final public void reply(HttpServletResponse response, JsonObject resJson, int status) throws IOException { + response.setContentType("text/json"); + response.setCharacterEncoding("utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + + PrintWriter out = response.getWriter(); + out.print(resJson); + out.flush(); + out.close(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPost.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPost.java new file mode 100644 index 000000000..2e915ff6b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPost.java @@ -0,0 +1,65 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedReader; +import java.io.IOException; + +/** + * @author pengys5 + */ +public abstract class AbstractPost extends AbstractLocalAsyncWorker { + + private Logger logger = LogManager.getFormatterLogger(AbstractPost.class); + + public AbstractPost(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + final public void onWork(Object request) throws Exception { + if (request instanceof String) { + onReceive((String) request); + } else if (request instanceof EndOfBatchCommand) { + + } else { + logger.error("unhandled request, request instance must String, but is %s", request.getClass().toString()); + } + } + + protected abstract void onReceive(String reqJsonStr) throws Exception; + + static class PostWithHttpServlet extends AbstractHttpServlet { + + private final LocalAsyncWorkerRef ownerWorkerRef; + + protected PostWithHttpServlet(LocalAsyncWorkerRef ownerWorkerRef) { + this.ownerWorkerRef = ownerWorkerRef; + } + + @Override + final protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + JsonObject resJson = new JsonObject(); + try { + BufferedReader bufferedReader = request.getReader(); + StringBuffer dataStr = new StringBuffer(); + String tmpStr; + while ((tmpStr = bufferedReader.readLine()) != null) { + dataStr.append(tmpStr); + } + ownerWorkerRef.tell(dataStr.toString()); + reply(response, resJson, HttpServletResponse.SC_OK); + } catch (Exception e) { + resJson.addProperty("error", e.getMessage()); + reply(response, resJson, HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + } + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostProvider.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostProvider.java new file mode 100644 index 000000000..563f4f1dd --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/AbstractPostProvider.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.a.eye.skywalking.collector.actor.*; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; + +/** + * @author pengys5 + */ +public abstract class AbstractPostProvider extends AbstractLocalAsyncWorkerProvider { + + public abstract String servletPath(); + + final protected void create(ServletContextHandler context) throws IllegalArgumentException, ProviderNotFoundException { + LocalAsyncWorkerRef workerRef = (LocalAsyncWorkerRef) super.create(AbstractWorker.noOwner()); + AbstractPost.PostWithHttpServlet postWithHttpServlet = new AbstractPost.PostWithHttpServlet(workerRef); + context.addServlet(new ServletHolder(postWithHttpServlet), servletPath()); + } +} 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 deleted file mode 100644 index 56535702a..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/Controller.java +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index 855e7ba7f..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCenter.java +++ /dev/null @@ -1,43 +0,0 @@ -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 deleted file mode 100644 index d5ee6cdf8..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerCreator.java +++ /dev/null @@ -1,18 +0,0 @@ -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 deleted file mode 100644 index 6cd1ad996..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerNotFoundException.java +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 1d7aecb02..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ControllerProvider.java +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 901822139..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/DuplicateControllerException.java +++ /dev/null @@ -1,7 +0,0 @@ -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 index fd570763a..481ac94ee 100644 --- 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 @@ -1,12 +1,11 @@ package com.a.eye.skywalking.collector.worker.httpserver; -import com.google.gson.JsonElement; -import fi.iki.elonen.NanoHTTPD; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; - -import java.io.IOException; -import java.util.Map; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.servlet.ServletContextHandler; /** * @author pengys5 @@ -16,33 +15,23 @@ public enum HttpServer { private Logger logger = LogManager.getFormatterLogger(HttpServer.class); - public void boot() throws Exception { - NanoHttpServer server = new NanoHttpServer(7001); - ControllerCreator.INSTANCE.boot(); - } + public void boot(ClusterWorkerContext clusterContext) throws Exception { + Server server = new Server(7001); - public class NanoHttpServer extends NanoHTTPD { + String contextPath = "/"; + ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); + servletContextHandler.setContextPath(contextPath); + logger.info("http server root context path: %s", contextPath); - 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); - } + ServletsCreator.INSTANCE.boot(servletContextHandler, clusterContext); - @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); +// ServerConnector serverConnector = new ServerConnector(server); +// serverConnector.setHost("127.0.0.1"); +// serverConnector.setPort(7001); +// serverConnector.setIdleTimeout(5000); - 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); - } - } + server.setHandler(servletContextHandler); + server.start(); + server.join(); } } \ 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 deleted file mode 100644 index c8affc457..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/RequestDispatcher.java +++ /dev/null @@ -1,22 +0,0 @@ -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/ServletsCreator.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ServletsCreator.java new file mode 100644 index 000000000..722fc079b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/ServletsCreator.java @@ -0,0 +1,34 @@ +package com.a.eye.skywalking.collector.worker.httpserver; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.eclipse.jetty.servlet.ServletContextHandler; + +import java.util.ServiceLoader; + +/** + * @author pengys5 + */ +public enum ServletsCreator { + INSTANCE; + + private Logger logger = LogManager.getFormatterLogger(ServletsCreator.class); + + public void boot(ServletContextHandler servletContextHandler, ClusterWorkerContext clusterContext) throws IllegalArgumentException, ProviderNotFoundException { + ServiceLoader receiverLoader = java.util.ServiceLoader.load(AbstractPostProvider.class); + for (AbstractPostProvider provider : receiverLoader) { + provider.setClusterContext(clusterContext); + provider.create(servletContextHandler); + logger.info("add post servlet mapping path: %s ", provider.servletPath()); + } + + ServiceLoader searcherLoader = java.util.ServiceLoader.load(AbstractGetProvider.class); + for (AbstractGetProvider provider : searcherLoader) { + provider.setClusterContext(clusterContext); + provider.create(servletContextHandler); + logger.info("add get servlet mapping path: %s ", provider.servletPath()); + } + } +} 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 deleted file mode 100644 index e85c21716..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/httpserver/controller/DagController.java +++ /dev/null @@ -1,39 +0,0 @@ -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/node/NodeCompIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeCompIndex.java new file mode 100644 index 000000000..9d96cece5 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeCompIndex.java @@ -0,0 +1,50 @@ +package com.a.eye.skywalking.collector.worker.node; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class NodeCompIndex extends AbstractIndex { + + public static final String Index = "node_comp_idx"; + + public static final String Name = "name"; + public static final String Peers = "peers"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return false; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(Name) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(Peers) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(AGG_COLUMN) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeMappingIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeMappingIndex.java new file mode 100644 index 000000000..498899b10 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeMappingIndex.java @@ -0,0 +1,54 @@ +package com.a.eye.skywalking.collector.worker.node; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class NodeMappingIndex extends AbstractIndex { + + public static final String Index = "node_mapping_idx"; + + public static final String Code = "code"; + public static final String Peers = "peers"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return false; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(Code) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(Peers) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(AGG_COLUMN) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(Time_Slice) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/AbstractNodeCompAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/AbstractNodeCompAnalysis.java new file mode 100644 index 000000000..ea783c1eb --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/AbstractNodeCompAnalysis.java @@ -0,0 +1,60 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.RecordAnalysisMember; +import com.a.eye.skywalking.collector.worker.node.NodeCompIndex; +import com.a.eye.skywalking.collector.worker.tools.ClientSpanIsLeafTools; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.collector.worker.tools.SpanPeersTools; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.tag.Tags; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * @author pengys5 + */ +abstract class AbstractNodeCompAnalysis extends RecordAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(AbstractNodeCompAnalysis.class); + + AbstractNodeCompAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + void analyseSpans(TraceSegment segment) throws Exception { + List spanList = segment.getSpans(); + logger.debug("node analysis span isNotEmpty %s", CollectionTools.isNotEmpty(spanList)); + + if (CollectionTools.isNotEmpty(spanList)) { + logger.debug("node analysis span list size: %s", spanList.size()); + for (Span span : spanList) { + String kind = Tags.SPAN_KIND.get(span); + if (Tags.SPAN_KIND_CLIENT.equals(kind) && ClientSpanIsLeafTools.isLeaf(span.getSpanId(), spanList)) { + String peers = SpanPeersTools.getPeers(span); + + JsonObject compJsonObj = new JsonObject(); + compJsonObj.addProperty(NodeCompIndex.Peers, peers); + compJsonObj.addProperty(NodeCompIndex.Name, Tags.COMPONENT.get(span)); + + setRecord(peers, compJsonObj); + } else if (Tags.SPAN_KIND_SERVER.equals(kind) && span.getParentSpanId() == -1) { + String peers = segment.getApplicationCode(); + + JsonObject compJsonObj = new JsonObject(); + compJsonObj.addProperty(NodeCompIndex.Peers, peers); + compJsonObj.addProperty(NodeCompIndex.Name, Tags.COMPONENT.get(span)); + + setRecord(peers, compJsonObj); + } else { + logger.error("The span kind value is incorrect which segment record id is %s, the value must client or server", segment.getTraceSegmentId()); + } + } + } + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/AbstractNodeMappingAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/AbstractNodeMappingAnalysis.java new file mode 100644 index 000000000..2ec8ceeb7 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/AbstractNodeMappingAnalysis.java @@ -0,0 +1,48 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.RecordAnalysisMember; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.TraceSegmentRef; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * @author pengys5 + */ +abstract class AbstractNodeMappingAnalysis extends RecordAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(AbstractNodeMappingAnalysis.class); + + AbstractNodeMappingAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + void analyseRefs(TraceSegment segment, long timeSlice) throws Exception { + List segmentRefList = segment.getRefs(); + logger.debug("node mapping analysis refs isNotEmpty %s", CollectionTools.isNotEmpty(segmentRefList)); + + if (CollectionTools.isNotEmpty(segmentRefList)) { + logger.debug("node mapping analysis refs list size: %s", segmentRefList.size()); + for (TraceSegmentRef segmentRef : segmentRefList) { + String peers = Const.PEERS_FRONT_SPLIT + segmentRef.getPeerHost() + Const.PEERS_BEHIND_SPLIT; + String code = segment.getApplicationCode(); + + JsonObject nodeMappingJsonObj = new JsonObject(); + nodeMappingJsonObj.addProperty(NodeMappingIndex.Code, code); + nodeMappingJsonObj.addProperty(NodeMappingIndex.Peers, peers); + nodeMappingJsonObj.addProperty(NodeMappingIndex.Time_Slice, timeSlice); + + String id = timeSlice + Const.ID_SPLIT + code + Const.ID_SPLIT + peers; + setRecord(id, nodeMappingJsonObj); + } + } + } +} \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeCompAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeCompAnalysis.java new file mode 100644 index 000000000..e7827f69d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeCompAnalysis.java @@ -0,0 +1,70 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeCompAgg; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeCompAnalysis extends AbstractNodeCompAnalysis { + + NodeCompAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof TraceSegment) { + TraceSegment segment = (TraceSegment) message; + analyseSpans(segment); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeCompAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeCompAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeCompAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeDayAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeCompAnalysis.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/node/analysis/NodeMappingDayAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingDayAnalysis.java new file mode 100644 index 000000000..4b83c8db9 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingDayAnalysis.java @@ -0,0 +1,72 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingDayAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeMappingDayAnalysis extends AbstractNodeMappingAnalysis { + + public NodeMappingDayAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + analyseRefs(segment, segmentWithTimeSlice.getDay()); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeMappingDayAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingDayAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingDayAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeMappingDayAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingDayAnalysis.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/node/analysis/NodeMappingHourAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingHourAnalysis.java new file mode 100644 index 000000000..539efd783 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingHourAnalysis.java @@ -0,0 +1,72 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingHourAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeMappingHourAnalysis extends AbstractNodeMappingAnalysis { + + public NodeMappingHourAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + analyseRefs(segment, segmentWithTimeSlice.getHour()); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeMappingHourAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingHourAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingHourAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeMappingHourAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingHourAnalysis.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/node/analysis/NodeMappingMinuteAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingMinuteAnalysis.java new file mode 100644 index 000000000..bd9975521 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingMinuteAnalysis.java @@ -0,0 +1,72 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingMinuteAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeMappingMinuteAnalysis extends AbstractNodeMappingAnalysis { + + public NodeMappingMinuteAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + analyseRefs(segment, segmentWithTimeSlice.getMinute()); + } + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeMappingMinuteAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingMinuteAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingMinuteAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeMappingMinuteAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingMinuteAnalysis.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/node/persistence/NodeCompAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompAgg.java new file mode 100644 index 000000000..fd2fd46a0 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompAgg.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.RecordData; + +/** + * @author pengys5 + */ +public class NodeCompAgg extends AbstractClusterWorker { + + public NodeCompAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeCompSave.Role.INSTANCE).create(this); + } + + @Override + protected void onWork(Object message) throws Exception { + if (message instanceof RecordData) { + getSelfContext().lookup(NodeCompSave.Role.INSTANCE).tell(message); + } else { + throw new IllegalArgumentException("message instance must RecordData"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeCompAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeCompAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.WorkerNum.Node.NodeDayAgg.Value; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeCompAgg.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompLoad.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompLoad.java new file mode 100644 index 000000000..098cfe6b5 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompLoad.java @@ -0,0 +1,78 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +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.node.NodeCompIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.search.SearchHit; + +/** + * @author pengys5 + */ +public class NodeCompLoad extends AbstractLocalSyncWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeCompLoad.class); + + NodeCompLoad(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void onWork(Object request, Object response) throws Exception { + SearchRequestBuilder searchRequestBuilder = EsClient.getClient().prepareSearch(NodeCompIndex.Index); + searchRequestBuilder.setTypes(NodeCompIndex.Type_Record); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setSize(100); + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + SearchHit[] searchHits = searchResponse.getHits().getHits(); + + JsonArray nodeCompArray = new JsonArray(); + for (SearchHit searchHit : searchHits) { + JsonObject nodeCompObj = new JsonObject(); + nodeCompObj.addProperty(NodeCompIndex.Name, (String) searchHit.getSource().get(NodeCompIndex.Name)); + nodeCompObj.addProperty(NodeCompIndex.Peers, (String) searchHit.getSource().get(NodeCompIndex.Peers)); + nodeCompArray.add(nodeCompObj); + logger.debug("node: %s", nodeCompObj.toString()); + } + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", nodeCompArray); + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeCompLoad workerInstance(ClusterWorkerContext clusterContext) { + return new NodeCompLoad(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeCompLoad.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/node/persistence/NodeCompSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompSave.java new file mode 100644 index 000000000..c89f6eb3b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompSave.java @@ -0,0 +1,63 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +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.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.node.NodeCompIndex; + +/** + * @author pengys5 + */ +public class NodeCompSave extends RecordPersistenceMember { + + NodeCompSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return NodeCompIndex.Index; + } + + @Override + public String esType() { + return NodeCompIndex.Type_Record; + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeCompSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeCompSave(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodePersistence.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeCompSave.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDayAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDayAgg.java new file mode 100644 index 000000000..12e36e053 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDayAgg.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.RecordData; + +/** + * @author pengys5 + */ +public class NodeMappingDayAgg extends AbstractClusterWorker { + + public NodeMappingDayAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeMappingDaySave.Role.INSTANCE).create(this); + } + + @Override + protected void onWork(Object message) throws Exception { + if (message instanceof RecordData) { + getSelfContext().lookup(NodeMappingDaySave.Role.INSTANCE).tell(message); + } else { + throw new IllegalArgumentException("message instance must RecordData"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingDayAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingDayAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.WorkerNum.Node.NodeMappingDayAgg.Value; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingDayAgg.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} 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/node/persistence/NodeMappingDaySave.java similarity index 64% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/DAGNodePersistence.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDaySave.java index 941f03809..c54393183 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/node/persistence/NodeMappingDaySave.java @@ -1,37 +1,34 @@ -package com.a.eye.skywalking.collector.worker.application.persistence; +package com.a.eye.skywalking.collector.worker.node.persistence; 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.HashCodeSelector; 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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; /** * @author pengys5 */ -public class DAGNodePersistence extends RecordPersistenceMember { +public class NodeMappingDaySave extends RecordPersistenceMember { - private Logger logger = LogManager.getFormatterLogger(DAGNodePersistence.class); - - public DAGNodePersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + public NodeMappingDaySave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public String esIndex() { - return "application"; + return NodeMappingIndex.Index; } @Override public String esType() { - return "dag_node"; + return NodeMappingIndex.Type_Day; } - public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -40,8 +37,8 @@ public class DAGNodePersistence extends RecordPersistenceMember { } @Override - public DAGNodePersistence workerInstance(ClusterWorkerContext clusterContext) { - return new DAGNodePersistence(role(), clusterContext, new LocalWorkerContext()); + public NodeMappingDaySave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingDaySave(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -55,12 +52,12 @@ public class DAGNodePersistence extends RecordPersistenceMember { @Override public String roleName() { - return DAGNodePersistence.class.getSimpleName(); + return NodeMappingDaySave.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourAgg.java new file mode 100644 index 000000000..2e614266b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourAgg.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.RecordData; + +/** + * @author pengys5 + */ +public class NodeMappingHourAgg extends AbstractClusterWorker { + + NodeMappingHourAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeMappingHourSave.Role.INSTANCE).create(this); + } + + @Override + protected void onWork(Object message) throws Exception { + if (message instanceof RecordData) { + getSelfContext().lookup(NodeMappingHourSave.Role.INSTANCE).tell(message); + } else { + throw new IllegalArgumentException("message instance must RecordData"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingHourAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingHourAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.WorkerNum.Node.NodeMappingHourAgg.Value; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingHourAgg.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourSave.java new file mode 100644 index 000000000..2ca6a6563 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourSave.java @@ -0,0 +1,63 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +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.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.node.NodeMappingIndex; + +/** + * @author pengys5 + */ +public class NodeMappingHourSave extends RecordPersistenceMember { + + public NodeMappingHourSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return NodeMappingIndex.Index; + } + + @Override + public String esType() { + return NodeMappingIndex.Type_Hour; + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingHourSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingHourSave(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodePersistence.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingHourSave.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteAgg.java new file mode 100644 index 000000000..d21ec9098 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteAgg.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.RecordData; + +/** + * @author pengys5 + */ +public class NodeMappingMinuteAgg extends AbstractClusterWorker { + + NodeMappingMinuteAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeMappingMinuteSave.Role.INSTANCE).create(this); + } + + @Override + protected void onWork(Object message) throws Exception { + if (message instanceof RecordData) { + getSelfContext().lookup(NodeMappingMinuteSave.Role.INSTANCE).tell(message); + } else { + throw new IllegalArgumentException("message instance must RecordData"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeMappingMinuteAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingMinuteAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.WorkerNum.Node.NodeMappingMinuteAgg.Value; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingMinuteAgg.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} 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/node/persistence/NodeMappingMinuteSave.java similarity index 60% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/persistence/DAGNodeRefPersistence.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteSave.java index 901d31c1d..e8bde5824 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/node/persistence/NodeMappingMinuteSave.java @@ -1,38 +1,34 @@ -package com.a.eye.skywalking.collector.worker.applicationref.persistence; +package com.a.eye.skywalking.collector.worker.node.persistence; 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.HashCodeSelector; 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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; /** * @author pengys5 */ -public class DAGNodeRefPersistence extends RecordPersistenceMember { +public class NodeMappingMinuteSave extends RecordPersistenceMember { - private Logger logger = LogManager.getFormatterLogger(DAGNodeRefPersistence.class); - - public DAGNodeRefPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + public NodeMappingMinuteSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public String esIndex() { - return "node_ref"; + return NodeMappingIndex.Index; } @Override public String esType() { - return "node_ref"; + return NodeMappingIndex.Type_Minute; } - public static class Factory extends AbstractLocalAsyncWorkerProvider { - + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -41,13 +37,13 @@ public class DAGNodeRefPersistence extends RecordPersistenceMember { } @Override - public DAGNodeRefPersistence workerInstance(ClusterWorkerContext clusterContext) { - return new DAGNodeRefPersistence(role(), clusterContext, new LocalWorkerContext()); + public NodeMappingMinuteSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingMinuteSave(role(), clusterContext, new LocalWorkerContext()); } @Override public int queueSize() { - return WorkerConfig.Queue.Persistence.DAGNodeRefPersistence.Size; + return WorkerConfig.Queue.Persistence.DAGNodePersistence.Size; } } @@ -56,12 +52,12 @@ public class DAGNodeRefPersistence extends RecordPersistenceMember { @Override public String roleName() { - return DAGNodeRefPersistence.class.getSimpleName(); + return NodeMappingMinuteSave.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingSearchWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingSearchWithTimeSlice.java new file mode 100644 index 000000000..292254153 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingSearchWithTimeSlice.java @@ -0,0 +1,102 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +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.Const; +import com.a.eye.skywalking.collector.worker.TimeSlice; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; + +/** + * @author pengys5 + */ +public class NodeMappingSearchWithTimeSlice extends AbstractLocalSyncWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeMappingSearchWithTimeSlice.class); + + NodeMappingSearchWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + + SearchRequestBuilder searchRequestBuilder = EsClient.getClient().prepareSearch(NodeMappingIndex.Index); + searchRequestBuilder.setTypes(search.getSliceType()); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeMappingIndex.Time_Slice).gte(search.getStartTime()).lte(search.getEndTime())); + searchRequestBuilder.setSize(0); + + searchRequestBuilder.addAggregation(AggregationBuilders.terms(NodeMappingIndex.AGG_COLUMN).field(NodeMappingIndex.AGG_COLUMN).size(100)); + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + Terms genders = searchResponse.getAggregations().get(NodeMappingIndex.AGG_COLUMN); + + JsonArray nodeMappingArray = new JsonArray(); + for (Terms.Bucket entry : genders.getBuckets()) { + String aggId = entry.getKeyAsString(); + String[] aggIds = aggId.split(Const.IDS_SPLIT); + String code = aggIds[0]; + String peers = aggIds[1]; + + JsonObject nodeMappingObj = new JsonObject(); + nodeMappingObj.addProperty(NodeMappingIndex.Code, code); + nodeMappingObj.addProperty(NodeMappingIndex.Peers, peers); + nodeMappingArray.add(nodeMappingObj); + } + logger.debug("node mapping data: %s", nodeMappingArray.toString()); + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add(Const.RESULT, nodeMappingArray); + } else { + throw new IllegalArgumentException("message instance must be RequestEntity"); + } + } + + public static class RequestEntity extends TimeSlice { + public RequestEntity(String sliceType, long startTime, long endTime) { + super(sliceType, startTime, endTime); + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeMappingSearchWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeMappingSearchWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeMappingSearchWithTimeSlice.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/noderef/NodeRefGetWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefGetWithTimeSlice.java new file mode 100644 index 000000000..d02326b7a --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefGetWithTimeSlice.java @@ -0,0 +1,94 @@ +package com.a.eye.skywalking.collector.worker.noderef; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefSearchWithTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class NodeRefGetWithTimeSlice extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(NodeRefGetWithTimeSlice.class); + + private NodeRefGetWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeRefSearchWithTimeSlice.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("startTime") || !request.containsKey("endTime") || !request.containsKey("timeSliceType")) { + throw new IllegalArgumentException("the request parameter must contains startTime,endTime,timeSliceType"); + } + logger.debug("startTime: %s, endTime: %s, timeSliceType: %s", Arrays.toString(request.get("startTime")), + Arrays.toString(request.get("endTime")), Arrays.toString(request.get("timeSliceType"))); + + long startTime; + try { + startTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "startTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter startTime must numeric with long type"); + } + + long endTime; + try { + endTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "endTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter endTime must numeric with long type"); + } + + NodeRefSearchWithTimeSlice.RequestEntity requestEntity; + requestEntity = new NodeRefSearchWithTimeSlice.RequestEntity(ParameterTools.INSTANCE.toString(request, "timeSliceType"), startTime, endTime); + getSelfContext().lookup(NodeRefSearchWithTimeSlice.WorkerRole.INSTANCE).ask(requestEntity, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeRefGetWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefGetWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/nodeRef/timeSlice"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefGetWithTimeSlice.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/noderef/NodeRefIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefIndex.java new file mode 100644 index 000000000..84eb17888 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefIndex.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.noderef; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class NodeRefIndex extends AbstractIndex { + + public static final String Index = "node_ref_idx"; + + public static final String Front = "front"; + public static final String FrontIsRealCode = "frontIsRealCode"; + public static final String Behind = "behind"; + public static final String BehindIsRealCode = "behindIsRealCode"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return false; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(Front) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(FrontIsRealCode) + .field("type", "boolean") + .field("index", "not_analyzed") + .endObject() + .startObject(Behind) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(BehindIsRealCode) + .field("type", "boolean") + .field("index", "not_analyzed") + .endObject() + .startObject(AGG_COLUMN) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(Time_Slice) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumGetGroupWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumGetGroupWithTimeSlice.java new file mode 100644 index 000000000..734005b2c --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumGetGroupWithTimeSlice.java @@ -0,0 +1,94 @@ +package com.a.eye.skywalking.collector.worker.noderef; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumGroupWithTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class NodeRefResSumGetGroupWithTimeSlice extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumGetGroupWithTimeSlice.class); + + private NodeRefResSumGetGroupWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeRefResSumGroupWithTimeSlice.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("startTime") || !request.containsKey("endTime") || !request.containsKey("timeSliceType")) { + throw new IllegalArgumentException("the request parameter must contains startTime,endTime,timeSliceType"); + } + logger.debug("startTime: %s, endTime: %s, timeSliceType: %s", Arrays.toString(request.get("startTime")), + Arrays.toString(request.get("endTime")), Arrays.toString(request.get("timeSliceType"))); + + long startTime; + try { + startTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "startTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter startTime must numeric with long type"); + } + + long endTime; + try { + endTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "endTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter endTime must numeric with long type"); + } + + NodeRefResSumGroupWithTimeSlice.RequestEntity requestEntity; + requestEntity = new NodeRefResSumGroupWithTimeSlice.RequestEntity(ParameterTools.INSTANCE.toString(request, "timeSliceType"), startTime, endTime); + getSelfContext().lookup(NodeRefResSumGroupWithTimeSlice.WorkerRole.INSTANCE).ask(requestEntity, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeRefResSumGetGroupWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumGetGroupWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/nodeRef/resSum/groupTimeSlice"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumGetGroupWithTimeSlice.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/noderef/NodeRefResSumGetWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumGetWithTimeSlice.java new file mode 100644 index 000000000..758ddda51 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumGetWithTimeSlice.java @@ -0,0 +1,94 @@ +package com.a.eye.skywalking.collector.worker.noderef; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumSearchWithTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class NodeRefResSumGetWithTimeSlice extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumGetWithTimeSlice.class); + + private NodeRefResSumGetWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeRefResSumSearchWithTimeSlice.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("startTime") || !request.containsKey("endTime") || !request.containsKey("timeSliceType")) { + throw new IllegalArgumentException("the request parameter must contains startTime,endTime,timeSliceType"); + } + logger.debug("startTime: %s, endTime: %s, timeSliceType: %s", Arrays.toString(request.get("startTime")), + Arrays.toString(request.get("endTime")), Arrays.toString(request.get("timeSliceType"))); + + long startTime; + try { + startTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "startTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter startTime must numeric with long type"); + } + + long endTime; + try { + endTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "endTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter endTime must numeric with long type"); + } + + NodeRefResSumSearchWithTimeSlice.RequestEntity requestEntity; + requestEntity = new NodeRefResSumSearchWithTimeSlice.RequestEntity(ParameterTools.INSTANCE.toString(request, "timeSliceType"), startTime, endTime); + getSelfContext().lookup(NodeRefResSumSearchWithTimeSlice.WorkerRole.INSTANCE).ask(requestEntity, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeRefResSumGetWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumGetWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/nodeRef/resSum/timeSlice"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumGetWithTimeSlice.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/noderef/NodeRefResSumIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumIndex.java new file mode 100644 index 000000000..3076f8639 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumIndex.java @@ -0,0 +1,73 @@ +package com.a.eye.skywalking.collector.worker.noderef; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class NodeRefResSumIndex extends AbstractIndex { + + public static final String Index = "node_ref_res_sum_idx"; + public static final String OneSecondLess = "oneSecondLess"; + public static final String ThreeSecondLess = "threeSecondLess"; + public static final String FiveSecondLess = "fiveSecondLess"; + public static final String FiveSecondGreater = "fiveSecondGreater"; + public static final String Error = "error"; + public static final String Summary = "summary"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return false; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(OneSecondLess) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(ThreeSecondLess) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(FiveSecondLess) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(FiveSecondGreater) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(Error) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(Summary) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(AGG_COLUMN) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(Time_Slice) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/AbstractNodeRefAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/AbstractNodeRefAnalysis.java new file mode 100644 index 000000000..3046c5006 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/AbstractNodeRefAnalysis.java @@ -0,0 +1,79 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.RecordAnalysisMember; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.a.eye.skywalking.collector.worker.tools.ClientSpanIsLeafTools; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.collector.worker.tools.SpanPeersTools; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.tag.Tags; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * @author pengys5 + */ +abstract class AbstractNodeRefAnalysis extends RecordAnalysisMember { + + private Logger logger = LogManager.getFormatterLogger(AbstractNodeRefAnalysis.class); + + AbstractNodeRefAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + final void analyseNodeRef(TraceSegment segment, long timeSlice, long minute, long hour, long day, int second) throws Exception { + List spanList = segment.getSpans(); + if (CollectionTools.isNotEmpty(spanList)) { + for (Span span : spanList) { + JsonObject dataJsonObj = new JsonObject(); + dataJsonObj.addProperty(NodeRefIndex.Time_Slice, timeSlice); + dataJsonObj.addProperty(NodeRefIndex.FrontIsRealCode, true); + dataJsonObj.addProperty(NodeRefIndex.BehindIsRealCode, true); + + if (Tags.SPAN_KIND_CLIENT.equals(Tags.SPAN_KIND.get(span)) && ClientSpanIsLeafTools.isLeaf(span.getSpanId(), spanList)) { + String front = segment.getApplicationCode(); + dataJsonObj.addProperty(NodeRefIndex.Front, front); + + String behind = SpanPeersTools.getPeers(span); + dataJsonObj.addProperty(NodeRefIndex.Behind, behind); + dataJsonObj.addProperty(NodeRefIndex.BehindIsRealCode, false); + + String id = timeSlice + Const.ID_SPLIT + front + Const.ID_SPLIT + behind; + logger.debug("dag node ref: %s", dataJsonObj.toString()); + setRecord(id, dataJsonObj); + buildNodeRefResRecordData(id, span, minute, hour, day, second); + } else if (Tags.SPAN_KIND_SERVER.equals(Tags.SPAN_KIND.get(span))) { + if (span.getParentSpanId() == -1 && CollectionTools.isEmpty(segment.getRefs())) { + String behind = segment.getApplicationCode(); + dataJsonObj.addProperty(NodeRefIndex.Behind, behind); + + String front = Const.USER_CODE; + dataJsonObj.addProperty(NodeRefIndex.Front, front); + + String id = timeSlice + Const.ID_SPLIT + front + Const.ID_SPLIT + behind; + setRecord(id, dataJsonObj); + buildNodeRefResRecordData(id, span, minute, hour, day, second); + } + } + } + } + } + + private void buildNodeRefResRecordData(String nodeRefId, Span span, long minute, long hour, long day, int second) throws Exception { + AbstractNodeRefResSumAnalysis.NodeRefResRecord refResRecord = new AbstractNodeRefResSumAnalysis.NodeRefResRecord(minute, hour, day, second); + refResRecord.setStartTime(span.getStartTime()); + refResRecord.setEndTime(span.getEndTime()); + refResRecord.setNodeRefId(nodeRefId); + refResRecord.setError(Tags.ERROR.get(span)); + sendToResSumAnalysis(refResRecord); + } + + protected abstract void sendToResSumAnalysis(AbstractNodeRefResSumAnalysis.NodeRefResRecord refResRecord) throws Exception; +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/AbstractNodeRefResSumAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/AbstractNodeRefResSumAnalysis.java new file mode 100644 index 000000000..cca06ec4c --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/AbstractNodeRefResSumAnalysis.java @@ -0,0 +1,69 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.MetricAnalysisMember; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; + +/** + * @author pengys5 + */ +abstract class AbstractNodeRefResSumAnalysis extends MetricAnalysisMember { + + AbstractNodeRefResSumAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + final void analyseResSum(NodeRefResRecord nodeRefRes) throws Exception { + long startTime = nodeRefRes.startTime; + long endTime = nodeRefRes.endTime; + boolean isError = nodeRefRes.isError; + long cost = endTime - startTime; + + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.OneSecondLess, 0L); + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.ThreeSecondLess, 0L); + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.FiveSecondLess, 0L); + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.FiveSecondGreater, 0L); + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.Error, 0L); + if (cost <= 1000 && !isError) { + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.OneSecondLess, 1L); + } else if (1000 < cost && cost <= 3000 && !isError) { + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.ThreeSecondLess, 1L); + } else if (3000 < cost && cost <= 5000 && !isError) { + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.FiveSecondLess, 1L); + } else if (5000 < cost && !isError) { + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.FiveSecondGreater, 1L); + } else { + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.Error, 1L); + } + setMetric(nodeRefRes.nodeRefId, NodeRefResSumIndex.Summary, 1L); + } + + static class NodeRefResRecord extends AbstractTimeSlice { + private String nodeRefId; + private long startTime; + private long endTime; + private Boolean isError; + + NodeRefResRecord(long minute, long hour, long day, int second) { + super(minute, hour, day, second); + } + + void setNodeRefId(String nodeRefId) { + this.nodeRefId = nodeRefId; + } + + void setStartTime(long startTime) { + this.startTime = startTime; + } + + void setEndTime(long endTime) { + this.endTime = endTime; + } + + void setError(Boolean error) { + isError = error; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefDayAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefDayAnalysis.java new file mode 100644 index 000000000..1f1658375 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefDayAnalysis.java @@ -0,0 +1,90 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +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.ProviderNotFoundException; +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.noderef.persistence.NodeRefDayAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeRefDayAnalysis extends AbstractNodeRefAnalysis { + + protected NodeRefDayAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + super.preStart(); + getClusterContext().findProvider(NodeRefResSumDayAnalysis.Role.INSTANCE).create(this); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + + long minute = segmentWithTimeSlice.getMinute(); + long hour = segmentWithTimeSlice.getHour(); + long day = segmentWithTimeSlice.getDay(); + int second = segmentWithTimeSlice.getSecond(); + analyseNodeRef(segment, segmentWithTimeSlice.getDay(), minute, hour, day, second); + } + } + + @Override + protected void sendToResSumAnalysis(AbstractNodeRefResSumAnalysis.NodeRefResRecord refResRecord) throws Exception { + getSelfContext().lookup(NodeRefResSumDayAnalysis.Role.INSTANCE).tell(refResRecord); + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeRefDayAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefDayAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefDayAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeRefDayAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefDayAnalysis.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/noderef/analysis/NodeRefHourAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefHourAnalysis.java new file mode 100644 index 000000000..02d27ff30 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefHourAnalysis.java @@ -0,0 +1,90 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +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.ProviderNotFoundException; +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.noderef.persistence.NodeRefHourAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeRefHourAnalysis extends AbstractNodeRefAnalysis { + + protected NodeRefHourAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + super.preStart(); + getClusterContext().findProvider(NodeRefResSumHourAnalysis.Role.INSTANCE).create(this); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + + long minute = segmentWithTimeSlice.getMinute(); + long hour = segmentWithTimeSlice.getHour(); + long day = segmentWithTimeSlice.getDay(); + int second = segmentWithTimeSlice.getSecond(); + analyseNodeRef(segment, segmentWithTimeSlice.getHour(), minute, hour, day, second); + } + } + + @Override + protected void sendToResSumAnalysis(AbstractNodeRefResSumAnalysis.NodeRefResRecord refResRecord) throws Exception { + getSelfContext().lookup(NodeRefResSumHourAnalysis.Role.INSTANCE).tell(refResRecord); + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeRefHourAgg.Role.INSTANCE).tell(oneRecord); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefHourAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefHourAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeRefHourAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefHourAnalysis.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/noderef/analysis/NodeRefMinuteAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefMinuteAnalysis.java new file mode 100644 index 000000000..c913d58f6 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefMinuteAnalysis.java @@ -0,0 +1,90 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +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.ProviderNotFoundException; +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.noderef.persistence.NodeRefMinuteAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * @author pengys5 + */ +public class NodeRefMinuteAnalysis extends AbstractNodeRefAnalysis { + + protected NodeRefMinuteAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + super.preStart(); + getClusterContext().findProvider(NodeRefResSumMinuteAnalysis.Role.INSTANCE).create(this); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + long minute = segmentWithTimeSlice.getMinute(); + long hour = segmentWithTimeSlice.getHour(); + long day = segmentWithTimeSlice.getDay(); + int second = segmentWithTimeSlice.getSecond(); + analyseNodeRef(segment, segmentWithTimeSlice.getMinute(), minute, hour, day, second); + } + } + + @Override + protected void sendToResSumAnalysis(AbstractNodeRefResSumAnalysis.NodeRefResRecord refResRecord) throws Exception { + getSelfContext().lookup(NodeRefResSumMinuteAnalysis.Role.INSTANCE).tell(refResRecord); + } + + @Override + protected void aggregation() throws Exception { + RecordData oneRecord; + while ((oneRecord = pushOne()) != null) { + getClusterContext().lookup(NodeRefMinuteAgg.Role.INSTANCE).tell(oneRecord); + } + } + + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefMinuteAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefMinuteAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Node.NodeRefMinuteAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefMinuteAnalysis.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/noderef/analysis/NodeRefResSumDayAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefResSumDayAnalysis.java new file mode 100644 index 000000000..9b10499be --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefResSumDayAnalysis.java @@ -0,0 +1,69 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumDayAgg; +import com.a.eye.skywalking.collector.worker.storage.MetricData; + +/** + * @author pengys5 + */ +public class NodeRefResSumDayAnalysis extends AbstractNodeRefResSumAnalysis { + + private NodeRefResSumDayAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof NodeRefResRecord) { + NodeRefResRecord refResRecord = (NodeRefResRecord) message; + analyseResSum(refResRecord); + } + } + + @Override + protected void aggregation() throws Exception { + MetricData oneMetric; + while ((oneMetric = pushOne()) != null) { + getClusterContext().lookup(NodeRefResSumDayAgg.Role.INSTANCE).tell(oneMetric); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefResSumDayAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumDayAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.ResponseSummaryAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumDayAnalysis.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/noderef/analysis/NodeRefResSumHourAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefResSumHourAnalysis.java new file mode 100644 index 000000000..1c30c2d76 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefResSumHourAnalysis.java @@ -0,0 +1,69 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumHourAgg; +import com.a.eye.skywalking.collector.worker.storage.MetricData; + +/** + * @author pengys5 + */ +public class NodeRefResSumHourAnalysis extends AbstractNodeRefResSumAnalysis { + + private NodeRefResSumHourAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof NodeRefResRecord) { + NodeRefResRecord refResRecord = (NodeRefResRecord) message; + analyseResSum(refResRecord); + } + } + + @Override + protected void aggregation() throws Exception { + MetricData oneMetric; + while ((oneMetric = pushOne()) != null) { + getClusterContext().lookup(NodeRefResSumHourAgg.Role.INSTANCE).tell(oneMetric); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefResSumHourAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumHourAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.ResponseSummaryAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumHourAnalysis.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/noderef/analysis/NodeRefResSumMinuteAnalysis.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefResSumMinuteAnalysis.java new file mode 100644 index 000000000..249336931 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefResSumMinuteAnalysis.java @@ -0,0 +1,69 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +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.WorkerConfig; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumMinuteAgg; +import com.a.eye.skywalking.collector.worker.storage.MetricData; + +/** + * @author pengys5 + */ +public class NodeRefResSumMinuteAnalysis extends AbstractNodeRefResSumAnalysis { + + private NodeRefResSumMinuteAnalysis(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof NodeRefResRecord) { + NodeRefResRecord refResRecord = (NodeRefResRecord) message; + analyseResSum(refResRecord); + } + } + + @Override + protected void aggregation() throws Exception { + MetricData oneMetric; + while ((oneMetric = pushOne()) != null) { + getClusterContext().lookup(NodeRefResSumMinuteAgg.Role.INSTANCE).tell(oneMetric); + } + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefResSumMinuteAnalysis workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumMinuteAnalysis(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.ResponseSummaryAnalysis.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumMinuteAnalysis.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/noderef/persistence/NodeRefDayAgg.java similarity index 52% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/applicationref/receiver/DAGNodeRefReceiver.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefDayAgg.java index f3b2affd4..ce44bfcec 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/noderef/persistence/NodeRefDayAgg.java @@ -1,10 +1,9 @@ -package com.a.eye.skywalking.collector.worker.applicationref.receiver; +package com.a.eye.skywalking.collector.worker.noderef.persistence; import com.a.eye.skywalking.collector.actor.*; -import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; 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; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,31 +11,29 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class DAGNodeRefReceiver extends AbstractClusterWorker { +public class NodeRefDayAgg extends AbstractClusterWorker { - private Logger logger = LogManager.getFormatterLogger(DAGNodeRefReceiver.class); + private Logger logger = LogManager.getFormatterLogger(NodeRefDayAgg.class); - private DAGNodeRefPersistence persistence; - - public DAGNodeRefReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + public NodeRefDayAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(DAGNodeRefPersistence.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefDaySave.Role.INSTANCE).create(this); } @Override - public void work(Object message) throws Exception { + protected void onWork(Object message) throws Exception { if (message instanceof RecordData) { - getSelfContext().lookup(DAGNodeRefPersistence.Role.INSTANCE).tell(message); + getSelfContext().lookup(NodeRefDaySave.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractClusterWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -45,8 +42,8 @@ public class DAGNodeRefReceiver extends AbstractClusterWorker { } @Override - public DAGNodeRefReceiver workerInstance(ClusterWorkerContext clusterContext) { - return new DAGNodeRefReceiver(role(), clusterContext, new LocalWorkerContext()); + public NodeRefDayAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefDayAgg(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -60,12 +57,12 @@ public class DAGNodeRefReceiver extends AbstractClusterWorker { @Override public String roleName() { - return DAGNodeRefReceiver.class.getSimpleName(); + return NodeRefDayAgg.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefDaySave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefDaySave.java new file mode 100644 index 000000000..16a595d9d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefDaySave.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.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.noderef.NodeRefIndex; + +/** + * @author pengys5 + */ +public class NodeRefDaySave extends RecordPersistenceMember { + + public NodeRefDaySave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return NodeRefIndex.Index; + } + + @Override + public String esType() { + return NodeRefIndex.Type_Day; + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefDaySave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefDaySave(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodeRefPersistence.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefDaySave.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} 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/noderef/persistence/NodeRefHourAgg.java similarity index 54% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/NodeInstanceReceiver.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefHourAgg.java index 11027f2bb..14c6890f7 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/noderef/persistence/NodeRefHourAgg.java @@ -1,10 +1,9 @@ -package com.a.eye.skywalking.collector.worker.application.receiver; +package com.a.eye.skywalking.collector.worker.noderef.persistence; import com.a.eye.skywalking.collector.actor.*; -import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; 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; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,29 +11,29 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class NodeInstanceReceiver extends AbstractClusterWorker { +public class NodeRefHourAgg extends AbstractClusterWorker { - private Logger logger = LogManager.getFormatterLogger(NodeInstanceReceiver.class); + private Logger logger = LogManager.getFormatterLogger(NodeRefHourAgg.class); - public NodeInstanceReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + public NodeRefHourAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(NodeInstancePersistence.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefHourSave.Role.INSTANCE).create(this); } @Override - public void work(Object message) throws Exception { + protected void onWork(Object message) throws Exception { if (message instanceof RecordData) { - getSelfContext().lookup(NodeInstancePersistence.Role.INSTANCE).tell(message); + getSelfContext().lookup(NodeRefHourSave.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractClusterWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -43,13 +42,13 @@ public class NodeInstanceReceiver extends AbstractClusterWorker { } @Override - public NodeInstanceReceiver workerInstance(ClusterWorkerContext clusterContext) { - return new NodeInstanceReceiver(role(), clusterContext, new LocalWorkerContext()); + public NodeRefHourAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefHourAgg(role(), clusterContext, new LocalWorkerContext()); } @Override public int workerNum() { - return WorkerConfig.Worker.NodeInstanceReceiver.Num; + return WorkerConfig.Worker.DAGNodeRefReceiver.Num; } } @@ -58,12 +57,12 @@ public class NodeInstanceReceiver extends AbstractClusterWorker { @Override public String roleName() { - return NodeInstanceReceiver.class.getSimpleName(); + return NodeRefHourAgg.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefHourSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefHourSave.java new file mode 100644 index 000000000..814ef87f4 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefHourSave.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.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.noderef.NodeRefIndex; + +/** + * @author pengys5 + */ +public class NodeRefHourSave extends RecordPersistenceMember { + + public NodeRefHourSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return NodeRefIndex.Index; + } + + @Override + public String esType() { + return NodeRefIndex.Type_Hour; + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefHourSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefHourSave(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodeRefPersistence.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefHourSave.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefMinuteAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefMinuteAgg.java new file mode 100644 index 000000000..5d1b4f124 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefMinuteAgg.java @@ -0,0 +1,68 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class NodeRefMinuteAgg extends AbstractClusterWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeRefMinuteAgg.class); + + public NodeRefMinuteAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeRefMinuteSave.Role.INSTANCE).create(this); + } + + @Override + protected void onWork(Object message) throws Exception { + if (message instanceof RecordData) { + getSelfContext().lookup(NodeRefMinuteSave.Role.INSTANCE).tell(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefMinuteAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefMinuteAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.DAGNodeRefReceiver.Num; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefMinuteAgg.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefMinuteSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefMinuteSave.java new file mode 100644 index 000000000..b872da5ea --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefMinuteSave.java @@ -0,0 +1,64 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.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.noderef.NodeRefIndex; + +/** + * @author pengys5 + */ +public class NodeRefMinuteSave extends RecordPersistenceMember { + + public NodeRefMinuteSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return NodeRefIndex.Index; + } + + @Override + public String esType() { + return NodeRefIndex.Type_Minute; + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefMinuteSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefMinuteSave(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.DAGNodeRefPersistence.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefMinuteSave.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} 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/noderef/persistence/NodeRefResSumDayAgg.java similarity index 54% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseCostReceiver.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumDayAgg.java index 7f193660d..a03ea1caf 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/noderef/persistence/NodeRefResSumDayAgg.java @@ -1,10 +1,9 @@ -package com.a.eye.skywalking.collector.worker.application.receiver; +package com.a.eye.skywalking.collector.worker.noderef.persistence; import com.a.eye.skywalking.collector.actor.*; -import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; 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; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,29 +11,29 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class ResponseCostReceiver extends AbstractClusterWorker { +public class NodeRefResSumDayAgg extends AbstractClusterWorker { - private Logger logger = LogManager.getFormatterLogger(ResponseCostReceiver.class); + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumDayAgg.class); - public ResponseCostReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + private NodeRefResSumDayAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(ResponseCostPersistence.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefResSumDaySave.Role.INSTANCE).create(this); } @Override - public void work(Object message) throws Exception { + protected void onWork(Object message) throws Exception { if (message instanceof MetricData) { - getSelfContext().lookup(ResponseCostPersistence.Role.INSTANCE).tell(message); + getSelfContext().lookup(NodeRefResSumDaySave.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractClusterWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -43,13 +42,13 @@ public class ResponseCostReceiver extends AbstractClusterWorker { } @Override - public ResponseCostReceiver workerInstance(ClusterWorkerContext clusterContext) { - return new ResponseCostReceiver(role(), clusterContext, new LocalWorkerContext()); + public NodeRefResSumDayAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumDayAgg(role(), clusterContext, new LocalWorkerContext()); } @Override public int workerNum() { - return WorkerConfig.Worker.ResponseCostReceiver.Num; + return WorkerConfig.Worker.ResponseSummaryReceiver.Num; } } @@ -58,12 +57,12 @@ public class ResponseCostReceiver extends AbstractClusterWorker { @Override public String roleName() { - return ResponseCostReceiver.class.getSimpleName(); + return NodeRefResSumDayAgg.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } 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/noderef/persistence/NodeRefResSumDaySave.java similarity index 54% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseSummaryPersistence.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumDaySave.java index 6517b2ace..566c51e33 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/noderef/persistence/NodeRefResSumDaySave.java @@ -1,47 +1,44 @@ -package com.a.eye.skywalking.collector.worker.application.persistence; +package com.a.eye.skywalking.collector.worker.noderef.persistence; 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.HashCodeSelector; 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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; /** * @author pengys5 */ -public class ResponseSummaryPersistence extends MetricPersistenceMember { +public class NodeRefResSumDaySave extends MetricPersistenceMember { - private Logger logger = LogManager.getFormatterLogger(ResponseSummaryPersistence.class); - - public ResponseSummaryPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + private NodeRefResSumDaySave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public String esIndex() { - return "application_metric"; + return NodeRefResSumIndex.Index; } @Override public String esType() { - return "response_summary"; + return NodeRefResSumIndex.Type_Day; } - public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override public Role role() { - return null; + return Role.INSTANCE; } @Override - public ResponseSummaryPersistence workerInstance(ClusterWorkerContext clusterContext) { - return new ResponseSummaryPersistence(role(), clusterContext, new LocalWorkerContext()); + public NodeRefResSumDaySave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumDaySave(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -55,12 +52,12 @@ public class ResponseSummaryPersistence extends MetricPersistenceMember { @Override public String roleName() { - return ResponseSummaryPersistence.class.getSimpleName(); + return NodeRefResSumDaySave.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSlice.java new file mode 100644 index 000000000..0a14de90a --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSlice.java @@ -0,0 +1,120 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.TimeSlice; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; +import org.elasticsearch.search.aggregations.metrics.sum.Sum; + +/** + * @author pengys5 + */ +public class NodeRefResSumGroupWithTimeSlice extends AbstractLocalSyncWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumGroupWithTimeSlice.class); + + NodeRefResSumGroupWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + + SearchRequestBuilder searchRequestBuilder = EsClient.getClient().prepareSearch(NodeRefResSumIndex.Index); + searchRequestBuilder.setTypes(search.getSliceType()); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeRefResSumIndex.Time_Slice).gte(search.getStartTime()).lte(search.getEndTime())); + searchRequestBuilder.setSize(0); + + TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms(NodeRefResSumIndex.Time_Slice).field(NodeRefResSumIndex.Time_Slice); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.OneSecondLess).field(NodeRefResSumIndex.OneSecondLess)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.ThreeSecondLess).field(NodeRefResSumIndex.ThreeSecondLess)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.FiveSecondLess).field(NodeRefResSumIndex.FiveSecondLess)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.FiveSecondGreater).field(NodeRefResSumIndex.FiveSecondGreater)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.Error).field(NodeRefResSumIndex.Error)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.Summary).field(NodeRefResSumIndex.Summary)); + + searchRequestBuilder.addAggregation(aggregationBuilder); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + JsonArray nodeRefResSumArray = new JsonArray(); + Terms aggTerms = searchResponse.getAggregations().get(NodeRefResSumIndex.Time_Slice); + for (Terms.Bucket bucket : aggTerms.getBuckets()) { + String aggId = String.valueOf(bucket.getKey()); + Sum oneSecondLess = bucket.getAggregations().get(NodeRefResSumIndex.OneSecondLess); + Sum threeSecondLess = bucket.getAggregations().get(NodeRefResSumIndex.ThreeSecondLess); + Sum fiveSecondLess = bucket.getAggregations().get(NodeRefResSumIndex.FiveSecondLess); + Sum fiveSecondGreater = bucket.getAggregations().get(NodeRefResSumIndex.FiveSecondGreater); + Sum error = bucket.getAggregations().get(NodeRefResSumIndex.Error); + Sum summary = bucket.getAggregations().get(NodeRefResSumIndex.Summary); + logger.debug("aggId: %s, oneSecondLess: %s, threeSecondLess: %s, fiveSecondLess: %s, fiveSecondGreater: %s, error: %s, summary: %s", aggId, + oneSecondLess.getValue(), threeSecondLess.getValue(), fiveSecondLess.getValue(), fiveSecondGreater.getValue(), error.getValue(), summary.getValue()); + + JsonObject nodeRefResSumObj = new JsonObject(); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.Time_Slice, aggId); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.OneSecondLess, oneSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.ThreeSecondLess, threeSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.FiveSecondLess, fiveSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.FiveSecondGreater, fiveSecondGreater.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.Error, error.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.Summary, summary.getValue()); + nodeRefResSumArray.add(nodeRefResSumObj); + } + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", nodeRefResSumArray); + } else { + throw new IllegalArgumentException("message instance must be RequestEntity"); + } + } + + public static class RequestEntity extends TimeSlice { + public RequestEntity(String sliceType, long startTime, long endTime) { + super(sliceType, startTime, endTime); + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeRefResSumGroupWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumGroupWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumGroupWithTimeSlice.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/noderef/persistence/NodeRefResSumHourAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumHourAgg.java new file mode 100644 index 000000000..5e4ef0c3e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumHourAgg.java @@ -0,0 +1,68 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +import com.a.eye.skywalking.collector.actor.*; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.storage.MetricData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class NodeRefResSumHourAgg extends AbstractClusterWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumHourAgg.class); + + private NodeRefResSumHourAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeRefResSumHourSave.Role.INSTANCE).create(this); + } + + @Override + protected void onWork(Object message) throws Exception { + if (message instanceof MetricData) { + getSelfContext().lookup(NodeRefResSumHourSave.Role.INSTANCE).tell(message); + } else { + logger.error("message unhandled"); + } + } + + public static class Factory extends AbstractClusterWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefResSumHourAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumHourAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.ResponseSummaryReceiver.Num; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumHourAgg.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumHourSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumHourSave.java new file mode 100644 index 000000000..0009ce518 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumHourSave.java @@ -0,0 +1,63 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.actor.selector.WorkerSelector; +import com.a.eye.skywalking.collector.worker.MetricPersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; + +/** + * @author pengys5 + */ +public class NodeRefResSumHourSave extends MetricPersistenceMember { + + private NodeRefResSumHourSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return NodeRefResSumIndex.Index; + } + + @Override + public String esType() { + return NodeRefResSumIndex.Type_Hour; + } + + public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public NodeRefResSumHourSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumHourSave(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int queueSize() { + return WorkerConfig.Queue.Persistence.ResponseSummaryPersistence.Size; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumHourSave.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new HashCodeSelector(); + } + } +} 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/noderef/persistence/NodeRefResSumMinuteAgg.java similarity index 55% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/receiver/ResponseSummaryReceiver.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumMinuteAgg.java index dc1a18d4b..1981f643a 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/noderef/persistence/NodeRefResSumMinuteAgg.java @@ -1,10 +1,9 @@ -package com.a.eye.skywalking.collector.worker.application.receiver; +package com.a.eye.skywalking.collector.worker.noderef.persistence; import com.a.eye.skywalking.collector.actor.*; -import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; 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; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,39 +11,39 @@ import org.apache.logging.log4j.Logger; /** * @author pengys5 */ -public class ResponseSummaryReceiver extends AbstractClusterWorker { +public class NodeRefResSumMinuteAgg extends AbstractClusterWorker { - private Logger logger = LogManager.getFormatterLogger(ResponseSummaryReceiver.class); + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumMinuteAgg.class); - public ResponseSummaryReceiver(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + private NodeRefResSumMinuteAgg(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(ResponseSummaryPersistence.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefResSumMinuteSave.Role.INSTANCE).create(this); } @Override - public void work(Object message) throws Exception { + protected void onWork(Object message) throws Exception { if (message instanceof MetricData) { - getSelfContext().lookup(ResponseSummaryPersistence.Role.INSTANCE).tell(message); + getSelfContext().lookup(NodeRefResSumMinuteSave.Role.INSTANCE).tell(message); } else { logger.error("message unhandled"); } } - public static class Factory extends AbstractClusterWorkerProvider { + public static class Factory extends AbstractClusterWorkerProvider { public static Factory INSTANCE = new Factory(); @Override public Role role() { - return null; + return Role.INSTANCE; } @Override - public ResponseSummaryReceiver workerInstance(ClusterWorkerContext clusterContext) { - return new ResponseSummaryReceiver(role(), clusterContext, new LocalWorkerContext()); + public NodeRefResSumMinuteAgg workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumMinuteAgg(role(), clusterContext, new LocalWorkerContext()); } @Override @@ -58,12 +57,12 @@ public class ResponseSummaryReceiver extends AbstractClusterWorker { @Override public String roleName() { - return ResponseSummaryReceiver.class.getSimpleName(); + return NodeRefResSumMinuteAgg.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } 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/noderef/persistence/NodeRefResSumMinuteSave.java similarity index 56% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/application/persistence/ResponseCostPersistence.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumMinuteSave.java index e950a13b0..3ffb4a0ff 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/noderef/persistence/NodeRefResSumMinuteSave.java @@ -1,37 +1,34 @@ -package com.a.eye.skywalking.collector.worker.application.persistence; +package com.a.eye.skywalking.collector.worker.noderef.persistence; 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.HashCodeSelector; 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 org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; /** * @author pengys5 */ -public class ResponseCostPersistence extends MetricPersistenceMember { +public class NodeRefResSumMinuteSave extends MetricPersistenceMember { - private Logger logger = LogManager.getFormatterLogger(ResponseCostPersistence.class); - - public ResponseCostPersistence(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + private NodeRefResSumMinuteSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); } @Override public String esIndex() { - return "application_metric"; + return NodeRefResSumIndex.Index; } @Override public String esType() { - return "response_cost"; + return NodeRefResSumIndex.Type_Minute; } - public static class Factory extends AbstractLocalAsyncWorkerProvider { + public static class Factory extends AbstractLocalAsyncWorkerProvider { public static Factory INSTANCE = new Factory(); @Override @@ -40,13 +37,13 @@ public class ResponseCostPersistence extends MetricPersistenceMember { } @Override - public ResponseCostPersistence workerInstance(ClusterWorkerContext clusterContext) { - return new ResponseCostPersistence(role(), clusterContext, new LocalWorkerContext()); + public NodeRefResSumMinuteSave workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumMinuteSave(role(), clusterContext, new LocalWorkerContext()); } @Override public int queueSize() { - return WorkerConfig.Queue.Persistence.ResponseCostPersistence.Size; + return WorkerConfig.Queue.Persistence.ResponseSummaryPersistence.Size; } } @@ -55,12 +52,12 @@ public class ResponseCostPersistence extends MetricPersistenceMember { @Override public String roleName() { - return ResponseCostPersistence.class.getSimpleName(); + return NodeRefResSumMinuteSave.class.getSimpleName(); } @Override public WorkerSelector workerSelector() { - return new RollingSelector(); + return new HashCodeSelector(); } } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumSearchWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumSearchWithTimeSlice.java new file mode 100644 index 000000000..a3a41f234 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumSearchWithTimeSlice.java @@ -0,0 +1,127 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.Const; +import com.a.eye.skywalking.collector.worker.TimeSlice; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; +import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder; +import org.elasticsearch.search.aggregations.metrics.sum.Sum; + +/** + * @author pengys5 + */ +public class NodeRefResSumSearchWithTimeSlice extends AbstractLocalSyncWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeRefResSumSearchWithTimeSlice.class); + + NodeRefResSumSearchWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + + SearchRequestBuilder searchRequestBuilder = EsClient.getClient().prepareSearch(NodeRefResSumIndex.Index); + searchRequestBuilder.setTypes(search.getSliceType()); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeRefResSumIndex.Time_Slice).gte(search.getStartTime()).lte(search.getEndTime())); + searchRequestBuilder.setSize(0); + + TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms(NodeRefResSumIndex.AGG_COLUMN).field(NodeRefResSumIndex.AGG_COLUMN); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.OneSecondLess).field(NodeRefResSumIndex.OneSecondLess)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.ThreeSecondLess).field(NodeRefResSumIndex.ThreeSecondLess)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.FiveSecondLess).field(NodeRefResSumIndex.FiveSecondLess)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.FiveSecondGreater).field(NodeRefResSumIndex.FiveSecondGreater)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.Error).field(NodeRefResSumIndex.Error)); + aggregationBuilder.subAggregation(AggregationBuilders.sum(NodeRefResSumIndex.Summary).field(NodeRefResSumIndex.Summary)); + + searchRequestBuilder.addAggregation(aggregationBuilder); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + JsonArray nodeRefResSumArray = new JsonArray(); + Terms aggTerms = searchResponse.getAggregations().get(NodeRefResSumIndex.AGG_COLUMN); + for (Terms.Bucket bucket : aggTerms.getBuckets()) { + String aggId = String.valueOf(bucket.getKey()); + Sum oneSecondLess = bucket.getAggregations().get(NodeRefResSumIndex.OneSecondLess); + Sum threeSecondLess = bucket.getAggregations().get(NodeRefResSumIndex.ThreeSecondLess); + Sum fiveSecondLess = bucket.getAggregations().get(NodeRefResSumIndex.FiveSecondLess); + Sum fiveSecondGreater = bucket.getAggregations().get(NodeRefResSumIndex.FiveSecondGreater); + Sum error = bucket.getAggregations().get(NodeRefResSumIndex.Error); + Sum summary = bucket.getAggregations().get(NodeRefResSumIndex.Summary); + logger.debug("aggId: %s, oneSecondLess: %s, threeSecondLess: %s, fiveSecondLess: %s, fiveSecondGreater: %s, error: %s, summary: %s", aggId, + oneSecondLess.getValue(), threeSecondLess.getValue(), fiveSecondLess.getValue(), fiveSecondGreater.getValue(), error.getValue(), summary.getValue()); + + JsonObject nodeRefResSumObj = new JsonObject(); + String[] ids = aggId.split(Const.IDS_SPLIT); + String front = ids[0]; + String behind = ids[1]; + + nodeRefResSumObj.addProperty("front", front); + nodeRefResSumObj.addProperty("behind", behind); + + nodeRefResSumObj.addProperty(NodeRefResSumIndex.OneSecondLess, oneSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.ThreeSecondLess, threeSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.FiveSecondLess, fiveSecondLess.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.FiveSecondGreater, fiveSecondGreater.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.Error, error.getValue()); + nodeRefResSumObj.addProperty(NodeRefResSumIndex.Summary, summary.getValue()); + nodeRefResSumArray.add(nodeRefResSumObj); + } + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", nodeRefResSumArray); + } else { + throw new IllegalArgumentException("message instance must be RequestEntity"); + } + } + + public static class RequestEntity extends TimeSlice { + public RequestEntity(String sliceType, long startTime, long endTime) { + super(sliceType, startTime, endTime); + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeRefResSumSearchWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefResSumSearchWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefResSumSearchWithTimeSlice.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/noderef/persistence/NodeRefSearchWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefSearchWithTimeSlice.java new file mode 100644 index 000000000..eeebdd49b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefSearchWithTimeSlice.java @@ -0,0 +1,103 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +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.Const; +import com.a.eye.skywalking.collector.worker.TimeSlice; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.aggregations.AggregationBuilders; +import org.elasticsearch.search.aggregations.bucket.terms.Terms; + +/** + * @author pengys5 + */ +public class NodeRefSearchWithTimeSlice extends AbstractLocalSyncWorker { + + private Logger logger = LogManager.getFormatterLogger(NodeRefSearchWithTimeSlice.class); + + NodeRefSearchWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + + SearchRequestBuilder searchRequestBuilder = EsClient.getClient().prepareSearch(NodeRefIndex.Index); + searchRequestBuilder.setTypes(search.getSliceType()); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + searchRequestBuilder.setQuery(QueryBuilders.rangeQuery(NodeRefIndex.Time_Slice).gte(search.getStartTime()).lte(search.getEndTime())); + searchRequestBuilder.setSize(0); + + searchRequestBuilder.addAggregation(AggregationBuilders.terms(NodeRefIndex.AGG_COLUMN).field(NodeRefIndex.AGG_COLUMN).size(100)); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + Terms genders = searchResponse.getAggregations().get(NodeRefIndex.AGG_COLUMN); + + JsonArray nodeRefArray = new JsonArray(); + for (Terms.Bucket entry : genders.getBuckets()) { + String aggId = entry.getKeyAsString(); + String[] aggIds = aggId.split(Const.IDS_SPLIT); + String front = aggIds[0]; + String behind = aggIds[1]; + + JsonObject nodeRefObj = new JsonObject(); + nodeRefObj.addProperty(NodeRefIndex.Front, front); + nodeRefObj.addProperty(NodeRefIndex.Behind, behind); + nodeRefArray.add(nodeRefObj); + } + logger.debug("node ref data: %s", nodeRefArray.toString()); + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", nodeRefArray); + } else { + throw new IllegalArgumentException("message instance must be RequestEntity"); + } + } + + public static class RequestEntity extends TimeSlice { + public RequestEntity(String sliceType, long startTime, long endTime) { + super(sliceType, startTime, endTime); + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public NodeRefSearchWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new NodeRefSearchWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return NodeRefSearchWithTimeSlice.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/receiver/TraceSegmentReceiver.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/receiver/TraceSegmentReceiver.java deleted file mode 100644 index b867bf670..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/receiver/TraceSegmentReceiver.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.a.eye.skywalking.collector.worker.receiver; - -import com.a.eye.skywalking.collector.actor.*; -import com.a.eye.skywalking.collector.commons.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; -import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; -import com.a.eye.skywalking.collector.worker.tools.DateTools; -import com.a.eye.skywalking.trace.TraceSegment; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -/** - * @author pengys5 - */ -public class TraceSegmentReceiver extends AbstractClusterWorker { - - private Logger logger = LogManager.getFormatterLogger(TraceSegmentReceiver.class); - - public TraceSegmentReceiver(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { - super(role, clusterContext, selfContext); - } - - @Override - public void preStart() throws ProviderNotFoundException { - getClusterContext().findProvider(ApplicationMain.Role.INSTANCE).create(this); - getClusterContext().findProvider(ApplicationRefMain.Role.INSTANCE).create(this); - } - - @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()); - long timeSlice = DateTools.timeStampToTimeSlice(traceSegment.getStartTime()); - int second = DateTools.timeStampToSecond(traceSegment.getStartTime()); - - TraceSegmentTimeSlice segmentTimeSlice = new TraceSegmentTimeSlice(timeSlice, second, traceSegment); - getSelfContext().lookup(ApplicationMain.Role.INSTANCE).tell(segmentTimeSlice); - getSelfContext().lookup(ApplicationRefMain.Role.INSTANCE).tell(segmentTimeSlice); - } - } - - public static class Factory extends AbstractClusterWorkerProvider { - public static Factory INSTANCE = new Factory(); - - @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 { - private final TraceSegment traceSegment; - - public TraceSegmentTimeSlice(long timeSliceMinute, int second, TraceSegment traceSegment) { - super(timeSliceMinute, second); - this.traceSegment = traceSegment; - } - - public TraceSegment getTraceSegment() { - return traceSegment; - } - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentCostIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentCostIndex.java new file mode 100644 index 000000000..dd2a994d8 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentCostIndex.java @@ -0,0 +1,61 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class SegmentCostIndex extends AbstractIndex { + + public static final String Index = "segment_cost_idx"; + + public static final String SegId = "segId"; + public static final String StartTime = "startTime"; + public static final String EndTime = "EndTime"; + public static final String OperationName = "operationName"; + public static final String Cost = "cost"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return true; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(SegId) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(StartTime) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(EndTime) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject(OperationName) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(Cost) + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentExceptionIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentExceptionIndex.java new file mode 100644 index 000000000..259ce9ce8 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentExceptionIndex.java @@ -0,0 +1,51 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class SegmentExceptionIndex extends AbstractIndex { + + public static final String Index = "segment_exp_idx"; + + public static final String SegId = "segId"; + public static final String IsError = "isError"; + public static final String ErrorKind = "errorKind"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return true; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject(SegId) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject(IsError) + .field("type", "boolean") + .field("index", "not_analyzed") + .endObject() + .startObject(ErrorKind) + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentIndex.java new file mode 100644 index 000000000..741ac3e0d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentIndex.java @@ -0,0 +1,113 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public class SegmentIndex extends AbstractIndex { + + private Logger logger = LogManager.getFormatterLogger(SegmentIndex.class); + + public static final String Index = "segment_idx"; + + @Override + public String index() { + return Index; + } + + @Override + public boolean isRecord() { + return true; + } + + @Override + public XContentBuilder createMappingBuilder() throws IOException { + XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() + .startObject() + .startObject("properties") + .startObject("traceSegmentId") + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject("startTime") + .field("type", "date") + .field("index", "not_analyzed") + .endObject() + .startObject("endTime") + .field("type", "date") + .field("index", "not_analyzed") + .endObject() + .startObject("applicationCode") + .field("type", "string") + .field("index", "not_analyzed") + .endObject() + .startObject("minute") + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject("hour") + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startObject("day") + .field("type", "long") + .field("index", "not_analyzed") + .endObject() + .startArray("refs") + .startObject("traceSegmentId") + .field("type", "String") + .field("index", "not_analyzed") + .endObject() + .startObject("spanId") + .field("type", "integer") + .field("index", "not_analyzed") + .endObject() + .startObject("applicationCode") + .field("type", "String") + .field("index", "not_analyzed") + .endObject() + .startObject("peerHost") + .field("type", "String") + .field("index", "not_analyzed") + .endObject() + .endArray() + .startArray("refs") + .startObject("spanId") + .field("type", "integer") + .field("index", "not_analyzed") + .endObject() + .startObject("parentSpanId") + .field("type", "integer") + .field("index", "not_analyzed") + .endObject() + .startObject("startTime") + .field("type", "date") + .field("index", "not_analyzed") + .endObject() + .startObject("endTime") + .field("type", "date") + .field("index", "not_analyzed") + .endObject() + .startObject("operationName") + .field("type", "String") + .field("index", "not_analyzed") + .endObject() + .endArray() + .startArray("relatedGlobalTraces") + .startObject("id") + .field("type", "String") + .field("index", "not_analyzed") + .endObject() + .endArray() + .endObject() + .endObject(); + return mappingBuilder; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentPost.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentPost.java new file mode 100644 index 000000000..da1317929 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentPost.java @@ -0,0 +1,177 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.api.util.StringUtil; +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.globaltrace.analysis.GlobalTraceAnalysis; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractPost; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractPostProvider; +import com.a.eye.skywalking.collector.worker.node.analysis.*; +import com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefDayAnalysis; +import com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefHourAnalysis; +import com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefMinuteAnalysis; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentCostSave; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentExceptionSave; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentSave; +import com.a.eye.skywalking.collector.worker.storage.AbstractTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.a.eye.skywalking.trace.SegmentsMessage; +import com.a.eye.skywalking.trace.TraceSegment; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * @author pengys5 + */ +public class SegmentPost extends AbstractPost { + + private Logger logger = LogManager.getFormatterLogger(SegmentPost.class); + + private Gson gson; + + public SegmentPost(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + gson = new Gson(); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(GlobalTraceAnalysis.Role.INSTANCE).create(this); + + getClusterContext().findProvider(NodeCompAnalysis.Role.INSTANCE).create(this); + + getClusterContext().findProvider(SegmentSave.Role.INSTANCE).create(this); + getClusterContext().findProvider(SegmentCostSave.Role.INSTANCE).create(this); + getClusterContext().findProvider(SegmentExceptionSave.Role.INSTANCE).create(this); + + getClusterContext().findProvider(NodeRefMinuteAnalysis.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefHourAnalysis.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefDayAnalysis.Role.INSTANCE).create(this); + + getClusterContext().findProvider(NodeMappingDayAnalysis.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeMappingHourAnalysis.Role.INSTANCE).create(this); + getClusterContext().findProvider(NodeMappingMinuteAnalysis.Role.INSTANCE).create(this); + } + + @Override + protected void onReceive(String reqJsonStr) throws Exception { + SegmentsMessage segmentsMessage = gson.fromJson(reqJsonStr, SegmentsMessage.class); + List segmentList = segmentsMessage.getSegments(); + for (TraceSegment newSegment : segmentList) { + try { + validateData(newSegment); + } catch (IllegalArgumentException e) { + continue; + } + + logger.debug("receive message instanceof TraceSegment, traceSegmentId is %s", newSegment.getTraceSegmentId()); + + long minuteSlice = DateTools.getMinuteSlice(newSegment.getStartTime()); + long hourSlice = DateTools.getHourSlice(newSegment.getStartTime()); + long daySlice = DateTools.getDaySlice(newSegment.getStartTime()); + int second = DateTools.getSecond(newSegment.getStartTime()); + logger.debug("minuteSlice: %s, hourSlice: %s, daySlice: %s, second:%s", minuteSlice, hourSlice, daySlice, second); + + SegmentWithTimeSlice segmentWithTimeSlice = new SegmentWithTimeSlice(newSegment, minuteSlice, hourSlice, daySlice, second); + String newSegmentJsonStr = gson.toJson(newSegment); + tellSegmentSave(newSegmentJsonStr, daySlice, hourSlice, minuteSlice); + + getSelfContext().lookup(SegmentCostSave.Role.INSTANCE).tell(segmentWithTimeSlice); + getSelfContext().lookup(GlobalTraceAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + getSelfContext().lookup(SegmentExceptionSave.Role.INSTANCE).tell(segmentWithTimeSlice); + + getSelfContext().lookup(NodeCompAnalysis.Role.INSTANCE).tell(newSegment); + + tellNodeRef(segmentWithTimeSlice); + tellNodeMapping(segmentWithTimeSlice); + } + } + + private void tellSegmentSave(String newSegmentJsonStr, long day, long hour, long minute) throws Exception { + JsonObject newSegmentJson = gson.fromJson(newSegmentJsonStr, JsonObject.class); + newSegmentJson.addProperty("minute", minute); + newSegmentJson.addProperty("hour", hour); + newSegmentJson.addProperty("day", day); + getSelfContext().lookup(SegmentSave.Role.INSTANCE).tell(newSegmentJson); + } + + private void tellNodeRef(SegmentWithTimeSlice segmentWithTimeSlice) throws Exception { + getSelfContext().lookup(NodeRefMinuteAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + getSelfContext().lookup(NodeRefHourAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + getSelfContext().lookup(NodeRefDayAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + } + + private void tellNodeMapping(SegmentWithTimeSlice segmentWithTimeSlice) throws Exception { + getSelfContext().lookup(NodeMappingMinuteAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + getSelfContext().lookup(NodeMappingHourAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + getSelfContext().lookup(NodeMappingDayAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); + } + + private void validateData(TraceSegment newSegment) { + if (StringUtil.isEmpty(newSegment.getTraceSegmentId())) { + throw new IllegalArgumentException("traceSegmentId required"); + } + if (0 == newSegment.getStartTime()) { + throw new IllegalArgumentException("startTime required"); + } + } + + public static class Factory extends AbstractPostProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public String servletPath() { + return "/segments"; + } + + @Override + public int queueSize() { + return 128; + } + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SegmentPost workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentPost(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentPost.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } + + public static class SegmentWithTimeSlice extends AbstractTimeSlice { + private final TraceSegment traceSegment; + + public SegmentWithTimeSlice(TraceSegment traceSegment, long minute, long hour, long day, int second) { + super(minute, hour, day, second); + this.traceSegment = traceSegment; + } + + public TraceSegment getTraceSegment() { + return traceSegment; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithGlobalTraceId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithGlobalTraceId.java new file mode 100644 index 000000000..f7f0a3746 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithGlobalTraceId.java @@ -0,0 +1,95 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentTopSearchWithGlobalTraceId; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class SegmentTopGetWithGlobalTraceId extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(SegmentTopGetWithGlobalTraceId.class); + + private SegmentTopGetWithGlobalTraceId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(SegmentTopSearchWithGlobalTraceId.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("globalTraceId") || !request.containsKey("from") || !request.containsKey("limit")) { + throw new IllegalArgumentException("the request parameter must contains globalTraceId, from, limit"); + } + logger.debug("globalTraceId: %s, from: %s, limit: %s", Arrays.toString(request.get("globalTraceId")), + Arrays.toString(request.get("from")), Arrays.toString(request.get("limit"))); + + int from = 0; + try { + from = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "from")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter from must numeric with int type"); + } + + int limit = 0; + try { + limit = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "limit")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter from must numeric with int type"); + } + + String globalTraceId = ParameterTools.INSTANCE.toString(request, "globalTraceId"); + + SegmentTopSearchWithGlobalTraceId.RequestEntity requestEntity = new SegmentTopSearchWithGlobalTraceId.RequestEntity(globalTraceId, from, limit); + getSelfContext().lookup(SegmentTopSearchWithGlobalTraceId.WorkerRole.INSTANCE).ask(requestEntity, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SegmentTopGetWithGlobalTraceId workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentTopGetWithGlobalTraceId(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/segments/top/globalTraceId"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentTopGetWithGlobalTraceId.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/segment/SegmentTopGetWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithTimeSlice.java new file mode 100644 index 000000000..b363f0640 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithTimeSlice.java @@ -0,0 +1,119 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentTopSearchWithTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class SegmentTopGetWithTimeSlice extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(SegmentTopGetWithTimeSlice.class); + + private SegmentTopGetWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(SegmentTopSearchWithTimeSlice.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("startTime") || !request.containsKey("endTime") || !request.containsKey("from") || !request.containsKey("limit")) { + throw new IllegalArgumentException("the request parameter must contains startTime, endTime, from, limit"); + } + logger.debug("startTime: %s, endTime: %s, from: %s", Arrays.toString(request.get("startTime")), + Arrays.toString(request.get("endTime")), Arrays.toString(request.get("from"))); + + long startTime; + try { + startTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "startTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter startTime must numeric with long type"); + } + + long endTime; + try { + endTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "endTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter endTime must numeric with long type"); + } + + int from = 0; + try { + from = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "from")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter from must numeric with int type"); + } + + int limit = 0; + try { + limit = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "limit")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter from must numeric with int type"); + } + + int minCost = -1; + if (request.containsKey("minCost")) { + minCost = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "minCost")); + } + int maxCost = -1; + if (request.containsKey("maxCost")) { + maxCost = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "maxCost")); + } + + SegmentTopSearchWithTimeSlice.RequestEntity requestEntity; + requestEntity = new SegmentTopSearchWithTimeSlice.RequestEntity(from, limit, startTime, endTime); + requestEntity.setMinCost(minCost); + requestEntity.setMaxCost(maxCost); + getSelfContext().lookup(SegmentTopSearchWithTimeSlice.WorkerRole.INSTANCE).ask(requestEntity, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SegmentTopGetWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentTopGetWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/segments/top/timeSlice"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentTopGetWithTimeSlice.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/segment/logic/Segment.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/Segment.java new file mode 100644 index 000000000..1115e56e9 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/Segment.java @@ -0,0 +1,141 @@ +package com.a.eye.skywalking.collector.worker.segment.logic; + +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceId.DistributedTraceId; +import com.a.eye.skywalking.trace.TraceId.DistributedTraceIds; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.TraceSegmentRef; +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * @author pengys5 + */ +public class Segment { + + /** + * The id of this trace segment. + * Every segment has its unique-global-id. + */ + @Expose + @SerializedName(value = "ts") + private String traceSegmentId; + + /** + * The start time of this trace segment. + */ + @Expose + @SerializedName(value = "st") + private long startTime; + + /** + * The end time of this trace segment. + */ + @Expose + @SerializedName(value = "et") + private long endTime; + + /** + * The refs of parent trace segments, except the primary one. + * For most RPC call, {@link #refs} contains only one element, + * but if this segment is a start span of batch process, the segment faces multi parents, + * at this moment, we use this {@link #refs} to link them. + */ + @Expose + @SerializedName(value = "rs") + private List refs; + + /** + * The spans belong to this trace segment. + * They all have finished. + * All active spans are hold and controlled by "skywalking-api" module. + */ + @Expose + @SerializedName(value = "ss") + private List spans; + + /** + * The applicationCode represents a name of current application/JVM and indicates which is business + * role in the cluster. + *

+ * e.g. account_app, billing_app + */ + @Expose + @SerializedName(value = "ac") + private String applicationCode; + + /** + * The relatedGlobalTraces represent a set of all related trace. Most time it contains only one + * element, because only one parent {@link TraceSegment} exists, but, in batch scenario, the num becomes greater + * than 1, also meaning multi-parents {@link TraceSegment}. + *

+ * The difference between relatedGlobalTraces and {@link #refs} is: + * {@link #refs} targets this {@link TraceSegment}'s direct parent, + *

+ * and + *

+ * relatedGlobalTraces targets this {@link TraceSegment}'s related call chain, a call chain contains + * multi {@link TraceSegment}s, only using {@link #refs} is not enough for analysis and ui. + */ + @Expose + @SerializedName(value = "gt") + private DistributedTraceIds relatedGlobalTraces; + + /** + * Establish the link between this segment and its parents. + * + * @param refSegment {@link TraceSegmentRef} + */ + public void ref(TraceSegmentRef refSegment) { + if (refs == null) { + refs = new LinkedList(); + } + if (!refs.contains(refSegment)) { + refs.add(refSegment); + } + } + + public void relatedGlobalTraces(List distributedTraceIds) { + if (distributedTraceIds == null || distributedTraceIds.size() == 0) { + return; + } + for (DistributedTraceId distributedTraceId : distributedTraceIds) { + relatedGlobalTraces.append(distributedTraceId); + } + } + + public String getTraceSegmentId() { + return traceSegmentId; + } + + public long getStartTime() { + return startTime; + } + + public long getEndTime() { + return endTime; + } + + public List getRefs() { + if (refs == null) { + return null; + } + return Collections.unmodifiableList(refs); + } + + public List getRelatedGlobalTraces() { + return relatedGlobalTraces.getRelatedGlobalTraces(); + } + + public List getSpans() { + return Collections.unmodifiableList(spans); + } + + public String getApplicationCode() { + return applicationCode; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SegmentDeserialize.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SegmentDeserialize.java new file mode 100644 index 000000000..3dedc35c0 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SegmentDeserialize.java @@ -0,0 +1,17 @@ +package com.a.eye.skywalking.collector.worker.segment.logic; + +import com.google.gson.Gson; + +/** + * @author pengys5 + */ +public enum SegmentDeserialize { + INSTANCE; + + private Gson gson = new Gson(); + + public Segment deserializeFromES(String segmentSource) { + Segment segment = gson.fromJson(segmentSource, Segment.class); + return segment; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SpanView.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SpanView.java new file mode 100644 index 000000000..f38bb35cd --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SpanView.java @@ -0,0 +1,106 @@ +package com.a.eye.skywalking.collector.worker.segment.logic; + +import java.util.HashSet; +import java.util.Set; + +/** + * @author pengys5 + */ +public class SpanView implements Comparable { + + private int spanId; + private String segId; + private String appCode; + private String spanSegId; + private String parentSpanSegId; + private long startTime; + private long relativeStartTime; + private long cost; + private String operationName; + private Set childSpans; + + public SpanView() { + childSpans = new HashSet<>(); + } + + public int getSpanId() { + return spanId; + } + + public void setSpanId(int spanId) { + this.spanId = spanId; + } + + public String getSegId() { + return segId; + } + + public void setSegId(String segId) { + this.segId = segId; + } + + public String getAppCode() { + return appCode; + } + + public void setAppCode(String appCode) { + this.appCode = appCode; + } + + public String getSpanSegId() { + return spanSegId; + } + + public void setSpanSegId(String spanSegId) { + this.spanSegId = spanSegId; + } + + public String getParentSpanSegId() { + return parentSpanSegId; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public void setParentSpanSegId(String parentSpanSegId) { + this.parentSpanSegId = parentSpanSegId; + } + + public long getRelativeStartTime() { + return relativeStartTime; + } + + public void setRelativeStartTime(long relativeStartTime) { + this.relativeStartTime = relativeStartTime; + } + + public long getCost() { + return cost; + } + + public void setCost(long cost) { + this.cost = cost; + } + + public String getOperationName() { + return operationName; + } + + public void setOperationName(String operationName) { + this.operationName = operationName; + } + + public void addChild(SpanView childSpan) { + childSpans.add(childSpan); + } + + @Override + public int compareTo(SpanView o) { + return Long.valueOf(this.startTime - o.getStartTime()).intValue(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSave.java new file mode 100644 index 000000000..9fe2cc6c4 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSave.java @@ -0,0 +1,109 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + + +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.segment.SegmentCostIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class SegmentCostSave extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(SegmentCostSave.class); + + @Override + public String esIndex() { + return SegmentCostIndex.Index; + } + + @Override + public String esType() { + return SegmentCostIndex.Type_Record; + } + + protected SegmentCostSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + + if (CollectionTools.isNotEmpty(segment.getSpans())) { + for (Span span : segment.getSpans()) { + if (span.getParentSpanId() == -1) { + JsonObject dataJsonObj = new JsonObject(); + dataJsonObj.addProperty(SegmentCostIndex.SegId, segment.getTraceSegmentId()); + dataJsonObj.addProperty(SegmentCostIndex.StartTime, span.getStartTime()); + dataJsonObj.addProperty(SegmentCostIndex.EndTime, span.getEndTime()); + dataJsonObj.addProperty(SegmentCostIndex.OperationName, span.getOperationName()); + dataJsonObj.addProperty(SegmentCostIndex.Time_Slice, segmentWithTimeSlice.getMinute()); + + long startTime = span.getStartTime(); + long endTime = span.getEndTime(); + long cost = endTime - startTime; + if (cost == 0) { + cost = 1; + } + dataJsonObj.addProperty(SegmentCostIndex.Cost, cost); + + RecordData recordData = new RecordData(segment.getTraceSegmentId()); + recordData.setRecord(dataJsonObj); + super.analyse(recordData); + } + } + } + } else { + logger.error("unhandled message, message instance must JsonObject, but is %s", message.getClass().toString()); + } + } + + 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.Segment.SegmentCostSave.Size; + } + + @Override + public SegmentCostSave workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentCostSave(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentCostSave.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/segment/persistence/SegmentExceptionSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionSave.java new file mode 100644 index 000000000..6caccfa10 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionSave.java @@ -0,0 +1,115 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + + +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.segment.SegmentExceptionIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.LogData; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.TraceSegment; +import com.a.eye.skywalking.trace.tag.Tags; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * @author pengys5 + */ +public class SegmentExceptionSave extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(SegmentExceptionSave.class); + + @Override + public String esIndex() { + return SegmentExceptionIndex.Index; + } + + @Override + public String esType() { + return AbstractIndex.Type_Record; + } + + protected SegmentExceptionSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof SegmentPost.SegmentWithTimeSlice) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) message; + TraceSegment segment = segmentWithTimeSlice.getTraceSegment(); + + if (CollectionTools.isNotEmpty(segment.getSpans())) { + for (Span span : segment.getSpans()) { + boolean isError = Tags.ERROR.get(span); + + JsonObject dataJsonObj = new JsonObject(); + dataJsonObj.addProperty(SegmentExceptionIndex.IsError, isError); + dataJsonObj.addProperty(SegmentExceptionIndex.SegId, segment.getTraceSegmentId()); + + JsonArray errorKind = new JsonArray(); + if (isError) { + List logDataList = span.getLogs(); + for (LogData logData : logDataList) { + if (logData.getFields().containsKey("error.kind")) { + errorKind.add(String.valueOf(logData.getFields().get("error.kind"))); + } + } + } + dataJsonObj.add(SegmentExceptionIndex.ErrorKind, errorKind); + + RecordData recordData = new RecordData(segment.getTraceSegmentId()); + recordData.setRecord(dataJsonObj); + super.analyse(recordData); + } + } + } else { + logger.error("unhandled message, message instance must JsonObject, but is %s", message.getClass().toString()); + } + } + + 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.Segment.SegmentExceptionSave.Size; + } + + @Override + public SegmentExceptionSave workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentExceptionSave(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentExceptionSave.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/segment/persistence/SegmentExceptionWithSegId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionWithSegId.java new file mode 100644 index 000000000..4102a6698 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionWithSegId.java @@ -0,0 +1,71 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + +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.segment.SegmentExceptionIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonObject; +import org.elasticsearch.action.get.GetResponse; + +/** + * @author pengys5 + */ +public class SegmentExceptionWithSegId extends AbstractLocalSyncWorker { + + private SegmentExceptionWithSegId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + protected void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + + GetResponse getResponse = EsClient.getClient().prepareGet(SegmentExceptionIndex.Index, SegmentExceptionIndex.Type_Record, search.segId).get(); + + JsonObject dataJson = new JsonObject(); + dataJson.addProperty(SegmentExceptionIndex.SegId, (String) getResponse.getSource().get(SegmentExceptionIndex.SegId)); + dataJson.addProperty(SegmentExceptionIndex.IsError, (Boolean) getResponse.getSource().get(SegmentExceptionIndex.IsError)); + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", dataJson); + } + } + + public static class RequestEntity { + private String segId; + + public RequestEntity(String segId) { + this.segId = segId; + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SegmentExceptionWithSegId workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentExceptionWithSegId(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentExceptionWithSegId.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/segment/persistence/SegmentSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentSave.java new file mode 100644 index 000000000..0875545ae --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentSave.java @@ -0,0 +1,83 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + + +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.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class SegmentSave extends RecordPersistenceMember { + + private Logger logger = LogManager.getFormatterLogger(SegmentSave.class); + + @Override + public String esIndex() { + return SegmentIndex.Index; + } + + @Override + public String esType() { + return AbstractIndex.Type_Record; + } + + public SegmentSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void analyse(Object message) throws Exception { + if (message instanceof JsonObject) { + JsonObject segmentJson = (JsonObject) message; + RecordData recordData = new RecordData(segmentJson.get("ts").getAsString()); + recordData.setRecord(segmentJson); + super.analyse(recordData); + } else { + logger.error("unhandled message, message instance must JsonObject, but is %s", message.getClass().toString()); + } + } + + 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.Segment.SegmentSave.Size; + } + + @Override + public SegmentSave workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentSave(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentSave.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/segment/persistence/SegmentTopSearchWithGlobalTraceId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentTopSearchWithGlobalTraceId.java new file mode 100644 index 000000000..9ecf8c6bd --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentTopSearchWithGlobalTraceId.java @@ -0,0 +1,155 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + +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.globaltrace.GlobalTraceIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentCostIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentExceptionIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.segment.logic.Segment; +import com.a.eye.skywalking.collector.worker.segment.logic.SegmentDeserialize; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.storage.MergeData; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.TraceId.DistributedTraceId; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.client.Client; + +import java.util.List; + +/** + * @author pengys5 + */ +public class SegmentTopSearchWithGlobalTraceId extends AbstractLocalSyncWorker { + + private Gson gson = new Gson(); + + private SegmentTopSearchWithGlobalTraceId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(SegmentExceptionWithSegId.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + Client client = EsClient.getClient(); + + String globalTraceData = client.prepareGet(GlobalTraceIndex.Index, GlobalTraceIndex.Type_Record, search.globalTraceId).get().getSourceAsString(); + JsonObject globalTraceObj = gson.fromJson(globalTraceData, JsonObject.class); + + JsonObject topSegPaging = new JsonObject(); + topSegPaging.addProperty("recordsTotal", 0); + + JsonArray topSegArray = new JsonArray(); + topSegPaging.add("data", topSegArray); + + if (globalTraceObj != null && globalTraceObj.has(GlobalTraceIndex.SubSegIds)) { + String subSegIdsStr = globalTraceObj.get(GlobalTraceIndex.SubSegIds).getAsString(); + String[] subSegIds = subSegIdsStr.split(MergeData.Split); + + topSegPaging.addProperty("recordsTotal", subSegIds.length); + + int num = search.from; + int limit = search.limit; + if (search.limit >= subSegIds.length) { + limit = subSegIds.length; + } + + for (int i = num; i < limit; i++) { + GetResponse getResponse = client.prepareGet(SegmentCostIndex.Index, SegmentCostIndex.Type_Record, subSegIds[num]).get(); + + JsonObject topSegmentJson = new JsonObject(); + topSegmentJson.addProperty("num", num); + String segId = (String) getResponse.getSource().get(SegmentCostIndex.SegId); + topSegmentJson.addProperty(SegmentCostIndex.SegId, segId); + topSegmentJson.addProperty(SegmentCostIndex.StartTime, (Number) getResponse.getSource().get(SegmentCostIndex.StartTime)); + if (getResponse.getSource().containsKey(SegmentCostIndex.EndTime)) { + topSegmentJson.addProperty(SegmentCostIndex.EndTime, (Number) getResponse.getSource().get(SegmentCostIndex.EndTime)); + } + + topSegmentJson.addProperty(SegmentCostIndex.OperationName, (String) getResponse.getSource().get(SegmentCostIndex.OperationName)); + topSegmentJson.addProperty(SegmentCostIndex.Cost, (Number) getResponse.getSource().get(SegmentCostIndex.Cost)); + + String segmentSource = client.prepareGet(SegmentIndex.Index, SegmentIndex.Type_Record, segId).get().getSourceAsString(); + Segment segment = SegmentDeserialize.INSTANCE.deserializeFromES(segmentSource); + List distributedTraceIdList = segment.getRelatedGlobalTraces(); + + JsonArray distributedTraceIdArray = new JsonArray(); + if (CollectionTools.isNotEmpty(distributedTraceIdList)) { + for (DistributedTraceId distributedTraceId : distributedTraceIdList) { + distributedTraceIdArray.add(distributedTraceId.get()); + } + } + topSegmentJson.add("traceIds", distributedTraceIdArray); + + boolean isError = false; + JsonObject resJsonObj = new JsonObject(); + getSelfContext().lookup(SegmentExceptionWithSegId.WorkerRole.INSTANCE).ask(new SegmentExceptionWithSegId.RequestEntity(segId), resJsonObj); + if (resJsonObj.has("result")) { + JsonObject segExJson = resJsonObj.get("result").getAsJsonObject(); + if (segExJson.has(SegmentExceptionIndex.IsError)) { + isError = segExJson.get(SegmentExceptionIndex.IsError).getAsBoolean(); + } + } + topSegmentJson.addProperty(SegmentExceptionIndex.IsError, isError); + + num++; + topSegArray.add(topSegmentJson); + } + } + + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", topSegPaging); + } + } + + public static class RequestEntity { + private int from; + private int limit; + private String globalTraceId; + + public RequestEntity(String globalTraceId, int from, int limit) { + this.from = from; + this.limit = limit; + this.globalTraceId = globalTraceId; + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SegmentTopSearchWithGlobalTraceId workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentTopSearchWithGlobalTraceId(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentTopSearchWithGlobalTraceId.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/segment/persistence/SegmentTopSearchWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentTopSearchWithTimeSlice.java new file mode 100644 index 000000000..0b3095af8 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentTopSearchWithTimeSlice.java @@ -0,0 +1,172 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + +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.segment.SegmentCostIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentExceptionIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.segment.logic.Segment; +import com.a.eye.skywalking.collector.worker.segment.logic.SegmentDeserialize; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.tools.CollectionTools; +import com.a.eye.skywalking.trace.TraceId.DistributedTraceId; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.elasticsearch.action.search.SearchRequestBuilder; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.SearchType; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.index.query.RangeQueryBuilder; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.sort.SortOrder; + +import java.util.List; + +/** + * @author pengys5 + */ +public class SegmentTopSearchWithTimeSlice extends AbstractLocalSyncWorker { + + private SegmentTopSearchWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(SegmentExceptionWithSegId.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + + SearchRequestBuilder searchRequestBuilder = EsClient.getClient().prepareSearch(SegmentCostIndex.Index); + searchRequestBuilder.setTypes(SegmentCostIndex.Type_Record); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + searchRequestBuilder.setQuery(boolQueryBuilder); + boolQueryBuilder.must().add(QueryBuilders.rangeQuery(SegmentCostIndex.Time_Slice).gte(search.startTime).lte(search.endTime)); + if (search.minCost != -1 || search.maxCost != -1) { + RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(SegmentCostIndex.Cost); + if (search.minCost != -1) { + rangeQueryBuilder.gte(search.minCost); + } + if (search.maxCost != -1) { + rangeQueryBuilder.lte(search.maxCost); + } + boolQueryBuilder.must().add(rangeQueryBuilder); + } + + searchRequestBuilder.addSort(SegmentCostIndex.Cost, SortOrder.DESC); + searchRequestBuilder.setSize(search.limit); + searchRequestBuilder.setFrom(search.from); + + SearchResponse searchResponse = searchRequestBuilder.execute().actionGet(); + + JsonObject topSegPaging = new JsonObject(); + topSegPaging.addProperty("recordsTotal", searchResponse.getHits().totalHits()); + + JsonArray topSegArray = new JsonArray(); + topSegPaging.add("data", topSegArray); + + int num = search.from; + for (SearchHit searchHit : searchResponse.getHits().getHits()) { + JsonObject topSegmentJson = new JsonObject(); + topSegmentJson.addProperty("num", num); + String segId = (String) searchHit.getSource().get(SegmentCostIndex.SegId); + topSegmentJson.addProperty(SegmentCostIndex.SegId, segId); + topSegmentJson.addProperty(SegmentCostIndex.StartTime, (Number) searchHit.getSource().get(SegmentCostIndex.StartTime)); + if (searchHit.getSource().containsKey(SegmentCostIndex.EndTime)) { + topSegmentJson.addProperty(SegmentCostIndex.EndTime, (Number) searchHit.getSource().get(SegmentCostIndex.EndTime)); + } + + topSegmentJson.addProperty(SegmentCostIndex.OperationName, (String) searchHit.getSource().get(SegmentCostIndex.OperationName)); + topSegmentJson.addProperty(SegmentCostIndex.Cost, (Number) searchHit.getSource().get(SegmentCostIndex.Cost)); + + String segmentSource = EsClient.getClient().prepareGet(SegmentIndex.Index, SegmentIndex.Type_Record, segId).get().getSourceAsString(); + Segment segment = SegmentDeserialize.INSTANCE.deserializeFromES(segmentSource); + List distributedTraceIdList = segment.getRelatedGlobalTraces(); + + JsonArray distributedTraceIdArray = new JsonArray(); + if (CollectionTools.isNotEmpty(distributedTraceIdList)) { + for (DistributedTraceId distributedTraceId : distributedTraceIdList) { + distributedTraceIdArray.add(distributedTraceId.get()); + } + } + topSegmentJson.add("traceIds", distributedTraceIdArray); + + boolean isError = false; + JsonObject resJsonObj = new JsonObject(); + getSelfContext().lookup(SegmentExceptionWithSegId.WorkerRole.INSTANCE).ask(new SegmentExceptionWithSegId.RequestEntity(segId), resJsonObj); + if (resJsonObj.has("result")) { + JsonObject segExJson = resJsonObj.get("result").getAsJsonObject(); + if (segExJson.has(SegmentExceptionIndex.IsError)) { + isError = segExJson.get(SegmentExceptionIndex.IsError).getAsBoolean(); + } + } + topSegmentJson.addProperty(SegmentExceptionIndex.IsError, isError); + + num++; + topSegArray.add(topSegmentJson); + } + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", topSegPaging); + } + } + + public static class RequestEntity { + private int from; + private int limit; + private long startTime; + private long endTime; + private int minCost; + private int maxCost; + + public RequestEntity(int from, int limit, long startTime, long endTime) { + this.from = from; + this.limit = limit; + this.startTime = startTime; + this.endTime = endTime; + } + + public void setMinCost(int minCost) { + this.minCost = minCost; + } + + public void setMaxCost(int maxCost) { + this.maxCost = maxCost; + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SegmentTopSearchWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new SegmentTopSearchWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SegmentTopSearchWithTimeSlice.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/span/SpanGetWithId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/span/SpanGetWithId.java new file mode 100644 index 000000000..e5ff6cf99 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/span/SpanGetWithId.java @@ -0,0 +1,86 @@ +package com.a.eye.skywalking.collector.worker.span; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.span.persistence.SpanSearchWithId; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class SpanGetWithId extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(SpanGetWithId.class); + + private SpanGetWithId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(SpanSearchWithId.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("segId") || !request.containsKey("spanId")) { + throw new IllegalArgumentException("the request parameter must contains segId, spanId"); + } + logger.debug("segId: %s, spanId: %s", Arrays.toString(request.get("segId")), Arrays.toString(request.get("spanId"))); + + int maxCost = -1; + if (request.containsKey("maxCost")) { + maxCost = Integer.valueOf(ParameterTools.INSTANCE.toString(request, "maxCost")); + } + + String segId = ParameterTools.INSTANCE.toString(request, "segId"); + String spanId = ParameterTools.INSTANCE.toString(request, "spanId"); + + SpanSearchWithId.RequestEntity requestEntity = new SpanSearchWithId.RequestEntity(segId, spanId); + getSelfContext().lookup(SpanSearchWithId.WorkerRole.INSTANCE).ask(requestEntity, response); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SpanGetWithId workerInstance(ClusterWorkerContext clusterContext) { + return new SpanGetWithId(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/span/spanId"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SpanGetWithId.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/span/persistence/SpanSearchWithId.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/span/persistence/SpanSearchWithId.java new file mode 100644 index 000000000..5129b4f2c --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/span/persistence/SpanSearchWithId.java @@ -0,0 +1,88 @@ +package com.a.eye.skywalking.collector.worker.span.persistence; + +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.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.segment.logic.Segment; +import com.a.eye.skywalking.collector.worker.segment.logic.SegmentDeserialize; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.trace.Span; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.elasticsearch.action.get.GetResponse; + +import java.util.List; + +/** + * @author pengys5 + */ +public class SpanSearchWithId extends AbstractLocalSyncWorker { + + private Gson gson = new Gson(); + + private SpanSearchWithId(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + protected void onWork(Object request, Object response) throws Exception { + if (request instanceof RequestEntity) { + RequestEntity search = (RequestEntity) request; + GetResponse getResponse = EsClient.getClient().prepareGet(SegmentIndex.Index, SegmentIndex.Type_Record, search.segId).get(); + Segment segment = SegmentDeserialize.INSTANCE.deserializeFromES(getResponse.getSourceAsString()); + List spanList = segment.getSpans(); + + getResponse.getSource(); + JsonObject dataJson = new JsonObject(); + + for (Span span : spanList) { + if (String.valueOf(span.getSpanId()).equals(search.spanId)) { + String spanJsonStr = gson.toJson(span); + dataJson = gson.fromJson(spanJsonStr, JsonObject.class); + } + } + + JsonObject resJsonObj = (JsonObject) response; + resJsonObj.add("result", dataJson); + } + } + + public static class RequestEntity { + private String segId; + private String spanId; + + public RequestEntity(String segId, String spanId) { + this.segId = segId; + this.spanId = spanId; + } + } + + public static class Factory extends AbstractLocalSyncWorkerProvider { + public static Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public SpanSearchWithId workerInstance(ClusterWorkerContext clusterContext) { + return new SpanSearchWithId(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return SpanSearchWithId.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/storage/AbstractIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractIndex.java new file mode 100644 index 000000000..8f4ade7da --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractIndex.java @@ -0,0 +1,90 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; +import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; +import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; +import org.elasticsearch.client.IndicesAdminClient; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.index.IndexNotFoundException; + +import java.io.IOException; + +/** + * @author pengys5 + */ +public abstract class AbstractIndex { + + private Logger logger = LogManager.getFormatterLogger(AbstractIndex.class); + + public static final String Type_Minute = "minute"; + public static final String Type_Hour = "hour"; + public static final String Type_Day = "day"; + + public static final String Type_Record = "record"; + + public static final String AGG_COLUMN = "aggId"; + public static final String Time_Slice = "timeSlice"; + + final public XContentBuilder createSettingBuilder() throws IOException { + XContentBuilder settingsBuilder = XContentFactory.jsonBuilder() + .startObject() + .field("index.number_of_shards", 2) + .field("index.number_of_replicas", 0) + .endObject(); + return settingsBuilder; + } + + public abstract boolean isRecord(); + + public abstract XContentBuilder createMappingBuilder() throws IOException; + + final public void createIndex() { + // settings + String settingSource = ""; + + // mapping + XContentBuilder mappingBuilder = null; + try { + XContentBuilder settingsBuilder = createSettingBuilder(); + + settingSource = settingsBuilder.string(); + + mappingBuilder = createMappingBuilder(); + logger.info("mapping builder str: %s", mappingBuilder.string()); + } catch (Exception e) { + logger.error("create %s index mapping builder error", index()); + } + Settings settings = Settings.builder().loadFromSource(settingSource).build(); + IndicesAdminClient client = EsClient.getClient().admin().indices(); + + if (isRecord()) { + CreateIndexResponse response = client.prepareCreate(index()).setSettings(settings).addMapping(Type_Record, mappingBuilder).get(); + logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), Type_Record, response.isAcknowledged()); + } else { + CreateIndexResponse response = client.prepareCreate(index()).setSettings(settings).addMapping(Type_Minute, mappingBuilder).get(); + logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), Type_Minute, response.isAcknowledged()); + PutMappingResponse putMappingResponse = client.preparePutMapping(index()).setType(Type_Hour).setSource(mappingBuilder).get(); + logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), Type_Hour, putMappingResponse.isAcknowledged()); + putMappingResponse = client.preparePutMapping(index()).setType(Type_Day).setSource(mappingBuilder).get(); + logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), Type_Day, putMappingResponse.isAcknowledged()); + } + } + + final public boolean deleteIndex() { + IndicesAdminClient client = EsClient.getClient().admin().indices(); + try { + DeleteIndexResponse response = client.prepareDelete(index()).get(); + logger.info("delete %s index finished, isAcknowledged: %s", index(), response.isAcknowledged()); + return response.isAcknowledged(); + } catch (IndexNotFoundException e) { + logger.info("%s index not found", index()); + } + return false; + } + + public abstract String index(); +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java index bb0ade6e1..2920b58e8 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractTimeSlice.java @@ -5,10 +5,14 @@ package com.a.eye.skywalking.collector.worker.storage; */ public abstract class AbstractTimeSlice { private final long minute; + private final long hour; + private final long day; private final int second; - public AbstractTimeSlice(long minute, int second) { + public AbstractTimeSlice(long minute, long hour, long day, int second) { this.minute = minute; + this.hour = hour; + this.day = day; this.second = second; } @@ -16,6 +20,14 @@ public abstract class AbstractTimeSlice { return minute; } + public long getHour() { + return hour; + } + + public long getDay() { + return day; + } + public int getSecond() { return second; } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java index badd094e9..27a0a8e80 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/EsClient.java @@ -2,6 +2,8 @@ package com.a.eye.skywalking.collector.worker.storage; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.admin.indices.refresh.RefreshRequest; +import org.elasticsearch.action.admin.indices.refresh.RefreshResponse; import org.elasticsearch.client.Client; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; @@ -15,14 +17,13 @@ import java.net.UnknownHostException; */ public class EsClient { - private static Logger logger = LogManager.getFormatterLogger(EsClient.class); - private static Client client; public static void boot() throws UnknownHostException { Settings settings = Settings.builder() .put("cluster.name", "CollectorCluster") - .put("client.transport.sniff", true).build(); + .put("client.transport.sniff", true) + .build(); client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); @@ -31,4 +32,15 @@ public class EsClient { public static Client getClient() { return client; } + + public static void indexRefresh(String... indexName) { + Logger logger = LogManager.getFormatterLogger(EsClient.class); + RefreshResponse response = client.admin().indices().refresh(new RefreshRequest(indexName)).actionGet(); + if (response.getShardFailures().length == response.getTotalShards()) { + logger.error("All elasticsearch shard index refresh failure, reason: %s", response.getShardFailures()); + } else if (response.getShardFailures().length > 0) { + logger.error("In parts of elasticsearch shard index refresh failure, reason: %s", response.getShardFailures()); + } + logger.info("elasticsearch index refresh success"); + } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/IndexCreator.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/IndexCreator.java new file mode 100644 index 000000000..b8312881f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/IndexCreator.java @@ -0,0 +1,50 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import com.a.eye.skywalking.collector.worker.globaltrace.GlobalTraceIndex; +import com.a.eye.skywalking.collector.worker.node.NodeCompIndex; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentCostIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentExceptionIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentIndex; + +/** + * @author pengys5 + */ +public enum IndexCreator { + INSTANCE; + + public void create() { + SegmentIndex segmentIndex = new SegmentIndex(); + segmentIndex.deleteIndex(); + + GlobalTraceIndex globalTraceIndex = new GlobalTraceIndex(); + globalTraceIndex.deleteIndex(); + globalTraceIndex.createIndex(); + + SegmentCostIndex segmentCostIndex = new SegmentCostIndex(); + segmentCostIndex.deleteIndex(); + segmentCostIndex.createIndex(); + + SegmentExceptionIndex segmentExceptionIndex = new SegmentExceptionIndex(); + segmentExceptionIndex.deleteIndex(); + segmentExceptionIndex.createIndex(); + + NodeCompIndex nodeCompIndex = new NodeCompIndex(); + nodeCompIndex.deleteIndex(); + nodeCompIndex.createIndex(); + + NodeMappingIndex nodeMappingIndex = new NodeMappingIndex(); + nodeMappingIndex.deleteIndex(); + nodeMappingIndex.createIndex(); + + NodeRefIndex nodeRefIndex = new NodeRefIndex(); + nodeRefIndex.deleteIndex(); + nodeRefIndex.createIndex(); + + NodeRefResSumIndex nodeRefResSumIndex = new NodeRefResSumIndex(); + nodeRefResSumIndex.deleteIndex(); + nodeRefResSumIndex.createIndex(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergeData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergeData.java new file mode 100644 index 000000000..b33a10b54 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergeData.java @@ -0,0 +1,79 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import com.a.eye.skywalking.collector.actor.selector.AbstractHashMessage; + +import java.util.*; + +/** + * @author pengys5 + */ +public class MergeData extends AbstractHashMessage { + + public static final String Split = ","; + + private String id; + + private Map> mergeData = new HashMap<>(); + + public MergeData(String key) { + super(key); + this.id = key; + } + + public String getId() { + return id; + } + + public void setMergeData(String column, String value) { + if (!mergeData.containsKey(column)) { + mergeData.put(column, new HashSet<>()); + } + mergeData.get(column).add(value); + } + + public void merge(MergeData data) { + for (Map.Entry> entry : data.mergeData.entrySet()) { + String column = entry.getKey(); + Set value = entry.getValue(); + Iterator iterator = value.iterator(); + while (iterator.hasNext()) { + setMergeData(column, iterator.next()); + } + } + } + + public void merge(Map dbData) { + for (Map.Entry entry : dbData.entrySet()) { + if (!AbstractIndex.Time_Slice.equals(entry.getKey()) + && !AbstractIndex.AGG_COLUMN.equals(entry.getKey())) { + String dbValue = String.valueOf(entry.getValue()); + String[] dbValues = dbValue.split(Split); + for (String value : dbValues) { + setMergeData(entry.getKey(), value); + } + } + } + } + + public Map toMap() { + Map source = new HashMap<>(); + for (Map.Entry> entry : mergeData.entrySet()) { + String column = entry.getKey(); + Iterator iterator = entry.getValue().iterator(); + StringBuffer value = new StringBuffer(); + + int i = 0; + while (iterator.hasNext()) { + if (i == 0) { + value.append(iterator.next()); + } else { + value.append(Split).append(iterator.next()); + } + i++; + } + source.put(column, value.toString()); + } + + return source; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergePersistenceData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergePersistenceData.java new file mode 100644 index 000000000..9d9aa9ec7 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergePersistenceData.java @@ -0,0 +1,55 @@ +package com.a.eye.skywalking.collector.worker.storage; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Spliterator; +import java.util.function.Consumer; + +/** + * @author pengys5 + */ +public class MergePersistenceData implements Iterable { + + private Map persistenceData = new HashMap(); + + public MergeData getElseCreate(String id) { + if (!persistenceData.containsKey(id)) { + persistenceData.put(id, new MergeData(id)); + } + return persistenceData.get(id); + } + + public int size() { + return persistenceData.size(); + } + + public void clear() { + persistenceData.clear(); + } + + public boolean hasNext() { + return persistenceData.entrySet().iterator().hasNext(); + } + + public MergeData pushOne() { + MergeData one = persistenceData.entrySet().iterator().next().getValue(); + persistenceData.remove(one.getId()); + return one; + } + + @Override + public void forEach(Consumer action) { + throw new UnsupportedOperationException("forEach"); + } + + @Override + public Spliterator spliterator() { + throw new UnsupportedOperationException("spliterator"); + } + + @Override + public Iterator> iterator() { + return persistenceData.entrySet().iterator(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java index 89341c910..041f6b0b3 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricData.java @@ -1,6 +1,7 @@ package com.a.eye.skywalking.collector.worker.storage; import com.a.eye.skywalking.collector.actor.selector.AbstractHashMessage; +import com.a.eye.skywalking.collector.worker.Const; import java.util.HashMap; import java.util.Map; @@ -10,97 +11,62 @@ import java.util.Map; */ public class MetricData extends AbstractHashMessage { - public MetricData(String key) { - super(key); - this.id = key; + private String id; + private Map value; + + public MetricData(String id) { + super(id); + this.id = id; + value = new HashMap<>(); + + String[] ids = id.split(Const.IDS_SPLIT); + String slice = ids[0]; + String aggId = ""; + for (int i = 1; i < ids.length; i++) { + if (i == 1) { + aggId = ids[i]; + } else { + aggId = aggId + Const.ID_SPLIT + ids[i]; + } + } + + value.put(AbstractIndex.Time_Slice, Long.valueOf(slice)); + value.put(AbstractIndex.AGG_COLUMN, aggId); } - private String id; - - private static final String s10 = "s10"; - private static final String s20 = "s20"; - private static final String s30 = "s30"; - private static final String s40 = "s40"; - private static final String s50 = "s50"; - private static final String s60 = "s60"; - - private Long s10Value = 0L; - private Long s20Value = 0L; - private Long s30Value = 0L; - private Long s40Value = 0L; - private Long s50Value = 0L; - private Long s60Value = 0L; - - public void setMetric(int second, Long value) { - if (second <= 10) { - s10Value += value; - } else if (second > 10 && second <= 20) { - s20Value += value; - } else if (second > 20 && second <= 30) { - s30Value += value; - } else if (second > 30 && second <= 40) { - s40Value += value; - } else if (second > 40 && second <= 50) { - s50Value += value; - } else { - s60Value += value; + public void setMetric(String column, Long value) { + long valueAdd = value; + if (this.value.containsKey(column) && !AbstractIndex.Time_Slice.equals(column) + && !AbstractIndex.AGG_COLUMN.equals(column)) { + valueAdd += (Long) this.value.get(column); } + this.value.put(column, valueAdd); } public void merge(MetricData metricData) { - s10Value += metricData.s10Value; - s20Value += metricData.s20Value; - s30Value += metricData.s30Value; - s40Value += metricData.s40Value; - s50Value += metricData.s50Value; - s60Value += metricData.s60Value; + for (Map.Entry entry : metricData.value.entrySet()) { + if (!AbstractIndex.Time_Slice.equals(entry.getKey()) + && !AbstractIndex.AGG_COLUMN.equals(entry.getKey())) { + setMetric(entry.getKey(), (Long) entry.getValue()); + } + } } public void merge(Map dbData) { - s10Value += Long.valueOf(dbData.get(s10).toString()); - s20Value += Long.valueOf(dbData.get(s20).toString()); - s30Value += Long.valueOf(dbData.get(s30).toString()); - s40Value += Long.valueOf(dbData.get(s40).toString()); - s50Value += Long.valueOf(dbData.get(s50).toString()); - s60Value += Long.valueOf(dbData.get(s60).toString()); + for (Map.Entry entry : dbData.entrySet()) { + if (!AbstractIndex.Time_Slice.equals(entry.getKey()) + && !AbstractIndex.AGG_COLUMN.equals(entry.getKey())) { + long dbValue = ((Number) entry.getValue()).longValue(); + setMetric(entry.getKey(), dbValue); + } + } } - public Map toMap() { - Map map = new HashMap<>(); - map.put(s10, s10Value); - map.put(s20, s20Value); - map.put(s30, s30Value); - map.put(s40, s40Value); - map.put(s50, s50Value); - map.put(s60, s60Value); - return map; + public Map toMap() { + return value; } public String getId() { return id; } - - protected Long getS10Value() { - return s10Value; - } - - protected Long getS20Value() { - return s20Value; - } - - protected Long getS30Value() { - return s30Value; - } - - protected Long getS40Value() { - return s40Value; - } - - protected Long getS50Value() { - return s50Value; - } - - protected Long getS60Value() { - return s60Value; - } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java index 0b2467f68..3f9cdedd5 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MetricPersistenceData.java @@ -4,7 +4,6 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Spliterator; -import java.util.function.Consumer; /** * @author pengys5 @@ -34,11 +33,6 @@ public class MetricPersistenceData implements Iterable { return one; } - @Override - public void forEach(Consumer action) { - throw new UnsupportedOperationException("forEach"); - } - @Override public Spliterator spliterator() { throw new UnsupportedOperationException("spliterator"); diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java index 8eba5110b..0135977b5 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/RecordData.java @@ -1,6 +1,7 @@ package com.a.eye.skywalking.collector.worker.storage; import com.a.eye.skywalking.collector.actor.selector.AbstractHashMessage; +import com.a.eye.skywalking.collector.worker.Const; import com.google.gson.JsonObject; /** @@ -9,11 +10,20 @@ import com.google.gson.JsonObject; public class RecordData extends AbstractHashMessage { private String id; + private String aggId; private JsonObject record; public RecordData(String key) { super(key); this.id = key; + String[] ids = id.split(Const.IDS_SPLIT); + for (int i = 1; i < ids.length; i++) { + if (i == 1) { + this.aggId = ids[i]; + } else { + this.aggId = this.aggId + Const.ID_SPLIT + ids[i]; + } + } } public String getId() { @@ -21,6 +31,7 @@ public class RecordData extends AbstractHashMessage { } public JsonObject getRecord() { + record.addProperty(AbstractIndex.AGG_COLUMN, this.aggId); return record; } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/ClientSpanIsLeafTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/ClientSpanIsLeafTools.java new file mode 100644 index 000000000..9a536e083 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/ClientSpanIsLeafTools.java @@ -0,0 +1,28 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.tag.Tags; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.List; + +/** + * @author pengys5 + */ +public class ClientSpanIsLeafTools { + + private static Logger logger = LogManager.getFormatterLogger(ClientSpanIsLeafTools.class); + + public static boolean isLeaf(int spanId, List spanList) { + boolean isLeaf = true; + for (Span span : spanList) { + if (span.getParentSpanId() == spanId && Tags.SPAN_KIND_CLIENT.equals(Tags.SPAN_KIND.get(span))) { + logger.debug("current spanId=%s, merge spanId=%s, span kind=%s", spanId, span.getSpanId(), Tags.SPAN_KIND.get(span)); + isLeaf = false; + } + } + + return isLeaf; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/CollectionTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/CollectionTools.java new file mode 100644 index 000000000..5f7c34cc0 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/CollectionTools.java @@ -0,0 +1,25 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import java.util.List; + +/** + * @author pengys5 + */ +public class CollectionTools { + + public static boolean isEmpty(List list) { + if (list == null || list.size() == 0) { + return true; + } else { + return false; + } + } + + public static boolean isNotEmpty(List list) { + if (list == null || list.size() == 0) { + return false; + } else { + return true; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java index bf61c67cf..c5fcff2ca 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/DateTools.java @@ -2,26 +2,51 @@ package com.a.eye.skywalking.collector.worker.tools; import java.text.SimpleDateFormat; import java.util.Calendar; +import java.util.TimeZone; /** * @author pengys5 */ public class DateTools { - private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); + private static final SimpleDateFormat dayDateFormat = new SimpleDateFormat("yyyyMMdd"); + private static final SimpleDateFormat hourDateFormat = new SimpleDateFormat("yyyyMMddHH"); + private static final SimpleDateFormat minuteDateFormat = new SimpleDateFormat("yyyyMMddHHmm"); - public static final String Time_Slice_Column_Name = "timeSlice"; - - public static int timeStampToSecond(long time) { + public static int getSecond(long time) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(time); return calendar.get(Calendar.SECOND); } - public static long timeStampToTimeSlice(long time) { - Calendar calendar = Calendar.getInstance(); + public static long getMinuteSlice(long time) { + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00")); calendar.setTimeInMillis(time); - String timeStr = sdf.format(calendar.getTime()); + String timeStr = minuteDateFormat.format(calendar.getTime()); return Long.valueOf(timeStr); } + + public static long getHourSlice(long time) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(time); + String timeStr = hourDateFormat.format(calendar.getTime()) + "00"; + return Long.valueOf(timeStr); + } + + public static long getDaySlice(long time) { + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(time); + String timeStr = dayDateFormat.format(calendar.getTime()) + "0000"; + return Long.valueOf(timeStr); + } + + public static long changeToUTCSlice(long timeSlice) { + String timeSliceStr = String.valueOf(timeSlice); + + if (TimeZone.getDefault().getID().equals("GMT+08:00") || timeSliceStr.endsWith("0000")) { + return timeSlice; + } else { + return timeSlice - 800; + } + } } diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/JsonFileReader.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/JsonFileReader.java new file mode 100644 index 000000000..2716c0b68 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/JsonFileReader.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; + +import java.io.FileNotFoundException; +import java.io.FileReader; + +/** + * @author pengys5 + */ +public enum JsonFileReader { + INSTANCE; + + public String read(String path) throws FileNotFoundException { + JsonParser jsonParser = new JsonParser(); + JsonElement jsonElement = jsonParser.parse(new FileReader(path)); + return jsonElement.toString(); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/ParameterTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/ParameterTools.java new file mode 100644 index 000000000..d80458c4d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/ParameterTools.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import java.util.Map; + +/** + * @author pengys5 + */ +public enum ParameterTools { + INSTANCE; + + public String toString(Map request, String key) { + if (request.get(key) != null) { + return request.get(key)[0]; + } else { + return ""; + } + } + +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/SpanPeersTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/SpanPeersTools.java new file mode 100644 index 000000000..55afd7219 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/SpanPeersTools.java @@ -0,0 +1,21 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import com.a.eye.skywalking.api.util.StringUtil; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.trace.Span; +import com.a.eye.skywalking.trace.tag.Tags; + +/** + * @author pengys5 + */ +public class SpanPeersTools { + public static String getPeers(Span span) { + if (StringUtil.isEmpty(Tags.PEERS.get(span))) { + String host = Tags.PEER_HOST.get(span); + int port = Tags.PEER_PORT.get(span); + return Const.PEERS_FRONT_SPLIT + host + ":" + port + Const.PEERS_BEHIND_SPLIT; + } else { + return Const.PEERS_FRONT_SPLIT + Tags.PEERS.get(span) + Const.PEERS_BEHIND_SPLIT; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/UrlTools.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/UrlTools.java new file mode 100644 index 000000000..42d659269 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/UrlTools.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.collector.worker.tools; + +/** + * @author pengys5 + */ +public class UrlTools { + + private static final String HttpUrlHead = "http://"; + private static final String HttpsUrlHead = "https://"; + private static final String MotanUrlHead = "motan://"; + + public static String parse(String url, String component) { + if ("Tomcat".equals(component)) { + return parseTomcat(url); + } else if ("Motan".equals(component)) { + return parseMotan(url); + } + return null; + } + + private static String parseTomcat(String url) { + if (url.startsWith(HttpUrlHead)) { + String suffix = url.substring(7, url.length()); + String[] urlSplit = suffix.split("/"); + return HttpUrlHead + urlSplit[0]; + } else if (url.startsWith(HttpsUrlHead)) { + String suffix = url.substring(8, url.length()); + String[] urlSplit = suffix.split("/"); + return HttpsUrlHead + urlSplit[0]; + } else if (url.contains(":")) { + return url.split("/")[0]; + } else { + return url; + } + } + + private static String parseMotan(String url) { + if (url.startsWith(MotanUrlHead)) { + String suffix = url.substring(8, url.length()); + String[] urlSplit = suffix.split("/"); + return MotanUrlHead + urlSplit[0]; + } else { + return url; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagDataBuilder.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagDataBuilder.java new file mode 100644 index 000000000..ce7796c09 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagDataBuilder.java @@ -0,0 +1,125 @@ +package com.a.eye.skywalking.collector.worker.tracedag; + +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.node.NodeCompIndex; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author pengys5 + */ +public class TraceDagDataBuilder { + + private Logger logger = LogManager.getFormatterLogger(TraceDagDataBuilder.class); + + private Integer nodeId = new Integer(-1); + private Map mappingMap = new HashMap<>(); + private Map nodeCompMap = new HashMap<>(); + private Map resSumMap = new HashMap<>(); + private Map nodeIdMap = new HashMap<>(); + private JsonArray pointArray = new JsonArray(); + private JsonArray lineArray = new JsonArray(); + + public JsonObject build(JsonArray nodeCompArray, JsonArray nodesMappingArray, JsonArray nodeRefsArray, JsonArray resSumArray) { + changeMapping2Map(nodesMappingArray); + changeNodeComp2Map(nodeCompArray); + resSumMerge(resSumArray); + + for (int i = 0; i < nodeRefsArray.size(); i++) { + JsonObject nodeRefJsonObj = nodeRefsArray.get(i).getAsJsonObject(); + String front = nodeRefJsonObj.get(NodeRefIndex.Front).getAsString(); + String behind = nodeRefJsonObj.get(NodeRefIndex.Behind).getAsString(); + + String behindCode = findRealCode(behind); + logger.debug("behind: %s, behindCode: %s", behind, behindCode); + + JsonObject lineJsonObj = new JsonObject(); + lineJsonObj.addProperty("from", findOrCreateNode(front)); + lineJsonObj.addProperty("to", findOrCreateNode(behindCode)); + lineJsonObj.addProperty("resSum", resSumMap.get(front + Const.ID_SPLIT + behindCode)); + + lineArray.add(lineJsonObj); + logger.debug("line: %s", lineJsonObj); + } + + JsonObject dagJsonObj = new JsonObject(); + dagJsonObj.add("nodes", pointArray); + dagJsonObj.add("nodeRefs", lineArray); + return dagJsonObj; + } + + private Integer findOrCreateNode(String peers) { + if (nodeIdMap.containsKey(peers)) { + return nodeIdMap.get(peers); + } else { + nodeId++; + JsonObject nodeJsonObj = new JsonObject(); + nodeJsonObj.addProperty("id", nodeId); + nodeJsonObj.addProperty("peer", peers); + if (peers.equals(Const.USER_CODE)) { + nodeJsonObj.addProperty("component", Const.USER_CODE); + } else { + nodeJsonObj.addProperty("component", nodeCompMap.get(peers)); + } + pointArray.add(nodeJsonObj); + + nodeIdMap.put(peers, nodeId); + logger.debug("node: %s", nodeJsonObj); + } + return nodeId; + } + + private void changeMapping2Map(JsonArray nodesMappingArray) { + for (int i = 0; i < nodesMappingArray.size(); i++) { + JsonObject nodesMappingJsonObj = nodesMappingArray.get(i).getAsJsonObject(); + String code = nodesMappingJsonObj.get(NodeMappingIndex.Code).getAsString(); + String peers = nodesMappingJsonObj.get(NodeMappingIndex.Peers).getAsString(); + mappingMap.put(peers, code); + } + } + + private void changeNodeComp2Map(JsonArray nodeCompArray) { + for (int i = 0; i < nodeCompArray.size(); i++) { + JsonObject nodesJsonObj = nodeCompArray.get(i).getAsJsonObject(); + logger.debug(nodesJsonObj); + String component = nodesJsonObj.get(NodeCompIndex.Name).getAsString(); + String peers = nodesJsonObj.get(NodeCompIndex.Peers).getAsString(); + nodeCompMap.put(peers, component); + } + } + + private String findRealCode(String peers) { + if (mappingMap.containsKey(peers)) { + return mappingMap.get(peers); + } else { + return peers; + } + } + + private void resSumMerge(JsonArray resSumArray) { + for (int i = 0; i < resSumArray.size(); i++) { + JsonObject resSumJsonObj = resSumArray.get(i).getAsJsonObject(); + String front = resSumJsonObj.get("front").getAsString(); + String behind = resSumJsonObj.get("behind").getAsString(); + Long summary = resSumJsonObj.get("summary").getAsLong(); + + if (mappingMap.containsKey(behind)) { + behind = mappingMap.get(behind); + } + + String id = front + Const.ID_SPLIT + behind; + if (resSumMap.containsKey(id)) { + resSumMap.put(id, summary + resSumMap.get(id)); + } else { + resSumMap.put(id, summary); + } + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagGetWithTimeSlice.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagGetWithTimeSlice.java new file mode 100644 index 000000000..28cfac4f2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagGetWithTimeSlice.java @@ -0,0 +1,120 @@ +package com.a.eye.skywalking.collector.worker.tracedag; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.ProviderNotFoundException; +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; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGet; +import com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeCompLoad; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingSearchWithTimeSlice; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumSearchWithTimeSlice; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefSearchWithTimeSlice; +import com.a.eye.skywalking.collector.worker.tools.ParameterTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.Arrays; +import java.util.Map; + +/** + * @author pengys5 + */ +public class TraceDagGetWithTimeSlice extends AbstractGet { + + private Logger logger = LogManager.getFormatterLogger(TraceDagGetWithTimeSlice.class); + + TraceDagGetWithTimeSlice(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public void preStart() throws ProviderNotFoundException { + getClusterContext().findProvider(NodeCompLoad.WorkerRole.INSTANCE).create(this); + getClusterContext().findProvider(NodeMappingSearchWithTimeSlice.WorkerRole.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefSearchWithTimeSlice.WorkerRole.INSTANCE).create(this); + getClusterContext().findProvider(NodeRefResSumSearchWithTimeSlice.WorkerRole.INSTANCE).create(this); + } + + @Override + protected void onSearch(Map request, JsonObject response) throws Exception { + if (!request.containsKey("startTime") || !request.containsKey("endTime") || !request.containsKey("timeSliceType")) { + throw new IllegalArgumentException("the request parameter must contains startTime,endTime,timeSliceType"); + } + logger.debug("startTime: %s, endTime: %s, timeSliceType: %s", Arrays.toString(request.get("startTime")), + Arrays.toString(request.get("endTime")), Arrays.toString(request.get("timeSliceType"))); + + long startTime; + try { + startTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "startTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter startTime must numeric with long type"); + } + + long endTime; + try { + endTime = Long.valueOf(ParameterTools.INSTANCE.toString(request, "endTime")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter endTime must numeric with long type"); + } + + String timeSliceType = ParameterTools.INSTANCE.toString(request, "timeSliceType"); + + JsonObject compResponse = new JsonObject(); + getSelfContext().lookup(NodeCompLoad.WorkerRole.INSTANCE).ask(null, compResponse); + + JsonObject nodeMappingResponse = new JsonObject(); + NodeMappingSearchWithTimeSlice.RequestEntity nodeMappingEntity = new NodeMappingSearchWithTimeSlice.RequestEntity(timeSliceType, startTime, endTime); + getSelfContext().lookup(NodeMappingSearchWithTimeSlice.WorkerRole.INSTANCE).ask(nodeMappingEntity, nodeMappingResponse); + + JsonObject nodeRefResponse = new JsonObject(); + NodeRefSearchWithTimeSlice.RequestEntity nodeReftEntity = new NodeRefSearchWithTimeSlice.RequestEntity(timeSliceType, startTime, endTime); + getSelfContext().lookup(NodeRefSearchWithTimeSlice.WorkerRole.INSTANCE).ask(nodeReftEntity, nodeRefResponse); + + JsonObject resSumResponse = new JsonObject(); + NodeRefResSumSearchWithTimeSlice.RequestEntity resSumEntity = new NodeRefResSumSearchWithTimeSlice.RequestEntity(timeSliceType, startTime, endTime); + getSelfContext().lookup(NodeRefResSumSearchWithTimeSlice.WorkerRole.INSTANCE).ask(resSumEntity, resSumResponse); + + TraceDagDataBuilder builder = new TraceDagDataBuilder(); + JsonObject result = builder.build(compResponse.get(Const.RESULT).getAsJsonArray(), nodeMappingResponse.get(Const.RESULT).getAsJsonArray(), + nodeRefResponse.get(Const.RESULT).getAsJsonArray(), resSumResponse.get(Const.RESULT).getAsJsonArray()); + + response.add(Const.RESULT, result); + } + + public static class Factory extends AbstractGetProvider { + + @Override + public Role role() { + return WorkerRole.INSTANCE; + } + + @Override + public TraceDagGetWithTimeSlice workerInstance(ClusterWorkerContext clusterContext) { + return new TraceDagGetWithTimeSlice(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public String servletPath() { + return "/traceDag/timeSlice"; + } + } + + public enum WorkerRole implements Role { + INSTANCE; + + @Override + public String roleName() { + return TraceDagGetWithTimeSlice.class.getSimpleName(); + } + + @Override + public WorkerSelector workerSelector() { + return new RollingSelector(); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider new file mode 100644 index 000000000..608ec478f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractClusterWorkerProvider @@ -0,0 +1,15 @@ +com.a.eye.skywalking.collector.worker.globaltrace.persistence.GlobalTraceAgg$Factory + +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefDayAgg$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefHourAgg$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefMinuteAgg$Factory + +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumDayAgg$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumHourAgg$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumMinuteAgg$Factory + +com.a.eye.skywalking.collector.worker.node.persistence.NodeCompAgg$Factory + +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingDayAgg$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingHourAgg$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingMinuteAgg$Factory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider new file mode 100644 index 000000000..30b0397fe --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractLocalWorkerProvider @@ -0,0 +1,44 @@ +com.a.eye.skywalking.collector.worker.segment.persistence.SegmentSave$Factory +com.a.eye.skywalking.collector.worker.segment.persistence.SegmentCostSave$Factory +com.a.eye.skywalking.collector.worker.segment.persistence.SegmentExceptionSave$Factory +com.a.eye.skywalking.collector.worker.segment.persistence.SegmentExceptionWithSegId$Factory +com.a.eye.skywalking.collector.worker.segment.persistence.SegmentTopSearchWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.segment.persistence.SegmentTopSearchWithGlobalTraceId$Factory + +com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefDayAnalysis$Factory +com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefHourAnalysis$Factory +com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefMinuteAnalysis$Factory + +com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefResSumDayAnalysis$Factory +com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefResSumHourAnalysis$Factory +com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefResSumMinuteAnalysis$Factory + +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefDaySave$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefHourSave$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefMinuteSave$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefSearchWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumSearchWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumGroupWithTimeSlice$Factory + +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumDaySave$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumHourSave$Factory +com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefResSumMinuteSave$Factory + +com.a.eye.skywalking.collector.worker.node.analysis.NodeCompAnalysis$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeCompSave$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeCompLoad$Factory + +com.a.eye.skywalking.collector.worker.node.analysis.NodeMappingDayAnalysis$Factory +com.a.eye.skywalking.collector.worker.node.analysis.NodeMappingHourAnalysis$Factory +com.a.eye.skywalking.collector.worker.node.analysis.NodeMappingMinuteAnalysis$Factory + +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingDaySave$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingHourSave$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingMinuteSave$Factory +com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingSearchWithTimeSlice$Factory + +com.a.eye.skywalking.collector.worker.globaltrace.analysis.GlobalTraceAnalysis$Factory +com.a.eye.skywalking.collector.worker.globaltrace.persistence.GlobalTraceSave$Factory +com.a.eye.skywalking.collector.worker.globaltrace.persistence.GlobalTraceSearchWithGlobalId$Factory + +com.a.eye.skywalking.collector.worker.span.persistence.SpanSearchWithId$Factory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider deleted file mode 100644 index 1416bc9e5..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.actor.AbstractWorkerProvider +++ /dev/null @@ -1,6 +0,0 @@ -com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver$Factory -com.a.eye.skywalking.collector.worker.application.receiver.DAGNodeReceiver$Factory -com.a.eye.skywalking.collector.worker.application.receiver.NodeInstanceReceiver$Factory -com.a.eye.skywalking.collector.worker.application.receiver.ResponseCostReceiver$Factory -com.a.eye.skywalking.collector.worker.application.receiver.ResponseSummaryReceiver$Factory -com.a.eye.skywalking.collector.worker.applicationref.receiver.DAGNodeRefReceiver$Factory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider new file mode 100644 index 000000000..ea63a29ac --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider @@ -0,0 +1,8 @@ +com.a.eye.skywalking.collector.worker.noderef.NodeRefGetWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumGetWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumGetGroupWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.segment.SegmentTopGetWithTimeSlice$Factory +com.a.eye.skywalking.collector.worker.globaltrace.GlobalTraceGetWithGlobalId$Factory +com.a.eye.skywalking.collector.worker.segment.SegmentTopGetWithGlobalTraceId$Factory +com.a.eye.skywalking.collector.worker.span.SpanGetWithId$Factory +com.a.eye.skywalking.collector.worker.tracedag.TraceDagGetWithTimeSlice$Factory \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractPostProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractPostProvider new file mode 100644 index 000000000..4918285cd --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractPostProvider @@ -0,0 +1 @@ +com.a.eye.skywalking.collector.worker.segment.SegmentPost$Factory \ No newline at end of file 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 deleted file mode 100644 index 64fd663e3..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.ControllerProvider +++ /dev/null @@ -1 +0,0 @@ -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/collector.config b/skywalking-collector/skywalking-collector-worker/src/main/resources/collector.config index 459b5d9bd..159b51eee 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/resources/collector.config +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/collector.config @@ -1,4 +1,7 @@ cluster.current.hostname=127.0.0.1 cluster.current.port=1000 -cluster.current.roles=[WorkersListener, TraceSegmentReceiver, NodeInstancePersistence] -cluster.seed_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"] +cluster.current.roles=[WorkersListener] +#cluster.seed_nodes=["akka.tcp://CollectorSystem@127.0.0.1:1000"] + +es.cluster.name= +es.cluster.nodes= 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 e8fc5bbdb..a97644db3 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml +++ b/skywalking-collector/skywalking-collector-worker/src/main/resources/log4j2.xml @@ -1,13 +1,19 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/AnalysisMemberTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/AnalysisMemberTestCase.java new file mode 100644 index 000000000..3e3583acc --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/AnalysisMemberTestCase.java @@ -0,0 +1,32 @@ +package com.a.eye.skywalking.collector.worker; + +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import org.junit.Test; + +import static org.mockito.Mockito.*; + +/** + * @author pengys5 + */ +public class AnalysisMemberTestCase { + + @Test + public void testCommandOnWork() throws Exception { + AnalysisMember member = mock(AnalysisMember.class); + + EndOfBatchCommand command = new EndOfBatchCommand(); + member.onWork(command); + verify(member, times(1)).aggregation(); + verify(member, never()).analyse(anyObject()); + } + + @Test + public void testAnalyse() throws Exception { + AnalysisMember member = mock(AnalysisMember.class); + + Object message = new Object(); + member.onWork(message); + verify(member, never()).aggregation(); + verify(member, times(1)).analyse(anyObject()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMemberTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMemberTestCase.java new file mode 100644 index 000000000..bf667754f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMemberTestCase.java @@ -0,0 +1,63 @@ +package com.a.eye.skywalking.collector.worker; + +import com.a.eye.skywalking.collector.worker.storage.MergeData; +import com.a.eye.skywalking.collector.worker.storage.MergePersistenceData; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.powermock.api.mockito.PowerMockito.*; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest(MergeAnalysisMember.class) +public class MergeAnalysisMemberTestCase { + + private MergeAnalysisMember member; + private MergePersistenceData persistenceData; + + @Before + public void init() throws Exception { + member = mock(MergeAnalysisMember.class); + persistenceData = mock(MergePersistenceData.class); + MergeData mergeData = mock(MergeData.class); + + when(member, "getPersistenceData").thenReturn(persistenceData); + when(persistenceData.getElseCreate(Mockito.anyString())).thenReturn(mergeData); + + doCallRealMethod().when(member).setMergeData(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); + } + + @Test + public void testSetMergeDataNotFull() throws Exception { + when(persistenceData.size()).thenReturn(WorkerConfig.Persistence.Data.size - 1); + + member.setMergeData("segment_1", "column", "value"); + Mockito.verify(member, Mockito.never()).aggregation(); + } + + @Test + public void testSetMergeDataFull() throws Exception { + when(persistenceData.size()).thenReturn(WorkerConfig.Persistence.Data.size); + + member.setMergeData("segment_1", "column", "value"); + Mockito.verify(member, Mockito.times(1)).aggregation(); + } + + @Test + public void testPushOne() throws Exception { + MergePersistenceData persistenceData = new MergePersistenceData(); + persistenceData.getElseCreate("segment_1").setMergeData("column", "value"); + + when(member, "getPersistenceData").thenReturn(persistenceData); + doCallRealMethod().when(member).pushOne(); + + Assert.assertEquals("segment_1", member.pushOne().getId()); + } +} 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 417310df4..fabd68d2c 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 @@ -5,7 +5,7 @@ import akka.actor.ActorSelection; import akka.actor.ActorSystem; import com.a.eye.skywalking.collector.cluster.ClusterConfig; import com.a.eye.skywalking.collector.cluster.ClusterConfigInitializer; -import com.a.eye.skywalking.collector.worker.receiver.TraceSegmentReceiver; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; import com.a.eye.skywalking.collector.worker.storage.EsClient; import com.a.eye.skywalking.sniffer.mock.trace.TraceSegmentBuilderFactory; import com.a.eye.skywalking.trace.TraceSegment; @@ -18,7 +18,7 @@ import com.typesafe.config.ConfigFactory; public class StartUpTestCase { public void test() throws Exception { - System.out.println(TraceSegmentReceiver.class.getSimpleName()); + System.out.println(SegmentPost.class.getSimpleName()); ClusterConfigInitializer.initialize("collector.config"); System.out.println(ClusterConfig.Cluster.Current.roles); diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceSearchTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceSearchTestCase.java new file mode 100644 index 000000000..57ead136f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceSearchTestCase.java @@ -0,0 +1,60 @@ +package com.a.eye.skywalking.collector.worker.globaltrace; + +import com.a.eye.skywalking.collector.worker.globaltrace.persistence.GlobalTraceSearchWithGlobalId; +import com.a.eye.skywalking.collector.worker.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.tools.JsonFileReader; +import com.google.gson.JsonObject; +import org.elasticsearch.action.get.GetRequestBuilder; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.client.Client; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.powermock.api.mockito.PowerMockito.*; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({EsClient.class}) +@PowerMockIgnore("javax.management.*") +public class GlobalTraceSearchTestCase { + + @Test + public void testSearchWithGlobalId() throws Exception { + Client client = mock(Client.class); + mockStatic(EsClient.class); + when(EsClient.getClient()).thenReturn(client); + + String globalTraceId = "Global.1"; + String segment_1 = "SEGMENT.1"; + String segment_2 = "SEGMENT.2"; + +// String globalData = JsonFileReader.INSTANCE.read(this.getClass().getResource("/").getPath() + "/json/globaltrace/global.json"); +// mockSegment(client, GlobalTraceIndex.Index, GlobalTraceIndex.Type_Record, globalTraceId, globalData); +// +// String segment_1_Data = JsonFileReader.INSTANCE.read(this.getClass().getResource("/").getPath() + "/json/globaltrace/segment_1.json"); +// mockSegment(client, SegmentIndex.Index, SegmentIndex.Type_Record, segment_1, segment_1_Data); +// +// String segment_2_Data = JsonFileReader.INSTANCE.read(this.getClass().getResource("/").getPath() + "/json/globaltrace/segment_2.json"); +// mockSegment(client, SegmentIndex.Index, SegmentIndex.Type_Record, segment_2, segment_2_Data); +// +// GlobalTraceSearchWithGlobalId search = new GlobalTraceSearchWithGlobalId(null, null, null); +// +// JsonObject responseObj = new JsonObject(); +// search.allocateJob(globalTraceId, responseObj); +// System.out.println(responseObj); + } + + private void mockSegment(Client client, String index, String type, String segmentId, String source) { + GetRequestBuilder builder = mock(GetRequestBuilder.class); + when(client.prepareGet(index, type, segmentId)).thenReturn(builder); + GetResponse response = mock(GetResponse.class); + when(builder.get()).thenReturn(response); + when(response.getSourceAsString()).thenReturn(source); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/MockEsBulkClient.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/MockEsBulkClient.java new file mode 100644 index 000000000..1221f6624 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/MockEsBulkClient.java @@ -0,0 +1,42 @@ +package com.a.eye.skywalking.collector.worker.mock; + +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import org.elasticsearch.action.ListenableActionFuture; +import org.elasticsearch.action.bulk.BulkRequestBuilder; +import org.elasticsearch.action.bulk.BulkResponse; +import org.elasticsearch.action.index.IndexRequestBuilder; +import org.elasticsearch.client.Client; +import org.mockito.Mockito; + +import static org.powermock.api.mockito.PowerMockito.*; + +/** + * @author pengys5 + */ +public class MockEsBulkClient { + + public IndexRequestBuilder indexRequestBuilder; + + public void createMock() { + Client client = mock(Client.class); + mockStatic(EsClient.class); + when(EsClient.getClient()).thenReturn(client); + + BulkRequestBuilder bulkRequestBuilder = mock(BulkRequestBuilder.class); + when(client.prepareBulk()).thenReturn(bulkRequestBuilder); + + ListenableActionFuture listenableActionFuture = mock(ListenableActionFuture.class); + when(bulkRequestBuilder.execute()).thenReturn(listenableActionFuture); + + BulkResponse responses = mock(BulkResponse.class); + when(listenableActionFuture.actionGet()).thenReturn(responses); + + when(responses.hasFailures()).thenReturn(true); + + indexRequestBuilder = mock(IndexRequestBuilder.class); + + when(client.prepareIndex(Mockito.anyString(), Mockito.anyString(), Mockito.anyString())).thenReturn(indexRequestBuilder); + + when(indexRequestBuilder.setSource(Mockito.anyString())).thenReturn(indexRequestBuilder); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/RecordDataAnswer.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/RecordDataAnswer.java new file mode 100644 index 000000000..4dc379aef --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/RecordDataAnswer.java @@ -0,0 +1,40 @@ +package com.a.eye.skywalking.collector.worker.mock; + +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author pengys5 + */ +public class RecordDataAnswer implements Answer { + + public RecordObj recordObj = new RecordObj(); + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + RecordData recordData = (RecordData) invocation.getArguments()[0]; + recordObj.setSource(recordData); + return null; + } + + public class RecordObj { + private List recordDataList; + + private RecordObj() { + recordDataList = new ArrayList<>(); + } + + public List getRecordData() { + return recordDataList; + } + + private void setSource(RecordData recordData) { + this.recordDataList.add(recordData); + System.out.printf("id: %s, data: %s \n", recordData.getId(), recordData.getRecord().toString()); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/SaveToEsSourceAnswer.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/SaveToEsSourceAnswer.java new file mode 100644 index 000000000..6fd4625ca --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/mock/SaveToEsSourceAnswer.java @@ -0,0 +1,46 @@ +package com.a.eye.skywalking.collector.worker.mock; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +/** + * @author pengys5 + */ +public class SaveToEsSourceAnswer implements Answer { + + private Logger logger = LogManager.getFormatterLogger(SaveToEsSourceAnswer.class); + + public SourceObj sourceObj = new SourceObj(); + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + Gson gson = new Gson(); + String source = (String) invocation.getArguments()[0]; + JsonObject sourceJsonObj = gson.fromJson(source, JsonObject.class); + logger.debug("sourceJsonObj: %s", sourceJsonObj.toString()); + + sourceObj.setSource(sourceJsonObj); + return null; + } + + public class SourceObj { + private JsonArray source; + + public SourceObj() { + source = new JsonArray(); + } + + public JsonArray getSource() { + return source; + } + + public void setSource(JsonObject source) { + this.source.add(source); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeAnalysisVerify.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeAnalysisVerify.java new file mode 100644 index 000000000..6ea40d7eb --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeAnalysisVerify.java @@ -0,0 +1,72 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import org.junit.Assert; + +import java.util.List; + +/** + * @author pengys5 + */ +public enum NodeAnalysisVerify { + INSTANCE; + + public void verify(List recordDataList, long timeSlice) { + Assert.assertEquals(9, recordDataList.size()); + + RecordData data_1 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..[localhost:-1]"); + Assert.assertEquals("H2", data_1.getRecord().get("component").getAsString()); + Assert.assertEquals("[localhost:-1]", data_1.getRecord().get("peers").getAsString()); + Assert.assertEquals("[localhost:-1]", data_1.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_1.getRecord().get("timeSlice").getAsLong()); + + RecordData data_2 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..portal-service"); + Assert.assertEquals("Tomcat", data_2.getRecord().get("component").getAsString()); + Assert.assertEquals("portal-service", data_2.getRecord().get("peers").getAsString()); + Assert.assertEquals("portal-service", data_2.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_2.getRecord().get("timeSlice").getAsLong()); + + RecordData data_3 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..persistence-service"); + Assert.assertEquals(false, data_3.getRecord().has("component")); + Assert.assertEquals("persistence-service", data_3.getRecord().get("peers").getAsString()); + Assert.assertEquals("persistence-service", data_3.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_3.getRecord().get("timeSlice").getAsLong()); + + RecordData data_4 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..[10.128.35.80:20880]"); + Assert.assertEquals("HttpClient", data_4.getRecord().get("component").getAsString()); + Assert.assertEquals("[10.128.35.80:20880]", data_4.getRecord().get("peers").getAsString()); + Assert.assertEquals("[10.128.35.80:20880]", data_4.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_4.getRecord().get("timeSlice").getAsLong()); + + RecordData data_5 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..[127.0.0.1:6379]"); + Assert.assertEquals("Redis", data_5.getRecord().get("component").getAsString()); + Assert.assertEquals("[127.0.0.1:6379]", data_5.getRecord().get("peers").getAsString()); + Assert.assertEquals("[127.0.0.1:6379]", data_5.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_5.getRecord().get("timeSlice").getAsLong()); + + RecordData data_6 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..[127.0.0.1:8002]"); + Assert.assertEquals("Motan", data_6.getRecord().get("component").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_6.getRecord().get("peers").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_6.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_6.getRecord().get("timeSlice").getAsLong()); + + RecordData data_7 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..User"); + Assert.assertEquals(false, data_7.getRecord().has("component")); + Assert.assertEquals("User", data_7.getRecord().get("peers").getAsString()); + Assert.assertEquals("User", data_7.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_7.getRecord().get("timeSlice").getAsLong()); + + RecordData data_8 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..[127.0.0.1:3307]"); + Assert.assertEquals("Mysql", data_8.getRecord().get("component").getAsString()); + Assert.assertEquals("[127.0.0.1:3307]", data_8.getRecord().get("peers").getAsString()); + Assert.assertEquals("[127.0.0.1:3307]", data_8.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_8.getRecord().get("timeSlice").getAsLong()); + + RecordData data_9 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service"); + Assert.assertEquals(false, data_9.getRecord().has("component")); + Assert.assertEquals("cache-service", data_9.getRecord().get("peers").getAsString()); + Assert.assertEquals("cache-service", data_9.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_9.getRecord().get("timeSlice").getAsLong()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingAnalysisVerify.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingAnalysisVerify.java new file mode 100644 index 000000000..e3705ce39 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingAnalysisVerify.java @@ -0,0 +1,30 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import org.junit.Assert; + +import java.util.List; + +/** + * @author pengys5 + */ +public enum NodeMappingAnalysisVerify { + INSTANCE; + + public void verify(List recordDataList, long timeSlice) { + Assert.assertEquals(2, recordDataList.size()); + + RecordData data_1 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..persistence-service..-..[10.128.35.80:20880]"); + Assert.assertEquals("persistence-service", data_1.getRecord().get("code").getAsString()); + Assert.assertEquals("[10.128.35.80:20880]", data_1.getRecord().get("peers").getAsString()); + Assert.assertEquals("persistence-service..-..[10.128.35.80:20880]", data_1.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_1.getRecord().get("timeSlice").getAsLong()); + + RecordData data_2 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[127.0.0.1:8002]"); + Assert.assertEquals("cache-service", data_2.getRecord().get("code").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_2.getRecord().get("peers").getAsString()); + Assert.assertEquals("cache-service..-..[127.0.0.1:8002]", data_2.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_2.getRecord().get("timeSlice").getAsLong()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingDayAnalysisTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingDayAnalysisTestCase.java new file mode 100644 index 000000000..70d5bfe3c --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingDayAnalysisTestCase.java @@ -0,0 +1,99 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingDayAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ClusterWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeMappingDayAnalysisTestCase { + + private NodeMappingDayAnalysis nodeMappingDayAnalysis; + private SegmentMock segmentMock = new SegmentMock(); + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(clusterWorkerContext.lookup(NodeMappingDayAgg.Role.INSTANCE)).thenReturn(workerRefs); + + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + nodeMappingDayAnalysis = new NodeMappingDayAnalysis(NodeMappingDayAnalysis.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeMappingDayAnalysis.class.getSimpleName(), NodeMappingDayAnalysis.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), NodeMappingDayAnalysis.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeMappingDayAnalysis.class.getSimpleName(), NodeMappingDayAnalysis.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeMappingDayAnalysis.class.getSimpleName(), NodeMappingDayAnalysis.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Node.NodeMappingDayAnalysis.Size = testSize; + Assert.assertEquals(testSize, NodeMappingDayAnalysis.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + List cacheServiceSegment = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceSegment) { + nodeMappingDayAnalysis.analyse(segmentWithTimeSlice); + } + List portalService = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalService) { + nodeMappingDayAnalysis.analyse(segmentWithTimeSlice); + } + List persistenceService = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : persistenceService) { + nodeMappingDayAnalysis.analyse(segmentWithTimeSlice); + } + List cacheServiceException = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceException) { + nodeMappingDayAnalysis.analyse(segmentWithTimeSlice); + } + List portalServiceException = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalServiceException) { + nodeMappingDayAnalysis.analyse(segmentWithTimeSlice); + } + + nodeMappingDayAnalysis.onWork(new EndOfBatchCommand()); + + NodeMappingAnalysisVerify.INSTANCE.verify(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310000L)); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingHourAnalysisTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingHourAnalysisTestCase.java new file mode 100644 index 000000000..ecc0454aa --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingHourAnalysisTestCase.java @@ -0,0 +1,100 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingDayAgg; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingHourAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ClusterWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeMappingHourAnalysisTestCase { + + private NodeMappingHourAnalysis nodeMappingHourAnalysis; + private SegmentMock segmentMock = new SegmentMock(); + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(clusterWorkerContext.lookup(NodeMappingHourAgg.Role.INSTANCE)).thenReturn(workerRefs); + + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + nodeMappingHourAnalysis = new NodeMappingHourAnalysis(NodeMappingHourAnalysis.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeMappingHourAnalysis.class.getSimpleName(), NodeMappingHourAnalysis.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), NodeMappingHourAnalysis.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeMappingHourAnalysis.class.getSimpleName(), NodeMappingHourAnalysis.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeMappingHourAnalysis.class.getSimpleName(), NodeMappingHourAnalysis.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Node.NodeMappingHourAnalysis.Size = testSize; + Assert.assertEquals(testSize, NodeMappingHourAnalysis.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + List cacheServiceSegment = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceSegment) { + nodeMappingHourAnalysis.analyse(segmentWithTimeSlice); + } + List portalService = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalService) { + nodeMappingHourAnalysis.analyse(segmentWithTimeSlice); + } + List persistenceService = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : persistenceService) { + nodeMappingHourAnalysis.analyse(segmentWithTimeSlice); + } + List cacheServiceException = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceException) { + nodeMappingHourAnalysis.analyse(segmentWithTimeSlice); + } + List portalServiceException = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalServiceException) { + nodeMappingHourAnalysis.analyse(segmentWithTimeSlice); + } + + nodeMappingHourAnalysis.onWork(new EndOfBatchCommand()); + + NodeMappingAnalysisVerify.INSTANCE.verify(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310900L)); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingMinuteAnalysisTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingMinuteAnalysisTestCase.java new file mode 100644 index 000000000..1e8ac9802 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/analysis/NodeMappingMinuteAnalysisTestCase.java @@ -0,0 +1,124 @@ +package com.a.eye.skywalking.collector.worker.node.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.node.persistence.NodeMappingMinuteAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ClusterWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeMappingMinuteAnalysisTestCase { + + private NodeMappingMinuteAnalysis nodeMappingMinuteAnalysis; + private SegmentMock segmentMock = new SegmentMock(); + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(clusterWorkerContext.lookup(NodeMappingMinuteAgg.Role.INSTANCE)).thenReturn(workerRefs); + + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + nodeMappingMinuteAnalysis = new NodeMappingMinuteAnalysis(NodeMappingMinuteAnalysis.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeMappingMinuteAnalysis.class.getSimpleName(), NodeMappingMinuteAnalysis.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), NodeMappingMinuteAnalysis.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeMappingMinuteAnalysis.class.getSimpleName(), NodeMappingMinuteAnalysis.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeMappingMinuteAnalysis.class.getSimpleName(), NodeMappingMinuteAnalysis.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Node.NodeMappingMinuteAnalysis.Size = testSize; + Assert.assertEquals(testSize, NodeMappingMinuteAnalysis.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + List cacheServiceSegment = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceSegment) { + nodeMappingMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List portalService = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalService) { + nodeMappingMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List persistenceService = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : persistenceService) { + nodeMappingMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List cacheServiceException = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceException) { + nodeMappingMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List portalServiceException = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalServiceException) { + nodeMappingMinuteAnalysis.analyse(segmentWithTimeSlice); + } + + nodeMappingMinuteAnalysis.onWork(new EndOfBatchCommand()); + + Assert.assertEquals(3, recordDataAnswer.recordObj.getRecordData().size()); + this.verify_1(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310915L)); + this.verify_2(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310916L)); + } + + public void verify_1(List recordDataList, long timeSlice) { + RecordData data_1 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..persistence-service..-..[10.128.35.80:20880]"); + Assert.assertEquals("persistence-service", data_1.getRecord().get("code").getAsString()); + Assert.assertEquals("[10.128.35.80:20880]", data_1.getRecord().get("peers").getAsString()); + Assert.assertEquals("persistence-service..-..[10.128.35.80:20880]", data_1.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_1.getRecord().get("timeSlice").getAsLong()); + + RecordData data_2 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[127.0.0.1:8002]"); + Assert.assertEquals("cache-service", data_2.getRecord().get("code").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_2.getRecord().get("peers").getAsString()); + Assert.assertEquals("cache-service..-..[127.0.0.1:8002]", data_2.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_2.getRecord().get("timeSlice").getAsLong()); + } + + public void verify_2(List recordDataList, long timeSlice) { + RecordData data_2 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[127.0.0.1:8002]"); + Assert.assertEquals("cache-service", data_2.getRecord().get("code").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_2.getRecord().get("peers").getAsString()); + Assert.assertEquals("cache-service..-..[127.0.0.1:8002]", data_2.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_2.getRecord().get("timeSlice").getAsLong()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompWithTimeSliceUseDB.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompWithTimeSliceUseDB.java new file mode 100644 index 000000000..c34c841ee --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeCompWithTimeSliceUseDB.java @@ -0,0 +1,33 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class NodeCompWithTimeSliceUseDB { + + public static void main(String[] args) throws Exception { + EsClient.boot(); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + NodeCompLoad nodeCompLoad = + new NodeCompLoad(NodeCompLoad.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext); + + JsonObject response = new JsonObject(); + nodeCompLoad.onWork(null, response); + + JsonArray nodeArray = response.get("result").getAsJsonArray(); + System.out.println(nodeArray.size()); + System.out.println(nodeArray.toString()); + for (int i = 0; i < nodeArray.size(); i++) { + JsonObject nodeJsonObj = nodeArray.get(i).getAsJsonObject(); + System.out.println(nodeJsonObj); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDayAggTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDayAggTestCase.java new file mode 100644 index 000000000..092f43765 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingDayAggTestCase.java @@ -0,0 +1,88 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import com.google.gson.JsonObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.*; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({LocalWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeMappingDayAggTestCase { + + private NodeMappingDayAgg nodeMappingDayAgg; + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(localWorkerContext.lookup(NodeMappingDaySave.Role.INSTANCE)).thenReturn(workerRefs); + nodeMappingDayAgg = new NodeMappingDayAgg(NodeMappingDayAgg.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeMappingDayAgg.class.getSimpleName(), NodeMappingDayAgg.Role.INSTANCE.roleName()); + Assert.assertEquals(HashCodeSelector.class.getSimpleName(), NodeMappingDayAgg.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeMappingDayAgg.class.getSimpleName(), NodeMappingDayAgg.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeMappingDayAgg.class.getSimpleName(), NodeMappingDayAgg.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.WorkerNum.Node.NodeMappingDayAgg.Value = testSize; + Assert.assertEquals(testSize, NodeMappingDayAgg.Factory.INSTANCE.workerNum()); + } + + @Test + public void testOnWork() throws Exception { + String id = "2017" + Const.ID_SPLIT + "TestNodeMappingDayAgg"; + JsonObject record = new JsonObject(); + record.addProperty("Column", "TestData"); + + RecordData recordData = new RecordData(id); + recordData.setRecord(record); + nodeMappingDayAgg.onWork(recordData); + + List recordDataList = recordDataAnswer.recordObj.getRecordData(); + RecordData data = RecordDataTool.INSTANCE.getRecord(recordDataList, id); + Assert.assertEquals("TestNodeMappingDayAgg", data.getRecord().get("aggId").getAsString()); + Assert.assertEquals("TestData", data.getRecord().get("Column").getAsString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testOnWorkError() throws Exception { + nodeMappingDayAgg.onWork(new Object()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourAggTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourAggTestCase.java new file mode 100644 index 000000000..c12e17ca2 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingHourAggTestCase.java @@ -0,0 +1,88 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import com.google.gson.JsonObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.*; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({LocalWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeMappingHourAggTestCase { + + private NodeMappingHourAgg nodeMappingHourAgg; + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(localWorkerContext.lookup(NodeMappingHourSave.Role.INSTANCE)).thenReturn(workerRefs); + nodeMappingHourAgg = new NodeMappingHourAgg(NodeMappingHourAgg.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeMappingHourAgg.class.getSimpleName(), NodeMappingHourAgg.Role.INSTANCE.roleName()); + Assert.assertEquals(HashCodeSelector.class.getSimpleName(), NodeMappingHourAgg.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeMappingHourAgg.class.getSimpleName(), NodeMappingHourAgg.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeMappingHourAgg.class.getSimpleName(), NodeMappingHourAgg.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.WorkerNum.Node.NodeMappingHourAgg.Value = testSize; + Assert.assertEquals(testSize, NodeMappingHourAgg.Factory.INSTANCE.workerNum()); + } + + @Test + public void testOnWork() throws Exception { + String id = "2017" + Const.ID_SPLIT + "TestNodeMappingHourAgg"; + JsonObject record = new JsonObject(); + record.addProperty("Column", "TestData"); + + RecordData recordData = new RecordData(id); + recordData.setRecord(record); + nodeMappingHourAgg.onWork(recordData); + + List recordDataList = recordDataAnswer.recordObj.getRecordData(); + RecordData data = RecordDataTool.INSTANCE.getRecord(recordDataList, id); + Assert.assertEquals("TestNodeMappingHourAgg", data.getRecord().get("aggId").getAsString()); + Assert.assertEquals("TestData", data.getRecord().get("Column").getAsString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testOnWorkError() throws Exception { + nodeMappingHourAgg.onWork(new Object()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteAggTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteAggTestCase.java new file mode 100644 index 000000000..f48a5f67a --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingMinuteAggTestCase.java @@ -0,0 +1,88 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.HashCodeSelector; +import com.a.eye.skywalking.collector.worker.Const; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import com.google.gson.JsonObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.*; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({LocalWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeMappingMinuteAggTestCase { + + private NodeMappingMinuteAgg nodeMappingMinuteAgg; + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(localWorkerContext.lookup(NodeMappingMinuteSave.Role.INSTANCE)).thenReturn(workerRefs); + nodeMappingMinuteAgg = new NodeMappingMinuteAgg(NodeMappingMinuteAgg.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeMappingMinuteAgg.class.getSimpleName(), NodeMappingMinuteAgg.Role.INSTANCE.roleName()); + Assert.assertEquals(HashCodeSelector.class.getSimpleName(), NodeMappingMinuteAgg.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeMappingMinuteAgg.class.getSimpleName(), NodeMappingMinuteAgg.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeMappingMinuteAgg.class.getSimpleName(), NodeMappingMinuteAgg.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.WorkerNum.Node.NodeMappingMinuteAgg.Value = testSize; + Assert.assertEquals(testSize, NodeMappingMinuteAgg.Factory.INSTANCE.workerNum()); + } + + @Test + public void testOnWork() throws Exception { + String id = "2017" + Const.ID_SPLIT + "TestNodeMappingMinuteAgg"; + JsonObject record = new JsonObject(); + record.addProperty("Column", "TestData"); + + RecordData recordData = new RecordData(id); + recordData.setRecord(record); + nodeMappingMinuteAgg.onWork(recordData); + + List recordDataList = recordDataAnswer.recordObj.getRecordData(); + RecordData data = RecordDataTool.INSTANCE.getRecord(recordDataList, id); + Assert.assertEquals("TestNodeMappingMinuteAgg", data.getRecord().get("aggId").getAsString()); + Assert.assertEquals("TestData", data.getRecord().get("Column").getAsString()); + } + + @Test(expected = IllegalArgumentException.class) + public void testOnWorkError() throws Exception { + nodeMappingMinuteAgg.onWork(new Object()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingSearchWithTimeSliceUseDB.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingSearchWithTimeSliceUseDB.java new file mode 100644 index 000000000..974bfac7d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/node/persistence/NodeMappingSearchWithTimeSliceUseDB.java @@ -0,0 +1,38 @@ +package com.a.eye.skywalking.collector.worker.node.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.node.NodeMappingIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class NodeMappingSearchWithTimeSliceUseDB { + + public static void main(String[] args) throws Exception { + EsClient.boot(); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + NodeMappingSearchWithTimeSlice nodeMappingSearch = + new NodeMappingSearchWithTimeSlice(NodeMappingSearchWithTimeSlice.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext); + + long startTime = 201703310910L; + long endTime = 201703310920L; + JsonObject response = new JsonObject(); + NodeMappingSearchWithTimeSlice.RequestEntity requestEntity = + new NodeMappingSearchWithTimeSlice.RequestEntity(NodeMappingIndex.Type_Minute, startTime, endTime); + nodeMappingSearch.onWork(requestEntity, response); + + JsonArray nodeArray = response.get("result").getAsJsonArray(); + System.out.println(nodeArray.size()); + System.out.println(nodeArray.toString()); + for (int i = 0; i < nodeArray.size(); i++) { + JsonObject nodeJsonObj = nodeArray.get(i).getAsJsonObject(); + System.out.println(nodeJsonObj); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefAnalysisVerify.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefAnalysisVerify.java new file mode 100644 index 000000000..50971406f --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefAnalysisVerify.java @@ -0,0 +1,66 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import org.junit.Assert; + +import java.util.List; + +/** + * @author pengys5 + */ +public enum NodeRefAnalysisVerify { + INSTANCE; + + public void verify(List recordDataList, long timeSlice) { + Assert.assertEquals(6, recordDataList.size()); + + RecordData data_1 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..portal-service..-..[10.128.35.80:20880]"); + Assert.assertEquals(true, data_1.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_1.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("portal-service", data_1.getRecord().get("front").getAsString()); + Assert.assertEquals("[10.128.35.80:20880]", data_1.getRecord().get("behind").getAsString()); + Assert.assertEquals("portal-service..-..[10.128.35.80:20880]", data_1.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_1.getRecord().get("timeSlice").getAsLong()); + + RecordData data_2 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[127.0.0.1:6379]"); + Assert.assertEquals(true, data_2.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_2.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("cache-service", data_2.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:6379]", data_2.getRecord().get("behind").getAsString()); + Assert.assertEquals("cache-service..-..[127.0.0.1:6379]", data_2.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_2.getRecord().get("timeSlice").getAsLong()); + + RecordData data_3 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[localhost:-1]"); + Assert.assertEquals(true, data_3.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_3.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("cache-service", data_3.getRecord().get("front").getAsString()); + Assert.assertEquals("[localhost:-1]", data_3.getRecord().get("behind").getAsString()); + Assert.assertEquals("cache-service..-..[localhost:-1]", data_3.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_3.getRecord().get("timeSlice").getAsLong()); + + RecordData data_4 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..User..-..portal-service"); + Assert.assertEquals(true, data_4.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(true, data_4.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("User", data_4.getRecord().get("front").getAsString()); + Assert.assertEquals("portal-service", data_4.getRecord().get("behind").getAsString()); + Assert.assertEquals("User..-..portal-service", data_4.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_4.getRecord().get("timeSlice").getAsLong()); + + RecordData data_5 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..portal-service..-..[127.0.0.1:8002]"); + Assert.assertEquals(true, data_5.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_5.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("portal-service", data_5.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_5.getRecord().get("behind").getAsString()); + Assert.assertEquals("portal-service..-..[127.0.0.1:8002]", data_5.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_5.getRecord().get("timeSlice").getAsLong()); + + RecordData data_6 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..persistence-service..-..[127.0.0.1:3307]"); + Assert.assertEquals(true, data_6.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_6.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("persistence-service", data_6.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:3307]", data_6.getRecord().get("behind").getAsString()); + Assert.assertEquals("persistence-service..-..[127.0.0.1:3307]", data_6.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_6.getRecord().get("timeSlice").getAsLong()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefDayAnalysisTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefDayAnalysisTestCase.java new file mode 100644 index 000000000..8017ba940 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefDayAnalysisTestCase.java @@ -0,0 +1,102 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefDayAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ClusterWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeRefDayAnalysisTestCase { + + private NodeRefDayAnalysis nodeRefDayAnalysis; + private SegmentMock segmentMock = new SegmentMock(); + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(clusterWorkerContext.lookup(NodeRefDayAgg.Role.INSTANCE)).thenReturn(workerRefs); + + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); + WorkerRefs nodeRefResSumWorkerRefs = mock(WorkerRefs.class); + when(localWorkerContext.lookup(NodeRefResSumDayAnalysis.Role.INSTANCE)).thenReturn(nodeRefResSumWorkerRefs); + nodeRefDayAnalysis = new NodeRefDayAnalysis(NodeRefDayAnalysis.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeRefDayAnalysis.class.getSimpleName(), NodeRefDayAnalysis.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), NodeRefDayAnalysis.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeRefDayAnalysis.class.getSimpleName(), NodeRefDayAnalysis.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeRefDayAnalysis.class.getSimpleName(), NodeRefDayAnalysis.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Node.NodeRefDayAnalysis.Size = testSize; + Assert.assertEquals(testSize, NodeRefDayAnalysis.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + List cacheServiceSegment = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceSegment) { + nodeRefDayAnalysis.analyse(segmentWithTimeSlice); + } + List portalService = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalService) { + nodeRefDayAnalysis.analyse(segmentWithTimeSlice); + } + List persistenceService = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : persistenceService) { + nodeRefDayAnalysis.analyse(segmentWithTimeSlice); + } + List cacheServiceException = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceException) { + nodeRefDayAnalysis.analyse(segmentWithTimeSlice); + } + List portalServiceException = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalServiceException) { + nodeRefDayAnalysis.analyse(segmentWithTimeSlice); + } + + nodeRefDayAnalysis.onWork(new EndOfBatchCommand()); + + List recordDataList = recordDataAnswer.recordObj.getRecordData(); + NodeRefAnalysisVerify.INSTANCE.verify(recordDataList, DateTools.changeToUTCSlice(201703310000L)); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefHourAnalysisTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefHourAnalysisTestCase.java new file mode 100644 index 000000000..b40ef99f0 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefHourAnalysisTestCase.java @@ -0,0 +1,102 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeAnalysisVerify; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefHourAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ClusterWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeRefHourAnalysisTestCase { + + private NodeRefHourAnalysis nodeRefHourAnalysis; + private SegmentMock segmentMock = new SegmentMock(); + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(clusterWorkerContext.lookup(NodeRefHourAgg.Role.INSTANCE)).thenReturn(workerRefs); + + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); + WorkerRefs nodeRefResSumWorkerRefs = mock(WorkerRefs.class); + when(localWorkerContext.lookup(NodeRefResSumHourAnalysis.Role.INSTANCE)).thenReturn(nodeRefResSumWorkerRefs); + nodeRefHourAnalysis = new NodeRefHourAnalysis(NodeRefHourAnalysis.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeRefHourAnalysis.class.getSimpleName(), NodeRefHourAnalysis.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), NodeRefHourAnalysis.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeRefHourAnalysis.class.getSimpleName(), NodeRefHourAnalysis.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeRefHourAnalysis.class.getSimpleName(), NodeRefHourAnalysis.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Node.NodeRefHourAnalysis.Size = testSize; + Assert.assertEquals(testSize, NodeRefHourAnalysis.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + List cacheServiceSegment = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceSegment) { + nodeRefHourAnalysis.analyse(segmentWithTimeSlice); + } + List portalService = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalService) { + nodeRefHourAnalysis.analyse(segmentWithTimeSlice); + } + List persistenceService = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : persistenceService) { + nodeRefHourAnalysis.analyse(segmentWithTimeSlice); + } + List cacheServiceException = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceException) { + nodeRefHourAnalysis.analyse(segmentWithTimeSlice); + } + List portalServiceException = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalServiceException) { + nodeRefHourAnalysis.analyse(segmentWithTimeSlice); + } + + nodeRefHourAnalysis.onWork(new EndOfBatchCommand()); + + NodeRefAnalysisVerify.INSTANCE.verify(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310900L)); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefMinuteAnalysisTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefMinuteAnalysisTestCase.java new file mode 100644 index 000000000..829abc5da --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/analysis/NodeRefMinuteAnalysisTestCase.java @@ -0,0 +1,174 @@ +package com.a.eye.skywalking.collector.worker.noderef.analysis; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRefs; +import com.a.eye.skywalking.collector.actor.selector.RollingSelector; +import com.a.eye.skywalking.collector.queue.EndOfBatchCommand; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.RecordDataAnswer; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeAnalysisVerify; +import com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefMinuteAgg; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.RecordData; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.a.eye.skywalking.collector.worker.tools.RecordDataTool; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; +import java.util.Map; + +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ClusterWorkerContext.class}) +@PowerMockIgnore({"javax.management.*"}) +public class NodeRefMinuteAnalysisTestCase { + + private NodeRefMinuteAnalysis nodeRefMinuteAnalysis; + private SegmentMock segmentMock = new SegmentMock(); + private RecordDataAnswer recordDataAnswer; + + @Before + public void init() throws Exception { + ClusterWorkerContext clusterWorkerContext = PowerMockito.mock(ClusterWorkerContext.class); + WorkerRefs workerRefs = mock(WorkerRefs.class); + recordDataAnswer = new RecordDataAnswer(); + doAnswer(recordDataAnswer).when(workerRefs).tell(Mockito.any(RecordData.class)); + + when(clusterWorkerContext.lookup(NodeRefMinuteAgg.Role.INSTANCE)).thenReturn(workerRefs); + + LocalWorkerContext localWorkerContext = PowerMockito.mock(LocalWorkerContext.class); + WorkerRefs nodeRefResSumWorkerRefs = mock(WorkerRefs.class); + when(localWorkerContext.lookup(NodeRefResSumMinuteAnalysis.Role.INSTANCE)).thenReturn(nodeRefResSumWorkerRefs); + nodeRefMinuteAnalysis = new NodeRefMinuteAnalysis(NodeRefMinuteAnalysis.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testRole() { + Assert.assertEquals(NodeRefMinuteAnalysis.class.getSimpleName(), NodeRefMinuteAnalysis.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), NodeRefMinuteAnalysis.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(NodeRefMinuteAnalysis.class.getSimpleName(), NodeRefMinuteAnalysis.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(NodeRefMinuteAnalysis.class.getSimpleName(), NodeRefMinuteAnalysis.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Node.NodeRefMinuteAnalysis.Size = testSize; + Assert.assertEquals(testSize, NodeRefMinuteAnalysis.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + List cacheServiceSegment = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceSegment) { + nodeRefMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List portalService = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalService) { + nodeRefMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List persistenceService = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : persistenceService) { + nodeRefMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List cacheServiceException = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceException) { + nodeRefMinuteAnalysis.analyse(segmentWithTimeSlice); + } + List portalServiceException = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : portalServiceException) { + nodeRefMinuteAnalysis.analyse(segmentWithTimeSlice); + } + + nodeRefMinuteAnalysis.onWork(new EndOfBatchCommand()); + + Assert.assertEquals(8, recordDataAnswer.recordObj.getRecordData().size()); + this.verify_1(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310915L)); + this.verify_2(recordDataAnswer.recordObj.getRecordData(), DateTools.changeToUTCSlice(201703310916L)); + } + + public void verify_1(List recordDataList, long timeSlice) { + RecordData data_5 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..portal-service..-..[127.0.0.1:8002]"); + Assert.assertEquals(true, data_5.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_5.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("portal-service", data_5.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_5.getRecord().get("behind").getAsString()); + Assert.assertEquals("portal-service..-..[127.0.0.1:8002]", data_5.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_5.getRecord().get("timeSlice").getAsLong()); + + RecordData data_3 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[localhost:-1]"); + Assert.assertEquals(true, data_3.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_3.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("cache-service", data_3.getRecord().get("front").getAsString()); + Assert.assertEquals("[localhost:-1]", data_3.getRecord().get("behind").getAsString()); + Assert.assertEquals("cache-service..-..[localhost:-1]", data_3.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_3.getRecord().get("timeSlice").getAsLong()); + + RecordData data_4 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..User..-..portal-service"); + Assert.assertEquals(true, data_4.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(true, data_4.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("User", data_4.getRecord().get("front").getAsString()); + Assert.assertEquals("portal-service", data_4.getRecord().get("behind").getAsString()); + Assert.assertEquals("User..-..portal-service", data_4.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_4.getRecord().get("timeSlice").getAsLong()); + + RecordData data_2 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..cache-service..-..[127.0.0.1:6379]"); + Assert.assertEquals(true, data_2.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_2.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("cache-service", data_2.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:6379]", data_2.getRecord().get("behind").getAsString()); + Assert.assertEquals("cache-service..-..[127.0.0.1:6379]", data_2.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_2.getRecord().get("timeSlice").getAsLong()); + + RecordData data_1 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..portal-service..-..[10.128.35.80:20880]"); + Assert.assertEquals(true, data_1.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_1.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("portal-service", data_1.getRecord().get("front").getAsString()); + Assert.assertEquals("[10.128.35.80:20880]", data_1.getRecord().get("behind").getAsString()); + Assert.assertEquals("portal-service..-..[10.128.35.80:20880]", data_1.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_1.getRecord().get("timeSlice").getAsLong()); + + RecordData data_6 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..persistence-service..-..[127.0.0.1:3307]"); + Assert.assertEquals(true, data_6.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_6.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("persistence-service", data_6.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:3307]", data_6.getRecord().get("behind").getAsString()); + Assert.assertEquals("persistence-service..-..[127.0.0.1:3307]", data_6.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_6.getRecord().get("timeSlice").getAsLong()); + } + + public void verify_2(List recordDataList, long timeSlice) { + RecordData data_5 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..portal-service..-..[127.0.0.1:8002]"); + Assert.assertEquals(true, data_5.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(false, data_5.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("portal-service", data_5.getRecord().get("front").getAsString()); + Assert.assertEquals("[127.0.0.1:8002]", data_5.getRecord().get("behind").getAsString()); + Assert.assertEquals("portal-service..-..[127.0.0.1:8002]", data_5.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_5.getRecord().get("timeSlice").getAsLong()); + + RecordData data_4 = RecordDataTool.INSTANCE.getRecord(recordDataList, timeSlice + "..-..User..-..portal-service"); + Assert.assertEquals(true, data_4.getRecord().get("frontIsRealCode").getAsBoolean()); + Assert.assertEquals(true, data_4.getRecord().get("behindIsRealCode").getAsBoolean()); + Assert.assertEquals("User", data_4.getRecord().get("front").getAsString()); + Assert.assertEquals("portal-service", data_4.getRecord().get("behind").getAsString()); + Assert.assertEquals("User..-..portal-service", data_4.getRecord().get("aggId").getAsString()); + Assert.assertEquals(timeSlice, data_4.getRecord().get("timeSlice").getAsLong()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSliceUseDB.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSliceUseDB.java new file mode 100644 index 000000000..b8e9b2008 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSliceUseDB.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class NodeRefResSumGroupWithTimeSliceUseDB { + + public static void main(String[] args) throws Exception { + EsClient.boot(); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + NodeRefResSumGroupWithTimeSlice nodeRefSearch = + new NodeRefResSumGroupWithTimeSlice(NodeRefResSumGroupWithTimeSlice.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext); + + long startTime = 201703310910L; + long endTime = 201703310920L; + JsonObject response = new JsonObject(); + NodeRefResSumGroupWithTimeSlice.RequestEntity requestEntity = + new NodeRefResSumGroupWithTimeSlice.RequestEntity(NodeRefIndex.Type_Minute, startTime, endTime); + nodeRefSearch.onWork(requestEntity, response); + + JsonArray nodeRefArray = response.get("result").getAsJsonArray(); + System.out.println(nodeRefArray.toString()); + for (int i = 0; i < nodeRefArray.size(); i++) { + JsonObject nodeRefJsonObj = nodeRefArray.get(i).getAsJsonObject(); + System.out.println(nodeRefJsonObj); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumSearchWithTimeSliceUseDB.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumSearchWithTimeSliceUseDB.java new file mode 100644 index 000000000..140c9ff03 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumSearchWithTimeSliceUseDB.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class NodeRefResSumSearchWithTimeSliceUseDB { + + public static void main(String[] args) throws Exception { + EsClient.boot(); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + NodeRefResSumSearchWithTimeSlice nodeRefSearch = + new NodeRefResSumSearchWithTimeSlice(NodeRefResSumSearchWithTimeSlice.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext); + + long startTime = 201703310910L; + long endTime = 201703310920L; + JsonObject response = new JsonObject(); + NodeRefResSumSearchWithTimeSlice.RequestEntity requestEntity = + new NodeRefResSumSearchWithTimeSlice.RequestEntity(NodeRefIndex.Type_Minute, startTime, endTime); + nodeRefSearch.onWork(requestEntity, response); + + JsonArray nodeRefArray = response.get("result").getAsJsonArray(); + System.out.println(nodeRefArray.toString()); + for (int i = 0; i < nodeRefArray.size(); i++) { + JsonObject nodeRefJsonObj = nodeRefArray.get(i).getAsJsonObject(); + System.out.println(nodeRefJsonObj); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefSearchWithTimeSliceUseDB.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefSearchWithTimeSliceUseDB.java new file mode 100644 index 000000000..5b85da58e --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefSearchWithTimeSliceUseDB.java @@ -0,0 +1,37 @@ +package com.a.eye.skywalking.collector.worker.noderef.persistence; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; + +/** + * @author pengys5 + */ +public class NodeRefSearchWithTimeSliceUseDB { + + public static void main(String[] args) throws Exception { + EsClient.boot(); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + NodeRefSearchWithTimeSlice nodeRefSearch = + new NodeRefSearchWithTimeSlice(NodeRefSearchWithTimeSlice.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext); + + long startTime = 201703310910L; + long endTime = 201703310920L; + JsonObject response = new JsonObject(); + NodeRefSearchWithTimeSlice.RequestEntity requestEntity = + new NodeRefSearchWithTimeSlice.RequestEntity(NodeRefIndex.Type_Minute, startTime, endTime); + nodeRefSearch.onWork(requestEntity, response); + + JsonArray nodeRefArray = response.get("result").getAsJsonArray(); + System.out.println(nodeRefArray.toString()); + for (int i = 0; i < nodeRefArray.size(); i++) { + JsonObject nodeRefJsonObj = nodeRefArray.get(i).getAsJsonObject(); + System.out.println(nodeRefJsonObj); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/HttpClientTools.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/HttpClientTools.java new file mode 100644 index 000000000..ce28e6729 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/HttpClientTools.java @@ -0,0 +1,79 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import org.apache.http.Consts; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.net.URI; +import java.util.List; + +/** + * @author pengys5 + */ +public enum HttpClientTools { + INSTANCE; + + private Logger logger = LogManager.getFormatterLogger(HttpClientTools.class); + + public String get(String url, List params) throws IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + try { + HttpGet httpget = new HttpGet(url); + String paramStr = EntityUtils.toString(new UrlEncodedFormEntity(params)); + httpget.setURI(new URI(httpget.getURI().toString() + "?" + paramStr)); + logger.debug("executing get request %s", httpget.getURI()); + + try (CloseableHttpResponse response = httpClient.execute(httpget)) { + HttpEntity entity = response.getEntity(); + System.out.println(response.getStatusLine()); + if (entity != null) { + return EntityUtils.toString(entity); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + public String post(String url, String data) throws IOException { + CloseableHttpClient httpClient = HttpClients.createDefault(); + try { + HttpPost httppost = new HttpPost(url); + httppost.setEntity(new StringEntity(data, Consts.UTF_8)); + logger.debug("executing post request %s", httppost.getURI()); + try (CloseableHttpResponse response = httpClient.execute(httppost)) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + return EntityUtils.toString(entity); + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + httpClient.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentPostTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentPostTestCase.java new file mode 100644 index 000000000..11bf29106 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentPostTestCase.java @@ -0,0 +1,270 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.actor.ClusterWorkerContext; +import com.a.eye.skywalking.collector.actor.LocalWorkerContext; +import com.a.eye.skywalking.collector.actor.WorkerRef; +import com.a.eye.skywalking.collector.worker.globaltrace.analysis.GlobalTraceAnalysis; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeCompAnalysis; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeMappingDayAnalysis; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeMappingHourAnalysis; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeMappingMinuteAnalysis; +import com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefDayAnalysis; +import com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefHourAnalysis; +import com.a.eye.skywalking.collector.worker.noderef.analysis.NodeRefMinuteAnalysis; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentCostSave; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentExceptionSave; +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentSave; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentMatcher; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.powermock.api.mockito.PowerMockito.*; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({LocalWorkerContext.class, WorkerRef.class}) +@PowerMockIgnore({"javax.management.*"}) +public class SegmentPostTestCase { + + private Logger logger = LogManager.getFormatterLogger(SegmentPostTestCase.class); + + private SegmentMock segmentMock; + private SegmentPost segmentPost; + private LocalWorkerContext localWorkerContext; + + @Before + public void init() throws Exception { + segmentMock = new SegmentMock(); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + localWorkerContext = new LocalWorkerContext(); + + initSegmentSave(); + initSegmentCostSave(); + initGlobalTraceAnalysis(); + initSegmentExceptionSave(); + initNodeRefAnalysis(); + initNodeCompAnalysis(); + initNodeNodeMappingAnalysis(); + + segmentPost = spy(new SegmentPost(SegmentPost.WorkerRole.INSTANCE, clusterWorkerContext, localWorkerContext)); + } + + private SegmentSaveAnswer segmentSaveAnswer_1; + private SegmentSaveAnswer segmentSaveAnswer_2; + + public void initSegmentSave() throws Exception { + WorkerRef segmentSave = mock(WorkerRef.class); + doReturn(SegmentSave.Role.INSTANCE).when(segmentSave, "getRole"); + localWorkerContext.put(segmentSave); + + segmentSaveAnswer_1 = new SegmentSaveAnswer(); + doAnswer(segmentSaveAnswer_1).when(segmentSave).tell(Mockito.argThat(new IsCacheServiceSegment_1())); + + segmentSaveAnswer_2 = new SegmentSaveAnswer(); + doAnswer(segmentSaveAnswer_2).when(segmentSave).tell(Mockito.argThat(new IsCacheServiceSegment_2())); + } + + private SegmentOtherAnswer segmentCostSaveAnswer; + + public void initSegmentCostSave() throws Exception { + WorkerRef segmentCostSave = mock(WorkerRef.class); + doReturn(SegmentCostSave.Role.INSTANCE).when(segmentCostSave, "getRole"); + localWorkerContext.put(segmentCostSave); + + segmentCostSaveAnswer = new SegmentOtherAnswer(); + doAnswer(segmentCostSaveAnswer).when(segmentCostSave).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + private SegmentOtherAnswer globalTraceAnalysisAnswer; + + public void initGlobalTraceAnalysis() throws Exception { + WorkerRef globalTraceAnalysis = mock(WorkerRef.class); + doReturn(GlobalTraceAnalysis.Role.INSTANCE).when(globalTraceAnalysis, "getRole"); + localWorkerContext.put(globalTraceAnalysis); + + globalTraceAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(globalTraceAnalysisAnswer).when(globalTraceAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + private SegmentOtherAnswer segmentExceptionSaveAnswer; + + public void initSegmentExceptionSave() throws Exception { + WorkerRef segmentExceptionSave = mock(WorkerRef.class); + doReturn(SegmentExceptionSave.Role.INSTANCE).when(segmentExceptionSave, "getRole"); + localWorkerContext.put(segmentExceptionSave); + + segmentExceptionSaveAnswer = new SegmentOtherAnswer(); + doAnswer(segmentExceptionSaveAnswer).when(segmentExceptionSave).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + private SegmentOtherAnswer nodeRefMinuteAnalysisAnswer; + private SegmentOtherAnswer nodeRefHourAnalysisAnswer; + private SegmentOtherAnswer nodeRefDayAnalysisAnswer; + + public void initNodeRefAnalysis() throws Exception { + WorkerRef nodeRefMinuteAnalysis = mock(WorkerRef.class); + doReturn(NodeRefMinuteAnalysis.Role.INSTANCE).when(nodeRefMinuteAnalysis, "getRole"); + localWorkerContext.put(nodeRefMinuteAnalysis); + + nodeRefMinuteAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeRefMinuteAnalysisAnswer).when(nodeRefMinuteAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + + WorkerRef nodeRefHourAnalysis = mock(WorkerRef.class); + doReturn(NodeRefHourAnalysis.Role.INSTANCE).when(nodeRefHourAnalysis, "getRole"); + localWorkerContext.put(nodeRefHourAnalysis); + + nodeRefHourAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeRefHourAnalysisAnswer).when(nodeRefHourAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + + WorkerRef nodeRefDayAnalysis = mock(WorkerRef.class); + doReturn(NodeRefDayAnalysis.Role.INSTANCE).when(nodeRefDayAnalysis, "getRole"); + localWorkerContext.put(nodeRefDayAnalysis); + + nodeRefDayAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeRefDayAnalysisAnswer).when(nodeRefDayAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + private SegmentOtherAnswer nodeCompAnalysisAnswer; + + public void initNodeCompAnalysis() throws Exception { + WorkerRef nodeMinuteAnalysis = mock(WorkerRef.class); + doReturn(NodeCompAnalysis.Role.INSTANCE).when(nodeMinuteAnalysis, "getRole"); + localWorkerContext.put(nodeMinuteAnalysis); + + nodeCompAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeCompAnalysisAnswer).when(nodeMinuteAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + private SegmentOtherAnswer nodeMappingMinuteAnalysisAnswer; + private SegmentOtherAnswer nodeMappingHourAnalysisAnswer; + private SegmentOtherAnswer nodeMappingDayAnalysisAnswer; + + public void initNodeNodeMappingAnalysis() throws Exception { + WorkerRef nodeMappingMinuteAnalysis = mock(WorkerRef.class); + doReturn(NodeMappingMinuteAnalysis.Role.INSTANCE).when(nodeMappingMinuteAnalysis, "getRole"); + localWorkerContext.put(nodeMappingMinuteAnalysis); + + nodeMappingMinuteAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeMappingMinuteAnalysisAnswer).when(nodeMappingMinuteAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + + WorkerRef nodeMappingHourAnalysis = mock(WorkerRef.class); + doReturn(NodeMappingHourAnalysis.Role.INSTANCE).when(nodeMappingHourAnalysis, "getRole"); + localWorkerContext.put(nodeMappingHourAnalysis); + + nodeMappingHourAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeMappingHourAnalysisAnswer).when(nodeMappingHourAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + + WorkerRef nodeMappingDayAnalysis = mock(WorkerRef.class); + doReturn(NodeMappingDayAnalysis.Role.INSTANCE).when(nodeMappingDayAnalysis, "getRole"); + localWorkerContext.put(nodeMappingDayAnalysis); + + nodeMappingDayAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeMappingDayAnalysisAnswer).when(nodeMappingDayAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + @Test + public void testOnReceive() throws Exception { + String cacheServiceSegmentAsString = segmentMock.mockCacheServiceSegmentAsString(); + + segmentPost.onReceive(cacheServiceSegmentAsString); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), segmentSaveAnswer_1.minute); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), segmentSaveAnswer_1.hour); + Assert.assertEquals(201703310000L, segmentSaveAnswer_1.day); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), segmentSaveAnswer_2.minute); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), segmentSaveAnswer_2.hour); + Assert.assertEquals(201703310000L, segmentSaveAnswer_2.day); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), segmentCostSaveAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), segmentCostSaveAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, segmentCostSaveAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), globalTraceAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), globalTraceAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, globalTraceAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), segmentExceptionSaveAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), segmentExceptionSaveAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, segmentExceptionSaveAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), nodeRefMinuteAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), nodeRefMinuteAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeRefMinuteAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), nodeRefHourAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), nodeRefHourAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeRefHourAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), nodeRefDayAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310900L), nodeRefDayAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeRefDayAnalysisAnswer.segmentWithTimeSlice.getDay()); + } + + public class SegmentOtherAnswer implements Answer { + + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice; + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + segmentWithTimeSlice = (SegmentPost.SegmentWithTimeSlice) invocation.getArguments()[0]; + return null; + } + } + + public class SegmentSaveAnswer implements Answer { + long minute = 0; + long hour = 0; + long day = 0; + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + JsonObject jsonObject = (JsonObject) invocation.getArguments()[0]; + logger.info("SegmentSave json: " + jsonObject.toString()); + minute = jsonObject.get("minute").getAsLong(); + hour = jsonObject.get("hour").getAsLong(); + day = jsonObject.get("day").getAsLong(); + return null; + } + } + + class IsCacheServiceSegment_1 extends ArgumentMatcher { + private static final String SegId = "Segment.1490922929258.927784221.5991.27.1"; + + public boolean matches(Object para) { + JsonObject paraJson = (JsonObject) para; + return SegId.equals(paraJson.get("ts").getAsString()); + } + } + + class IsCacheServiceSegment_2 extends ArgumentMatcher { + private static final String SegId = "Segment.1490922929298.927784221.5991.28.1"; + + public boolean matches(Object para) { + JsonObject paraJson = (JsonObject) para; + return SegId.equals(paraJson.get("ts").getAsString()); + } + } + + class IsSegmentWithTimeSlice extends ArgumentMatcher { + public boolean matches(Object para) { + return para instanceof SegmentPost.SegmentWithTimeSlice; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentRealPost.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentRealPost.java new file mode 100644 index 000000000..f0c6cfdeb --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentRealPost.java @@ -0,0 +1,27 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; + +/** + * @author pengys5 + */ +public class SegmentRealPost { + + public static void main(String[] args) throws Exception { + SegmentMock mock = new SegmentMock(); +// String cacheServiceExceptionSegmentAsString = mock.mockCacheServiceExceptionSegmentAsString(); +// HttpClientTools.INSTANCE.post("http://localhost:7001/segments", cacheServiceExceptionSegmentAsString); +// +// String portalServiceExceptionSegmentAsString = mock.mockPortalServiceExceptionSegmentAsString(); +// HttpClientTools.INSTANCE.post("http://localhost:7001/segments", portalServiceExceptionSegmentAsString); + + String cacheServiceSegmentAsString = mock.mockCacheServiceSegmentAsString(); + HttpClientTools.INSTANCE.post("http://localhost:7001/segments", cacheServiceSegmentAsString); + + String persistenceServiceSegmentAsString = mock.mockPersistenceServiceSegmentAsString(); + HttpClientTools.INSTANCE.post("http://localhost:7001/segments", persistenceServiceSegmentAsString); + + String portalServiceSegmentAsString = mock.mockPortalServiceSegmentAsString(); + HttpClientTools.INSTANCE.post("http://localhost:7001/segments", portalServiceSegmentAsString); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/mock/SegmentMock.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/mock/SegmentMock.java new file mode 100644 index 000000000..2b31d9eb8 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/mock/SegmentMock.java @@ -0,0 +1,116 @@ +package com.a.eye.skywalking.collector.worker.segment.mock; + +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.a.eye.skywalking.collector.worker.tools.JsonFileReader; +import com.a.eye.skywalking.trace.SegmentsMessage; +import com.a.eye.skywalking.trace.TraceSegment; +import com.google.gson.Gson; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author pengys5 + */ +public class SegmentMock { + + private Logger logger = LogManager.getFormatterLogger(SegmentMock.class); + + private Gson gson = new Gson(); + private String path = this.getClass().getResource("/").getPath(); + + private final String CacheServiceJsonFile = path + "/json/segment/post/normal/cache-service.json"; + private final String PersistenceServiceJsonFile = path + "/json/segment/post/normal/persistence-service.json"; + private final String PortalServiceJsonFile = path + "/json/segment/post/normal/portal-service.json"; + + private final String CacheServiceExceptionJsonFile = path + "/json/segment/post/exception/cache-service.json"; + private final String PortalServiceExceptionJsonFile = path + "/json/segment/post/exception/portal-service.json"; + + private final String SpecialJsonFile = path + "/json/segment/post/special/special.json"; + + public String mockSpecialSegmentAsString() throws FileNotFoundException { + return JsonFileReader.INSTANCE.read(SpecialJsonFile); + } + + public String mockCacheServiceSegmentAsString() throws FileNotFoundException { + return JsonFileReader.INSTANCE.read(CacheServiceJsonFile); + } + + public String mockPersistenceServiceSegmentAsString() throws FileNotFoundException { + return JsonFileReader.INSTANCE.read(PersistenceServiceJsonFile); + } + + public String mockPortalServiceSegmentAsString() throws FileNotFoundException { + return JsonFileReader.INSTANCE.read(PortalServiceJsonFile); + } + + public String mockCacheServiceExceptionSegmentAsString() throws FileNotFoundException { + return JsonFileReader.INSTANCE.read(CacheServiceExceptionJsonFile); + } + + public String mockPortalServiceExceptionSegmentAsString() throws FileNotFoundException { + return JsonFileReader.INSTANCE.read(PortalServiceExceptionJsonFile); + } + + public List mockSpecialSegmentTimeSlice() throws FileNotFoundException { + String specialSegmentAsString = mockSpecialSegmentAsString(); + logger.debug(specialSegmentAsString); + return createSegmentWithTimeSliceList(specialSegmentAsString); + } + + public List mockCacheServiceExceptionSegmentTimeSlice() throws FileNotFoundException { + String cacheServiceExceptionSegmentAsString = mockCacheServiceExceptionSegmentAsString(); + logger.debug(cacheServiceExceptionSegmentAsString); + return createSegmentWithTimeSliceList(cacheServiceExceptionSegmentAsString); + } + + public List mockPortalServiceExceptionSegmentTimeSlice() throws FileNotFoundException { + String portalServiceExceptionSegmentAsString = mockPortalServiceExceptionSegmentAsString(); + logger.debug(portalServiceExceptionSegmentAsString); + return createSegmentWithTimeSliceList(portalServiceExceptionSegmentAsString); + } + + public List mockCacheServiceSegmentSegmentTimeSlice() throws FileNotFoundException { + String cacheServiceSegmentAsString = mockCacheServiceSegmentAsString(); + logger.debug(cacheServiceSegmentAsString); + return createSegmentWithTimeSliceList(cacheServiceSegmentAsString); + } + + public List mockPersistenceServiceSegmentTimeSlice() throws FileNotFoundException { + String persistenceServiceSegmentAsString = mockPersistenceServiceSegmentAsString(); + logger.debug(persistenceServiceSegmentAsString); + return createSegmentWithTimeSliceList(persistenceServiceSegmentAsString); + } + + public List mockPortalServiceSegmentSegmentTimeSlice() throws FileNotFoundException { + String portalServiceSegmentAsString = mockPortalServiceSegmentAsString(); + logger.debug(portalServiceSegmentAsString); + return createSegmentWithTimeSliceList(portalServiceSegmentAsString); + } + + private List createSegmentWithTimeSliceList(String segmentJsonStr) { + SegmentsMessage segmentsMessage = gson.fromJson(segmentJsonStr, SegmentsMessage.class); + List segmentList = segmentsMessage.getSegments(); + + List segmentWithTimeSliceList = new ArrayList<>(); + for (TraceSegment newSegment : segmentList) { + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = createSegmentWithTimeSlice(newSegment); + segmentWithTimeSliceList.add(segmentWithTimeSlice); + } + return segmentWithTimeSliceList; + } + + private SegmentPost.SegmentWithTimeSlice createSegmentWithTimeSlice(TraceSegment newSegment) { + long minuteSlice = DateTools.getMinuteSlice(newSegment.getStartTime()); + long hourSlice = DateTools.getHourSlice(newSegment.getStartTime()); + long daySlice = DateTools.getDaySlice(newSegment.getStartTime()); + int second = DateTools.getSecond(newSegment.getStartTime()); + + SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice = new SegmentPost.SegmentWithTimeSlice(newSegment, minuteSlice, hourSlice, daySlice, second); + return segmentWithTimeSlice; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSaveTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSaveTestCase.java new file mode 100644 index 000000000..71b31908b --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSaveTestCase.java @@ -0,0 +1,206 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + +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.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.MockEsBulkClient; +import com.a.eye.skywalking.collector.worker.mock.SaveToEsSourceAnswer; +import com.a.eye.skywalking.collector.worker.segment.SegmentCostIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.a.eye.skywalking.collector.worker.tools.DateTools; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.List; + +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({EsClient.class, LogManager.class}) +@PowerMockIgnore({"javax.management.*"}) +public class SegmentCostSaveTestCase { + + private SegmentCostSave segmentCostSave; + private SegmentMock segmentMock = new SegmentMock(); + private MockEsBulkClient mockEsBulkClient = new MockEsBulkClient(); + + private SaveToEsSourceAnswer saveToEsSourceAnswer; + + @Before + public void init() throws Exception { + mockEsBulkClient.createMock(); + + saveToEsSourceAnswer = new SaveToEsSourceAnswer(); + when(mockEsBulkClient.indexRequestBuilder.setSource(Mockito.anyString())).thenAnswer(saveToEsSourceAnswer); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + segmentCostSave = new SegmentCostSave(SegmentCostSave.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testEsIndex() { + Assert.assertEquals(SegmentCostIndex.Index, segmentCostSave.esIndex()); + } + + @Test + public void testEsType() { + Assert.assertEquals(SegmentCostIndex.Type_Record, segmentCostSave.esType()); + } + + @Test + public void testRole() { + Assert.assertEquals(SegmentCostSave.class.getSimpleName(), SegmentCostSave.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), SegmentCostSave.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(SegmentCostSave.class.getSimpleName(), SegmentCostSave.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(SegmentCostSave.class.getSimpleName(), SegmentCostSave.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Segment.SegmentCostSave.Size = testSize; + Assert.assertEquals(testSize, SegmentCostSave.Factory.INSTANCE.queueSize()); + } + + @Test + public void testPersistenceServiceAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + List segmentWithTimeSliceList = segmentMock.mockPersistenceServiceSegmentTimeSlice(); + + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : segmentWithTimeSliceList) { + segmentCostSave.analyse(segmentWithTimeSlice); + } + + JsonArray sourceArray = saveToEsSourceAnswer.sourceObj.getSource(); + Assert.assertEquals(1, sourceArray.size()); + + JsonObject costJsonObj = sourceArray.get(0).getAsJsonObject(); + Assert.assertEquals("Segment.1490922929274.1382198130.5997.47.1", costJsonObj.get("segId").getAsString()); + Assert.assertEquals(1490922929274L, costJsonObj.get("startTime").getAsLong()); + Assert.assertEquals(1490922929288L, costJsonObj.get("EndTime").getAsLong()); + Assert.assertEquals("/persistence/query", costJsonObj.get("operationName").getAsString()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), costJsonObj.get("timeSlice").getAsLong()); + Assert.assertEquals(14, costJsonObj.get("cost").getAsInt()); + } + + @Test + public void testCacheServiceAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 2; + + List segmentWithTimeSliceList = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : segmentWithTimeSliceList) { + segmentCostSave.analyse(segmentWithTimeSlice); + } + + JsonArray sourceArray = saveToEsSourceAnswer.sourceObj.getSource(); + Assert.assertEquals(2, sourceArray.size()); + + JsonObject costJsonObj_0 = null; + JsonObject costJsonObj_1 = null; + for (int i = 0; i < sourceArray.size(); i++) { + JsonObject costJsonObj = sourceArray.get(i).getAsJsonObject(); + if (costJsonObj.get("segId").getAsString().equals("Segment.1490922929258.927784221.5991.27.1")) { + costJsonObj_0 = costJsonObj; + } else if (costJsonObj.get("segId").getAsString().equals("Segment.1490922929298.927784221.5991.28.1")) { + costJsonObj_1 = costJsonObj; + } + } + + Assert.assertEquals(1490922929258L, costJsonObj_0.get("startTime").getAsLong()); + Assert.assertEquals(1490922929261L, costJsonObj_0.get("EndTime").getAsLong()); + Assert.assertEquals("com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)", costJsonObj_0.get("operationName").getAsString()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), costJsonObj_0.get("timeSlice").getAsLong()); + Assert.assertEquals(3, costJsonObj_0.get("cost").getAsInt()); + + Assert.assertEquals(1490922929298L, costJsonObj_1.get("startTime").getAsLong()); + Assert.assertEquals(1490922929303L, costJsonObj_1.get("EndTime").getAsLong()); + Assert.assertEquals("com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", costJsonObj_1.get("operationName").getAsString()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), costJsonObj_1.get("timeSlice").getAsLong()); + Assert.assertEquals(5, costJsonObj_1.get("cost").getAsInt()); + } + + @Test + public void testPortalServiceAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + List segmentWithTimeSliceList = segmentMock.mockPortalServiceSegmentSegmentTimeSlice(); + + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : segmentWithTimeSliceList) { + segmentCostSave.analyse(segmentWithTimeSlice); + } + + JsonArray sourceArray = saveToEsSourceAnswer.sourceObj.getSource(); + Assert.assertEquals(1, sourceArray.size()); + + JsonObject costJsonObj = sourceArray.get(0).getAsJsonObject(); + Assert.assertEquals("Segment.1490922929254.1797892356.6003.69.1", costJsonObj.get("segId").getAsString()); + Assert.assertEquals(1490922929254L, costJsonObj.get("startTime").getAsLong()); + Assert.assertEquals(1490922929306L, costJsonObj.get("EndTime").getAsLong()); + Assert.assertEquals("/portal/", costJsonObj.get("operationName").getAsString()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310915L), costJsonObj.get("timeSlice").getAsLong()); + Assert.assertEquals(52, costJsonObj.get("cost").getAsInt()); + } + + @Test + public void testCacheServiceExceptionAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + List segmentWithTimeSliceList = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : segmentWithTimeSliceList) { + segmentCostSave.analyse(segmentWithTimeSlice); + } + + JsonArray sourceArray = saveToEsSourceAnswer.sourceObj.getSource(); + Assert.assertEquals(1, sourceArray.size()); + + JsonObject costJsonObj = sourceArray.get(0).getAsJsonObject(); + Assert.assertEquals("Segment.1490923010328.927784221.5991.32.1", costJsonObj.get("segId").getAsString()); + Assert.assertEquals(1490923010328L, costJsonObj.get("startTime").getAsLong()); + Assert.assertEquals(1490923010329L, costJsonObj.get("EndTime").getAsLong()); + Assert.assertEquals("com.a.eye.skywalking.test.cache.CacheService.findCacheWithException(java.lang.String)", costJsonObj.get("operationName").getAsString()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310916L), costJsonObj.get("timeSlice").getAsLong()); + Assert.assertEquals(1, costJsonObj.get("cost").getAsInt()); + } + + @Test + public void testPortalServiceExceptionAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + List segmentWithTimeSliceList = segmentMock.mockPortalServiceExceptionSegmentTimeSlice(); + + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : segmentWithTimeSliceList) { + segmentCostSave.analyse(segmentWithTimeSlice); + } + + JsonArray sourceArray = saveToEsSourceAnswer.sourceObj.getSource(); + Assert.assertEquals(1, sourceArray.size()); + + JsonObject costJsonObj = sourceArray.get(0).getAsJsonObject(); + Assert.assertEquals("Segment.1490923010324.1797892356.6003.67.1", costJsonObj.get("segId").getAsString()); + Assert.assertEquals(1490923010324L, costJsonObj.get("startTime").getAsLong()); + Assert.assertEquals(1490923010336L, costJsonObj.get("EndTime").getAsLong()); + Assert.assertEquals("/portal/cache/exception/test", costJsonObj.get("operationName").getAsString()); + Assert.assertEquals(DateTools.changeToUTCSlice(201703310916L), costJsonObj.get("timeSlice").getAsLong()); + Assert.assertEquals(12, costJsonObj.get("cost").getAsInt()); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionSaveTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionSaveTestCase.java new file mode 100644 index 000000000..8fd8eeb86 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionSaveTestCase.java @@ -0,0 +1,133 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + +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.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.MockEsBulkClient; +import com.a.eye.skywalking.collector.worker.segment.SegmentExceptionIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentPost; +import com.a.eye.skywalking.collector.worker.segment.mock.SegmentMock; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({EsClient.class}) +@PowerMockIgnore({"javax.management.*"}) +public class SegmentExceptionSaveTestCase { + + private Logger logger = LogManager.getFormatterLogger(SegmentExceptionSaveTestCase.class); + + private SegmentMock segmentMock = new SegmentMock(); + private SegmentExceptionSave segmentExceptionSave; + private SaveToEsSource saveToEsSource; + private MockEsBulkClient mockEsBulkClient = new MockEsBulkClient(); + + @Before + public void init() { + mockEsBulkClient.createMock(); + + saveToEsSource = new SaveToEsSource(); + when(mockEsBulkClient.indexRequestBuilder.setSource(Mockito.anyString())).thenAnswer(saveToEsSource); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + + segmentExceptionSave = new SegmentExceptionSave(SegmentExceptionSave.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testEsIndex() { + Assert.assertEquals(SegmentExceptionIndex.Index, segmentExceptionSave.esIndex()); + } + + @Test + public void testEsType() { + Assert.assertEquals(SegmentExceptionIndex.Type_Record, segmentExceptionSave.esType()); + } + + @Test + public void testRole() { + Assert.assertEquals(SegmentExceptionSave.class.getSimpleName(), SegmentExceptionSave.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), SegmentExceptionSave.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(SegmentExceptionSave.class.getSimpleName(), SegmentExceptionSave.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(SegmentExceptionSave.class.getSimpleName(), SegmentExceptionSave.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Segment.SegmentExceptionSave.Size = testSize; + Assert.assertEquals(testSize, SegmentExceptionSave.Factory.INSTANCE.queueSize()); + } + + @Test + public void testSuccessAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + List cacheServiceList = segmentMock.mockCacheServiceSegmentSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceList) { + segmentExceptionSave.analyse(segmentWithTimeSlice); + } + + JsonObject isError_1 = saveToEsSource.isErrorMap.get("Segment.1490922929258.927784221.5991.27.1"); + Assert.assertEquals(false, isError_1.get("isError").getAsBoolean()); + Assert.assertEquals(0, isError_1.get("errorKind").getAsJsonArray().size()); + + JsonObject isError_2 = saveToEsSource.isErrorMap.get("Segment.1490922929298.927784221.5991.28.1"); + Assert.assertEquals(false, isError_2.get("isError").getAsBoolean()); + Assert.assertEquals(0, isError_2.get("errorKind").getAsJsonArray().size()); + } + + @Test + public void testErrorAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + List cacheServiceList = segmentMock.mockCacheServiceExceptionSegmentTimeSlice(); + for (SegmentPost.SegmentWithTimeSlice segmentWithTimeSlice : cacheServiceList) { + segmentExceptionSave.analyse(segmentWithTimeSlice); + } + + JsonObject isError_1 = saveToEsSource.isErrorMap.get("Segment.1490923010328.927784221.5991.32.1"); + Assert.assertEquals(true, isError_1.get("isError").getAsBoolean()); + Assert.assertEquals("com.weibo.api.motan.exception.MotanBizException", isError_1.get("errorKind").getAsJsonArray().get(0).getAsString()); + } + + class SaveToEsSource implements Answer { + + Map isErrorMap = new HashMap<>(); + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + Gson gson = new Gson(); + String source = (String) invocation.getArguments()[0]; + JsonObject sourceJsonObj = gson.fromJson(source, JsonObject.class); + logger.info("es source: %s", sourceJsonObj.toString()); + isErrorMap.put(sourceJsonObj.get("segId").getAsString(), sourceJsonObj); + return null; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentSaveTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentSaveTestCase.java new file mode 100644 index 000000000..5f187f1c1 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentSaveTestCase.java @@ -0,0 +1,101 @@ +package com.a.eye.skywalking.collector.worker.segment.persistence; + +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.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.mock.MockEsBulkClient; +import com.a.eye.skywalking.collector.worker.segment.SegmentCostIndex; +import com.a.eye.skywalking.collector.worker.segment.SegmentIndex; +import com.a.eye.skywalking.collector.worker.storage.EsClient; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import static org.powermock.api.mockito.PowerMockito.when; + +/** + * @author pengys5 + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({EsClient.class}) +@PowerMockIgnore({"javax.management.*"}) +public class SegmentSaveTestCase { + + private SegmentSave segmentSave; + private SaveToEsSource saveToEsSource; + private MockEsBulkClient mockEsBulkClient = new MockEsBulkClient(); + + @Before + public void init() { + mockEsBulkClient.createMock(); + + saveToEsSource = new SaveToEsSource(); + when(mockEsBulkClient.indexRequestBuilder.setSource(Mockito.anyString())).thenAnswer(saveToEsSource); + + ClusterWorkerContext clusterWorkerContext = new ClusterWorkerContext(null); + LocalWorkerContext localWorkerContext = new LocalWorkerContext(); + + segmentSave = new SegmentSave(SegmentSave.Role.INSTANCE, clusterWorkerContext, localWorkerContext); + } + + @Test + public void testEsIndex() { + Assert.assertEquals(SegmentIndex.Index, segmentSave.esIndex()); + } + + @Test + public void testEsType() { + Assert.assertEquals(SegmentIndex.Type_Record, segmentSave.esType()); + } + + @Test + public void testRole() { + Assert.assertEquals(SegmentSave.class.getSimpleName(), SegmentSave.Role.INSTANCE.roleName()); + Assert.assertEquals(RollingSelector.class.getSimpleName(), SegmentSave.Role.INSTANCE.workerSelector().getClass().getSimpleName()); + } + + @Test + public void testFactory() { + Assert.assertEquals(SegmentSave.class.getSimpleName(), SegmentSave.Factory.INSTANCE.role().roleName()); + Assert.assertEquals(SegmentSave.class.getSimpleName(), SegmentSave.Factory.INSTANCE.workerInstance(null).getClass().getSimpleName()); + + int testSize = 10; + WorkerConfig.Queue.Segment.SegmentSave.Size = testSize; + Assert.assertEquals(testSize, SegmentSave.Factory.INSTANCE.queueSize()); + } + + @Test + public void testAnalyse() throws Exception { + WorkerConfig.Persistence.Data.size = 1; + + JsonObject segment_1 = new JsonObject(); + segment_1.addProperty("ts", "segment_1"); + segmentSave.analyse(segment_1); + + Assert.assertEquals("segment_1", saveToEsSource.ts); + } + + class SaveToEsSource implements Answer { + + String ts = ""; + + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + Gson gson = new Gson(); + String source = (String) invocation.getArguments()[0]; + JsonObject sourceJsonObj = gson.fromJson(source, JsonObject.class); + ts = sourceJsonObj.get("ts").getAsString(); + return null; + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/DateToolsTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/DateToolsTestCase.java new file mode 100644 index 000000000..06f4b723d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/DateToolsTestCase.java @@ -0,0 +1,28 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.TimeZone; + +/** + * @author pengys5 + */ +public class DateToolsTestCase { + + @Test + public void testUTCLocation() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + long timeSlice = 201703310915L; + long changedTimeSlice = DateTools.changeToUTCSlice(timeSlice); + Assert.assertEquals(201703310115L, changedTimeSlice); + } + + @Test + public void testUTC8Location() { + TimeZone.setDefault(TimeZone.getTimeZone("GMT+08:00")); + long timeSlice = 201703310915L; + long changedTimeSlice = DateTools.changeToUTCSlice(timeSlice); + Assert.assertEquals(201703310915L, changedTimeSlice); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/IdSplitTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/IdSplitTestCase.java new file mode 100644 index 000000000..dadb89aea --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/IdSplitTestCase.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import com.a.eye.skywalking.collector.worker.Const; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class IdSplitTestCase { + + @Test + public void testIdSplit() { + String id = "201703221502..-..portal-service..-..[127.0.0.1:8002]"; + String[] ids = id.split(Const.IDS_SPLIT); + for (String splitId : ids) { + System.out.println(splitId); + } + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/ParameterToolsTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/ParameterToolsTestCase.java new file mode 100644 index 000000000..7efbf3874 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/ParameterToolsTestCase.java @@ -0,0 +1,24 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author pengys5 + */ +public class ParameterToolsTestCase { + + @Test + public void testToString() { + Map request = new HashMap<>(); + String[] test = {"Test"}; + + request.put("Key", test); + + String value = ParameterTools.INSTANCE.toString(request, "Key"); + Assert.assertEquals("Test", value); + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/RecordDataTool.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/RecordDataTool.java new file mode 100644 index 000000000..e9258debb --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/RecordDataTool.java @@ -0,0 +1,22 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import com.a.eye.skywalking.collector.worker.storage.RecordData; + +import java.util.List; + +/** + * @author pengys5 + */ +public enum RecordDataTool { + + INSTANCE; + + public RecordData getRecord(List recordDataList, String id) { + for (RecordData recordData : recordDataList) { + if (id.equals(recordData.getId())) { + return recordData; + } + } + return null; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/UrlToolsTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/UrlToolsTestCase.java new file mode 100644 index 000000000..62697a711 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tools/UrlToolsTestCase.java @@ -0,0 +1,34 @@ +package com.a.eye.skywalking.collector.worker.tools; + +import org.junit.Assert; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class UrlToolsTestCase { + +// @Test + public void testParseTomcat() { + String peers = + UrlTools.parse("http://172.0.0.1:8080/Web/GetUser", "Tomcat"); + Assert.assertEquals(peers, "http://172.0.0.1:8080"); + + peers = UrlTools.parse("https://172.0.0.1:8080/Web/GetUser", "Tomcat"); + Assert.assertEquals(peers, "https://172.0.0.1:8080"); + + peers = UrlTools.parse("172.0.0.1:8080/Web/GetUser", "Tomcat"); + Assert.assertEquals(peers, "172.0.0.1:8080"); + + peers = UrlTools.parse("http172.0.0.18080/Web/GetUser", "Tomcat"); + Assert.assertEquals(peers, "http172.0.0.18080/Web/GetUser"); + } + +// @Test + public void testParseMotan() { + String peers = + UrlTools.parse("motan://10.20.3.15:3000/com.a.eye.skywalking.demo.services.GetUserService.findUser(String, String)", "Motan"); + Assert.assertEquals(peers, "motan://10.20.3.15:3000"); + } + +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagDataBuilderTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagDataBuilderTestCase.java new file mode 100644 index 000000000..1bf956c24 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/tracedag/TraceDagDataBuilderTestCase.java @@ -0,0 +1,60 @@ +package com.a.eye.skywalking.collector.worker.tracedag; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import org.junit.Test; + +/** + * @author pengys5 + */ +public class TraceDagDataBuilderTestCase { + + private Gson gson = new Gson(); + + @Test + public void testBuild() { + JsonArray nodeMappingArray = nodeMappingArrayData(); + JsonArray nodeRefArray = nodeRefArrayData(); + JsonArray nodeCompArray = nodeCompArrayData(); + JsonArray resSumArray = resSumArrayData(); + + TraceDagDataBuilder builder = new TraceDagDataBuilder(); + JsonObject dagJsonObj = builder.build(nodeCompArray, nodeMappingArray, nodeRefArray, resSumArray); + + JsonArray pointArray = dagJsonObj.getAsJsonArray("nodes"); + JsonArray lineArray = dagJsonObj.getAsJsonArray("nodeRefs"); + + for (int i = 0; i < pointArray.size(); i++) { + System.out.println(pointArray.get(i).getAsJsonObject()); + } + + for (int i = 0; i < lineArray.size(); i++) { + System.out.println(lineArray.get(i).getAsJsonObject()); + } + } + + private JsonArray nodeMappingArrayData() { + String str = "[{\"code\":\"cache-service\",\"peers\":\"[127.0.0.1:8002]\"},{\"code\":\"persistence-service\",\"peers\":\"[10.128.35.80:20880]\"}]"; + JsonArray jsonArray = gson.fromJson(str, JsonArray.class); + return jsonArray; + } + + private JsonArray nodeRefArrayData() { + String str = "[{\"front\":\"User\",\"behind\":\"portal-service\"},{\"front\":\"portal-service\",\"behind\":\"[127.0.0.1:8002]\"},{\"front\":\"cache-service\",\"behind\":\"[127.0.0.1:6379]\"},{\"front\":\"cache-service\",\"behind\":\"[localhost:-1]\"},{\"front\":\"persistence-service\",\"behind\":\"[127.0.0.1:3307]\"},{\"front\":\"portal-service\",\"behind\":\"[10.128.35.80:20880]\"}]"; + JsonArray jsonArray = gson.fromJson(str, JsonArray.class); + return jsonArray; + } + + private JsonArray nodeCompArrayData() { + String str = "[{\"name\":\"Tomcat\",\"peers\":\"portal-service\"},{\"name\":\"Motan\",\"peers\":\"cache-service\"},{\"name\":\"H2\",\"peers\":\"[localhost:-1]\"},{\"name\":\"Tomcat\",\"peers\":\"[10.128.35.80:57818]\"},{\"name\":\"Redis\",\"peers\":\"[127.0.0.1:6379]\"},{\"name\":\"Mysql\",\"peers\":\"[127.0.0.1:3307]\"},{\"name\":\"Tomcat\",\"peers\":\"persistence-service\"},{\"name\":\"HttpClient\",\"peers\":\"[10.128.35.80:20880]\"},{\"name\":\"Motan\",\"peers\":\"[127.0.0.1:8002]\"},{\"name\":\"Tomcat\",\"peers\":\"[0:0:0:0:0:0:0:1:57837]\"}]"; + JsonArray jsonArray = gson.fromJson(str, JsonArray.class); + return jsonArray; + } + + private JsonArray resSumArrayData() { + String str = "[{\"front\":\"User\",\"behind\":\"portal-service\",\"oneSecondLess\":1.0,\"threeSecondLess\":0.0,\"fiveSecondLess\":0.0,\"fiveSecondGreater\":0.0,\"error\":0.0,\"summary\":1.0},{\"front\":\"cache-service\",\"behind\":\"[127.0.0.1:6379]\",\"oneSecondLess\":10.0,\"threeSecondLess\":0.0,\"fiveSecondLess\":0.0,\"fiveSecondGreater\":0.0,\"error\":0.0,\"summary\":10.0},{\"front\":\"cache-service\",\"behind\":\"[localhost:-1]\",\"oneSecondLess\":4.0,\"threeSecondLess\":0.0,\"fiveSecondLess\":0.0,\"fiveSecondGreater\":0.0,\"error\":0.0,\"summary\":4.0},{\"front\":\"persistence-service\",\"behind\":\"[127.0.0.1:3307]\",\"oneSecondLess\":2.0,\"threeSecondLess\":0.0,\"fiveSecondLess\":0.0,\"fiveSecondGreater\":0.0,\"error\":0.0,\"summary\":2.0},{\"front\":\"portal-service\",\"behind\":\"[10.128.35.80:20880]\",\"oneSecondLess\":1.0,\"threeSecondLess\":0.0,\"fiveSecondLess\":0.0,\"fiveSecondGreater\":0.0,\"error\":0.0,\"summary\":1.0},{\"front\":\"portal-service\",\"behind\":\"[127.0.0.1:8002]\",\"oneSecondLess\":2.0,\"threeSecondLess\":0.0,\"fiveSecondLess\":0.0,\"fiveSecondGreater\":0.0,\"error\":0.0,\"summary\":2.0}]"; + JsonArray jsonArray = gson.fromJson(str, JsonArray.class); + return jsonArray; + } +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/cache-service.json b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/cache-service.json new file mode 100644 index 000000000..e76265a77 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/cache-service.json @@ -0,0 +1,61 @@ +[ + { + "ts": "Segment.1490923010328.927784221.5991.32.1", + "st": 1490923010328, + "et": 1490923010329, + "rs": [ + { + "ts": "Segment.1490923010324.1797892356.6003.67.1", + "si": 2, + "ac": "portal-service", + "ph": "127.0.0.1:8002" + } + ], + "ss": [ + { + "si": 1, + "ps": 0, + "st": 0, + "et": 1490923010329, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.findCacheWithException(java.lang.String)", + "ts": { + "requestId": "1563346086476644362" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1490923010328, + "et": 1490923010329, + "on": "com.a.eye.skywalking.test.cache.CacheService.findCacheWithException(java.lang.String)", + "ts": { + "span.layer": "rpc", + "component": "Motan", + "span.kind": "server" + }, + "tb": { + "error": true + }, + "ti": {}, + "lo": [ + { + "tm": 1490923010329, + "fi": { + "stack": "com.weibo.api.motan.exception.MotanBizException: error_message: provider call process error, status: 503, error_code: 30001,r\u003d0\n\tat com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:62)\n\tat com.weibo.api.motan.rpc.AbstractProvider.call(AbstractProvider.java:47)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.process(OpenTracingFilter.java:94)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.processProviderTrace(OpenTracingFilter.java:148)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.filter(OpenTracingFilter.java:58)\n\tat com.weibo.api.motan.protocol.support.ProtocolFilterDecorator$2.call(ProtocolFilterDecorator.java:150)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8(ProviderMessageRouter.java:96)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8$accessor$PEWyOMYz(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter$auxiliary$s7ixnKeK.call(Unknown Source)\n\tat com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsInterceptor.intercept(ClassInstanceMethodsInterceptor.java:66)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.transport.ProviderProtectedMessageRouter.call(ProviderProtectedMessageRouter.java:79)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.handle(ProviderMessageRouter.java:91)\n\tat com.weibo.api.motan.transport.support.DefaultRpcHeartbeatFactory$HeartMessageHandleWrapper.handle(DefaultRpcHeartbeatFactory.java:82)\n\tat com.weibo.api.motan.transport.netty.NettyChannelHandler.processRequest(NettyChannelHandler.java:139)\n\tat com.weibo.api.motan.transport.netty.NettyChannelHandler.access$000(NettyChannelHandler.java:47)\n\tat com.weibo.api.motan.transport.netty.NettyChannelHandler$1.run(NettyChannelHandler.java:116)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745)\nCaused by: java.lang.NullPointerException\n\tat com.a.eye.skywalking.test.cache.jedis.JedisServiceManager.findWithException(JedisServiceManager.java:49)\n\tat com.a.eye.skywalking.test.cache.CacheServiceImpl.findCacheWithException(CacheServiceImpl.java:46)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:498)\n\tat com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:57)\n\t... 19 more\ncom.weibo.api.motan.exception.MotanBizException: error_message: provider call process error, status: 503, error_code: 30001,r\u003d0\n\tat com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:62)\n\tat com.weibo.api.motan.rpc.AbstractProvider.call(AbstractProvider.java:47)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.process(OpenTracingFilter.java:94)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.processProviderTrace(OpenTracingFilter.java:148)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.filter(OpenTracingFilter.java:58)\n\tat com.weibo.api.motan.protocol.support.ProtocolFilterDecorator$2.call(ProtocolFilterDecorator.java:150)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8(ProviderMessageRouter.java:96)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8$accessor$PEWyOMYz(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter$auxiliary$s7ixnKeK.call(Unknown Source)\n\tat com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsInterceptor.intercept(ClassInstanceMethodsInterceptor.java:66)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.", + "error.kind": "com.weibo.api.motan.exception.MotanBizException", + "event": "error", + "message": "error_message: provider call process error, status: 503, error_code: 30001,r\u003d0" + } + } + ] + } + ], + "ac": "cache-service", + "gt": [ + "Trace.1490923010324.1797892356.6003.67.2" + ] + } +] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/portal-service.json b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/portal-service.json new file mode 100644 index 000000000..15bf66ee0 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/portal-service.json @@ -0,0 +1,77 @@ +[ + { + "ts": "Segment.1490923010324.1797892356.6003.67.1", + "st": 1490923010324, + "et": 1490923010336, + "ss": [ + { + "si": 2, + "ps": 1, + "st": 1490923010327, + "et": 1490923010332, + "on": "com.a.eye.skywalking.test.cache.CacheService.findCacheWithException(java.lang.String)", + "ts": { + "span.layer": "rpc", + "peer.host": "127.0.0.1", + "component": "Motan", + "span.kind": "client", + "url": "motan://127.0.0.1:8002/default_rpc/com.a.eye.skywalking.test.cache.CacheService/1.0/referer" + }, + "tb": {}, + "ti": { + "peer.port": 8002 + }, + "lo": [ + { + "tm": 1490923010332, + "fi": { + "stack": "com.weibo.api.motan.exception.MotanBizException: error_message: provider call process error, status: 503, error_code: 30001,r\u003dnull\n\tat com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:62)\n\tat com.weibo.api.motan.rpc.AbstractProvider.call(AbstractProvider.java:47)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.process(OpenTracingFilter.java:94)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.processProviderTrace(OpenTracingFilter.java:148)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.filter(OpenTracingFilter.java:58)\n\tat com.weibo.api.motan.protocol.support.ProtocolFilterDecorator$2.call(ProtocolFilterDecorator.java:150)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8(ProviderMessageRouter.java:96)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8$accessor$PEWyOMYz(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter$auxiliary$s7ixnKeK.call(Unknown Source)\n\tat com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsInterceptor.intercept(ClassInstanceMethodsInterceptor.java:66)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.transport.ProviderProtectedMessageRouter.call(ProviderProtectedMessageRouter.java:79)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.handle(ProviderMessageRouter.java:91)\n\tat com.weibo.api.motan.transport.support.DefaultRpcHeartbeatFactory$HeartMessageHandleWrapper.handle(DefaultRpcHeartbeatFactory.java:82)\n\tat com.weibo.api.motan.transport.netty.NettyChannelHandler.processRequest(NettyChannelHandler.java:139)\n\tat com.weibo.api.motan.transport.netty.NettyChannelHandler.access$000(NettyChannelHandler.java:47)\n\tat com.weibo.api.motan.transport.netty.NettyChannelHandler$1.run(NettyChannelHandler.java:116)\n\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)\n\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)\n\tat java.lang.Thread.run(Thread.java:745)\nCaused by: java.lang.NullPointerException\n\tat com.a.eye.skywalking.test.cache.jedis.JedisServiceManager.findWithException(JedisServiceManager.java:49)\n\tat com.a.eye.skywalking.test.cache.CacheServiceImpl.findCacheWithException(CacheServiceImpl.java:46)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\n\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\n\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\n\tat java.lang.reflect.Method.invoke(Method.java:498)\n\tat com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:57)\n\t... 19 more\ncom.weibo.api.motan.exception.MotanBizException: error_message: provider call process error, status: 503, error_code: 30001,r\u003dnull\n\tat com.weibo.api.motan.rpc.DefaultProvider.invoke(DefaultProvider.java:62)\n\tat com.weibo.api.motan.rpc.AbstractProvider.call(AbstractProvider.java:47)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.process(OpenTracingFilter.java:94)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.processProviderTrace(OpenTracingFilter.java:148)\n\tat com.weibo.api.motan.filter.opentracing.OpenTracingFilter.filter(OpenTracingFilter.java:58)\n\tat com.weibo.api.motan.protocol.support.ProtocolFilterDecorator$2.call(ProtocolFilterDecorator.java:150)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8(ProviderMessageRouter.java:96)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call$original$doBagGo8$accessor$PEWyOMYz(ProviderMessageRouter.java)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter$auxiliary$s7ixnKeK.call(Unknown Source)\n\tat com.a.eye.skywalking.api.plugin.interceptor.enhance.ClassInstanceMethodsInterceptor.intercept(ClassInstanceMethodsInterceptor.java:66)\n\tat com.weibo.api.motan.transport.ProviderMessageRouter.call(ProviderMessageRouter.java)\n\tat com.weibo.api.", + "error.kind": "com.weibo.api.motan.exception.MotanBizException", + "event": "error", + "message": "error_message: provider call process error, status: 503, error_code: 30001,r\u003dnull" + } + } + ] + }, + { + "si": 1, + "ps": 0, + "st": 0, + "et": 1490923010332, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.findCacheWithException(java.lang.String)", + "ts": { + "requestId": "1563346086476644362" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1490923010324, + "et": 1490923010336, + "on": "/portal/cache/exception/test", + "ts": { + "span.layer": "http", + "component": "Tomcat", + "peer.host": "0:0:0:0:0:0:0:1", + "span.kind": "server", + "url": "http://localhost:38080/portal/cache/exception/test" + }, + "tb": { + "error": true + }, + "ti": { + "peer.port": 57888, + "status_code": 500 + }, + "lo": [] + } + ], + "ac": "portal-service", + "gt": [ + "Trace.1490923010324.1797892356.6003.67.2" + ] + } +] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/cache-service.json b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/cache-service.json new file mode 100644 index 000000000..2d8421131 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/cache-service.json @@ -0,0 +1,372 @@ +[ + { + "ts": "Segment.1490922929258.927784221.5991.27.1", + "st": 1490922929258, + "et": 1490922929261, + "rs": [ + { + "ts": "Segment.1490922929254.1797892356.6003.69.1", + "si": 2, + "ac": "portal-service", + "ph": "127.0.0.1:8002" + } + ], + "ss": [ + { + "si": 2, + "ps": 1, + "st": 1490922929258, + "et": 1490922929258, + "on": "Jedis/getClient", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 3, + "ps": 1, + "st": 1490922929258, + "et": 1490922929258, + "on": "Jedis/getClient", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 4, + "ps": 1, + "st": 1490922929258, + "et": 1490922929258, + "on": "Jedis/isConnected", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 5, + "ps": 1, + "st": 1490922929258, + "et": 1490922929259, + "on": "Jedis/ping", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 6, + "ps": 1, + "st": 1490922929259, + "et": 1490922929259, + "on": "Jedis/get", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client", + "db.statement": "get test" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 7, + "ps": 1, + "st": 1490922929261, + "et": 1490922929261, + "on": "H2/JDBI/PreparedStatement/executeQuery", + "ts": { + "db.instance": "dataSource", + "span.layer": "db", + "db.type": "sql", + "component": "H2", + "span.kind": "client", + "db.statement": "SELECT id,CACHE_VALUE, CACHE_KEY FROM CACHE_TABLE WHERE CACHE_KEY \u003d ?", + "peer.host": "localhost" + }, + "tb": {}, + "ti": { + "peer.port": -1 + }, + "lo": [] + }, + { + "si": 8, + "ps": 1, + "st": 1490922929261, + "et": 1490922929261, + "on": "H2/JDBI/Connection/close", + "ts": { + "db.instance": "dataSource", + "span.layer": "db", + "db.type": "sql", + "component": "H2", + "span.kind": "client", + "db.statement": "", + "peer.host": "localhost" + }, + "tb": {}, + "ti": { + "peer.port": -1 + }, + "lo": [] + }, + { + "si": 1, + "ps": 0, + "st": 0, + "et": 1490922929261, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)", + "ts": { + "requestId": "1563346001467539461" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1490922929258, + "et": 1490922929261, + "on": "com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)", + "ts": { + "span.layer": "rpc", + "component": "Motan", + "span.kind": "server" + }, + "tb": {}, + "ti": {}, + "lo": [] + } + ], + "ac": "cache-service", + "gt": [ + "Trace.1490922929254.1797892356.6003.69.2" + ] + }, + { + "ts": "Segment.1490922929298.927784221.5991.28.1", + "st": 1490922929298, + "et": 1490922929303, + "rs": [ + { + "ts": "Segment.1490922929254.1797892356.6003.69.1", + "si": 6, + "ac": "portal-service", + "ph": "127.0.0.1:8002" + } + ], + "ss": [ + { + "si": 2, + "ps": 1, + "st": 1490922929298, + "et": 1490922929298, + "on": "Jedis/getClient", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 3, + "ps": 1, + "st": 1490922929298, + "et": 1490922929298, + "on": "Jedis/getClient", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 4, + "ps": 1, + "st": 1490922929298, + "et": 1490922929298, + "on": "Jedis/isConnected", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 5, + "ps": 1, + "st": 1490922929298, + "et": 1490922929300, + "on": "Jedis/ping", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 6, + "ps": 1, + "st": 1490922929300, + "et": 1490922929300, + "on": "Jedis/set", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client", + "db.statement": "set test_NEW" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 7, + "ps": 1, + "st": 1490922929302, + "et": 1490922929302, + "on": "H2/JDBI/PreparedStatement/executeUpdate", + "ts": { + "db.instance": "dataSource", + "span.layer": "db", + "db.type": "sql", + "component": "H2", + "span.kind": "client", + "db.statement": "INSERT INTO CACHE_TABLE(CACHE_VALUE, CACHE_KEY) VALUES(?, ?)", + "peer.host": "localhost" + }, + "tb": {}, + "ti": { + "peer.port": -1 + }, + "lo": [] + }, + { + "si": 8, + "ps": 1, + "st": 1490922929303, + "et": 1490922929303, + "on": "H2/JDBI/Connection/close", + "ts": { + "db.instance": "dataSource", + "span.layer": "db", + "db.type": "sql", + "component": "H2", + "span.kind": "client", + "db.statement": "", + "peer.host": "localhost" + }, + "tb": {}, + "ti": { + "peer.port": -1 + }, + "lo": [] + }, + { + "si": 1, + "ps": 0, + "st": 0, + "et": 1490922929303, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", + "ts": { + "requestId": "1563346001510531078" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1490922929298, + "et": 1490922929303, + "on": "com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", + "ts": { + "span.layer": "rpc", + "component": "Motan", + "span.kind": "server" + }, + "tb": {}, + "ti": {}, + "lo": [] + } + ], + "ac": "cache-service", + "gt": [ + "Trace.1490922929254.1797892356.6003.69.2" + ] + } +] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/persistence-service.json b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/persistence-service.json new file mode 100644 index 000000000..28854981d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/persistence-service.json @@ -0,0 +1,102 @@ +[ + { + "ts": "Segment.1490922929274.1382198130.5997.47.1", + "st": 1490922929274, + "et": 1490922929288, + "rs": [ + { + "ts": "Segment.1490922929254.1797892356.6003.69.1", + "si": 4, + "ac": "portal-service", + "ph": "10.128.35.80:20880" + } + ], + "ss": [ + { + "si": 2, + "ps": 1, + "st": 1490922929279, + "et": 1490922929280, + "on": "Mysql/JDBI/PreparedStatement/executeQuery", + "ts": { + "db.instance": "skywalking-test", + "span.layer": "db", + "db.type": "sql", + "component": "Mysql", + "span.kind": "client", + "db.statement": "SELECT * FROM information_schema.tables WHERE table_schema \u003d ? AND table_name \u003d ? LIMIT 1;", + "peer.host": "127.0.0.1" + }, + "tb": {}, + "ti": { + "peer.port": 3307 + }, + "lo": [] + }, + { + "si": 3, + "ps": 1, + "st": 1490922929284, + "et": 1490922929284, + "on": "Mysql/JDBI/PreparedStatement/executeQuery", + "ts": { + "db.instance": "skywalking-test", + "span.layer": "db", + "db.type": "sql", + "component": "Mysql", + "span.kind": "client", + "db.statement": "SELECT id, CACHE_KEY, CACHE_VALUE FROM CACHE_TABLE WHERE CACHE_KEY\u003d ?", + "peer.host": "127.0.0.1" + }, + "tb": {}, + "ti": { + "peer.port": 3307 + }, + "lo": [] + }, + { + "si": 1, + "ps": 0, + "st": 1490922929276, + "et": 1490922929287, + "on": "com.a.eye.skywalking.test.persistence.PersistenceService.query(String)", + "ts": { + "span.layer": "rpc", + "component": "Dubbo", + "peer.host": "10.128.35.80", + "span.kind": "server", + "url": "rest://10.128.35.80:20880/com.a.eye.skywalking.test.persistence.PersistenceService.query(String)" + }, + "tb": {}, + "ti": { + "peer.port": 20880 + }, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1490922929274, + "et": 1490922929288, + "on": "/persistence/query", + "ts": { + "span.layer": "http", + "component": "Tomcat", + "peer.host": "10.128.35.80", + "span.kind": "server", + "url": "http://10.128.35.80:20880/persistence/query" + }, + "tb": {}, + "ti": { + "peer.port": 57818, + "status_code": 200 + }, + "lo": [] + } + ], + "ac": "persistence-service", + "gt": [ + "Trace.1490922929254.1797892356.6003.69.2" + ] + } +] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/portal-service.json b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/portal-service.json new file mode 100644 index 000000000..c75caee8a --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/portal-service.json @@ -0,0 +1,136 @@ +[ + { + "ts": "Segment.1490922929254.1797892356.6003.69.1", + "st": 1490922929254, + "et": 1490922929306, + "ss": [ + { + "si": 2, + "ps": 1, + "st": 1490922929257, + "et": 1490922929262, + "on": "com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)", + "ts": { + "span.layer": "rpc", + "peer.host": "127.0.0.1", + "component": "Motan", + "span.kind": "client", + "url": "motan://127.0.0.1:8002/default_rpc/com.a.eye.skywalking.test.cache.CacheService/1.0/referer" + }, + "tb": {}, + "ti": { + "peer.port": 8002 + }, + "lo": [] + }, + { + "si": 1, + "ps": 0, + "st": 0, + "et": 1490922929262, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)", + "ts": { + "requestId": "1563346001467539461" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 4, + "ps": 3, + "st": 1490922929262, + "et": 1490922929293, + "on": "/persistence/query", + "ts": { + "span.layer": "http", + "peer.host": "10.128.35.80", + "component": "HttpClient", + "span.kind": "client", + "url": "http://10.128.35.80:20880/persistence/query" + }, + "tb": {}, + "ti": { + "peer.port": 20880, + "status_code": 200 + }, + "lo": [] + }, + { + "si": 3, + "ps": 0, + "st": 1490922929262, + "et": 1490922929297, + "on": "com.a.eye.skywalking.test.persistence.PersistenceService.query(String)", + "ts": { + "span.layer": "rpc", + "component": "Dubbo", + "peer.host": "10.128.35.80", + "span.kind": "client", + "url": "rest://10.128.35.80:20880/com.a.eye.skywalking.test.persistence.PersistenceService.query(String)" + }, + "tb": {}, + "ti": { + "peer.port": 20880 + }, + "lo": [] + }, + { + "si": 6, + "ps": 5, + "st": 1490922929297, + "et": 1490922929303, + "on": "com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", + "ts": { + "span.layer": "rpc", + "peer.host": "127.0.0.1", + "component": "Motan", + "span.kind": "client", + "url": "motan://127.0.0.1:8002/default_rpc/com.a.eye.skywalking.test.cache.CacheService/1.0/referer" + }, + "tb": {}, + "ti": { + "peer.port": 8002 + }, + "lo": [] + }, + { + "si": 5, + "ps": 0, + "st": 0, + "et": 1490922929303, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", + "ts": { + "requestId": "1563346001510531078" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1490922929254, + "et": 1490922929306, + "on": "/portal/", + "ts": { + "span.layer": "http", + "component": "Tomcat", + "peer.host": "0:0:0:0:0:0:0:1", + "span.kind": "server", + "url": "http://localhost:38080/portal/" + }, + "tb": {}, + "ti": { + "peer.port": 57837, + "status_code": 200 + }, + "lo": [] + } + ], + "ac": "portal-service", + "gt": [ + "Trace.1490922929254.1797892356.6003.69.2" + ] + } +] \ No newline at end of file diff --git a/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/special/special.json b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/special/special.json new file mode 100644 index 000000000..b1e00ef64 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/special/special.json @@ -0,0 +1,187 @@ +[ + { + "ts": "Segment.1491277162066.18986177.70531.27.1", + "st": 1491277162066, + "et": 1491277165743, + "rs": [ + { + "ts": "Segment.1491277147441.-1562443425.70539.65.1", + "si": 6, + "ac": "portal-service", + "ph": "127.0.0.1:8002" + } + ], + "ss": [ + { + "si": 2, + "ps": 1, + "st": 1491277162141, + "et": 1491277162144, + "on": "Jedis/getClient", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 3, + "ps": 1, + "st": 1491277162144, + "et": 1491277162147, + "on": "Jedis/getClient", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 4, + "ps": 1, + "st": 1491277162147, + "et": 1491277162147, + "on": "Jedis/isConnected", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 5, + "ps": 1, + "st": 1491277162147, + "et": 1491277164410, + "on": "Jedis/ping", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 6, + "ps": 1, + "st": 1491277164420, + "et": 1491277165738, + "on": "Jedis/set", + "ts": { + "span.layer": "db", + "component": "Redis", + "db.type": "Redis", + "peer.host": "127.0.0.1", + "span.kind": "client", + "db.statement": "set test_NEW" + }, + "tb": {}, + "ti": { + "peer.port": 6379 + }, + "lo": [] + }, + { + "si": 7, + "ps": 1, + "st": 1491277165741, + "et": 1491277165743, + "on": "H2/JDBI/PreparedStatement/executeUpdate", + "ts": { + "db.instance": "dataSource", + "span.layer": "db", + "db.type": "sql", + "component": "H2", + "span.kind": "client", + "db.statement": "INSERT INTO CACHE_TABLE(CACHE_VALUE, CACHE_KEY) VALUES(?, ?)", + "peer.host": "localhost" + }, + "tb": {}, + "ti": { + "peer.port": -1 + }, + "lo": [] + }, + { + "si": 8, + "ps": 1, + "st": 1491277165743, + "et": 1491277165743, + "on": "H2/JDBI/Connection/close", + "ts": { + "db.instance": "dataSource", + "span.layer": "db", + "db.type": "sql", + "component": "H2", + "span.kind": "client", + "db.statement": "", + "peer.host": "localhost" + }, + "tb": {}, + "ti": { + "peer.port": -1 + }, + "lo": [] + }, + { + "si": 1, + "ps": 0, + "st": 1491277162066, + "et": 1491277165743, + "on": "Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", + "ts": { + "requestId": "1563717428890828802" + }, + "tb": {}, + "ti": {}, + "lo": [] + }, + { + "si": 0, + "ps": -1, + "st": 1491277162066, + "et": 1491277165743, + "on": "com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)", + "ts": { + "span.layer": "rpc", + "component": "Motan", + "span.kind": "server" + }, + "tb": {}, + "ti": {}, + "lo": [] + } + ], + "ac": "cache-service", + "gt": [ + "Trace.1491277147443.-1562443425.70539.65.2" + ] + } +] \ No newline at end of file diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java index b50468bdc..1bc7c8f3c 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/LogData.java @@ -12,14 +12,14 @@ import java.util.Map; */ public class LogData { @Expose - @SerializedName(value="ti") + @SerializedName(value="tm") private long time; @Expose @SerializedName(value="fi") - private Map fields; + private Map fields; - LogData(long time, Map fields) { + LogData(long time, Map fields) { this.time = time; if(fields == null){ throw new NullPointerException(); diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java index 57573fd4e..9ba226cf4 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/Span.java @@ -57,8 +57,16 @@ public class Span{ * {@see https://github.com/opentracing/specification/blob/master/specification.md#set-a-span-tag} */ @Expose - @SerializedName(value="ta") - private final Map tags; + @SerializedName(value="ts") + private final Map tagsWithStr; + + @Expose + @SerializedName(value="tb") + private final Map tagsWithBool; + + @Expose + @SerializedName(value="ti") + private final Map tagsWithInt; /** * Log is a concept from OpenTracing spec. @@ -151,7 +159,9 @@ public class Span{ * Create a new/empty span. */ public Span() { - tags = new HashMap(); + tagsWithStr = new HashMap(5); + tagsWithBool = new HashMap(1); + tagsWithInt = new HashMap(2); logs = new LinkedList(); } @@ -194,17 +204,17 @@ public class Span{ * @return this Span instance, for chaining */ public final Span setTag(String key, String value) { - tags.put(key, value); + tagsWithStr.put(key, value); return this; } public final Span setTag(String key, boolean value) { - tags.put(key, value); + tagsWithBool.put(key, value); return this; } - public final Span setTag(String key, Number value) { - tags.put(key, value); + public final Span setTag(String key, Integer value) { + tagsWithInt.put(key, value); return this; } @@ -214,7 +224,11 @@ public class Span{ * @return */ public final Map getTags() { - return Collections.unmodifiableMap(tags); + Map tags = new HashMap(); + tags.putAll(tagsWithStr); + tags.putAll(tagsWithBool); + tags.putAll(tagsWithInt); + return tags; } /** @@ -223,8 +237,16 @@ public class Span{ * @param key the given tag key. * @return tag value. */ - public Object getTag(String key) { - return tags.get(key); + public String getStrTag(String key) { + return tagsWithStr.get(key); + } + + public Boolean getBoolTag(String key) { + return tagsWithBool.get(key); + } + + public Integer getIntTag(String key) { + return tagsWithInt.get(key); } /** @@ -250,7 +272,7 @@ public class Span{ * @return the Span, for chaining * @see Span#log(String) */ - public Span log(Map fields) { + public Span log(Map fields) { logs.add(new LogData(System.currentTimeMillis(), fields)); return this; } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceId/DistributedTraceId.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceId/DistributedTraceId.java index b64cffaea..9730a55a6 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceId/DistributedTraceId.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceId/DistributedTraceId.java @@ -24,6 +24,13 @@ public abstract class DistributedTraceId { return id; } + /** + * Compare the two DistributedTraceId by its {@link #id}, + * even these two DistributedTraceIds are not the same instances. + * + * @param o target DistributedTraceId + * @return return if they have the same {@link #id} + */ @Override public boolean equals(Object o) { if (this == o) 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 d5c2edbcf..65a8aae22 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 @@ -26,21 +26,21 @@ public class TraceSegment { * Every segment has its unique-global-id. */ @Expose - @SerializedName(value="ts") + @SerializedName(value = "ts") private String traceSegmentId; /** * The start time of this trace segment. */ @Expose - @SerializedName(value="st") + @SerializedName(value = "st") private long startTime; /** * The end time of this trace segment. */ @Expose - @SerializedName(value="et") + @SerializedName(value = "et") private long endTime; /** @@ -50,7 +50,7 @@ public class TraceSegment { * at this moment, we use this {@link #refs} to link them. */ @Expose - @SerializedName(value="rs") + @SerializedName(value = "rs") private List refs; /** @@ -59,7 +59,7 @@ public class TraceSegment { * All active spans are hold and controlled by "skywalking-api" module. */ @Expose - @SerializedName(value="ss") + @SerializedName(value = "ss") private List spans; /** @@ -69,7 +69,7 @@ public class TraceSegment { * e.g. account_app, billing_app */ @Expose - @SerializedName(value="ac") + @SerializedName(value = "ac") private String applicationCode; /** @@ -86,12 +86,21 @@ public class TraceSegment { * multi {@link TraceSegment}s, only using {@link #refs} is not enough for analysis and ui. */ @Expose - @SerializedName(value="gt") + @SerializedName(value = "gt") private DistributedTraceIds relatedGlobalTraces; /** - * Create a trace segment, by given segmentId. - * This segmentId is generated by TraceSegmentRef, AKA, from tracer/agent module. + * The sampled is a flag, which represent, when this {@link TraceSegment} finished, it need to be send + * to Collector. + * + * Its value depends on SamplingService. True, by default. + * + * This value is not serialized. + */ + private boolean sampled; + + /** + * Create a trace segment, by the given applicationCode. */ public TraceSegment(String applicationCode) { this(); @@ -99,7 +108,9 @@ public class TraceSegment { } /** - * Create a default/empty trace segment + * Create a default/empty trace segment, + * with current time as start time, + * and generate a new segment id. */ public TraceSegment() { this.startTime = System.currentTimeMillis(); @@ -107,6 +118,7 @@ public class TraceSegment { this.spans = new LinkedList(); this.relatedGlobalTraces = new DistributedTraceIds(); this.relatedGlobalTraces.append(new NewDistributedTraceId()); + this.sampled = true; } /** @@ -118,11 +130,16 @@ public class TraceSegment { if (refs == null) { refs = new LinkedList(); } - if(!refs.contains(refSegment)){ + if (!refs.contains(refSegment)) { refs.add(refSegment); } } + /** + * Establish the line between this segment and all relative global trace ids. + * + * @param distributedTraceIds multi global trace ids. @see {@link DistributedTraceId} + */ public void relatedGlobalTraces(List distributedTraceIds) { if (distributedTraceIds == null || distributedTraceIds.size() == 0) { return; @@ -183,6 +200,14 @@ public class TraceSegment { return applicationCode; } + public boolean isSampled() { + return sampled; + } + + public void setSampled(boolean sampled) { + this.sampled = sampled; + } + @Override public String toString() { return "TraceSegment{" + diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegmentRef.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegmentRef.java index e900a7182..0a8a6ab21 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegmentRef.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/TraceSegmentRef.java @@ -86,25 +86,18 @@ public class TraceSegmentRef{ '}'; } - @Override public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; - TraceSegmentRef ref = (TraceSegmentRef)o; + TraceSegmentRef that = (TraceSegmentRef) o; - if (traceSegmentId != null ? !traceSegmentId.equals(ref.traceSegmentId) : ref.traceSegmentId != null) - return false; - return applicationCode != null ? applicationCode.equals(ref.applicationCode) : ref.applicationCode == null; + return traceSegmentId != null ? traceSegmentId.equals(that.traceSegmentId) : that.traceSegmentId == null; } @Override public int hashCode() { - int result = traceSegmentId != null ? traceSegmentId.hashCode() : 0; - result = 31 * result + (applicationCode != null ? applicationCode.hashCode() : 0); - return result; + return traceSegmentId != null ? traceSegmentId.hashCode() : 0; } } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/AbstractTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/AbstractTag.java index 9ffeea26e..e023ac274 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/AbstractTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/AbstractTag.java @@ -7,7 +7,7 @@ import com.a.eye.skywalking.trace.Span; * All span's tags inherit from {@link AbstractTag}, * which provide an easy way to * {@link Span#setTag(String, String)} , - * {@link Span#setTag(String, Number)} , + * {@link Span#setTag(String, Integer)} * {@link Span#setTag(String, boolean)} , * * Created by wusheng on 2017/2/17. diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java index 9f3a780f2..20c83af35 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/BooleanTag.java @@ -30,13 +30,11 @@ public class BooleanTag extends AbstractTag { */ @Override public Boolean get(Span span) { - Object tagValue = span.getTag(super.key); + Boolean tagValue = span.getBoolTag(super.key); if (tagValue == null) { return defaultValue; - } else if (tagValue instanceof Boolean) { - return (Boolean) tagValue; } else { - return Boolean.valueOf(tagValue.toString()); + return tagValue; } } } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java index 8af1fec9a..cc6b36b2e 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/IntTag.java @@ -26,13 +26,11 @@ public class IntTag extends AbstractTag { */ @Override public Integer get(Span span) { - Object tagValue = span.getTag(super.key); + Integer tagValue = span.getIntTag(super.key); if (tagValue == null) { return null; - } else if(tagValue instanceof Integer){ - return (Integer)tagValue; - }else { - return Integer.valueOf(tagValue.toString()); + } else { + return tagValue; } } } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java index ebd93a607..b7e8f6585 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/ShortTag.java @@ -14,7 +14,7 @@ public class ShortTag extends AbstractTag { @Override public void set(Span span, Short tagValue) { - span.setTag(super.key, tagValue); + span.setTag(super.key, (int)tagValue.shortValue()); } /** @@ -25,12 +25,10 @@ public class ShortTag extends AbstractTag { * @return tag value */ @Override public Short get(Span span) { - Object tagValue = span.getTag(super.key); + Integer tagValue = span.getIntTag(super.key); if (tagValue == null) { return null; - } else if(tagValue instanceof Short){ - return (Short)tagValue; - }else { + } else { return Short.valueOf(tagValue.toString()); } } diff --git a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/StringTag.java b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/StringTag.java index 229521287..e76825c9c 100644 --- a/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/StringTag.java +++ b/skywalking-commons/skywalking-trace/src/main/java/com/a/eye/skywalking/trace/tag/StringTag.java @@ -19,6 +19,6 @@ public class StringTag extends AbstractTag { } @Override public String get(Span span) { - return (String)span.getTag(super.key); + return span.getStrTag(super.key); } } diff --git a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/LogDataTestCase.java b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/LogDataTestCase.java index 316c278ac..f2f616d22 100644 --- a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/LogDataTestCase.java +++ b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/LogDataTestCase.java @@ -11,7 +11,7 @@ import org.junit.Test; public class LogDataTestCase { @Test public void testHoldValue(){ - Map fields = new HashMap(); + Map fields = new HashMap(); LogData logData = new LogData(123L, fields); Assert.assertEquals(123, logData.getTime()); diff --git a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/tag/TagsTest.java b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/tag/TagsTest.java index 3bb2b4d55..7cb908ffc 100644 --- a/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/tag/TagsTest.java +++ b/skywalking-commons/skywalking-trace/src/test/java/com/a/eye/skywalking/trace/tag/TagsTest.java @@ -12,13 +12,13 @@ public class TagsTest { public void testLayer(){ Span span = new Span(1, "/test"); Tags.SPAN_LAYER.asDB(span); - Assert.assertEquals("db", span.getTag("span.layer")); + Assert.assertEquals("db", span.getStrTag("span.layer")); Tags.SPAN_LAYER.asRPCFramework(span); - Assert.assertEquals("rpc", span.getTag("span.layer")); + Assert.assertEquals("rpc", span.getStrTag("span.layer")); Tags.SPAN_LAYER.asHttp(span); - Assert.assertEquals("http", span.getTag("span.layer")); + Assert.assertEquals("http", span.getStrTag("span.layer")); } @Test diff --git a/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/api/util/ConfigInitializer.java b/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/api/util/ConfigInitializer.java index 7a079b81d..b7a14fb2c 100644 --- a/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/api/util/ConfigInitializer.java +++ b/skywalking-commons/skywalking-util/src/main/java/com/a/eye/skywalking/api/util/ConfigInitializer.java @@ -19,20 +19,24 @@ public class ConfigInitializer { initNextLevel(properties, rootConfigType, new ConfigDesc()); } - private static void initNextLevel(Properties properties, Class recentConfigType, ConfigDesc parentDesc) throws IllegalArgumentException, IllegalAccessException { + private static void initNextLevel(Properties properties, Class recentConfigType, + ConfigDesc parentDesc) throws IllegalArgumentException, IllegalAccessException { for (Field field : recentConfigType.getFields()) { if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) { String configKey = (parentDesc + "." + field.getName()).toLowerCase(); String value = properties.getProperty(configKey); if (value != null) { - if (field.getType().equals(int.class)) + Class type = field.getType(); + if (type.equals(int.class)) field.set(null, Integer.valueOf(value)); - if (field.getType().equals(String.class)) + else if (type.equals(String.class)) field.set(null, value); - if (field.getType().equals(long.class)) + else if (type.equals(long.class)) field.set(null, Long.valueOf(value)); - if (field.getType().equals(boolean.class)) + else if (type.equals(boolean.class)) field.set(null, Boolean.valueOf(value)); + else if (type.isEnum()) + field.set(null, Enum.valueOf((Class)type, value.toUpperCase())); } } } @@ -44,7 +48,6 @@ public class ConfigInitializer { } } - class ConfigDesc { private LinkedList descs = new LinkedList(); diff --git a/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml b/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml index 014bb63e4..0d5b89395 100644 --- a/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml +++ b/skywalking-sniffer/skywalking-agent/dependency-reduced-pom.xml @@ -36,23 +36,20 @@ + + + com.lmax:* + org.apache.httpcomponents:* + commons-logging:* + commons-codec:* + *:gson + + ${shade.net.bytebuddy.source} ${shade.net.bytebuddy.target} - - ${shade.com.lmax.disruptor.source} - ${shade.com.lmax.disruptor.target} - - - ${shade.com.google.source} - ${shade.com.google.target} - - - ${shade.org.apache.source} - ${shade.org.apache.target} - @@ -61,6 +58,12 @@ + + com.google.code.gson + gson + 2.8.0 + compile + junit junit @@ -120,17 +123,11 @@ - org.apache - com.a.eye.skywalking.dependencies - com.google ${shade.package}.${shade.net.bytebuddy.source} - ${shade.package}.${shade.com.lmax.disruptor.source} + com.a.eye.skywalking.dependencies UTF-8 net.bytebuddy - ${shade.package}.${shade.com.google.source} - ${shade.package}.${shade.org.apache.source} com.a.eye.skywalking.agent.SkyWalkingAgent - com.lmax.disruptor diff --git a/skywalking-sniffer/skywalking-agent/pom.xml b/skywalking-sniffer/skywalking-agent/pom.xml index d807e4a1f..fcc5b7fe8 100644 --- a/skywalking-sniffer/skywalking-agent/pom.xml +++ b/skywalking-sniffer/skywalking-agent/pom.xml @@ -21,13 +21,6 @@ com.a.eye.skywalking.dependencies net.bytebuddy ${shade.package}.${shade.net.bytebuddy.source} - com.lmax.disruptor - ${shade.package}.${shade.com.lmax.disruptor.source} - - com.google - ${shade.package}.${shade.com.google.source} - org.apache - ${shade.package}.${shade.org.apache.source} @@ -123,23 +116,20 @@ + + + com.lmax:* + org.apache.httpcomponents:* + commons-logging:* + commons-codec:* + *:gson + + ${shade.net.bytebuddy.source} ${shade.net.bytebuddy.target} - - ${shade.com.lmax.disruptor.source} - ${shade.com.lmax.disruptor.target} - - - ${shade.com.google.source} - ${shade.com.google.target} - - - ${shade.org.apache.source} - ${shade.org.apache.target} - diff --git a/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java b/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java index ea6ba500e..5d9508345 100644 --- a/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java +++ b/skywalking-sniffer/skywalking-agent/src/main/java/com/a/eye/skywalking/agent/SkyWalkingAgent.java @@ -2,16 +2,15 @@ package com.a.eye.skywalking.agent; import com.a.eye.skywalking.agent.junction.SkyWalkingEnhanceMatcher; import com.a.eye.skywalking.api.boot.ServiceManager; -import com.a.eye.skywalking.api.conf.Config; import com.a.eye.skywalking.api.conf.SnifferConfigInitializer; import com.a.eye.skywalking.api.logging.EasyLogResolver; import com.a.eye.skywalking.api.plugin.AbstractClassEnhancePluginDefine; import com.a.eye.skywalking.api.plugin.PluginBootstrap; -import com.a.eye.skywalking.api.plugin.PluginFinder; import com.a.eye.skywalking.api.plugin.PluginException; - +import com.a.eye.skywalking.api.plugin.PluginFinder; import com.a.eye.skywalking.logging.ILog; import com.a.eye.skywalking.logging.LogManager; +import java.lang.instrument.Instrumentation; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.NamedElement; import net.bytebuddy.description.type.TypeDescription; @@ -19,10 +18,6 @@ import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.utility.JavaModule; -import java.io.File; -import java.lang.instrument.Instrumentation; -import java.net.URL; - import static net.bytebuddy.matcher.ElementMatchers.isInterface; import static net.bytebuddy.matcher.ElementMatchers.not; @@ -50,7 +45,7 @@ public class SkyWalkingAgent { public static void premain(String agentArgs, Instrumentation instrumentation) throws PluginException { logger = LogManager.getLogger(SkyWalkingAgent.class); - initConfig(); + SnifferConfigInitializer.initialize(); final PluginFinder pluginFinder = new PluginFinder(new PluginBootstrap().loadPlugins()); @@ -92,33 +87,4 @@ public class SkyWalkingAgent { private static ElementMatcher.Junction enhanceClassMatcher(PluginFinder pluginFinder) { return new SkyWalkingEnhanceMatcher(pluginFinder); } - - private static String generateLocationPath() { - return SkyWalkingAgent.class.getName().replaceAll("\\.", "/") + ".class"; - } - - - private static void initConfig() { - Config.SkyWalking.IS_PREMAIN_MODE = true; - Config.SkyWalking.AGENT_BASE_PATH = initAgentBasePath(); - - SnifferConfigInitializer.initialize(); - } - - /** - * Try to allocate the skywalking-agent.jar - * Some config files or output resources are from this path. - * - * @return the path, where the skywalking-agent.jar is. - */ - private static String initAgentBasePath() { - try { - String urlString = SkyWalkingAgent.class.getClassLoader().getSystemClassLoader().getResource(generateLocationPath()).toString(); - urlString = urlString.substring(urlString.indexOf("file:"), urlString.indexOf('!')); - return new File(new URL(urlString).getFile()).getParentFile().getAbsolutePath(); - } catch (Exception e) { - logger.error("Failed to init config .", e); - return ""; - } - } } diff --git a/skywalking-sniffer/skywalking-api/pom.xml b/skywalking-sniffer/skywalking-api/pom.xml index f57880769..eab817765 100644 --- a/skywalking-sniffer/skywalking-api/pom.xml +++ b/skywalking-sniffer/skywalking-api/pom.xml @@ -17,6 +17,15 @@ UTF-8 9.4.2.v20170220 + + com.a.eye.skywalking.dependencies + com.lmax.disruptor + ${shade.package}.${shade.com.lmax.disruptor.source} + + com.google + ${shade.package}.${shade.com.google.source} + org.apache + ${shade.package}.${shade.org.apache.source} @@ -74,6 +83,40 @@ ${project.build.sourceEncoding} + + org.apache.maven.plugins + maven-shade-plugin + 2.4.1 + + + package + + shade + + + + + net.bytebuddy:byte-buddy:jar: + + + + + ${shade.com.lmax.disruptor.source} + ${shade.com.lmax.disruptor.target} + + + ${shade.com.google.source} + ${shade.com.google.target} + + + ${shade.org.apache.source} + ${shade.org.apache.target} + + + + + + diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceManager.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceManager.java index 1ff1c9820..ed1693512 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceManager.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/boot/ServiceManager.java @@ -17,36 +17,41 @@ public enum ServiceManager { INSTANCE; private static ILog logger = LogManager.getLogger(StatusBootService.class); - private volatile boolean isStarted = false; - private Map bootedServices; + private Map bootedServices = new HashMap(); public void boot() { - if (!isStarted) { + bootedServices = loadAllServices(); + startup(); + } + + private Map loadAllServices() { + HashMap bootedServices = new HashMap(); + Iterator serviceIterator = load().iterator(); + while (serviceIterator.hasNext()) { + BootService bootService = serviceIterator.next(); + bootedServices.put(bootService.getClass(), bootService); + } + return bootedServices; + } + + private void startup() { + for (BootService service : bootedServices.values()) { try { - bootedServices = new HashMap(); - Iterator serviceIterator = load().iterator(); - while (serviceIterator.hasNext()) { - BootService bootService = serviceIterator.next(); - try { - bootService.bootUp(); - bootedServices.put(bootService.getClass(), bootService); - } catch (Throwable e) { - logger.error(e, "ServiceManager try to start [{}] fail.", bootService.getClass().getName()); - } - } - } finally { - isStarted = true; + service.bootUp(); + } catch (Throwable e) { + logger.error(e, "ServiceManager try to start [{}] fail.", service.getClass().getName()); } } } /** * Find a {@link BootService} implementation, which is already started. + * * @param serviceClass class name. * @param {@link BootService} implementation class. * @return {@link BootService} instance */ - public T findService(Class serviceClass){ + public T findService(Class serviceClass) { return (T)bootedServices.get(serviceClass); } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClient.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClient.java index 63e6a8b94..18a36f86e 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClient.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/CollectorClient.java @@ -1,11 +1,21 @@ package com.a.eye.skywalking.api.client; import com.a.eye.skywalking.api.boot.ServiceManager; +import com.a.eye.skywalking.api.conf.Config; import com.a.eye.skywalking.api.queue.TraceSegmentProcessQueue; import com.a.eye.skywalking.logging.ILog; import com.a.eye.skywalking.logging.LogManager; +import com.a.eye.skywalking.trace.SegmentsMessage; import com.a.eye.skywalking.trace.TraceSegment; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.IOException; import java.util.List; +import java.util.Random; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy; import org.apache.http.impl.client.HttpClients; @@ -20,12 +30,15 @@ import org.apache.http.impl.client.HttpClients; public class CollectorClient implements Runnable { private static ILog logger = LogManager.getLogger(CollectorClient.class); private static long SLEEP_TIME_MILLIS = 500; - private CloseableHttpClient httpclient; + private String[] serverList; + private volatile int selectedServer = -1; public CollectorClient() { - httpclient = HttpClients.custom() - .setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy()) - .build(); + serverList = Config.Collector.SERVERS.split(","); + Random r = new Random(); + if (serverList.length > 0) { + selectedServer = r.nextInt(serverList.length); + } } @Override @@ -36,13 +49,19 @@ public class CollectorClient implements Runnable { TraceSegmentProcessQueue segmentProcessQueue = ServiceManager.INSTANCE.findService(TraceSegmentProcessQueue.class); List cachedTraceSegments = segmentProcessQueue.getCachedTraceSegments(); if (cachedTraceSegments.size() > 0) { + SegmentsMessage message = null; + int count = 0; for (TraceSegment segment : cachedTraceSegments) { - /** - * No receiver found, means collector server is off-line. - */ - sleepTime = SLEEP_TIME_MILLIS * 10; - break; + if (message == null) { + message = new SegmentsMessage(); + } + message.append(segment); + if (count == Config.Collector.BATCH_SIZE) { + sendToCollector(message); + message = null; + } } + sendToCollector(message); } else { sleepTime = SLEEP_TIME_MILLIS; } @@ -56,6 +75,66 @@ public class CollectorClient implements Runnable { } } + /** + * Send the given {@link SegmentsMessage} to collector. + * + * @param message to be send. + */ + private void sendToCollector(SegmentsMessage message) throws RESTResponseStatusError, IOException { + if (message == null) { + return; + } + Gson gson = new GsonBuilder() + .excludeFieldsWithoutExposeAnnotation() + .create(); + String messageJson = gson.toJson(message); + CloseableHttpClient httpClient = HttpClients.custom().build(); + try { + HttpPost httpPost = ready2Send(messageJson); + if (httpPost != null) { + CloseableHttpResponse httpResponse = httpClient.execute(httpPost); + int statusCode = httpResponse.getStatusLine().getStatusCode(); + if (200 != statusCode) { + findBackupServer(); + throw new RESTResponseStatusError(statusCode); + } + } + } catch (IOException e) { + findBackupServer(); + throw e; + }finally { + httpClient.close(); + } + } + + /** + * Prepare the given message for HTTP Post service. + * + * @param messageJson to send + * @return {@link HttpPost}, when is ready to send. otherwise, null. + */ + private HttpPost ready2Send(String messageJson) { + if (selectedServer == -1) { + //no available server + return null; + } + HttpPost post = new HttpPost("http://" + serverList[selectedServer] + Config.Collector.SERVICE_NAME); + StringEntity entity = new StringEntity(messageJson, ContentType.APPLICATION_JSON); + post.setEntity(entity); + + return post; + } + + /** + * Choose the next server in {@link #serverList}, by moving {@link #selectedServer}. + */ + private void findBackupServer() { + selectedServer++; + if (selectedServer == serverList.length) { + selectedServer = 0; + } + } + /** * Try to sleep, and ignore the {@link InterruptedException} * diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/RESTResponseStatusError.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/RESTResponseStatusError.java new file mode 100644 index 000000000..db74873bd --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/client/RESTResponseStatusError.java @@ -0,0 +1,13 @@ +package com.a.eye.skywalking.api.client; + +/** + * The RESTResponseStatusError represents the REST-Service client got an unexpected response code. + * Most likely, the response code is not 200. + * + * @author wusheng + */ +class RESTResponseStatusError extends Exception { + RESTResponseStatusError(int responseCode){ + super("Unexpected service response code: " + responseCode); + } +} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java index e2cfae6d0..96aaafa13 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Config.java @@ -1,32 +1,84 @@ package com.a.eye.skywalking.api.conf; +import com.a.eye.skywalking.api.logging.LogLevel; +import com.a.eye.skywalking.api.logging.WriterFactory; + +/** + * This is the core config in sniffer agent. + * + * @author wusheng + */ public class Config { - public static class SkyWalking { + public static class Agent { + /** + * Application code is showed in sky-walking-ui. + * Suggestion: set a unique name for each application, one application's nodes share the same code. + */ public static String APPLICATION_CODE = ""; - public static boolean IS_PREMAIN_MODE = false; - - public static String AGENT_BASE_PATH = ""; + /** + * One, means sampling OFF. + * Greater than one, select one trace in every N traces. + * Zero and negative number are illegal. + */ + public static int SAMPLING_CYCLE = 1; + } + public static class Collector { + /** + * Collector REST-Service address. + * e.g. + * SERVERS="127.0.0.1:8080" for single collector node. + * SERVERS="10.2.45.126:8080,10.2.45.127:7600" for multi collector nodes. + */ public static String SERVERS = ""; + /** + * Collector receive segments REST-Service name. + */ public static String SERVICE_NAME = "/segments"; + + /** + * The max size to send traces per rest-service call. + */ + public static int BATCH_SIZE = 50; } - public static class Disruptor{ - public static int BUFFER_SIZE = 512; + public static class Buffer { + /** + * The in-memory buffer size. Based on Disruptor, this value must be 2^n. + * + * @see {https://github.com/LMAX-Exchange/disruptor} + */ + public static int SIZE = 512; } - public static class Logging { - // log文件名 - public static String LOG_FILE_NAME = "skywalking-api.log"; - // log文件文件夹名字 - public static String LOG_DIR_NAME = "logs"; - // 最大文件大小 - public static int MAX_LOG_FILE_LENGTH = 300 * 1024 * 1024; - // skywalking 系统错误文件日志 - public static String SYSTEM_ERROR_LOG_FILE_NAME = "skywalking-api-error.log"; + /** + * Log file name. + */ + public static String FILE_NAME = "skywalking-api.log"; + + /** + * Log files directory. + * Default is blank string, means, use "system.out" to output logs. + * + * @see {@link WriterFactory#getLogWriter()} + */ + public static String DIR = ""; + + /** + * The max size of log file. + * If the size is bigger than this, archive the current file, and write into a new file. + */ + public static int MAX_FILE_SIZE = 300 * 1024 * 1024; + + /** + * The log level. Default is debug. + * + * @see {@link LogLevel} + */ + public static LogLevel LEVEL = LogLevel.DEBUG; } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Constants.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Constants.java index dbbe904d5..23fd19cc4 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Constants.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/Constants.java @@ -1,11 +1,7 @@ package com.a.eye.skywalking.api.conf; -import com.a.eye.skywalking.trace.GlobalIdGenerator; - public class Constants { - /** - * This is the version, which will be the first segment of traceid. - * Ref {@link GlobalIdGenerator#generate()} - */ - public final static String SDK_VERSION = "302017"; + public static String PATH_SEPARATOR = System.getProperty("file.separator", "/"); + + public static String LINE_SEPARATOR = System.getProperty("line.separator", "\n"); } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java index 6b63b2a44..fc7c6512c 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializer.java @@ -7,55 +7,151 @@ import com.a.eye.skywalking.api.util.StringUtil; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; import java.util.Properties; +/** + * The SnifferConfigInitializer initializes all configs in several way. + * + * @author wusheng + * @see {@link #initialize()}, to learn more about how to initialzie. + */ public class SnifferConfigInitializer { private static ILog logger = LogManager.getLogger(SnifferConfigInitializer.class); + private static String CONFIG_FILE_NAME = "/sky-walking.config"; + /** + * Try to locate config file, named {@link #CONFIG_FILE_NAME}, in following order: + * 1. Path from SystemProperty. {@link #loadConfigBySystemProperty()} + * 2. class path. + * 3. Path, where agent is. {@link #loadConfigFromAgentFolder()} + * + * If no found in any path, agent is still going to run in default config, {@link Config}, + * but in initialization steps, these following configs must be set, by config file or system properties: + * + * 1. applicationCode. "-DapplicationCode=" or {@link Config.Agent#APPLICATION_CODE} + * 2. servers. "-Dservers=" or {@link Config.Collector#SERVERS} + */ public static void initialize() { InputStream configFileStream; - if (Config.SkyWalking.IS_PREMAIN_MODE) { - configFileStream = fetchAuthFileInputStream(); - } else { - configFileStream = SnifferConfigInitializer.class.getResourceAsStream("/sky-walking.config"); + + configFileStream = loadConfigBySystemProperty(); + + if (configFileStream == null) { + configFileStream = SnifferConfigInitializer.class.getResourceAsStream(CONFIG_FILE_NAME); + + if (configFileStream == null) { + logger.info("No {} file found in class path.", CONFIG_FILE_NAME); + configFileStream = loadConfigFromAgentFolder(); + }else{ + logger.info("{} file found in class path.", CONFIG_FILE_NAME); + } } if (configFileStream == null) { - logger.info("Not provide sky-walking certification documents, sky-walking api run in default config."); + logger.info("No {} found, sky-walking is going to run in default config.", CONFIG_FILE_NAME); } else { try { Properties properties = new Properties(); properties.load(configFileStream); ConfigInitializer.initialize(properties, Config.class); } catch (Exception e) { - logger.error("Failed to read the config file, sky-walking api run in default config.", e); + logger.error("Failed to read the config file, sky-walking is going to run in default config.", e); } } String applicationCode = System.getProperty("applicationCode"); if (!StringUtil.isEmpty(applicationCode)) { - Config.SkyWalking.APPLICATION_CODE = applicationCode; + Config.Agent.APPLICATION_CODE = applicationCode; } String servers = System.getProperty("servers"); - if(!StringUtil.isEmpty(servers)) { - Config.SkyWalking.SERVERS = servers; + if (!StringUtil.isEmpty(servers)) { + Config.Collector.SERVERS = servers; } - if (StringUtil.isEmpty(Config.SkyWalking.APPLICATION_CODE)) { + if (StringUtil.isEmpty(Config.Agent.APPLICATION_CODE)) { throw new ExceptionInInitializerError("'-DapplicationCode=' is missing."); } - if (StringUtil.isEmpty(Config.SkyWalking.SERVERS)) { + if (StringUtil.isEmpty(Config.Collector.SERVERS)) { throw new ExceptionInInitializerError("'-Dservers=' is missing."); } } - private static InputStream fetchAuthFileInputStream() { - try { - return new FileInputStream(Config.SkyWalking.AGENT_BASE_PATH + File.separator + "sky-walking.config"); - } catch (Exception e) { - logger.warn("sky-walking.config is missing, use default config."); + /** + * Load the config file by the path, which is provided by system property, usually with a "-DconfigPath=" arg. + * + * @return the config file {@link InputStream}, or null if not exist. + */ + private static InputStream loadConfigBySystemProperty() { + String configPath = System.getProperty("configPath"); + if (StringUtil.isEmpty(configPath)) { return null; } + File configFile = new File(configPath, CONFIG_FILE_NAME); + if (configFile.exists() && configFile.isFile()) { + try { + logger.info("{} found in path {}, according system property.", CONFIG_FILE_NAME, configPath); + return new FileInputStream(configFile); + } catch (FileNotFoundException e) { + logger.error(e, "Fail to load {} in path {}, according system property.", CONFIG_FILE_NAME, configPath); + } + } + + logger.info("No {} found in path {}, according system property.", CONFIG_FILE_NAME, configPath); + return null; + } + + /** + * Load the config file, where the agent jar is. + * + * @return the config file {@link InputStream}, or null if not exist. + */ + private static InputStream loadConfigFromAgentFolder() { + String agentBasePath = initAgentBasePath(); + if (!StringUtil.isEmpty(agentBasePath)) { + File configFile = new File(agentBasePath, CONFIG_FILE_NAME); + if (configFile.exists() && configFile.isFile()) { + try { + logger.info("{} file found in agent folder.", CONFIG_FILE_NAME); + return new FileInputStream(configFile); + } catch (FileNotFoundException e) { + logger.error(e, "Fail to load {} in path {}, according auto-agent-folder mechanism.", CONFIG_FILE_NAME, agentBasePath); + } + } + } + + logger.info("No {} file found in agent folder.", CONFIG_FILE_NAME); + return null; + } + + /** + * Try to allocate the skywalking-agent.jar + * Some config files or output resources are from this path. + * + * @return he path, where the skywalking-agent.jar is + */ + private static String initAgentBasePath() { + String classResourcePath = SnifferConfigInitializer.class.getName().replaceAll("\\.", "/") + ".class"; + + URL resource = SnifferConfigInitializer.class.getClassLoader().getSystemClassLoader().getResource(classResourcePath); + if (resource != null) { + String urlString = resource.toString(); + urlString = urlString.substring(urlString.indexOf("file:"), urlString.indexOf('!')); + File agentJarFile = null; + try { + agentJarFile = new File(new URL(urlString).getFile()); + } catch (MalformedURLException e) { + logger.error(e, "Can not locate agent jar file by url:", urlString); + } + if (agentJarFile.exists()) { + return agentJarFile.getParentFile().getAbsolutePath(); + } + } + + logger.info("Can not locate agent jar file."); + return null; } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextCarrier.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextCarrier.java index 684922194..9c653518b 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextCarrier.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/ContextCarrier.java @@ -42,6 +42,11 @@ public class ContextCarrier implements Serializable { */ private List distributedTraceIds; + /** + * {@link TraceSegment#sampled} + */ + private boolean sampled; + /** * Serialize this {@link ContextCarrier} to a {@link String}, * with '|' split. @@ -54,7 +59,8 @@ public class ContextCarrier implements Serializable { this.getSpanId() + "", this.getApplicationCode(), this.getPeerHost(), - this.serializeDistributedTraceIds()); + this.serializeDistributedTraceIds(), + this.isSampled() ? "1" : "0"); } /** @@ -64,14 +70,15 @@ public class ContextCarrier implements Serializable { */ public ContextCarrier deserialize(String text) { if (text != null) { - String[] parts = text.split("\\|", 5); - if (parts.length == 5) { + String[] parts = text.split("\\|", 6); + if (parts.length == 6) { try { setSpanId(Integer.parseInt(parts[1])); setTraceSegmentId(parts[0]); setApplicationCode(parts[2]); setPeerHost(parts[3]); setDistributedTraceIds(deserializeDistributedTraceIds(parts[4])); + setSampled("1".equals(parts[5])); } catch (NumberFormatException e) { } @@ -129,6 +136,14 @@ public class ContextCarrier implements Serializable { return distributedTraceIds; } + public boolean isSampled() { + return sampled; + } + + public void setSampled(boolean sampled) { + this.sampled = sampled; + } + public void setDistributedTraceIds(List distributedTraceIds) { this.distributedTraceIds = distributedTraceIds; } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java index e484e0d4d..2485ee92d 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/context/TracerContext.java @@ -1,6 +1,8 @@ package com.a.eye.skywalking.api.context; +import com.a.eye.skywalking.api.boot.ServiceManager; import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.sampling.SamplingService; import com.a.eye.skywalking.trace.Span; import com.a.eye.skywalking.trace.TraceSegment; import com.a.eye.skywalking.trace.TraceSegmentRef; @@ -34,7 +36,8 @@ public final class TracerContext { * Create a {@link TraceSegment} and init {@link #spanIdGenerator} as 0; */ TracerContext() { - this.segment = new TraceSegment(Config.SkyWalking.APPLICATION_CODE); + this.segment = new TraceSegment(Config.Agent.APPLICATION_CODE); + ServiceManager.INSTANCE.findService(SamplingService.class).trySampling(this.segment); this.spanIdGenerator = 0; } @@ -122,10 +125,18 @@ public final class TracerContext { */ public void inject(ContextCarrier carrier) { carrier.setTraceSegmentId(this.segment.getTraceSegmentId()); - carrier.setSpanId(this.activeSpan().getSpanId()); - carrier.setApplicationCode(Config.SkyWalking.APPLICATION_CODE); - carrier.setPeerHost(Tags.PEER_HOST.get(activeSpan())); + Span span = this.activeSpan(); + carrier.setSpanId(span.getSpanId()); + carrier.setApplicationCode(Config.Agent.APPLICATION_CODE); + String host = Tags.PEER_HOST.get(span); + if(host != null) { + Integer port = Tags.PEER_PORT.get(span); + carrier.setPeerHost(host + ":" + port); + }else{ + carrier.setPeerHost(Tags.PEERS.get(span)); + } carrier.setDistributedTraceIds(this.segment.getRelatedGlobalTraces()); + carrier.setSampled(this.segment.isSampled()); } /** @@ -137,6 +148,7 @@ public final class TracerContext { public void extract(ContextCarrier carrier) { if(carrier.isValid()) { this.segment.ref(getRef(carrier)); + ServiceManager.INSTANCE.findService(SamplingService.class).setSampleWhenExtract(this.segment, carrier); this.segment.relatedGlobalTraces(carrier.getDistributedTraceIds()); } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java index 200c255e3..a519db621 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/EasyLogger.java @@ -1,46 +1,38 @@ package com.a.eye.skywalking.api.logging; - +import com.a.eye.skywalking.api.conf.Constants; +import com.a.eye.skywalking.api.util.StringUtil; import com.a.eye.skywalking.logging.ILog; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; +import static com.a.eye.skywalking.api.conf.Config.Logging.LEVEL; import static com.a.eye.skywalking.api.logging.LogLevel.*; /** - * Created by xin on 16-6-23. + * The EasyLogger is a simple implementation of {@link ILog}. + * + * @author wusheng */ public class EasyLogger implements ILog { - private Class toBeLoggerClass; + private Class targetClass; - public EasyLogger(Class toBeLoggerClass) { - this.toBeLoggerClass = toBeLoggerClass; + public EasyLogger(Class targetClass) { + this.targetClass = targetClass; } - public void logger(LogLevel level, String message, Throwable e) { - Throwable dummyException = new Throwable(); - StackTraceElement locations[] = dummyException.getStackTrace(); - - if (locations != null && locations.length > 2) { - if (ERROR.equals(level) || WARN.equals(level)) { - WriterFactory.getLogWriter().writeError(formatMessage(level, message, locations[2])); - } else { - WriterFactory.getLogWriter().write(formatMessage(level, message, locations[2])); - } - } - - if (e != null) { - WriterFactory.getLogWriter().writeError(ThrowableFormatter.format(e)); - } + private void logger(LogLevel level, String message, Throwable e) { + WriterFactory.getLogWriter().write(format(level, message, e)); } - private String replaceParam(String message, Object... parameters) { int startSize = 0; int parametersIndex = 0; - int index = -1; + int index; String tmpMessage = message; while ((index = message.indexOf("{}", startSize)) != -1) { if (parametersIndex >= parameters.length) { @@ -53,69 +45,97 @@ public class EasyLogger implements ILog { return tmpMessage; } + String format(LogLevel level, String message, Throwable t) { + return StringUtil.join(' ', level.name(), + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), + targetClass.getSimpleName(), + ": ", + message, + t == null ? "" : format(t) + ); + } - private String formatMessage(LogLevel level, String message, StackTraceElement caller) { - return level + " " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " " - + caller.getClassName() + "." + caller.getMethodName() + "(" + caller.getFileName() + ":" + caller.getLineNumber() + ") " + message; + String format(Throwable t) { + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + t.printStackTrace(new java.io.PrintWriter(buf, true)); + String expMessage = buf.toString(); + try { + buf.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return Constants.LINE_SEPARATOR + expMessage; } @Override public void info(String format) { - logger(INFO, format, null); + if (isInfoEnable()) + logger(INFO, format, null); } @Override public void info(String format, Object... arguments) { - logger(INFO, replaceParam(format, arguments), null); + if (isInfoEnable()) + logger(INFO, replaceParam(format, arguments), null); } @Override public void warn(String format, Object... arguments) { - logger(WARN, replaceParam(format, arguments), null); + if (isWarnEnable()) + logger(WARN, replaceParam(format, arguments), null); } @Override public void error(String format, Throwable e) { - logger(ERROR, format, e); + if (isErrorEnable()) + logger(ERROR, format, e); } @Override public void error(Throwable e, String format, Object... arguments) { - logger(ERROR, replaceParam(format, arguments), e); + if (isErrorEnable()) + logger(ERROR, replaceParam(format, arguments), e); } @Override public boolean isDebugEnable() { - return true; + return DEBUG.compareTo(LEVEL) >= 0; } @Override public boolean isInfoEnable() { - return true; + return INFO.compareTo(LEVEL) >= 0; } @Override public boolean isWarnEnable() { - return true; + return WARN.compareTo(LEVEL) >= 0; } @Override public boolean isErrorEnable() { - return true; + return ERROR.compareTo(LEVEL) >= 0; } @Override public void debug(String format) { - logger(DEBUG, format, null); + if (isDebugEnable()) { + logger(DEBUG, format, null); + } } @Override public void debug(String format, Object... arguments) { - logger(DEBUG, replaceParam(format, arguments), null); + if (isDebugEnable()) { + logger(DEBUG, replaceParam(format, arguments), null); + } } @Override public void error(String format) { - logger(ERROR, format, null); + if (isErrorEnable()) { + logger(ERROR, format, null); + } } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/FileWriter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/FileWriter.java new file mode 100644 index 000000000..74f64698f --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/FileWriter.java @@ -0,0 +1,156 @@ +package com.a.eye.skywalking.api.logging; + +import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.conf.Constants; +import com.lmax.disruptor.EventFactory; +import com.lmax.disruptor.EventHandler; +import com.lmax.disruptor.RingBuffer; +import com.lmax.disruptor.dsl.Disruptor; +import com.lmax.disruptor.util.DaemonThreadFactory; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.Callable; + +/** + * The FileWriter support async file output, by using a queue as buffer. + * + * @author wusheng + */ +public class FileWriter implements IWriter, EventHandler { + private static FileWriter instance; + private static Object createLock = new Object(); + private Disruptor disruptor; + private RingBuffer buffer; + private FileOutputStream fileOutputStream; + private volatile boolean started = false; + private volatile int fileSize; + private volatile int lineNum; + + public static FileWriter get() { + if (instance == null) { + synchronized (createLock) { + if (instance == null) { + instance = new FileWriter(); + } + } + } + return instance; + } + + private FileWriter() { + disruptor = new Disruptor(new EventFactory() { + @Override + public LogMessageHolder newInstance() { + return new LogMessageHolder(); + } + }, 1024, DaemonThreadFactory.INSTANCE); + disruptor.handleEventsWith(this); + buffer = disruptor.getRingBuffer(); + lineNum = 0; + disruptor.start(); + } + + @Override + public void onEvent(LogMessageHolder event, long sequence, boolean endOfBatch) throws Exception { + if (hasWriteStream()) { + try { + lineNum++; + write(event.getMessage() + Constants.LINE_SEPARATOR, endOfBatch); + } finally { + event.setMessage(null); + } + } + } + + private void write(String message, boolean forceFlush) { + try { + fileOutputStream.write(message.getBytes()); + fileSize += message.length(); + if (forceFlush || lineNum % 20 == 0) { + fileOutputStream.flush(); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + switchFile(); + } + } + + private void switchFile() { + if (fileSize > Config.Logging.MAX_FILE_SIZE) { + forceExecute(new Callable() { + @Override public Object call() throws Exception { + fileOutputStream.flush(); + return null; + } + }); + forceExecute(new Callable() { + @Override public Object call() throws Exception { + fileOutputStream.close(); + return null; + } + }); + forceExecute(new Callable() { + @Override public Object call() throws Exception { + new File(Config.Logging.DIR, Config.Logging.FILE_NAME) + .renameTo(new File(Config.Logging.DIR, + Config.Logging.FILE_NAME + new SimpleDateFormat(".yyyy_MM_dd_HH_mm_ss").format(new Date()))); + return null; + } + }); + forceExecute(new Callable() { + @Override public Object call() throws Exception { + fileOutputStream = null; + started = false; + return null; + } + }); + } + } + + private void forceExecute(Callable callable) { + try { + callable.call(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private boolean hasWriteStream() { + if (fileOutputStream != null) { + return true; + } + if (!started) { + File logFilePath = new File(Config.Logging.DIR); + if (!logFilePath.exists()) { + logFilePath.mkdirs(); + } else if (!logFilePath.isDirectory()) { + System.err.println("Log dir(" + Config.Logging.DIR + ") is not a directory."); + } + try { + fileOutputStream = new FileOutputStream(new File(logFilePath, Config.Logging.FILE_NAME), true); + fileSize = Long.valueOf(new File(logFilePath, Config.Logging.FILE_NAME).length()).intValue(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + started = true; + } + + return fileOutputStream != null; + } + + @Override + public void write(String message) { + long next = buffer.next(); + try { + LogMessageHolder messageHolder = buffer.get(next); + messageHolder.setMessage(message); + } finally { + buffer.publish(next); + } + } +} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/IWriter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/IWriter.java index 4bbf17116..3098c9f39 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/IWriter.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/IWriter.java @@ -2,6 +2,4 @@ package com.a.eye.skywalking.api.logging; public interface IWriter { void write(String message); - - void writeError(String message); } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogLevel.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogLevel.java index feb602e31..0579022b2 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogLevel.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogLevel.java @@ -3,6 +3,6 @@ package com.a.eye.skywalking.api.logging; /** * Created by xin on 2016/12/7. */ -public enum LogLevel { - INFO, DEBUG, WARN, ERROR +public enum LogLevel{ + DEBUG, INFO, WARN, ERROR; } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogMessageHolder.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogMessageHolder.java new file mode 100644 index 000000000..37d4e273e --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/LogMessageHolder.java @@ -0,0 +1,19 @@ +package com.a.eye.skywalking.api.logging; + +/** + * The LogMessageHolder is a {@link String} holder, + * in order to in-process propagation String across the disruptor queue. + * + * @author wusheng + */ +public class LogMessageHolder { + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/STDOutWriter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/STDOutWriter.java deleted file mode 100644 index 58fbeaef0..000000000 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/STDOutWriter.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.a.eye.skywalking.api.logging; - -public class STDOutWriter implements IWriter { - - - @Override - public void write(String message) { - System.out.println(message); - } - - @Override - public void writeError(String message) { - System.err.println(message); - } -} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/SyncFileWriter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/SyncFileWriter.java deleted file mode 100644 index 99d081143..000000000 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/SyncFileWriter.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.a.eye.skywalking.api.logging; - - - -import com.a.eye.skywalking.api.conf.Config; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Date; - -public class SyncFileWriter implements IWriter { - - private static SyncFileWriter writer; - private FileOutputStream os; - private int bufferSize; - private static final Object lock = new Object(); - - private SyncFileWriter() { - try { - File logFilePath = new File(Config.SkyWalking.AGENT_BASE_PATH, Config.Logging.LOG_DIR_NAME); - if (!logFilePath.exists()) { - logFilePath.mkdirs(); - } - os = new FileOutputStream(new File(logFilePath, Config.Logging.LOG_FILE_NAME), true); - bufferSize = Long.valueOf(new File(logFilePath, Config.Logging.LOG_FILE_NAME).length()).intValue(); - } catch (IOException e) { - writeErrorLog(e); - } - } - - - public static IWriter instance() { - if (writer == null) { - writer = new SyncFileWriter(); - } - return writer; - } - - - public void write(String message) { - writeLogRecord(message); - switchLogFileIfNecessary(); - } - - @Override - public void writeError(String message) { - this.write(message); - } - - private void writeLogRecord(String message) { - try { - os.write(message.getBytes()); - os.write("\n".getBytes()); - bufferSize += message.length(); - } catch (IOException e) { - writeErrorLog(e); - } - } - - private void switchLogFileIfNecessary() { - if (bufferSize > Config.Logging.MAX_LOG_FILE_LENGTH) { - synchronized (lock) { - if (bufferSize > Config.Logging.MAX_LOG_FILE_LENGTH) { - try { - closeInputStream(); - renameLogFile(); - revertInputStream(); - } catch (IOException e) { - writeErrorLog(e); - } - bufferSize = 0; - } - } - } - } - - private void revertInputStream() throws FileNotFoundException { - os = new FileOutputStream(new File(Config.Logging.LOG_DIR_NAME, Config.Logging.LOG_FILE_NAME), true); - } - - private void renameLogFile() { - new File(Config.Logging.LOG_DIR_NAME, Config.Logging.LOG_FILE_NAME) - .renameTo(new File(Config.Logging.LOG_DIR_NAME, Config.Logging.LOG_FILE_NAME + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); - } - - private void closeInputStream() throws IOException { - this.os.flush(); - this.os.close(); - } - - - private void writeErrorLog(Throwable e) { - FileOutputStream fileOutputStream = null; - try { - File file = new File(Config.Logging.LOG_DIR_NAME, Config.Logging.SYSTEM_ERROR_LOG_FILE_NAME); - fileOutputStream = new FileOutputStream(file, true); - fileOutputStream.write(("Failed to init sync File Writer.\n" + ThrowableFormatter.format(e)).getBytes()); - } catch (Exception e1) { - System.err.print(ThrowableFormatter.format(e1)); - } finally { - if (fileOutputStream != null) { - try { - fileOutputStream.close(); - } catch (IOException e1) { - System.err.print(ThrowableFormatter.format(e1)); - } - } - } - } - -} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/SystemOutWriter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/SystemOutWriter.java new file mode 100644 index 000000000..c4b1458f1 --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/SystemOutWriter.java @@ -0,0 +1,10 @@ +package com.a.eye.skywalking.api.logging; + +public enum SystemOutWriter implements IWriter { + INSTANCE; + + @Override + public void write(String message) { + System.out.println(message); + } +} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/ThrowableFormatter.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/ThrowableFormatter.java deleted file mode 100644 index 429e63d49..000000000 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/ThrowableFormatter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.a.eye.skywalking.api.logging; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * Created by xin on 16-6-24. - */ -public class ThrowableFormatter { - public static String format(Throwable e) { - ByteArrayOutputStream buf = new ByteArrayOutputStream(); - e.printStackTrace(new java.io.PrintWriter(buf, true)); - String expMessage = buf.toString(); - try { - buf.close(); - } catch (IOException e1) { - System.err.println("Failed to close throwable stack stream."); - e.printStackTrace(); - } - - return expMessage; - } -} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/WriterFactory.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/WriterFactory.java index fc38edfee..ef6003d58 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/WriterFactory.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/logging/WriterFactory.java @@ -1,14 +1,14 @@ package com.a.eye.skywalking.api.logging; import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.util.StringUtil; public class WriterFactory { public static IWriter getLogWriter(){ - if (Config.SkyWalking.IS_PREMAIN_MODE){ - return SyncFileWriter.instance(); + if (!StringUtil.isEmpty(Config.Logging.DIR)){ + return FileWriter.get(); }else{ - return new STDOutWriter(); + return SystemOutWriter.INSTANCE; } - } } diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoCocurrencyAceessObject.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAceessObject.java similarity index 69% rename from skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoCocurrencyAceessObject.java rename to skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAceessObject.java index 4f69939e2..ce326faef 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoCocurrencyAceessObject.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/plugin/interceptor/assist/NoConcurrencyAceessObject.java @@ -2,10 +2,9 @@ package com.a.eye.skywalking.api.plugin.interceptor.assist; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; import com.a.eye.skywalking.api.plugin.interceptor.InterceptorException; -import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; /** - * {@link NoCocurrencyAceessObject} is method invocation counter, + * {@link NoConcurrencyAceessObject} is method invocation counter, * when {@link #whenEnter(EnhancedClassInstanceContext, Runnable)}, counter + 1; * and when {@link #whenExist(EnhancedClassInstanceContext, Runnable)}, counter -1; * @@ -13,22 +12,16 @@ import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAround * * @author wusheng */ -public class NoCocurrencyAceessObject { - protected String invokeCounterKey = "__$invokeCounterKey"; - - protected Object invokeCounterInstLock = new Object(); +public class NoConcurrencyAceessObject { + private static String invokeCounterKey = "__$invokeCounterKey"; public void whenEnter(EnhancedClassInstanceContext context, Runnable runnable) { if (!context.isContain(invokeCounterKey)) { - synchronized (invokeCounterInstLock) { - if (!context.isContain(invokeCounterKey)) { - context.set(invokeCounterKey, 0); - } - } + context.set(invokeCounterKey, 0); } int counter = context.get(invokeCounterKey, Integer.class); - if(++counter == 1){ + if (++counter == 1) { runnable.run(); } context.set(invokeCounterKey, counter); @@ -41,7 +34,7 @@ public class NoCocurrencyAceessObject { } int counter = context.get(invokeCounterKey, Integer.class); - if(--counter == 0){ + if (--counter == 0) { runnable.run(); } context.set(invokeCounterKey, counter); diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java index d868de9f4..94ceac768 100644 --- a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/queue/TraceSegmentProcessQueue.java @@ -30,8 +30,8 @@ public class TraceSegmentProcessQueue extends StatusBootService implements Trace private volatile int cacheIndex; public TraceSegmentProcessQueue() { - disruptor = new Disruptor(TraceSegmentHolder.Factory.INSTANCE, Config.Disruptor.BUFFER_SIZE, DaemonThreadFactory.INSTANCE); - secondLevelCache = new TraceSegment[Config.Disruptor.BUFFER_SIZE]; + disruptor = new Disruptor(TraceSegmentHolder.Factory.INSTANCE, Config.Buffer.SIZE, DaemonThreadFactory.INSTANCE); + secondLevelCache = new TraceSegment[Config.Buffer.SIZE]; cacheIndex = 0; disruptor.handleEventsWith(this); buffer = disruptor.getRingBuffer(); @@ -43,9 +43,14 @@ public class TraceSegmentProcessQueue extends StatusBootService implements Trace disruptor.start(); } + /** + * Append the given traceSegment to the queue, wait for sending to Collector. + * + * @param traceSegment finished {@link TraceSegment} + */ @Override public void afterFinished(TraceSegment traceSegment) { - if (isStarted()) { + if (isStarted() && traceSegment.isSampled()) { long sequence = this.buffer.next(); // Grab the next sequence try { TraceSegmentHolder data = this.buffer.get(sequence); diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/sampling/IllegalSamplingRateException.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/sampling/IllegalSamplingRateException.java new file mode 100644 index 000000000..bb89d7a86 --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/sampling/IllegalSamplingRateException.java @@ -0,0 +1,12 @@ +package com.a.eye.skywalking.api.sampling; + +/** + * Use IllegalSamplingRateException, only if the rate can not be supported. + * + * @author wusheng + */ +public class IllegalSamplingRateException extends Exception { + IllegalSamplingRateException(String message) { + super(message); + } +} diff --git a/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/sampling/SamplingService.java b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/sampling/SamplingService.java new file mode 100644 index 000000000..dd6572f97 --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/main/java/com/a/eye/skywalking/api/sampling/SamplingService.java @@ -0,0 +1,68 @@ +package com.a.eye.skywalking.api.sampling; + +import com.a.eye.skywalking.api.boot.BootService; +import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.context.ContextCarrier; +import com.a.eye.skywalking.logging.ILog; +import com.a.eye.skywalking.logging.LogManager; +import com.a.eye.skywalking.trace.TraceSegment; + +/** + * The SamplingService take charge of how to sample the {@link TraceSegment}. Every {@link TraceSegment}s + * have been traced, but, considering CPU cost of serialization/deserialization, and network bandwidth, the agent do NOT + * send all of them to collector, if SAMPLING is on. + * + * By default, SAMPLING is off, and {@link Config.Agent#SAMPLING_CYCLE} == 1. + * + * @author wusheng + */ +public class SamplingService implements BootService { + private static ILog logger = LogManager.getLogger(SamplingService.class); + + private volatile boolean on = false; + private volatile int rollingSeed = 1; + + @Override + public void bootUp() throws Throwable { + if (Config.Agent.SAMPLING_CYCLE == 1) { + this.on = false; + return; + } + if (Config.Agent.SAMPLING_CYCLE < 1) { + throw new IllegalSamplingRateException("sampling cycle must greater than 0."); + } + this.on = true; + + logger.debug("The trace sampling is on, and the sampling cycle is: {}", Config.Agent.SAMPLING_CYCLE); + } + + public void trySampling(TraceSegment segment) { + if (on) { + if (rollingSeed % Config.Agent.SAMPLING_CYCLE != 0) { + segment.setSampled(false); + this.rollingSeed = 1; + } + rollingSeed++; + } + } + + /** + * Set the {@link TraceSegment} to sampled, when {@link ContextCarrier} contains "isSampled" flag. + * + * A -> B, if TraceSegment is sampled in A, then the related TraceSegment in B must be sampled, no matter you + * sampling rate. And reset the {@link #rollingSeed}, in case of too many {@link TraceSegment}s, which started in + * this JVM, are sampled. + * + * @param segment the current TraceSegment. + * @param carrier + */ + public void setSampleWhenExtract(TraceSegment segment, ContextCarrier carrier) { + if(on) { + if (!segment.isSampled() && carrier.isSampled()) { + segment.setSampled(true); + this.rollingSeed = 1; + } + } + } + +} diff --git a/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService b/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService index c84f7acac..0a0bbb211 100644 --- a/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService +++ b/skywalking-sniffer/skywalking-api/src/main/resources/META-INF/services/com.a.eye.skywalking.api.boot.BootService @@ -1,3 +1,4 @@ com.a.eye.skywalking.api.queue.TraceSegmentProcessQueue com.a.eye.skywalking.api.context.ContextManager com.a.eye.skywalking.api.client.CollectorClientService +com.a.eye.skywalking.api.sampling.SamplingService diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/client/HTTPRestServiceTestApp.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/client/HTTPRestServiceTestApp.java index de4a3d068..24f481fb5 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/client/HTTPRestServiceTestApp.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/client/HTTPRestServiceTestApp.java @@ -75,7 +75,7 @@ public class HTTPRestServiceTestApp { baseRequest.setHandled(true); } }); - //server.start(); + server.start(); return server; } diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/ConstantsTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/ConstantsTest.java deleted file mode 100644 index 8f9f7f314..000000000 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/ConstantsTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.a.eye.skywalking.api.conf; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by wusheng on 2017/2/28. - */ -public class ConstantsTest { - @Test - public void testSDKVersion(){ - Assert.assertEquals("302017", Constants.SDK_VERSION); - } -} diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializerTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializerTest.java index 4804c74ba..64ae18e7d 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializerTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/conf/SnifferConfigInitializerTest.java @@ -4,6 +4,8 @@ import org.junit.AfterClass; import org.junit.Assert; import org.junit.Test; +import static com.a.eye.skywalking.api.logging.LogLevel.*; + /** * @author wusheng */ @@ -11,27 +13,21 @@ public class SnifferConfigInitializerTest { @Test public void testInitialize(){ - Config.SkyWalking.IS_PREMAIN_MODE = false; SnifferConfigInitializer.initialize(); - Assert.assertEquals("crmApp", Config.SkyWalking.APPLICATION_CODE); - Assert.assertEquals("127.0.0.1:8080", Config.SkyWalking.SERVERS); + Assert.assertEquals("crmApp", Config.Agent.APPLICATION_CODE); + Assert.assertEquals("127.0.0.1:8080", Config.Collector.SERVERS); - Assert.assertNotNull(Config.Disruptor.BUFFER_SIZE); - Assert.assertNotNull(Config.Logging.LOG_DIR_NAME); - Assert.assertNotNull(Config.Logging.LOG_FILE_NAME); - Assert.assertNotNull(Config.Logging.MAX_LOG_FILE_LENGTH); - Assert.assertNotNull(Config.Logging.SYSTEM_ERROR_LOG_FILE_NAME); - } - - @Test(expected = ExceptionInInitializerError.class) - public void testErrorInitialize(){ - Config.SkyWalking.IS_PREMAIN_MODE = true; - SnifferConfigInitializer.initialize(); + Assert.assertNotNull(Config.Buffer.SIZE); + Assert.assertNotNull(Config.Logging.DIR); + Assert.assertNotNull(Config.Logging.FILE_NAME); + Assert.assertNotNull(Config.Logging.MAX_FILE_SIZE); + Assert.assertNotNull(Config.Logging.FILE_NAME); + Assert.assertEquals(INFO, Config.Logging.LEVEL); } @AfterClass - public static void reset(){ - Config.SkyWalking.IS_PREMAIN_MODE = false; + public static void clear(){ + Config.Logging.LEVEL = DEBUG; } } diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextCarrierTestCase.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextCarrierTestCase.java index 269911b79..6809afed6 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextCarrierTestCase.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextCarrierTestCase.java @@ -18,17 +18,18 @@ public class ContextCarrierTestCase { carrier.setSpanId(100); carrier.setApplicationCode("REMOTE_APP"); carrier.setPeerHost("10.2.3.16:8080"); + carrier.setSampled(true); List ids = new LinkedList(); ids.add(new PropagatedTraceId("Trace.global.id.123")); carrier.setDistributedTraceIds(ids); - Assert.assertEquals("trace_id_A|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123", carrier.serialize()); + Assert.assertEquals("trace_id_A|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123|1", carrier.serialize()); } @Test public void testDeserialize(){ ContextCarrier carrier = new ContextCarrier(); - carrier.deserialize("trace_id_A|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222"); + carrier.deserialize("trace_id_A|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222|1"); Assert.assertEquals("trace_id_A", carrier.getTraceSegmentId()); Assert.assertEquals(100, carrier.getSpanId()); @@ -36,6 +37,7 @@ public class ContextCarrierTestCase { Assert.assertEquals("10.2.3.16:8080", carrier.getPeerHost()); Assert.assertEquals("Trace.global.id.123", carrier.getDistributedTraceIds().get(0).get()); Assert.assertEquals("Trace.global.id.222", carrier.getDistributedTraceIds().get(1).get()); + Assert.assertEquals(true, carrier.isSampled()); } @Test @@ -62,6 +64,10 @@ public class ContextCarrierTestCase { carrier = new ContextCarrier(); carrier.deserialize("trace_id|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222"); + Assert.assertFalse(carrier.isValid()); + + carrier = new ContextCarrier(); + carrier.deserialize("trace_id|100|REMOTE_APP|10.2.3.16:8080|Trace.global.id.123,Trace.global.id.222|0"); Assert.assertTrue(carrier.isValid()); } } diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java index f0b092a0b..bef3c3c5d 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/context/ContextManagerTestCase.java @@ -1,16 +1,23 @@ package com.a.eye.skywalking.api.context; +import com.a.eye.skywalking.api.boot.ServiceManager; import com.a.eye.skywalking.trace.Span; import com.a.eye.skywalking.trace.TraceSegment; import com.a.eye.skywalking.trace.tag.Tags; import org.junit.After; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; /** * Created by wusheng on 2017/2/19. */ public class ContextManagerTestCase { + @BeforeClass + public static void setup(){ + ServiceManager.INSTANCE.boot(); + } + @Test public void testDelegateToTracerContext(){ Span span = ContextManager.createSpan("serviceA"); 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 7fad516d8..308d72801 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 @@ -5,6 +5,7 @@ import com.a.eye.skywalking.trace.TraceId.DistributedTraceId; import com.a.eye.skywalking.trace.TraceId.PropagatedTraceId; import com.a.eye.skywalking.trace.TraceSegment; import com.a.eye.skywalking.trace.tag.Tags; +import java.awt.SystemTray; import java.util.LinkedList; import java.util.List; import org.junit.After; @@ -61,7 +62,8 @@ public class TracerContextTestCase { TracerContext context = new TracerContext(); Span serviceSpan = context.createSpan("/serviceA"); Span dbSpan = context.createSpan("db/preparedStatement/execute"); - Tags.PEER_HOST.set(dbSpan, "127.0.0.1:8080"); + Tags.PEER_HOST.set(dbSpan, "127.0.0.1"); + Tags.PEER_PORT.set(dbSpan, 8080); ContextCarrier carrier = new ContextCarrier(); context.inject(carrier); diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/EasyLoggerTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/EasyLoggerTest.java index 0e6cd274c..f65097292 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/EasyLoggerTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/EasyLoggerTest.java @@ -1,6 +1,6 @@ package com.a.eye.skywalking.api.logging; -import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.conf.Constants; import java.io.PrintStream; import org.junit.AfterClass; import org.junit.Assert; @@ -26,8 +26,6 @@ public class EasyLoggerTest { @Test public void testLog(){ - Config.SkyWalking.IS_PREMAIN_MODE = false; - PrintStream output = Mockito.mock(PrintStream.class); System.setOut(output); PrintStream err = Mockito.mock(PrintStream.class); @@ -50,12 +48,20 @@ public class EasyLoggerTest { logger.error("hello world", new NullPointerException()); logger.error(new NullPointerException(),"hello {}", "world"); - Mockito.verify(output,times(4)) - .println(anyString()); - Mockito.verify(err,times(7)) + Mockito.verify(output,times(9)) .println(anyString()); } + @Test + public void testFormat() { + NullPointerException exception = new NullPointerException(); + EasyLogger logger = new EasyLogger(EasyLoggerTest.class); + String formatLines = logger.format(exception); + String[] lines = formatLines.split(Constants.LINE_SEPARATOR); + Assert.assertEquals("java.lang.NullPointerException", lines[1]); + Assert.assertEquals("\tat com.a.eye.skywalking.api.logging.EasyLoggerTest.testFormat(EasyLoggerTest.java:57)", lines[2]); + } + @AfterClass public static void reset(){ System.setOut(outRef); diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/FileWriterTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/FileWriterTest.java new file mode 100644 index 000000000..af30a6abb --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/FileWriterTest.java @@ -0,0 +1,52 @@ +package com.a.eye.skywalking.api.logging; + +import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.api.conf.Constants; +import java.io.File; +import java.io.IOException; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +/** + * @author wusheng + */ +public class FileWriterTest { + + @BeforeClass + public static void beforeTestFile() throws IOException { + Config.Logging.MAX_FILE_SIZE = 10; + File directory = new File(""); + Config.Logging.DIR = directory.getCanonicalPath() + Constants.PATH_SEPARATOR + "/log-test/"; + } + + @Test + public void testWriteFile() throws InterruptedException { + FileWriter writer = FileWriter.get(); + for (int i = 0; i < 100; i++) { + writer.write("abcd"); + } + + Thread.sleep(10000L); + } + + @AfterClass + public static void clear() { + Config.Logging.MAX_FILE_SIZE = 300 * 1024 * 1024; + deleteDir(new File(Config.Logging.DIR)); + Config.Logging.DIR = ""; + } + + private static boolean deleteDir(File dir) { + if (dir.isDirectory()) { + String[] children = dir.list(); + for (int i = 0; i < children.length; i++) { + boolean success = deleteDir(new File(dir, children[i])); + if (!success) { + return false; + } + } + } + return dir.delete(); + } +} diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/STDOutWriterTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/SystemOutWriterTest.java similarity index 59% rename from skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/STDOutWriterTest.java rename to skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/SystemOutWriterTest.java index 31a5c2a54..c154ed3cb 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/STDOutWriterTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/SystemOutWriterTest.java @@ -12,14 +12,12 @@ import static org.mockito.Mockito.times; /** * Created by wusheng on 2017/2/28. */ -public class STDOutWriterTest { +public class SystemOutWriterTest { private static PrintStream outRef; - private static PrintStream errRef; @BeforeClass public static void initAndHoldOut(){ outRef = System.out; - errRef = System.err; } @Test @@ -27,19 +25,7 @@ public class STDOutWriterTest { PrintStream mockStream = Mockito.mock(PrintStream.class); System.setOut(mockStream); - STDOutWriter writer = new STDOutWriter(); - writer.write("hello"); - - Mockito.verify(mockStream,times(1)).println(anyString()); - } - - @Test - public void testWriteError(){ - PrintStream mockStream = Mockito.mock(PrintStream.class); - System.setErr(mockStream); - - STDOutWriter writer = new STDOutWriter(); - writer.writeError("hello"); + SystemOutWriter.INSTANCE.write("hello"); Mockito.verify(mockStream,times(1)).println(anyString()); } @@ -47,6 +33,5 @@ public class STDOutWriterTest { @AfterClass public static void reset(){ System.setOut(outRef); - System.setErr(errRef); } } diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java deleted file mode 100644 index f3c19f4bf..000000000 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/ThrowableFormatterTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.a.eye.skywalking.api.logging; - -import org.junit.Assert; -import org.junit.Test; - -/** - * Created by wusheng on 2017/2/28. - */ -public class ThrowableFormatterTest { - @Test - public void testFormat() { - NullPointerException exception = new NullPointerException(); - String formatLines = ThrowableFormatter.format(exception); - String[] lines = formatLines.split(System.lineSeparator()); - Assert.assertEquals("java.lang.NullPointerException", lines[0]); - Assert.assertEquals("\tat com.a.eye.skywalking.api.logging.ThrowableFormatterTest.testFormat(ThrowableFormatterTest.java:12)", lines[1]); - } -} diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/WriterFactoryTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/WriterFactoryTest.java index eec580928..ea23a0cfd 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/WriterFactoryTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/logging/WriterFactoryTest.java @@ -15,7 +15,7 @@ public class WriterFactoryTest { private static PrintStream errRef; @BeforeClass - public static void initAndHoldOut(){ + public static void initAndHoldOut() { errRef = System.err; } @@ -24,19 +24,18 @@ public class WriterFactoryTest { * reset {@link System#out} to a Mock object, for avoid a console system.error. */ @Test - public void testGetLogWriter(){ - Config.SkyWalking.IS_PREMAIN_MODE = true; + public void testGetLogWriter() { PrintStream mockStream = Mockito.mock(PrintStream.class); System.setErr(mockStream); - Assert.assertEquals(SyncFileWriter.instance(), WriterFactory.getLogWriter()); + Assert.assertEquals(SystemOutWriter.INSTANCE, WriterFactory.getLogWriter()); - Config.SkyWalking.IS_PREMAIN_MODE = false; - Assert.assertTrue(WriterFactory.getLogWriter() instanceof STDOutWriter); + Config.Logging.DIR = "/only/test/folder"; + Assert.assertTrue(WriterFactory.getLogWriter() instanceof FileWriter); } @AfterClass - public static void reset(){ - Config.SkyWalking.IS_PREMAIN_MODE = false; + public static void reset() { + Config.Logging.DIR = ""; System.setErr(errRef); } } diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoCocurrencyAceessObjectTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAceessObjectTest.java similarity index 86% rename from skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoCocurrencyAceessObjectTest.java rename to skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAceessObjectTest.java index bcf2304a8..c4eecd9d5 100644 --- a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoCocurrencyAceessObjectTest.java +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/plugin/assist/NoConcurrencyAceessObjectTest.java @@ -1,17 +1,17 @@ package com.a.eye.skywalking.api.plugin.assist; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; -import com.a.eye.skywalking.api.plugin.interceptor.assist.NoCocurrencyAceessObject; +import com.a.eye.skywalking.api.plugin.interceptor.assist.NoConcurrencyAceessObject; import org.junit.Assert; import org.junit.Test; /** * @author wusheng */ -public class NoCocurrencyAceessObjectTest { +public class NoConcurrencyAceessObjectTest { @Test public void testEntraExitCounter(){ - NoCocurrencyAceessObject object = new NoCocurrencyAceessObject(); + NoConcurrencyAceessObject object = new NoConcurrencyAceessObject(); final EnhancedClassInstanceContext context = new EnhancedClassInstanceContext(); object.whenEnter(context, new Runnable() { @Override diff --git a/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/sampling/SamplingServiceTest.java b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/sampling/SamplingServiceTest.java new file mode 100644 index 000000000..36bb9799c --- /dev/null +++ b/skywalking-sniffer/skywalking-api/src/test/java/com/a/eye/skywalking/api/sampling/SamplingServiceTest.java @@ -0,0 +1,40 @@ +package com.a.eye.skywalking.api.sampling; + +import com.a.eye.skywalking.api.boot.ServiceManager; +import com.a.eye.skywalking.api.conf.Config; +import com.a.eye.skywalking.trace.TraceSegment; +import org.junit.AfterClass; +import org.junit.Assert; +import org.junit.Test; + +/** + * @author wusheng + */ +public class SamplingServiceTest { + @Test + public void test50Percent(){ + Config.Agent.SAMPLING_CYCLE = 2; + ServiceManager.INSTANCE.boot(); + + TraceSegment segment = new TraceSegment(); + Assert.assertTrue(segment.isSampled()); + + SamplingService service = ServiceManager.INSTANCE.findService(SamplingService.class); + service.trySampling(segment); + Assert.assertFalse(segment.isSampled()); + + segment = new TraceSegment(); + service.trySampling(segment); + Assert.assertTrue(segment.isSampled()); + + segment = new TraceSegment(); + service.trySampling(segment); + Assert.assertFalse(segment.isSampled()); + } + + @AfterClass + public static void clear(){ + Config.Agent.SAMPLING_CYCLE = 1; + ServiceManager.INSTANCE.boot(); + } +} diff --git a/skywalking-sniffer/skywalking-api/src/test/resources/sky-walking.config b/skywalking-sniffer/skywalking-api/src/test/resources/sky-walking.config index 7817dd446..5e9506e02 100644 --- a/skywalking-sniffer/skywalking-api/src/test/resources/sky-walking.config +++ b/skywalking-sniffer/skywalking-api/src/test/resources/sky-walking.config @@ -1,2 +1,3 @@ -skywalking.application_code = crmApp -skywalking.servers = 127.0.0.1:8080 +agent.application_code = crmApp +collector.servers = 127.0.0.1:8080 +logging.level=info diff --git a/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/pom.xml index 1fa1a6eaf..bd8525c12 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/dubbo-plugin/pom.xml @@ -18,11 +18,6 @@ - - com.a.eye - skywalking-api - 3.0-2017 - org.springframework spring-context 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 4e479b039..75026a8dd 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 @@ -80,7 +80,7 @@ public class DubboInterceptorTest { Mockito.when(RpcContext.getContext()).thenReturn(rpcContext); when(rpcContext.isConsumerSide()).thenReturn(true); when(methodInvokeContext.allArguments()).thenReturn(new Object[]{invoker, invocation}); - Config.SkyWalking.APPLICATION_CODE = "DubboTestCases-APP"; + Config.Agent.APPLICATION_CODE = "DubboTestCases-APP"; } @@ -155,7 +155,7 @@ public class DubboInterceptorTest { @Test public void testProviderWithAttachment() { when(rpcContext.isConsumerSide()).thenReturn(false); - when(rpcContext.getAttachment(DubboInterceptor.ATTACHMENT_NAME_OF_CONTEXT_DATA)).thenReturn("302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123"); + when(rpcContext.getAttachment(DubboInterceptor.ATTACHMENT_NAME_OF_CONTEXT_DATA)).thenReturn("302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123|1"); dubboInterceptor.beforeMethod(classInstanceContext, methodInvokeContext, methodInterceptResult); dubboInterceptor.afterMethod(classInstanceContext, methodInvokeContext, result); @@ -168,7 +168,7 @@ public class DubboInterceptorTest { when(rpcContext.isConsumerSide()).thenReturn(false); when(BugFixActive.isActive()).thenReturn(true); - testParam.setTraceContext("302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123"); + testParam.setTraceContext("302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123|1"); dubboInterceptor.beforeMethod(classInstanceContext, methodInvokeContext, methodInterceptResult); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml index 4d13cff6b..03708288b 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/httpClient-4.x-plugin/pom.xml @@ -20,13 +20,6 @@ - - com.a.eye - skywalking-api - ${project.version} - - - org.apache.httpcomponents httpclient diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/pom.xml b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/pom.xml index db239652d..ebddf6e30 100755 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/pom.xml +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/pom.xml @@ -18,11 +18,6 @@ - - com.a.eye - skywalking-api - 3.0-2017 - mysql mysql-connector-java diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java index 797908dcd..02975b3b2 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/CallableStatementTracing.java @@ -24,6 +24,7 @@ public class CallableStatementTracing { try { Span span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/CallableStatement/" + method); Tags.DB_TYPE.set(span, "sql"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); Tags.SPAN_LAYER.asDB(span); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java index 1b20172ac..ebb089921 100755 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/ConnectionTracing.java @@ -24,6 +24,7 @@ public class ConnectionTracing { try { Span span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/Connection/" + method); Tags.DB_TYPE.set(span, "sql"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); Tags.COMPONENT.set(span, connectInfo.getDBType()); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java index 20f7fba3b..207bd91e7 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/PreparedStatementTracing.java @@ -23,6 +23,7 @@ public class PreparedStatementTracing { try { Span span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/PreparedStatement/" + method); Tags.DB_TYPE.set(span, "sql"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); Tags.COMPONENT.set(span, connectInfo.getDBType()); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java index f421e0ad0..f27a5033e 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/a/eye/skywalking/plugin/jdbc/StatementTracing.java @@ -23,6 +23,7 @@ public class StatementTracing { try { Span span = ContextManager.createSpan(connectInfo.getDBType() + "/JDBI/Statement/" + method); Tags.DB_TYPE.set(span, "sql"); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); Tags.DB_INSTANCE.set(span, connectInfo.getDatabaseName()); Tags.DB_STATEMENT.set(span, sql); Tags.COMPONENT.set(span, connectInfo.getDBType()); diff --git a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java index 4cb17f016..2dc671c0f 100644 --- a/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java +++ b/skywalking-sniffer/skywalking-sdk-plugin/jedis-2.x-plugin/src/main/java/com/a/eye/skywalking/plugin/jedis/v2/JedisMethodInterceptor.java @@ -2,7 +2,7 @@ package com.a.eye.skywalking.plugin.jedis.v2; import com.a.eye.skywalking.api.context.ContextManager; import com.a.eye.skywalking.api.plugin.interceptor.EnhancedClassInstanceContext; -import com.a.eye.skywalking.api.plugin.interceptor.assist.NoCocurrencyAceessObject; +import com.a.eye.skywalking.api.plugin.interceptor.assist.NoConcurrencyAceessObject; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodInvokeContext; import com.a.eye.skywalking.api.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import com.a.eye.skywalking.api.plugin.interceptor.enhance.MethodInterceptResult; @@ -17,7 +17,7 @@ import com.a.eye.skywalking.trace.tag.Tags; * * @author zhangxin */ -public class JedisMethodInterceptor extends NoCocurrencyAceessObject implements InstanceMethodsAroundInterceptor { +public class JedisMethodInterceptor extends NoConcurrencyAceessObject implements InstanceMethodsAroundInterceptor { /** * The key name that redis connection information in {@link EnhancedClassInstanceContext#context}. */ @@ -50,6 +50,7 @@ public class JedisMethodInterceptor extends NoCocurrencyAceessObject implements Span span = ContextManager.createSpan("Jedis/" + interceptorContext.methodName()); Tags.COMPONENT.set(span, REDIS_COMPONENT); Tags.DB_TYPE.set(span, REDIS_COMPONENT); + Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); tagPeer(span, context); Tags.SPAN_LAYER.asDB(span); if (StringUtil.isEmpty(context.get(KEY_OF_REDIS_HOST, String.class))) { 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 140bc34f4..e1a75e3a9 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 @@ -94,7 +94,7 @@ public class MotanProviderInterceptorTest { @Test public void testInvokerWithRefSegment() { HashMap attachments = new HashMap(); - attachments.put("SWTraceContext", "302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123"); + attachments.put("SWTraceContext", "302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123|1"); when(request.getAttachments()).thenReturn(attachments); invokeInterceptor.beforeMethod(instanceContext, interceptorContext, null); 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 6d2b4e38a..76f01259d 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 @@ -81,7 +81,7 @@ public class TomcatInterceptorTest { @Test public void testWithSerializedContextData() { - when(request.getHeader(TomcatInterceptor.HEADER_NAME_OF_CONTEXT_DATA)).thenReturn("302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123"); + when(request.getHeader(TomcatInterceptor.HEADER_NAME_OF_CONTEXT_DATA)).thenReturn("302017.1487666919810.624424584.17332.1.1|1|REMOTE_APP|127.0.0.1|Trace.globalId.123|1"); tomcatInterceptor.beforeMethod(classInstanceContext, methodInvokeContext, methodInterceptResult); tomcatInterceptor.afterMethod(classInstanceContext, methodInvokeContext, null); diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml index d159c4e6b..cf91ccd65 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/pom.xml @@ -12,11 +12,6 @@ skywalking-toolkit-opentracing-activation - - com.a.eye - skywalking-api - ${project.version} - com.a.eye skywalking-toolkit-opentracing diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java index 028ea37c6..e3a6e7ba9 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-opentracing-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/opentracing/span/interceptor/SpanSetTagInterceptor.java @@ -24,8 +24,10 @@ public class SpanSetTagInterceptor implements InstanceMethodsAroundInterceptor { ContextManager.activeSpan().setTag(key, (String)value); else if (value instanceof Boolean) ContextManager.activeSpan().setTag(key, (Boolean)value); - else if (value instanceof Number) - ContextManager.activeSpan().setTag(key, (Number)value); + else if (value instanceof Integer) + ContextManager.activeSpan().setTag(key, (Integer)value); + else + ContextManager.activeSpan().setTag(key, value.toString()); } @Override diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/pom.xml b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/pom.xml index c78fd3771..fff2540da 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/pom.xml +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/pom.xml @@ -12,11 +12,4 @@ jar skywalking-toolkit-trace-context-activation - - - com.a.eye - skywalking-api - 3.0-2017 - - diff --git a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java index f3715e652..938d0e249 100644 --- a/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java +++ b/skywalking-sniffer/skywalking-toolkit-activation/skywalking-toolkit-trace-context-activation/src/main/java/com/a/eye/skywalking/toolkit/activation/trace/TraceContextInterceptor.java @@ -24,9 +24,7 @@ public class TraceContextInterceptor implements StaticMethodsAroundInterceptor { @Override public Object afterMethod(StaticMethodInvokeContext interceptorContext, Object ret) { - ContextCarrier carrier = new ContextCarrier(); - ContextManager.inject(carrier); - return carrier.getTraceSegmentId(); + return ContextManager.getTraceSegmentId(); } @Override