From 1d625d2ad5116874d1ec7c5d3bb08afc6d3a4fce Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Sun, 4 Feb 2018 23:57:40 +0800 Subject: [PATCH] Provide the queryTrace query. --- .../test/resources/json/dubbox-provider.json | 2 +- .../collector/storage/ui/trace/KeyValue.java | 16 ++ .../collector/storage/ui/trace/LogEntity.java | 23 +- .../apm/collector/storage/ui/trace/Ref.java | 34 ++- .../apm/collector/storage/ui/trace/Span.java | 170 ++++++++++- .../apm/collector/storage/ui/trace/Trace.java | 14 + .../ui/jetty/handler/GraphQLHandler.java | 11 +- .../apm/collector/ui/query/TraceQuery.java | 15 +- .../ui/service/TraceStackService.java | 272 ++++++++---------- 9 files changed, 397 insertions(+), 160 deletions(-) diff --git a/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/test/resources/json/dubbox-provider.json b/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/test/resources/json/dubbox-provider.json index 01c6e76ad..174112074 100644 --- a/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/test/resources/json/dubbox-provider.json +++ b/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/test/resources/json/dubbox-provider.json @@ -24,7 +24,7 @@ { "pts": [230150, 185809, 24040000], //上级的segment_id 一个应用中的一个实例在链路中产生的编号 "pii": 2, //上级的实例编号 - "psp": 0, //上级的埋点编号span_id + "psp": 1, //上级的埋点编号span_id "psi": 0, //上级的服务编号(org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()注册后的ID) "psn": "org.skywaking.apm.testcase.dubbo.services.GreetService.doBusiness()", //上级的服务名 "ni": 0, //上级调用时使用的地址注册后的ID diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/KeyValue.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/KeyValue.java index 03e1d6857..deac45f07 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/KeyValue.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/KeyValue.java @@ -24,4 +24,20 @@ package org.apache.skywalking.apm.collector.storage.ui.trace; public class KeyValue { private String key; private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/LogEntity.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/LogEntity.java index 61855c8ea..a7988702e 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/LogEntity.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/LogEntity.java @@ -18,12 +18,33 @@ package org.apache.skywalking.apm.collector.storage.ui.trace; +import java.util.LinkedList; import java.util.List; /** * @author peng-yongsheng */ public class LogEntity { - private String time; + private long time; private List data; + + public LogEntity() { + this.data = new LinkedList<>(); + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Ref.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Ref.java index a013e0c1a..7f189e765 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Ref.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Ref.java @@ -23,7 +23,39 @@ package org.apache.skywalking.apm.collector.storage.ui.trace; */ public class Ref { private String traceId; - private Integer parentSegmentId; + private String parentSegmentId; private Integer parentSpanId; private RefType type; + + public String getTraceId() { + return traceId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public String getParentSegmentId() { + return parentSegmentId; + } + + public void setParentSegmentId(String parentSegmentId) { + this.parentSegmentId = parentSegmentId; + } + + public Integer getParentSpanId() { + return parentSpanId; + } + + public void setParentSpanId(Integer parentSpanId) { + this.parentSpanId = parentSpanId; + } + + public RefType getType() { + return type; + } + + public void setType(RefType type) { + this.type = type; + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Span.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Span.java index 1df21844c..9d56c39ce 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Span.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Span.java @@ -18,6 +18,7 @@ package org.apache.skywalking.apm.collector.storage.ui.trace; +import java.util.LinkedList; import java.util.List; /** @@ -26,12 +27,12 @@ import java.util.List; public class Span { private String traceId; private String segmentId; - private Integer spanId; - private Integer parentSpanId; + private int spanId; + private int parentSpanId; private List refs; private String applicationCode; - private Long startTime; - private Long endTime; + private long startTime; + private long endTime; private String operationName; private String type; private String peer; @@ -40,4 +41,165 @@ public class Span { private String layer; private List tags; private List logs; + private boolean isRoot; + private String segmentSpanId; + private String segmentParentSpanId; + + public Span() { + this.refs = new LinkedList<>(); + this.tags = new LinkedList<>(); + this.logs = new LinkedList<>(); + } + + public String getTraceId() { + return traceId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public String getSegmentId() { + return segmentId; + } + + public void setSegmentId(String segmentId) { + this.segmentId = segmentId; + } + + public int getSpanId() { + return spanId; + } + + public void setSpanId(int spanId) { + this.spanId = spanId; + } + + public int getParentSpanId() { + return parentSpanId; + } + + public void setParentSpanId(int parentSpanId) { + this.parentSpanId = parentSpanId; + } + + public List getRefs() { + return refs; + } + + public void setRefs(List refs) { + this.refs = refs; + } + + public String getApplicationCode() { + return applicationCode; + } + + public void setApplicationCode(String applicationCode) { + this.applicationCode = applicationCode; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public String getOperationName() { + return operationName; + } + + public void setOperationName(String operationName) { + this.operationName = operationName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPeer() { + return peer; + } + + public void setPeer(String peer) { + this.peer = peer; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public Boolean getError() { + return isError; + } + + public void setError(Boolean error) { + isError = error; + } + + public String getLayer() { + return layer; + } + + public void setLayer(String layer) { + this.layer = layer; + } + + public List getTags() { + return tags; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public List getLogs() { + return logs; + } + + public void setLogs(List logs) { + this.logs = logs; + } + + public boolean isRoot() { + return isRoot; + } + + public void setRoot(boolean root) { + isRoot = root; + } + + public String getSegmentParentSpanId() { + return segmentParentSpanId; + } + + public void setSegmentParentSpanId(String segmentParentSpanId) { + this.segmentParentSpanId = segmentParentSpanId; + } + + public String getSegmentSpanId() { + return segmentSpanId; + } + + public void setSegmentSpanId(String segmentSpanId) { + this.segmentSpanId = segmentSpanId; + } } diff --git a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Trace.java b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Trace.java index a9f03964f..a3524aa44 100644 --- a/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Trace.java +++ b/apm-collector/apm-collector-storage/collector-storage-define/src/main/java/org/apache/skywalking/apm/collector/storage/ui/trace/Trace.java @@ -18,11 +18,25 @@ package org.apache.skywalking.apm.collector.storage.ui.trace; +import java.util.LinkedList; import java.util.List; /** * @author peng-yongsheng */ public class Trace { + private List spans; + + public Trace() { + this.spans = new LinkedList<>(); + } + + public List getSpans() { + return spans; + } + + public void setSpans(List spans) { + this.spans = spans; + } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/jetty/handler/GraphQLHandler.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/jetty/handler/GraphQLHandler.java index c66a5052c..7c30f793d 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/jetty/handler/GraphQLHandler.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/jetty/handler/GraphQLHandler.java @@ -23,6 +23,7 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import graphql.ExecutionInput; import graphql.ExecutionResult; import graphql.GraphQL; @@ -31,6 +32,7 @@ import graphql.schema.GraphQLSchema; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.lang.reflect.Type; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -64,6 +66,7 @@ public class GraphQLHandler extends JettyHandler { private final Gson gson = new Gson(); private final GraphQL graphQL; private static final String QUERY = "query"; + private static final String VARIABLES = "variables"; private static final String DATA = "data"; private static final String ERRORS = "errors"; private static final String MESSAGE = "message"; @@ -79,7 +82,7 @@ public class GraphQLHandler extends JettyHandler { .file("ui-graphql/service-layer.graphqls") .file("ui-graphql/trace.graphqls") .resolvers(new VersionQuery(), new VersionMutation(), new AlarmQuery(), new ApplicationQuery(moduleManager)) - .resolvers(new OverViewLayerQuery(moduleManager), new ServerQuery(moduleManager), new ServiceQuery(), new TraceQuery()) + .resolvers(new OverViewLayerQuery(moduleManager), new ServerQuery(moduleManager), new ServiceQuery(), new TraceQuery(moduleManager)) .resolvers(new ConfigQuery(), new ConfigMutation()) .dictionary(ConjecturalNode.class, VisualUserNode.class, ApplicationNode.class) .build() @@ -105,7 +108,11 @@ public class GraphQLHandler extends JettyHandler { } JsonObject requestJson = gson.fromJson(request, JsonObject.class); - return execute(requestJson.get(QUERY).getAsString(), gson.fromJson(requestJson.get("variables"), Map.class)); + + Type mapType = new TypeToken>() { + }.getType(); + + return execute(requestJson.get(QUERY).getAsString(), gson.fromJson(requestJson.get(VARIABLES), mapType)); } private JsonObject execute(String request, Map variables) { diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java index e77a8e59f..336824467 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/query/TraceQuery.java @@ -26,6 +26,7 @@ import org.apache.skywalking.apm.collector.storage.ui.trace.TraceBrief; import org.apache.skywalking.apm.collector.storage.ui.trace.TraceQueryCondition; import org.apache.skywalking.apm.collector.ui.graphql.Query; import org.apache.skywalking.apm.collector.ui.service.SegmentTopService; +import org.apache.skywalking.apm.collector.ui.service.TraceStackService; import org.apache.skywalking.apm.collector.ui.utils.DurationUtils; /** @@ -35,6 +36,7 @@ public class TraceQuery implements Query { private final ModuleManager moduleManager; private SegmentTopService segmentTopService; + private TraceStackService traceStackService; public TraceQuery(ModuleManager moduleManager) { this.moduleManager = moduleManager; @@ -47,6 +49,13 @@ public class TraceQuery implements Query { return segmentTopService; } + private TraceStackService getTraceStackService() { + if (ObjectUtils.isEmpty(traceStackService)) { + this.traceStackService = new TraceStackService(moduleManager); + } + return traceStackService; + } + public TraceBrief queryBasicTraces(TraceQueryCondition condition) throws ParseException { long start = DurationUtils.INSTANCE.durationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getStart()); long end = DurationUtils.INSTANCE.durationToSecondTimeBucket(condition.getQueryDuration().getStep(), condition.getQueryDuration().getEnd()); @@ -59,10 +68,10 @@ public class TraceQuery implements Query { int limit = condition.getPaging().getPageSize(); int from = condition.getPaging().getPageSize() * condition.getPaging().getPageNum(); - return segmentTopService.loadTop(start, end, minDuration, maxDuration, operationName, traceId, applicationId, limit, from); + return getSegmentTopService().loadTop(start, end, minDuration, maxDuration, operationName, traceId, applicationId, limit, from); } - public Trace queryTrace(String id) { - return null; + public Trace queryTrace(String traceId) { + return getTraceStackService().load(traceId); } } diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TraceStackService.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TraceStackService.java index 55bb369ea..989d4318f 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TraceStackService.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TraceStackService.java @@ -16,26 +16,33 @@ * */ - package org.apache.skywalking.apm.collector.ui.service; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import org.apache.skywalking.apm.collector.cache.CacheModule; +import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService; +import org.apache.skywalking.apm.collector.cache.service.NetworkAddressCacheService; +import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService; import org.apache.skywalking.apm.collector.core.module.ModuleManager; import org.apache.skywalking.apm.collector.core.util.CollectionUtils; import org.apache.skywalking.apm.collector.core.util.Const; import org.apache.skywalking.apm.collector.core.util.ObjectUtils; -import org.apache.skywalking.apm.collector.storage.dao.ui.IGlobalTraceUIDAO; -import org.apache.skywalking.apm.collector.storage.dao.ui.ISegmentUIDAO; -import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService; -import org.apache.skywalking.apm.collector.cache.service.ServiceNameCacheService; import org.apache.skywalking.apm.collector.core.util.StringUtils; import org.apache.skywalking.apm.collector.storage.StorageModule; +import org.apache.skywalking.apm.collector.storage.dao.ui.IGlobalTraceUIDAO; +import org.apache.skywalking.apm.collector.storage.dao.ui.ISegmentUIDAO; +import org.apache.skywalking.apm.collector.storage.ui.trace.KeyValue; +import org.apache.skywalking.apm.collector.storage.ui.trace.LogEntity; +import org.apache.skywalking.apm.collector.storage.ui.trace.Ref; +import org.apache.skywalking.apm.collector.storage.ui.trace.RefType; +import org.apache.skywalking.apm.collector.storage.ui.trace.Span; +import org.apache.skywalking.apm.collector.storage.ui.trace.Trace; import org.apache.skywalking.apm.network.proto.SpanObject; import org.apache.skywalking.apm.network.proto.TraceSegmentObject; +import org.apache.skywalking.apm.network.proto.UniqueId; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; /** * @author peng-yongsheng @@ -46,60 +53,45 @@ public class TraceStackService { private final ISegmentUIDAO segmentDAO; private final ApplicationCacheService applicationCacheService; private final ServiceNameCacheService serviceNameCacheService; + private final NetworkAddressCacheService networkAddressCacheService; public TraceStackService(ModuleManager moduleManager) { this.globalTraceDAO = moduleManager.find(StorageModule.NAME).getService(IGlobalTraceUIDAO.class); this.segmentDAO = moduleManager.find(StorageModule.NAME).getService(ISegmentUIDAO.class); this.applicationCacheService = moduleManager.find(CacheModule.NAME).getService(ApplicationCacheService.class); this.serviceNameCacheService = moduleManager.find(CacheModule.NAME).getService(ServiceNameCacheService.class); + this.networkAddressCacheService = moduleManager.find(CacheModule.NAME).getService(NetworkAddressCacheService.class); } - public JsonArray load(String globalTraceId) { - List spans = new ArrayList<>(); - List segmentIds = globalTraceDAO.getSegmentIds(globalTraceId); + public Trace load(String traceId) { + Trace trace = new Trace(); + List segmentIds = globalTraceDAO.getSegmentIds(traceId); if (CollectionUtils.isNotEmpty(segmentIds)) { for (String segmentId : segmentIds) { TraceSegmentObject segment = segmentDAO.load(segmentId); if (ObjectUtils.isNotEmpty(segment)) { - spans.addAll(buildSpanList(segmentId, segment)); + trace.getSpans().addAll(buildSpanList(traceId, segmentId, segment.getApplicationId(), segment.getSpansList())); } } } - List sortedSpans = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(spans)) { - List rootSpans = findRoot(spans); + List sortedSpans = new LinkedList<>(); + if (CollectionUtils.isNotEmpty(trace.getSpans())) { + List rootSpans = findRoot(trace.getSpans()); if (CollectionUtils.isNotEmpty(rootSpans)) { rootSpans.forEach(span -> { List childrenSpan = new ArrayList<>(); childrenSpan.add(span); - findChildren(spans, span, childrenSpan); + findChildren(trace.getSpans(), span, childrenSpan); sortedSpans.addAll(childrenSpan); }); } } - minStartTime(sortedSpans); +// minStartTime(sortedSpans); - return toJsonArray(sortedSpans); - } - - private JsonArray toJsonArray(List sortedSpans) { - JsonArray traceStackArray = new JsonArray(); - sortedSpans.forEach(span -> { - JsonObject spanJson = new JsonObject(); - spanJson.addProperty("spanId", span.getSpanId()); - spanJson.addProperty("parentSpanId", span.getParentSpanId()); - spanJson.addProperty("segmentSpanId", span.getSegmentSpanId()); - spanJson.addProperty("segmentParentSpanId", span.getSegmentParentSpanId()); - spanJson.addProperty("startTime", span.getStartTime()); - spanJson.addProperty("operationName", span.getOperationName()); - spanJson.addProperty("applicationCode", span.getApplicationCode()); - spanJson.addProperty("cost", span.getCost()); - spanJson.addProperty("isRoot", span.isRoot()); - traceStackArray.add(spanJson); - }); - return traceStackArray; + trace.setSpans(sortedSpans); + return trace; } private void minStartTime(List spans) { @@ -115,56 +107,108 @@ public class TraceStackService { } } - private List buildSpanList(String segmentId, TraceSegmentObject segment) { + private List buildSpanList(String traceId, String segmentId, int applicationId, + List spanObjects) { List spans = new ArrayList<>(); - if (segment.getSpansCount() > 0) { - for (SpanObject spanObject : segment.getSpansList()) { - int spanId = spanObject.getSpanId(); - int parentSpanId = spanObject.getParentSpanId(); - String segmentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(spanId); - String segmentParentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(parentSpanId); - long startTime = spanObject.getStartTime(); - String operationName = spanObject.getOperationName(); - if (spanObject.getOperationNameId() != 0) { - String serviceName = serviceNameCacheService.get(spanObject.getOperationNameId()); - if (StringUtils.isNotEmpty(serviceName)) { - operationName = serviceName.split(Const.ID_SPLIT)[1]; + spanObjects.forEach(spanObject -> { + Span span = new Span(); + span.setTraceId(traceId); + span.setSegmentId(segmentId); + span.setSpanId(spanObject.getSpanId()); + span.setParentSpanId(spanObject.getParentSpanId()); + span.setStartTime(spanObject.getStartTime()); + span.setEndTime(spanObject.getEndTime()); + span.setError(spanObject.getIsError()); + span.setLayer(spanObject.getSpanLayer().name()); + span.setType(spanObject.getSpanType().name()); + + String segmentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(spanObject.getSpanId()); + span.setSegmentSpanId(segmentSpanId); + + String segmentParentSpanId = segmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(spanObject.getParentSpanId()); + span.setSegmentParentSpanId(segmentParentSpanId); + + if (spanObject.getPeerId() == 0) { + span.setPeer(spanObject.getPeer()); + } else { + span.setPeer(networkAddressCacheService.getAddress(spanObject.getPeerId())); + } + + String operationName = spanObject.getOperationName(); + if (spanObject.getOperationNameId() != 0) { + String serviceName = serviceNameCacheService.get(spanObject.getOperationNameId()); + if (StringUtils.isNotEmpty(serviceName)) { + operationName = serviceName.split(Const.ID_SPLIT)[1]; + } else { + operationName = Const.EMPTY_STRING; + } + } + span.setOperationName(operationName); + + String applicationCode = applicationCacheService.getApplicationById(applicationId).getApplicationCode(); + span.setApplicationCode(applicationCode); + + if (spanObject.getComponentId() == 0) { + span.setComponent(spanObject.getComponent()); + } else { + span.setComponent(ComponentsDefine.getInstance().getComponentName(spanObject.getComponentId())); + } + + spanObject.getRefsList().forEach(reference -> { + Ref ref = new Ref(); + ref.setTraceId(traceId); + + switch (reference.getRefType()) { + case CrossThread: + ref.setType(RefType.CROSS_THREAD); + break; + case CrossProcess: + ref.setType(RefType.CROSS_PROCESS); + break; + } + ref.setParentSpanId(reference.getParentSpanId()); + + UniqueId uniqueId = reference.getParentTraceSegmentId(); + StringBuilder segmentIdBuilder = new StringBuilder(); + for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) { + if (i == 0) { + segmentIdBuilder.append(String.valueOf(uniqueId.getIdPartsList().get(i))); } else { - operationName = Const.EMPTY_STRING; + segmentIdBuilder.append(".").append(String.valueOf(uniqueId.getIdPartsList().get(i))); } } - String applicationCode = applicationCacheService.getApplicationById(segment.getApplicationId()).getApplicationCode(); + ref.setParentSegmentId(segmentIdBuilder.toString()); - long cost = spanObject.getEndTime() - spanObject.getStartTime(); - if (cost == 0) { - cost = 1; - } + span.setSegmentParentSpanId(ref.getParentSegmentId() + Const.SEGMENT_SPAN_SPLIT + String.valueOf(ref.getParentSpanId())); + + span.getRefs().add(ref); + }); + + spanObject.getTagsList().forEach(tag -> { + KeyValue keyValue = new KeyValue(); + keyValue.setKey(tag.getKey()); + keyValue.setValue(tag.getValue()); + span.getTags().add(keyValue); + }); + + spanObject.getLogsList().forEach(log -> { + LogEntity logEntity = new LogEntity(); + logEntity.setTime(log.getTime()); + + log.getDataList().forEach(data -> { + KeyValue keyValue = new KeyValue(); + keyValue.setKey(data.getKey()); + keyValue.setValue(data.getValue()); + logEntity.getData().add(keyValue); + }); + + span.getLogs().add(logEntity); + }); + + spans.add(span); + }); -// if (parentSpanId == -1 && segment.getRefsCount() > 0) { -// for (TraceSegmentReference reference : segment.getRefsList()) { -// parentSpanId = reference.getParentSpanId(); -// UniqueId uniqueId = reference.getParentTraceSegmentId(); -// -// StringBuilder segmentIdBuilder = new StringBuilder(); -// for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) { -// if (i == 0) { -// segmentIdBuilder.append(String.valueOf(uniqueId.getIdPartsList().getApplicationIdByCode(i))); -// } else { -// segmentIdBuilder.append(".").append(String.valueOf(uniqueId.getIdPartsList().getApplicationIdByCode(i))); -// } -// } -// -// String parentSegmentId = segmentIdBuilder.toString(); -// segmentParentSpanId = parentSegmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(parentSpanId); -// -// spans.add(new Span(spanId, parentSpanId, segmentSpanId, segmentParentSpanId, startTime, operationName, applicationCode, cost)); -// } -// } else { -// spans.add(new Span(spanId, parentSpanId, segmentSpanId, segmentParentSpanId, startTime, operationName, applicationCode, cost)); -// } - } - } return spans; } @@ -174,8 +218,8 @@ public class TraceStackService { String segmentParentSpanId = span.getSegmentParentSpanId(); boolean hasParent = false; - for (Span span1 : spans) { - if (segmentParentSpanId.equals(span1.getSegmentSpanId())) { + for (Span subSpan : spans) { + if (segmentParentSpanId.equals(subSpan.getSegmentSpanId())) { hasParent = true; } } @@ -196,72 +240,4 @@ public class TraceStackService { } }); } - - class Span { - private int spanId; - private int parentSpanId; - private String segmentSpanId; - private String segmentParentSpanId; - private long startTime; - private String operationName; - private String applicationCode; - private long cost; - private boolean isRoot = false; - - Span(int spanId, int parentSpanId, String segmentSpanId, String segmentParentSpanId, long startTime, - String operationName, String applicationCode, long cost) { - this.spanId = spanId; - this.parentSpanId = parentSpanId; - this.segmentSpanId = segmentSpanId; - this.segmentParentSpanId = segmentParentSpanId; - this.startTime = startTime; - this.operationName = operationName; - this.applicationCode = applicationCode; - this.cost = cost; - } - - int getSpanId() { - return spanId; - } - - int getParentSpanId() { - return parentSpanId; - } - - String getSegmentSpanId() { - return segmentSpanId; - } - - String getSegmentParentSpanId() { - return segmentParentSpanId; - } - - long getStartTime() { - return startTime; - } - - String getOperationName() { - return operationName; - } - - String getApplicationCode() { - return applicationCode; - } - - long getCost() { - return cost; - } - - public boolean isRoot() { - return isRoot; - } - - public void setRoot(boolean root) { - isRoot = root; - } - - public void setStartTime(long startTime) { - this.startTime = startTime; - } - } }