From be626bdaae9f3d8e07d1793bb28b11f0fdca8933 Mon Sep 17 00:00:00 2001 From: pengys5 <8082209@qq.com> Date: Sat, 1 Apr 2017 16:55:54 +0800 Subject: [PATCH] mock mock mock --- .../actor/AbstractClusterWorker.java | 2 +- .../collector/actor/LocalWorkerContext.java | 3 + .../collector/actor/WorkerContext.java | 22 +- .../actor/AbstractClusterWorkerTestCase.java | 21 + .../AbstractLocalAsyncWorkerTestCase.java | 60 +++ .../actor/AbstractWorkerProviderTestCase.java | 75 ++++ .../collector/actor/TestClusterWorker.java | 68 ---- .../actor/TestClusterWorkerTestCase.java | 32 -- .../collector/actor/TestLocalAsyncWorker.java | 58 --- .../collector/actor/TestLocalSyncWorker.java | 54 --- .../actor/TestLocalSyncWorkerTestCase.java | 25 -- .../selector/HashCodeSelectorTestCase.java | 49 +++ .../selector/RollingSelectorTestCase.java | 41 ++ .../collector/queue/QueueTestCase.java | 13 - .../worker/CollectorBootStartUp.java | 2 +- .../collector/worker/MergeAnalysisMember.java | 38 ++ .../worker/MergePersistenceMember.java | 90 +++++ .../worker/MetricPersistenceMember.java | 4 +- .../collector/worker/PersistenceMember.java | 4 +- .../worker/RecordPersistenceMember.java | 4 +- .../GlobalTraceGetWithGlobalId.java | 79 ++++ .../worker/globaltrace/GlobalTraceIndex.java | 41 ++ .../analysis/GlobalTraceAnalysis.java | 84 ++++ .../worker/globaltrace/entity/TreeNode.java | 23 ++ .../persistence/GlobalTraceAgg.java | 68 ++++ .../persistence/GlobalTraceSave.java | 64 +++ .../GlobalTraceSearchWithGlobalId.java | 181 +++++++++ .../worker/httpserver/AbstractGet.java | 8 +- .../collector/worker/node/NodeIndex.java | 2 +- .../worker/nodeinst/NodeInstIndex.java | 2 +- .../worker/noderef/NodeRefIndex.java | 4 +- .../NodeRefResSumGetGroupWithTimeSlice.java | 94 +++++ .../worker/noderef/NodeRefResSumIndex.java | 2 +- .../noderef/persistence/NodeRefDaySave.java | 1 - .../noderef/persistence/NodeRefHourSave.java | 1 - .../persistence/NodeRefMinuteSave.java | 1 - .../NodeRefResSumGroupWithTimeSlice.java | 120 ++++++ .../worker/segment/SegmentCostIndex.java | 61 +++ .../SegmentExceptionIndex.java} | 27 +- .../worker/segment/SegmentIndex.java | 2 +- .../collector/worker/segment/SegmentPost.java | 24 +- .../SegmentTopGetWithGlobalTraceId.java | 95 +++++ .../segment/SegmentTopGetWithTimeSlice.java | 119 ++++++ .../worker/segment/logic/Segment.java | 141 +++++++ .../segment/logic/SegmentDeserialize.java | 17 + .../worker/segment/logic/SpanView.java | 106 +++++ .../segment/persistence/SegmentCostSave.java | 110 ++++++ .../persistence/SegmentExceptionSave.java | 115 ++++++ .../SegmentExceptionWithSegId.java | 71 ++++ .../segment/persistence/SegmentSave.java | 2 +- .../SegmentTopSearchWithGlobalTraceId.java | 155 ++++++++ .../SegmentTopSearchWithTimeSlice.java | 172 ++++++++ .../collector/worker/span/SpanGetWithId.java | 86 ++++ .../span/persistence/SpanSearchWithId.java | 88 +++++ .../storage/{index => }/AbstractIndex.java | 3 +- .../collector/worker/storage/EsClient.java | 3 +- .../worker/storage/IndexCreator.java | 15 + .../collector/worker/storage/MergeData.java | 79 ++++ .../worker/storage/MergePersistenceData.java | 55 +++ .../collector/worker/storage/MetricData.java | 1 - .../collector/worker/storage/RecordData.java | 1 - .../worker/tools/JsonFileReader.java | 20 + ...lector.actor.AbstractClusterWorkerProvider | 2 + ...ollector.actor.AbstractLocalWorkerProvider | 11 + ...ctor.worker.httpserver.AbstractGetProvider | 7 +- .../worker/AnalysisMemberTestCase.java | 32 ++ .../worker/MergeAnalysisMemberTestCase.java | 63 +++ .../MergePersistenceMemberTestCase.java | 7 + .../persistence/ClientNodeTestCase.java | 77 ---- .../dagnode/persistence/NodeRefTestCase.java | 65 --- .../persistence/ServerNodeTestCase.java | 77 ---- .../GlobalTraceSearchTestCase.java | 60 +++ .../worker/segment/SegmentPostTestCase.java | 338 +++++++++++----- .../worker/segment/SegmentSaveTestCase.java | 20 + .../worker/segment/mock/SegmentMock.java | 29 ++ .../segment/post/exception/cache-service.json | 61 +++ .../post/exception/portal-service.json | 77 ++++ .../segment/post/normal/cache-service.json | 372 ++++++++++++++++++ .../post/normal/persistence-service.json | 102 +++++ .../segment/post/normal/portal-service.json | 136 +++++++ 80 files changed, 3926 insertions(+), 618 deletions(-) create mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractClusterWorkerTestCase.java create mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractLocalAsyncWorkerTestCase.java create mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/AbstractWorkerProviderTestCase.java delete mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorker.java delete mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorkerTestCase.java delete mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalAsyncWorker.java delete mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorker.java delete mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java create mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/HashCodeSelectorTestCase.java create mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/selector/RollingSelectorTestCase.java delete mode 100644 skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/queue/QueueTestCase.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMember.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MergePersistenceMember.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceGetWithGlobalId.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceIndex.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/analysis/GlobalTraceAnalysis.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/entity/TreeNode.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceAgg.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSave.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSearchWithGlobalId.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumGetGroupWithTimeSlice.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/persistence/NodeRefResSumGroupWithTimeSlice.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentCostIndex.java rename skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/{storage/index/ClientNodeIndex.java => segment/SegmentExceptionIndex.java} (57%) create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithGlobalTraceId.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentTopGetWithTimeSlice.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/Segment.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SegmentDeserialize.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/logic/SpanView.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSave.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionSave.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentExceptionWithSegId.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentTopSearchWithGlobalTraceId.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentTopSearchWithTimeSlice.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/span/SpanGetWithId.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/span/persistence/SpanSearchWithId.java rename skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/{index => }/AbstractIndex.java (97%) create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergeData.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/MergePersistenceData.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/tools/JsonFileReader.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/AnalysisMemberTestCase.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergeAnalysisMemberTestCase.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergePersistenceMemberTestCase.java delete mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ClientNodeTestCase.java delete mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/NodeRefTestCase.java delete mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ServerNodeTestCase.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/globaltrace/GlobalTraceSearchTestCase.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentSaveTestCase.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/mock/SegmentMock.java create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/cache-service.json create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/exception/portal-service.json create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/cache-service.json create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/persistence-service.json create mode 100644 skywalking-collector/skywalking-collector-worker/src/test/resources/json/segment/post/normal/portal-service.json 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 9a0c969a5..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 @@ -15,7 +15,7 @@ import org.apache.logging.log4j.Logger; */ 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); } 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/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/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 497a21d31..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 onWork(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 bf5ab8375..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestClusterWorkerTestCase.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.a.eye.skywalking.collector.actor; - -import com.a.eye.skywalking.collector.CollectorSystem; - -/** - * @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 205940f61..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 onWork(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 59b19a08c..000000000 --- a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorker.java +++ /dev/null @@ -1,54 +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 void onWork(Object request, Object response) throws Exception { - if (request.equals("TellLocalWorker")) { - System.out.println("hello! "); - } else { - System.out.println("unhandled"); - } - } - - public static class Factory extends AbstractLocalSyncWorkerProvider { - @Override - public Role role() { - return TestLocalSyncWorkerRole.INSTANCE; - } - - @Override - public TestLocalSyncWorker workerInstance(ClusterWorkerContext clusterContext) { - return new TestLocalSyncWorker(role(), clusterContext, new LocalWorkerContext()); - } - } - - public enum TestLocalSyncWorkerRole implements Role { - INSTANCE; - - @Override - public String roleName() { - return TestLocalSyncWorker.class.getSimpleName(); - } - - @Override - public WorkerSelector workerSelector() { - return new RollingSelector(); - } - } -} diff --git a/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java b/skywalking-collector/skywalking-collector-cluster/src/test/java/com/a/eye/skywalking/collector/actor/TestLocalSyncWorkerTestCase.java 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-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 286e34b0f..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 @@ -23,7 +23,7 @@ public class CollectorBootStartUp { CollectorSystem collectorSystem = new CollectorSystem(); collectorSystem.boot(); EsClient.boot(); - IndexCreator.INSTANCE.create(); +// 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/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/MetricPersistenceMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/MetricPersistenceMember.java index 9d36c8f65..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 @@ -33,7 +33,7 @@ public abstract class MetricPersistenceMember extends PersistenceMember { } @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(); 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 c70c3b03c..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 - protected void onWork(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/RecordPersistenceMember.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/RecordPersistenceMember.java index 108b6a896..6a69bd073 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,7 +22,7 @@ public abstract class RecordPersistenceMember extends PersistenceMember { private Logger logger = LogManager.getFormatterLogger(RecordPersistenceMember.class); - protected RecordPersistenceData persistenceData = new RecordPersistenceData(); + private RecordPersistenceData persistenceData = new RecordPersistenceData(); public RecordPersistenceMember(Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { super(role, clusterContext, selfContext); @@ -48,7 +48,7 @@ public abstract class RecordPersistenceMember extends PersistenceMember { } } - 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/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..da48921fb --- /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.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/globaltrace/persistence/GlobalTraceAgg.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceAgg.java new file mode 100644 index 000000000..0a6cf9079 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceAgg.java @@ -0,0 +1,68 @@ +package com.a.eye.skywalking.collector.worker.globaltrace.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.MergeData; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +/** + * @author pengys5 + */ +public class GlobalTraceAgg extends AbstractClusterWorker { + + private Logger logger = LogManager.getFormatterLogger(GlobalTraceAgg.class); + + 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(GlobalTraceSave.Role.INSTANCE).create(this); + } + + @Override + 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 Factory INSTANCE = new Factory(); + + @Override + public Role role() { + return Role.INSTANCE; + } + + @Override + public GlobalTraceAgg workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceAgg(role(), clusterContext, new LocalWorkerContext()); + } + + @Override + public int workerNum() { + return WorkerConfig.Worker.DAGNodeReceiver.Num; + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return GlobalTraceAgg.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/globaltrace/persistence/GlobalTraceSave.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSave.java new file mode 100644 index 000000000..6954e9b4d --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/globaltrace/persistence/GlobalTraceSave.java @@ -0,0 +1,64 @@ +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.MergePersistenceMember; +import com.a.eye.skywalking.collector.worker.WorkerConfig; +import com.a.eye.skywalking.collector.worker.globaltrace.GlobalTraceIndex; + +/** + * @author pengys5 + */ +public class GlobalTraceSave extends MergePersistenceMember { + + private GlobalTraceSave(com.a.eye.skywalking.collector.actor.Role role, ClusterWorkerContext clusterContext, LocalWorkerContext selfContext) { + super(role, clusterContext, selfContext); + } + + @Override + public String esIndex() { + return GlobalTraceIndex.Index; + } + + @Override + public String esType() { + return GlobalTraceIndex.Type_Record; + } + + 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 GlobalTraceSave workerInstance(ClusterWorkerContext clusterContext) { + return new GlobalTraceSave(role(), clusterContext, new LocalWorkerContext()); + } + } + + public enum Role implements com.a.eye.skywalking.collector.actor.Role { + INSTANCE; + + @Override + public String roleName() { + return GlobalTraceSave.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/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 index 59ffa4fff..176bf9bb3 100644 --- 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 @@ -21,7 +21,13 @@ public abstract class AbstractGet extends AbstractLocalSyncWorker { @Override final public void onWork(Object request, Object response) throws Exception { Map parameterMap = (Map) request; - onSearch(parameterMap, (JsonObject) response); + 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; diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeIndex.java index 7ac335b70..5da6c798a 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeIndex.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/node/NodeIndex.java @@ -1,6 +1,6 @@ package com.a.eye.skywalking.collector.worker.node; -import com.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; diff --git a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/nodeinst/NodeInstIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/nodeinst/NodeInstIndex.java index d9b41bf16..da3353bfc 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/nodeinst/NodeInstIndex.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/nodeinst/NodeInstIndex.java @@ -1,6 +1,6 @@ package com.a.eye.skywalking.collector.worker.nodeinst; -import com.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; 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 index 8d5e349b1..84eb17888 100644 --- 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 @@ -1,8 +1,6 @@ package com.a.eye.skywalking.collector.worker.noderef; -import com.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; 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..3268b7b18 --- /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.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.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.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/NodeRefResSumIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/noderef/NodeRefResSumIndex.java index aa2a252e6..3076f8639 100644 --- 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 @@ -1,6 +1,6 @@ package com.a.eye.skywalking.collector.worker.noderef; -import com.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; 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 index 45e362cff..16a595d9d 100644 --- 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 @@ -4,7 +4,6 @@ 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.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; 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 index a0d72c1d5..814ef87f4 100644 --- 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 @@ -4,7 +4,6 @@ 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.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; 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 index c9621a392..b872da5ea 100644 --- 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 @@ -4,7 +4,6 @@ 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.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; 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..4c703e2d1 --- /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); + + private 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/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/storage/index/ClientNodeIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentExceptionIndex.java similarity index 57% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/index/ClientNodeIndex.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentExceptionIndex.java index 6e009b441..259ce9ce8 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/index/ClientNodeIndex.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentExceptionIndex.java @@ -1,7 +1,6 @@ -package com.a.eye.skywalking.collector.worker.storage.index; +package com.a.eye.skywalking.collector.worker.segment; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; +import com.a.eye.skywalking.collector.worker.storage.AbstractIndex; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -10,11 +9,13 @@ import java.io.IOException; /** * @author pengys5 */ -public class ClientNodeIndex extends AbstractIndex { +public class SegmentExceptionIndex extends AbstractIndex { - private Logger logger = LogManager.getFormatterLogger(ClientNodeIndex.class); + public static final String Index = "segment_exp_idx"; - public static final String Index = "client_node_idx"; + public static final String SegId = "segId"; + public static final String IsError = "isError"; + public static final String ErrorKind = "errorKind"; @Override public String index() { @@ -23,7 +24,7 @@ public class ClientNodeIndex extends AbstractIndex { @Override public boolean isRecord() { - return false; + return true; } @Override @@ -31,22 +32,18 @@ public class ClientNodeIndex extends AbstractIndex { XContentBuilder mappingBuilder = XContentFactory.jsonBuilder() .startObject() .startObject("properties") - .startObject("layer") + .startObject(SegId) .field("type", "string") .field("index", "not_analyzed") .endObject() - .startObject("component") - .field("type", "string") + .startObject(IsError) + .field("type", "boolean") .field("index", "not_analyzed") .endObject() - .startObject("serverHost") + .startObject(ErrorKind) .field("type", "string") .field("index", "not_analyzed") .endObject() - .startObject("timeSlice") - .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/SegmentIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/SegmentIndex.java index b7b8786b1..741ac3e0d 100644 --- 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 @@ -1,6 +1,6 @@ package com.a.eye.skywalking.collector.worker.segment; -import com.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; +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; 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 index d466b1d24..ac4e80404 100644 --- 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 @@ -7,6 +7,7 @@ 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.NodeDayAnalysis; @@ -18,6 +19,8 @@ import com.a.eye.skywalking.collector.worker.nodeinst.analysis.NodeInstMinuteAna 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; @@ -37,15 +40,20 @@ public class SegmentPost extends AbstractPost { private Logger logger = LogManager.getFormatterLogger(SegmentPost.class); - private Gson gson = new Gson(); + 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(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); @@ -82,6 +90,10 @@ public class SegmentPost extends AbstractPost { 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); + tellNodeRef(segmentWithTimeSlice); tellNode(segmentWithTimeSlice); // tellNodeInst(segmentWithTimeSlice); @@ -108,11 +120,11 @@ public class SegmentPost extends AbstractPost { getSelfContext().lookup(NodeDayAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); } - private void tellNodeInst(SegmentWithTimeSlice segmentWithTimeSlice) throws Exception { - getSelfContext().lookup(NodeInstMinuteAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); - getSelfContext().lookup(NodeInstHourAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); - getSelfContext().lookup(NodeInstDayAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); - } +// private void tellNodeInst(SegmentWithTimeSlice segmentWithTimeSlice) throws Exception { +// getSelfContext().lookup(NodeInstMinuteAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); +// getSelfContext().lookup(NodeInstHourAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); +// getSelfContext().lookup(NodeInstDayAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice); +// } private void validateData(TraceSegment newSegment) { if (StringUtil.isEmpty(newSegment.getTraceSegmentId())) { 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..bf19a2d83 --- /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.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.toString(request, "limit")); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("the request parameter from must numeric with int type"); + } + + String globalTraceId = ParameterTools.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..999685f0e --- /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.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.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.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.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.toString(request, "minCost")); + } + int maxCost = -1; + if (request.containsKey("maxCost")) { + maxCost = Integer.valueOf(ParameterTools.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..880b34335 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/segment/persistence/SegmentCostSave.java @@ -0,0 +1,110 @@ +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.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.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 AbstractIndex.Type_Record; + } + + private 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.TraceSegmentRecordAnalysis.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..c52fe15b7 --- /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; + } + + private 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.TraceSegmentRecordAnalysis.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 index e1f2ef08c..62c702f44 100644 --- 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 @@ -9,8 +9,8 @@ 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.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; import com.google.gson.JsonObject; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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..e90f5c737 --- /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.toString(request, "maxCost")); + } + + String segId = ParameterTools.toString(request, "segId"); + String spanId = ParameterTools.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/index/AbstractIndex.java b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractIndex.java similarity index 97% rename from skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/index/AbstractIndex.java rename to skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractIndex.java index 4bd720480..97c473422 100644 --- a/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/index/AbstractIndex.java +++ b/skywalking-collector/skywalking-collector-worker/src/main/java/com/a/eye/skywalking/collector/worker/storage/AbstractIndex.java @@ -1,6 +1,5 @@ -package com.a.eye.skywalking.collector.worker.storage.index; +package com.a.eye.skywalking.collector.worker.storage; -import com.a.eye.skywalking.collector.worker.storage.EsClient; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; 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 f01139679..cbf79a0e2 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 @@ -17,8 +17,6 @@ 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 { @@ -35,6 +33,7 @@ public class EsClient { } 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()); 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 index e1cc2ef57..fc57d6a6c 100644 --- 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 @@ -1,9 +1,12 @@ 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.NodeIndex; import com.a.eye.skywalking.collector.worker.nodeinst.NodeInstIndex; 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; /** @@ -16,6 +19,18 @@ public enum IndexCreator { 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(); + NodeIndex nodeIndex = new NodeIndex(); nodeIndex.deleteIndex(); nodeIndex.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 517fa2298..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 @@ -2,7 +2,6 @@ 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.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; import java.util.HashMap; import java.util.Map; 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 85440219e..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 @@ -2,7 +2,6 @@ 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.a.eye.skywalking.collector.worker.storage.index.AbstractIndex; import com.google.gson.JsonObject; /** 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/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 index 7c8d39ed8..ad1b9bfb8 100644 --- 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 @@ -1,3 +1,5 @@ +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 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 index c5cb05cc2..ff042773f 100644 --- 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 @@ -1,4 +1,9 @@ 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 @@ -13,6 +18,7 @@ com.a.eye.skywalking.collector.worker.noderef.persistence.NodeRefHourSave$Factor 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 @@ -37,3 +43,8 @@ com.a.eye.skywalking.collector.worker.nodeinst.analysis.NodeInstDayAnalysis$Fact com.a.eye.skywalking.collector.worker.nodeinst.analysis.NodeInstHourAnalysis$Factory com.a.eye.skywalking.collector.worker.nodeinst.analysis.NodeInstMinuteAnalysis$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.worker.httpserver.AbstractGetProvider b/skywalking-collector/skywalking-collector-worker/src/main/resources/META-INF/services/com.a.eye.skywalking.collector.worker.httpserver.AbstractGetProvider index 6dd8a4d64..dd6dd2de0 100644 --- 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 @@ -2,4 +2,9 @@ com.a.eye.skywalking.collector.worker.node.NodeGetWithTimeSlice$Factory com.a.eye.skywalking.collector.worker.nodeinst.NodeInstGetWithTimeSlice$Factory com.a.eye.skywalking.collector.worker.nodeinst.NodeInstSummaryGetWithTimeSlice$Factory com.a.eye.skywalking.collector.worker.noderef.NodeRefGetWithTimeSlice$Factory -com.a.eye.skywalking.collector.worker.noderef.NodeRefResSumGetWithTimeSlice$Factory \ No newline at end of file +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 \ No newline at end of file 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/MergePersistenceMemberTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergePersistenceMemberTestCase.java new file mode 100644 index 000000000..63c423de4 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/MergePersistenceMemberTestCase.java @@ -0,0 +1,7 @@ +package com.a.eye.skywalking.collector.worker; + +/** + * @author pengys5 + */ +public class MergePersistenceMemberTestCase { +} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ClientNodeTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ClientNodeTestCase.java deleted file mode 100644 index be1c4a6b3..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ClientNodeTestCase.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.a.eye.skywalking.collector.worker.dagnode.persistence; - -import com.a.eye.skywalking.collector.actor.AbstractWorker; -import com.a.eye.skywalking.collector.actor.LocalSyncWorkerRef; -import com.a.eye.skywalking.collector.worker.storage.EsClient; -import com.a.eye.skywalking.collector.worker.storage.index.ClientNodeIndex; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.rest.RestStatus; -import org.junit.Before; -import org.junit.Test; - -import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.Map; - -/** - * @author pengys5 - */ -public class ClientNodeTestCase { - -// @Before - public void initIndex() throws UnknownHostException { - EsClient.boot(); - ClientNodeIndex index = new ClientNodeIndex(); - index.deleteIndex(); - index.createIndex(); - } - -// @Test - public void testLoadClientNode() throws Exception { - loadNode(201703101201l, ClientNodeIndex.Type_Minute); - loadNode(201703101200l, ClientNodeIndex.Type_Hour); - loadNode(201703100000l, ClientNodeIndex.Type_Day); - } - - public void loadNode(long timeSlice, String type) throws Exception { -// LocalSyncWorkerRef workerRef = (LocalSyncWorkerRef) ClientNodeSearchPersistence.Factory.INSTANCE.create(AbstractWorker.noOwner()); -// -// insertData(timeSlice, type); -// EsClient.indexRefresh(ClientNodeIndex.Index); -// -// ClientNodeSearchPersistence.RequestEntity requestEntity = new ClientNodeSearchPersistence.RequestEntity(type, timeSlice); -// JsonObject resJsonObj = new JsonObject(); -// workerRef.ask(requestEntity, resJsonObj); -// JsonArray nodeArray = resJsonObj.get("result").getAsJsonArray(); -// for (int i = 0; i < nodeArray.size(); i++) { -// JsonObject node = nodeArray.get(i).getAsJsonObject(); -// System.out.println(node); -// } - } - - private void insertData(long timeSlice, String type) { - Map json = new HashMap(); - json.put("serverHost", "10.20.3.15:3000"); - json.put("timeSlice", timeSlice); - json.put("component", "Motan"); - json.put("layer", "rpc"); - - String _id = timeSlice + "-Motan-10.20.3.15:3000"; - IndexResponse response = EsClient.getClient().prepareIndex(ClientNodeIndex.Index, type, _id).setSource(json).get(); - RestStatus status = response.status(); - status.getStatus(); - - json = new HashMap(); - json.put("serverHost", "10.5.34.18"); - json.put("timeSlice", timeSlice); - json.put("component", "Mysql"); - json.put("layer", "db"); - _id = timeSlice + "-Mysql-10.5.34.18"; - - response = EsClient.getClient().prepareIndex(ClientNodeIndex.Index, type, _id).setSource(json).get(); - status = response.status(); - status.getStatus(); - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/NodeRefTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/NodeRefTestCase.java deleted file mode 100644 index b60c34a2f..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/NodeRefTestCase.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.a.eye.skywalking.collector.worker.dagnode.persistence; - -import com.a.eye.skywalking.collector.actor.AbstractWorker; -import com.a.eye.skywalking.collector.actor.LocalSyncWorkerRef; -import com.a.eye.skywalking.collector.worker.storage.EsClient; -import com.a.eye.skywalking.collector.worker.noderef.NodeRefIndex; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.rest.RestStatus; -import org.junit.Before; -import org.junit.Test; - -import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.Map; - -/** - * @author pengys5 - */ -public class NodeRefTestCase { - -// @Before - public void initIndex() throws UnknownHostException { - EsClient.boot(); - NodeRefIndex index = new NodeRefIndex(); - index.deleteIndex(); - index.createIndex(); - } - -// @Test - public void testLoadNodeRef() throws Exception { - loadNodeRef(201703101201l, NodeRefIndex.Type_Minute); - loadNodeRef(201703101200l, NodeRefIndex.Type_Hour); - loadNodeRef(201703100000l, NodeRefIndex.Type_Day); - } - - public void loadNodeRef(long timeSlice, String type) throws Exception { -// LocalSyncWorkerRef workerRef = (LocalSyncWorkerRef) NodeRefSearchPersistence.Factory.INSTANCE.create(AbstractWorker.noOwner()); -// -// insertData(timeSlice, type); -// EsClient.indexRefresh(NodeRefIndex.Index); -// -// NodeRefSearchPersistence.RequestEntity requestEntity = new NodeRefSearchPersistence.RequestEntity(type, timeSlice); -// JsonObject resJsonObj = new JsonObject(); -// workerRef.ask(requestEntity, resJsonObj); -// JsonArray nodeArray = resJsonObj.get("result").getAsJsonArray(); -// for (int i = 0; i < nodeArray.size(); i++) { -// JsonObject node = nodeArray.get(i).getAsJsonObject(); -// System.out.println(node); -// } - } - - private void insertData(long timeSlice, String type) { - Map json = new HashMap(); - json.put("client", "WebApplication"); - json.put("server", "MotanServiceApplication"); - json.put("timeSlice", timeSlice); - - String _id = timeSlice + "-WebApplication-MotanServiceApplication"; - IndexResponse response = EsClient.getClient().prepareIndex(NodeRefIndex.Index, type, _id).setSource(json).get(); - RestStatus status = response.status(); - status.getStatus(); - } -} diff --git a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ServerNodeTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ServerNodeTestCase.java deleted file mode 100644 index 632ffa72e..000000000 --- a/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/dagnode/persistence/ServerNodeTestCase.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.a.eye.skywalking.collector.worker.dagnode.persistence; - -import com.a.eye.skywalking.collector.actor.AbstractWorker; -import com.a.eye.skywalking.collector.actor.LocalSyncWorkerRef; -import com.a.eye.skywalking.collector.worker.storage.EsClient; -import com.a.eye.skywalking.collector.worker.node.NodeIndex; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.rest.RestStatus; -import org.junit.Before; -import org.junit.Test; - -import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.Map; - -/** - * @author pengys5 - */ -public class ServerNodeTestCase { - -// @Before - public void initIndex() throws UnknownHostException { - EsClient.boot(); - NodeIndex index = new NodeIndex(); - index.deleteIndex(); - index.createIndex(); - } - -// @Test - public void testLoadServerNode() throws Exception { - loadNode(201703101201l, NodeIndex.Type_Minute); - loadNode(201703101200l, NodeIndex.Type_Hour); - loadNode(201703100000l, NodeIndex.Type_Day); - } - - public void loadNode(long timeSlice, String type) throws Exception { -// LocalSyncWorkerRef workerRef = (LocalSyncWorkerRef) ServerNodeSearchPersistence.Factory.INSTANCE.create(AbstractWorker.noOwner()); -// -// insertData(timeSlice, type); -// EsClient.indexRefresh(NodeIndex.Index); -// -// ServerNodeSearchPersistence.RequestEntity requestEntity = new ServerNodeSearchPersistence.RequestEntity(type, timeSlice); -// JsonObject resJsonObj = new JsonObject(); -// workerRef.ask(requestEntity, resJsonObj); -// JsonArray nodeArray = resJsonObj.get("result").getAsJsonArray(); -// for (int i = 0; i < nodeArray.size(); i++) { -// JsonObject node = nodeArray.get(i).getAsJsonObject(); -// System.out.println(node); -// } - } - - private void insertData(long timeSlice, String type) { - Map json = new HashMap(); - json.put("code", "WebApplication"); - json.put("timeSlice", timeSlice); - json.put("component", "Tomcat"); - json.put("layer", "http"); - - String _id = timeSlice + "-WebApplication"; - IndexResponse response = EsClient.getClient().prepareIndex(NodeIndex.Index, type, _id).setSource(json).get(); - RestStatus status = response.status(); - status.getStatus(); - - json = new HashMap(); - json.put("code", "MotanServiceApplication"); - json.put("timeSlice", timeSlice); - json.put("component", "Motan"); - json.put("layer", "rpc"); - _id = timeSlice + "-MotanServiceApplication"; - - response = EsClient.getClient().prepareIndex(NodeIndex.Index, type, _id).setSource(json).get(); - status = response.status(); - status.getStatus(); - } -} 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/segment/SegmentPostTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentPostTestCase.java index 19926be0e..cba0303bf 100644 --- 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 @@ -1,113 +1,263 @@ package com.a.eye.skywalking.collector.worker.segment; -import com.a.eye.skywalking.collector.worker.tools.HttpClientTools; -import com.a.eye.skywalking.trace.SegmentsMessage; -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 com.google.gson.Gson; -import com.google.gson.GsonBuilder; +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.NodeDayAnalysis; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeHourAnalysis; +import com.a.eye.skywalking.collector.worker.node.analysis.NodeMinuteAnalysis; +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.google.gson.JsonObject; +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 java.io.IOException; -import java.util.Date; +import static org.powermock.api.mockito.PowerMockito.*; /** * @author pengys5 */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({LocalWorkerContext.class, WorkerRef.class}) +@PowerMockIgnore({"javax.management.*"}) public class SegmentPostTestCase { -// @Test - public void loopPostSegment() throws Exception { - for (int i = 0; i < 100; i++) { - testPostSegment(); + 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(); + initNodeAnalysis(); + + 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 nodeMinuteAnalysisAnswer; + private SegmentOtherAnswer nodeHourAnalysisAnswer; + private SegmentOtherAnswer nodeDayAnalysisAnswer; + + public void initNodeAnalysis() throws Exception { + WorkerRef nodeMinuteAnalysis = mock(WorkerRef.class); + doReturn(NodeMinuteAnalysis.Role.INSTANCE).when(nodeMinuteAnalysis, "getRole"); + localWorkerContext.put(nodeMinuteAnalysis); + + nodeMinuteAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeMinuteAnalysisAnswer).when(nodeMinuteAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + + WorkerRef nodeHourAnalysis = mock(WorkerRef.class); + doReturn(NodeHourAnalysis.Role.INSTANCE).when(nodeHourAnalysis, "getRole"); + localWorkerContext.put(nodeHourAnalysis); + + nodeHourAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeHourAnalysisAnswer).when(nodeHourAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + + WorkerRef nodeDayAnalysis = mock(WorkerRef.class); + doReturn(NodeDayAnalysis.Role.INSTANCE).when(nodeDayAnalysis, "getRole"); + localWorkerContext.put(nodeDayAnalysis); + + nodeDayAnalysisAnswer = new SegmentOtherAnswer(); + doAnswer(nodeDayAnalysisAnswer).when(nodeDayAnalysis).tell(Mockito.argThat(new IsSegmentWithTimeSlice())); + } + + @Test + public void testOnReceive() throws Exception { + String cacheServiceSegmentAsString = segmentMock.mockCacheServiceSegmentAsString(); + + segmentPost.onReceive(cacheServiceSegmentAsString); + + Assert.assertEquals(201703310915L, segmentSaveAnswer_1.minute); + Assert.assertEquals(201703310900L, segmentSaveAnswer_1.hour); + Assert.assertEquals(201703310000L, segmentSaveAnswer_1.day); + + Assert.assertEquals(201703310915L, segmentSaveAnswer_2.minute); + Assert.assertEquals(201703310900L, segmentSaveAnswer_2.hour); + Assert.assertEquals(201703310000L, segmentSaveAnswer_2.day); + + Assert.assertEquals(201703310915L, segmentCostSaveAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, segmentCostSaveAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, segmentCostSaveAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, globalTraceAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, globalTraceAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, globalTraceAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, segmentExceptionSaveAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, segmentExceptionSaveAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, segmentExceptionSaveAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, nodeRefMinuteAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, nodeRefMinuteAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeRefMinuteAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, nodeRefHourAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, nodeRefHourAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeRefHourAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, nodeRefDayAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, nodeRefDayAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeRefDayAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, nodeMinuteAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, nodeMinuteAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeMinuteAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, nodeHourAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, nodeHourAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeHourAnalysisAnswer.segmentWithTimeSlice.getDay()); + + Assert.assertEquals(201703310915L, nodeDayAnalysisAnswer.segmentWithTimeSlice.getMinute()); + Assert.assertEquals(201703310900L, nodeDayAnalysisAnswer.segmentWithTimeSlice.getHour()); + Assert.assertEquals(201703310000L, nodeDayAnalysisAnswer.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; } } -// @Test - public void testPostSegment() throws Exception { - Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + public class SegmentSaveAnswer implements Answer { + long minute = 0; + long hour = 0; + long day = 0; - SegmentsMessage segmentsMessage = new SegmentsMessage(); - - TraceSegment webSegment = new TraceSegment("WebApplication"); - - Span span = new Span(0, "/Web/GetUser", new Date().getTime()); - Tags.SPAN_LAYER.asHttp(span); - Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); - Tags.URL.set(span, "http://10.218.9.86:8080/Web/GetUser"); - Tags.STATUS_CODE.set(span, 200); - Tags.COMPONENT.set(span, "Tomcat"); - Tags.PEERS.set(span, "202.135.4.12"); - Thread.sleep(300); - webSegment.archive(span); - Thread.sleep(300); - - Span span1 = new Span(1, span, "com.a.eye.skywalking.demo.services.GetUserService.findUser(String, String)", new Date().getTime()); - Tags.SPAN_LAYER.asRPCFramework(span1); - Tags.URL.set(span1, "motan://10.20.3.15:3000/com.a.eye.skywalking.demo.services.GetUserService.findUser(String, String)"); - Tags.SPAN_KIND.set(span1, Tags.SPAN_KIND_CLIENT); - Tags.COMPONENT.set(span1, "Motan"); - Tags.PEERS.set(span1, "10.20.3.15:3000"); - Thread.sleep(300); - webSegment.archive(span1); - Thread.sleep(300); - - Thread.sleep(300); - webSegment.finish(); - Thread.sleep(300); - - segmentsMessage.append(webSegment); -// String webJsonStr = gson.toJson(webSegment); -// HttpClientTools.INSTANCE.post("http://localhost:7001/segment", webJsonStr); - - TraceSegment motanSegment = new TraceSegment("MotanServiceApplication"); - - TraceSegmentRef segmentRef = new TraceSegmentRef(); - segmentRef.setApplicationCode("WebApplication"); - segmentRef.setPeerHost("10.20.3.15:3000"); - segmentRef.setTraceSegmentId(webSegment.getTraceSegmentId()); - motanSegment.ref(segmentRef); - - Span span2 = new Span(0, "com.a.eye.skywalking.demo.services.GetUserService.findUser(String, String)", new Date().getTime()); - Tags.SPAN_LAYER.asRPCFramework(span2); - Tags.SPAN_KIND.set(span2, Tags.SPAN_KIND_SERVER); - Tags.URL.set(span2, "motan://10.20.3.15:3000/com.a.eye.skywalking.demo.services.GetUserService.findUser(String, String)"); - Tags.COMPONENT.set(span2, "Motan"); - Tags.PEERS.set(span2, "10.218.9.86"); - Thread.sleep(300); - motanSegment.archive(span2); - Thread.sleep(300); - - Span span3 = new Span(1, span2, "com.a.eye.skywalking.demo.services.GetUserService.findUser(String, String)", new Date().getTime()); - Tags.SPAN_LAYER.asDB(span3); - Tags.SPAN_KIND.set(span3, Tags.SPAN_KIND_CLIENT); - Tags.COMPONENT.set(span3, "Mysql"); - Tags.PEERS.set(span3, "10.5.34.18"); - Thread.sleep(300); - motanSegment.archive(span3); - Thread.sleep(300); - - Thread.sleep(300); - motanSegment.finish(); - Thread.sleep(300); - - segmentsMessage.append(motanSegment); - String segmentJsonStr = gson.toJson(segmentsMessage); - HttpClientTools.INSTANCE.post("http://localhost:7001/segment", segmentJsonStr); + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + JsonObject jsonObject = (JsonObject) invocation.getArguments()[0]; + minute = jsonObject.get("minute").getAsLong(); + hour = jsonObject.get("hour").getAsLong(); + day = jsonObject.get("day").getAsLong(); + return null; + } } -// @Test - public void testPostSample1Segment() throws Exception { -// HttpClientTools.INSTANCE.post("http://localhost:7001/segments", sample1); -// HttpClientTools.INSTANCE.post("http://localhost:7001/segments", sample2); -// HttpClientTools.INSTANCE.post("http://localhost:7001/segments", sample3); - HttpClientTools.INSTANCE.post("http://localhost:7001/segments", test); + 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()); + } } - private String test = "[{\"ts\":\"Segment.1490346133016.1756883859.5046.1.1\",\"st\":1490346133015,\"et\":1490346133041,\"ss\":[{\"si\":0,\"ps\":-1,\"st\":1490346133020,\"et\":1490346133041,\"on\":\"H2/JDBI/Statement/execute\",\"ts\":{\"db.instance\":\"dataSource\",\"span.layer\":\"db\",\"db.type\":\"sql\",\"component\":\"H2\",\"span.kind\":\"client\",\"db.statement\":\"CREATE TABLE CACHE_TABLE ( id INTEGER PRIMARY KEY AUTO_INCREMENT, CACHE_KEY VARCHAR(30), CACHE_VALUE VARCHAR(50) )\",\"peer.host\":\"localhost\"},\"tb\":{},\"ti\":{\"peer.port\":-1},\"lo\":[]}],\"ac\":\"cache-service\",\"gt\":[\"Trace.1490346133019.1756883859.5046.1.2\"],\"sampled\":true,\"minute\":201703241702,\"hour\":201703241700,\"day\":201703240000,\"aggId\":null}]"; - private String sample1 = "[{\"ts\":\"Segment.1490166134993.56087145.45017.26.1\",\"st\":1490166134993,\"et\":1490166134996,\"rs\":[{\"ts\":\"Segment.1490166134989.142811427.45029.64.1\",\"si\":2,\"ac\":\"portal-service\",\"ph\":\"127.0.0.1:8002\"}],\"ss\":[{\"si\":2,\"ps\":1,\"st\":1490166134993,\"et\":1490166134993,\"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\":1490166134993,\"et\":1490166134993,\"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\":1490166134993,\"et\":1490166134993,\"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\":1490166134993,\"et\":1490166134994,\"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\":1490166134994,\"et\":1490166134994,\"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\":1490166134996,\"et\":1490166134996,\"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\":1490166134996,\"et\":1490166134996,\"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\":1490166134996,\"on\":\"Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)\",\"ts\":{\"requestId\":\"1562552445165371397\"},\"tb\":{},\"ti\":{},\"lo\":[]},{\"si\":0,\"ps\":-1,\"st\":1490166134993,\"et\":1490166134996,\"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.1490166134989.142811427.45029.64.2\"]},{\"ts\":\"Segment.1490166135023.56087145.45017.27.1\",\"st\":1490166135023,\"et\":1490166135026,\"rs\":[{\"ts\":\"Segment.1490166134989.142811427.45029.64.1\",\"si\":6,\"ac\":\"portal-service\",\"ph\":\"127.0.0.1:8002\"}],\"ss\":[{\"si\":2,\"ps\":1,\"st\":1490166135023,\"et\":1490166135023,\"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\":1490166135023,\"et\":1490166135023,\"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\":1490166135023,\"et\":1490166135023,\"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\":1490166135023,\"et\":1490166135024,\"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\":1490166135024,\"et\":1490166135024,\"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\":1490166135025,\"et\":1490166135025,\"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\":1490166135026,\"et\":1490166135026,\"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\":1490166135026,\"on\":\"Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)\",\"ts\":{\"requestId\":\"1562552445196828678\"},\"tb\":{},\"ti\":{},\"lo\":[]},{\"si\":0,\"ps\":-1,\"st\":1490166135023,\"et\":1490166135026,\"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.1490166134989.142811427.45029.64.2\"]}]"; - private String sample2 = "[{\"ts\":\"Segment.1490166135008.-790808105.45019.39.1\",\"st\":1490166135008,\"et\":1490166135014,\"rs\":[{\"ts\":\"Segment.1490166134989.142811427.45029.64.1\",\"si\":4,\"ac\":\"portal-service\",\"ph\":\"10.128.35.80:20880\"}],\"ss\":[{\"si\":2,\"ps\":1,\"st\":1490166135010,\"et\":1490166135010,\"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\":1490166135012,\"et\":1490166135013,\"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\":1490166135009,\"et\":1490166135013,\"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\":1490166135008,\"et\":1490166135014,\"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\":61968,\"status_code\":200},\"lo\":[]}],\"ac\":\"persistence-service\",\"gt\":[\"Trace.1490166134989.142811427.45029.64.2\"]}]"; - private String sample3 = "[{\"ts\":\"Segment.1490166134989.142811427.45029.64.1\",\"st\":1490166134989,\"et\":1490166135028,\"ss\":[{\"si\":2,\"ps\":1,\"st\":1490166134992,\"et\":1490166134996,\"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\":1490166134996,\"on\":\"Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.findCache(java.lang.String)\",\"ts\":{\"requestId\":\"1562552445165371397\"},\"tb\":{},\"ti\":{},\"lo\":[]},{\"si\":4,\"ps\":3,\"st\":1490166134997,\"et\":1490166135019,\"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\":1490166134997,\"et\":1490166135022,\"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\":1490166135022,\"et\":1490166135026,\"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\":1490166135026,\"on\":\"Motan_default_rpc_com.a.eye.skywalking.test.cache.CacheService.updateCache(java.lang.String,java.lang.String)\",\"ts\":{\"requestId\":\"1562552445196828678\"},\"tb\":{},\"ti\":{},\"lo\":[]},{\"si\":0,\"ps\":-1,\"st\":1490166134989,\"et\":1490166135028,\"on\":\"/portal/\",\"ts\":{\"span.layer\":\"http\",\"component\":\"Tomcat\",\"peer.host\":\"0:0:0:0:0:0:0:1\",\"span.kind\":\"server\",\"url\":\"http://localhost:8080/portal/\"},\"tb\":{},\"ti\":{\"peer.port\":61982,\"status_code\":200},\"lo\":[]}],\"ac\":\"portal-service\",\"gt\":[\"Trace.1490166134989.142811427.45029.64.2\"]}]"; + 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/SegmentSaveTestCase.java b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentSaveTestCase.java new file mode 100644 index 000000000..2f98b1a65 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/SegmentSaveTestCase.java @@ -0,0 +1,20 @@ +package com.a.eye.skywalking.collector.worker.segment; + +import com.a.eye.skywalking.collector.worker.segment.persistence.SegmentSave; +import com.google.gson.JsonObject; +import org.junit.Test; +import org.mockito.Mockito; + +/** + * @author pengys5 + */ +public class SegmentSaveTestCase { + + @Test + public void testAnalyse() throws Exception{ + SegmentSave segmentSave = Mockito.mock(SegmentSave.class); + + JsonObject segment_1 = new JsonObject(); + segmentSave.analyse(segment_1); + } +} 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..6766e6719 --- /dev/null +++ b/skywalking-collector/skywalking-collector-worker/src/test/java/com/a/eye/skywalking/collector/worker/segment/mock/SegmentMock.java @@ -0,0 +1,29 @@ +package com.a.eye.skywalking.collector.worker.segment.mock; + +import com.a.eye.skywalking.collector.worker.tools.JsonFileReader; + +import java.io.FileNotFoundException; + +/** + * @author pengys5 + */ +public class SegmentMock { + + 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"; + + 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); + } +} 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