Merge branch 'feature/collector' into feature/3.0
* feature/collector: modify testcase bug When errors occur in timezone mock mock mock remove property layer and kind from node index
This commit is contained in:
commit
8af68b1481
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,8 @@
|
|||
package com.a.eye.skywalking.collector.actor;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author pengys5
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -10,12 +10,20 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||
*/
|
||||
public abstract class WorkerContext implements Context {
|
||||
|
||||
private Map<String, List<WorkerRef>> roleWorkers = new ConcurrentHashMap<>();
|
||||
private Map<String, List<WorkerRef>> roleWorkers;
|
||||
|
||||
public WorkerContext() {
|
||||
this.roleWorkers = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
private Map<String, List<WorkerRef>> 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<WorkerRef>());
|
||||
if (!getRoleWorkers().containsKey(workerRef.getRole().roleName())) {
|
||||
getRoleWorkers().putIfAbsent(workerRef.getRole().roleName(), new ArrayList<WorkerRef>());
|
||||
}
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<EndOfBatchCommand> {
|
||||
public boolean matches(Object para) {
|
||||
return para.getClass() == EndOfBatchCommand.class;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TestClusterWorker> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TestLocalAsyncWorker> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TestLocalSyncWorker> {
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 {
|
||||
}
|
||||
}
|
||||
|
|
@ -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<WorkerRef> 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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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<WorkerRef> 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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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 {
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<Map.Entry<String, MergeData>> 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<Map.Entry<String, MergeData>> 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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<String, String[]> 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<GlobalTraceGetWithGlobalId> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<DistributedTraceId> 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<GlobalTraceAnalysis> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TreeNode> childNodes;
|
||||
|
||||
public TreeNode(String spanId) {
|
||||
this.spanId = spanId;
|
||||
childNodes = new ArrayList<>();
|
||||
}
|
||||
|
||||
public void addChild(TreeNode childNode) {
|
||||
childNodes.add(childNode);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<GlobalTraceAgg> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<GlobalTraceSave> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<SpanView> 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<TraceSegmentRef> 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<SpanView> 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<SpanView> 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<SpanView> spanViewList, long rootStartTime) {
|
||||
String spanSegId = parentSpan.getSpanSegId();
|
||||
logger.debug("findChild spanSegId: %s", spanSegId);
|
||||
|
||||
List<SpanView> childSpanSort = sortChildSpan(spanViewList, spanSegId);
|
||||
for (SpanView spanView : childSpanSort) {
|
||||
spanView.setRelativeStartTime(spanView.getStartTime() - rootStartTime);
|
||||
parentSpan.addChild(spanView);
|
||||
findChild(spanView, spanViewList, rootStartTime);
|
||||
}
|
||||
}
|
||||
|
||||
private List<SpanView> sortChildSpan(List<SpanView> spanViewList, String parentSpanId) {
|
||||
List<SpanView> 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<SpanView> spanViewList, List<TraceSegmentRef> 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<GlobalTraceSearchWithGlobalId> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -21,7 +21,13 @@ public abstract class AbstractGet extends AbstractLocalSyncWorker {
|
|||
@Override
|
||||
final public void onWork(Object request, Object response) throws Exception {
|
||||
Map<String, String[]> parameterMap = (Map<String, String[]>) 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<String, String[]> request, JsonObject response) throws Exception;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
@ -15,9 +15,7 @@ public class NodeIndex extends AbstractIndex {
|
|||
|
||||
public static final String Code = "code";
|
||||
public static final String NickName = "nickName";
|
||||
public static final String Layer = "layer";
|
||||
public static final String Component = "component";
|
||||
public static final String Kind = "kind";
|
||||
|
||||
@Override
|
||||
public String index() {
|
||||
|
|
@ -42,18 +40,10 @@ public class NodeIndex extends AbstractIndex {
|
|||
.field("type", "string")
|
||||
.field("index", "not_analyzed")
|
||||
.endObject()
|
||||
.startObject(Layer)
|
||||
.field("type", "string")
|
||||
.field("index", "not_analyzed")
|
||||
.endObject()
|
||||
.startObject(Component)
|
||||
.field("type", "string")
|
||||
.field("index", "not_analyzed")
|
||||
.endObject()
|
||||
.startObject(Kind)
|
||||
.field("type", "string")
|
||||
.field("index", "not_analyzed")
|
||||
.endObject()
|
||||
.startObject(AGG_COLUMN)
|
||||
.field("type", "string")
|
||||
.field("index", "not_analyzed")
|
||||
|
|
|
|||
|
|
@ -35,14 +35,16 @@ abstract class AbstractNodeAnalysis extends RecordAnalysisMember {
|
|||
|
||||
if (CollectionTools.isNotEmpty(spanList)) {
|
||||
logger.debug("node analysis span list size: %s", spanList.size());
|
||||
String id = timeSlice + Const.ID_SPLIT + segment.getApplicationCode();
|
||||
JsonObject appDataJsonObj = new JsonObject();
|
||||
appDataJsonObj.addProperty(NodeIndex.Code, segment.getApplicationCode());
|
||||
appDataJsonObj.addProperty(NodeIndex.NickName, segment.getApplicationCode());
|
||||
appDataJsonObj.addProperty(NodeIndex.Time_Slice, timeSlice);
|
||||
setRecord(id, appDataJsonObj);
|
||||
|
||||
for (Span span : spanList) {
|
||||
JsonObject dataJsonObj = new JsonObject();
|
||||
String kind = Tags.SPAN_KIND.get(span);
|
||||
dataJsonObj.addProperty(NodeIndex.Kind, kind);
|
||||
|
||||
String layer = Tags.SPAN_LAYER.get(span);
|
||||
dataJsonObj.addProperty(NodeIndex.Layer, layer);
|
||||
|
||||
String component = Tags.COMPONENT.get(span);
|
||||
dataJsonObj.addProperty(NodeIndex.Component, component);
|
||||
|
||||
|
|
@ -50,13 +52,7 @@ abstract class AbstractNodeAnalysis extends RecordAnalysisMember {
|
|||
dataJsonObj.addProperty(NodeIndex.Code, code);
|
||||
|
||||
dataJsonObj.addProperty(NodeIndex.Time_Slice, timeSlice);
|
||||
logger.debug("span id=%s, kind=%s, layer=%s, component=%s, code=%s", span.getSpanId(), kind, layer, component, code);
|
||||
|
||||
String id = timeSlice + Const.ID_SPLIT + code;
|
||||
logger.debug("leaf client node: %s", dataJsonObj.toString());
|
||||
dataJsonObj.addProperty(NodeIndex.Code, code);
|
||||
dataJsonObj.addProperty(NodeIndex.NickName, code);
|
||||
setRecord(id, dataJsonObj);
|
||||
logger.debug("span id=%s, kind=%s, component=%s, code=%s", span.getSpanId(), kind, component, code);
|
||||
|
||||
if (Tags.SPAN_KIND_CLIENT.equals(kind) && ClientSpanIsLeafTools.isLeaf(span.getSpanId(), spanList)) {
|
||||
logger.debug("The span id %s which kind is client and is a leaf span", span.getSpanId());
|
||||
|
|
@ -72,8 +68,6 @@ abstract class AbstractNodeAnalysis extends RecordAnalysisMember {
|
|||
if (CollectionTools.isEmpty(segment.getRefs())) {
|
||||
JsonObject userDataJsonObj = new JsonObject();
|
||||
userDataJsonObj.addProperty(NodeIndex.Code, Const.USER_CODE);
|
||||
userDataJsonObj.addProperty(NodeIndex.Layer, Const.USER_CODE);
|
||||
userDataJsonObj.addProperty(NodeIndex.Kind, Tags.SPAN_KIND_CLIENT);
|
||||
userDataJsonObj.addProperty(NodeIndex.Component, Const.USER_CODE);
|
||||
userDataJsonObj.addProperty(NodeIndex.NickName, Const.USER_CODE);
|
||||
userDataJsonObj.addProperty(NodeIndex.Time_Slice, timeSlice);
|
||||
|
|
|
|||
|
|
@ -54,12 +54,12 @@ public class NodeSearchWithTimeSlice extends AbstractLocalSyncWorker {
|
|||
TopHits topHits = entry.getAggregations().get(NodeIndex.Top_One);
|
||||
for (SearchHit hit : topHits.getHits().getHits()) {
|
||||
logger.debug(" -> id [{%s}], _source [{%s}]", hit.getId(), hit.getSourceAsString());
|
||||
|
||||
|
||||
JsonObject nodeObj = new JsonObject();
|
||||
nodeObj.addProperty(NodeIndex.Code, (String) hit.getSource().get(NodeIndex.Code));
|
||||
nodeObj.addProperty(NodeIndex.Component, (String) hit.getSource().get(NodeIndex.Component));
|
||||
nodeObj.addProperty(NodeIndex.Layer, (String) hit.getSource().get(NodeIndex.Layer));
|
||||
nodeObj.addProperty(NodeIndex.Kind, (String) hit.getSource().get(NodeIndex.Kind));
|
||||
if (hit.getSource().containsKey(NodeIndex.Component)) {
|
||||
nodeObj.addProperty(NodeIndex.Component, (String) hit.getSource().get(NodeIndex.Component));
|
||||
}
|
||||
nodeObj.addProperty(NodeIndex.NickName, (String) hit.getSource().get(NodeIndex.NickName));
|
||||
nodeObj.addProperty(NodeIndex.Time_Slice, (Long) hit.getSource().get(NodeIndex.Time_Slice));
|
||||
nodeArray.add(nodeObj);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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<String, String[]> 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<NodeRefResSumGetGroupWithTimeSlice> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<NodeRefResSumGroupWithTimeSlice> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -77,11 +85,16 @@ public class SegmentPost extends AbstractPost {
|
|||
long hourSlice = DateTools.getHourSlice(newSegment.getStartTime());
|
||||
long daySlice = DateTools.getDaySlice(newSegment.getStartTime());
|
||||
int second = DateTools.getSecond(newSegment.getStartTime());
|
||||
logger.debug("minuteSlice: %s, hourSlice: %s, daySlice: %s, second:%s", minuteSlice, hourSlice, daySlice, second);
|
||||
|
||||
SegmentWithTimeSlice segmentWithTimeSlice = new SegmentWithTimeSlice(newSegment, minuteSlice, hourSlice, daySlice, second);
|
||||
String newSegmentJsonStr = gson.toJson(newSegment);
|
||||
tellSegmentSave(newSegmentJsonStr, daySlice, hourSlice, minuteSlice);
|
||||
|
||||
getSelfContext().lookup(SegmentCostSave.Role.INSTANCE).tell(segmentWithTimeSlice);
|
||||
getSelfContext().lookup(GlobalTraceAnalysis.Role.INSTANCE).tell(segmentWithTimeSlice);
|
||||
getSelfContext().lookup(SegmentExceptionSave.Role.INSTANCE).tell(segmentWithTimeSlice);
|
||||
|
||||
tellNodeRef(segmentWithTimeSlice);
|
||||
tellNode(segmentWithTimeSlice);
|
||||
// tellNodeInst(segmentWithTimeSlice);
|
||||
|
|
@ -108,11 +121,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())) {
|
||||
|
|
|
|||
|
|
@ -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<String, String[]> 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<SegmentTopGetWithGlobalTraceId> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String, String[]> 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<SegmentTopGetWithTimeSlice> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<TraceSegmentRef> 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<Span> spans;
|
||||
|
||||
/**
|
||||
* The <code>applicationCode</code> represents a name of current application/JVM and indicates which is business
|
||||
* role in the cluster.
|
||||
* <p>
|
||||
* e.g. account_app, billing_app
|
||||
*/
|
||||
@Expose
|
||||
@SerializedName(value = "ac")
|
||||
private String applicationCode;
|
||||
|
||||
/**
|
||||
* The <code>relatedGlobalTraces</code> 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}.
|
||||
* <p>
|
||||
* The difference between <code>relatedGlobalTraces</code> and {@link #refs} is:
|
||||
* {@link #refs} targets this {@link TraceSegment}'s direct parent,
|
||||
* <p>
|
||||
* and
|
||||
* <p>
|
||||
* <code>relatedGlobalTraces</code> 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<TraceSegmentRef>();
|
||||
}
|
||||
if (!refs.contains(refSegment)) {
|
||||
refs.add(refSegment);
|
||||
}
|
||||
}
|
||||
|
||||
public void relatedGlobalTraces(List<DistributedTraceId> 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<TraceSegmentRef> getRefs() {
|
||||
if (refs == null) {
|
||||
return null;
|
||||
}
|
||||
return Collections.unmodifiableList(refs);
|
||||
}
|
||||
|
||||
public List<DistributedTraceId> getRelatedGlobalTraces() {
|
||||
return relatedGlobalTraces.getRelatedGlobalTraces();
|
||||
}
|
||||
|
||||
public List<Span> getSpans() {
|
||||
return Collections.unmodifiableList(spans);
|
||||
}
|
||||
|
||||
public String getApplicationCode() {
|
||||
return applicationCode;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<SpanView> {
|
||||
|
||||
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<SpanView> 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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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<SegmentCostSave> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<LogData> 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<SegmentExceptionSave> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<SegmentExceptionWithSegId> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<DistributedTraceId> 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<SegmentTopSearchWithGlobalTraceId> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<DistributedTraceId> 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<SegmentTopSearchWithTimeSlice> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String, String[]> 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<SpanGetWithId> {
|
||||
|
||||
@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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<Span> 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<SpanSearchWithId> {
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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<String, Set<String>> 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<String, Set<String>> entry : data.mergeData.entrySet()) {
|
||||
String column = entry.getKey();
|
||||
Set<String> value = entry.getValue();
|
||||
Iterator<String> iterator = value.iterator();
|
||||
while (iterator.hasNext()) {
|
||||
setMergeData(column, iterator.next());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void merge(Map<String, Object> dbData) {
|
||||
for (Map.Entry<String, Object> 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<String, String> toMap() {
|
||||
Map<String, String> source = new HashMap<>();
|
||||
for (Map.Entry<String, Set<String>> entry : mergeData.entrySet()) {
|
||||
String column = entry.getKey();
|
||||
Iterator<String> 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String, MergeData> 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<Map.Entry<String, MergeData>> iterator() {
|
||||
return persistenceData.entrySet().iterator();
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.a.eye.skywalking.collector.worker.tools;
|
|||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* @author pengys5
|
||||
|
|
@ -19,7 +20,7 @@ public class DateTools {
|
|||
}
|
||||
|
||||
public static long getMinuteSlice(long time) {
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8:00"));
|
||||
calendar.setTimeInMillis(time);
|
||||
String timeStr = minuteDateFormat.format(calendar.getTime());
|
||||
return Long.valueOf(timeStr);
|
||||
|
|
@ -38,4 +39,12 @@ public class DateTools {
|
|||
String timeStr = dayDateFormat.format(calendar.getTime()) + "0000";
|
||||
return Long.valueOf(timeStr);
|
||||
}
|
||||
|
||||
public static long changeToUTCSlice(long timeSlice) {
|
||||
if (TimeZone.getDefault().getID().equals("GMT+08:00")) {
|
||||
return timeSlice;
|
||||
} else {
|
||||
return timeSlice - 800;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
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
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String, Object> json = new HashMap<String, Object>();
|
||||
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<String, Object>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String, Object> json = new HashMap<String, Object>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String, Object> json = new HashMap<String, Object>();
|
||||
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<String, Object>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package com.a.eye.skywalking.collector.worker.tools;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* @author pengys5
|
||||
*/
|
||||
public class DateToolsTestCase {
|
||||
|
||||
@Test
|
||||
public void testUTCLocation() {
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
|
||||
long timeSlice = 201703310915L;
|
||||
long changedTimeSlice = DateTools.changeToUTCSlice(timeSlice);
|
||||
Assert.assertEquals(201703310115L, changedTimeSlice);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUTC8Location() {
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("GMT+08:00"));
|
||||
long timeSlice = 201703310915L;
|
||||
long changedTimeSlice = DateTools.changeToUTCSlice(timeSlice);
|
||||
Assert.assertEquals(201703310915L, changedTimeSlice);
|
||||
}
|
||||
}
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
|
@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
Loading…
Reference in New Issue