Fixed the GlobalTraceId contidtion not effect in trece stack web ui.
This commit is contained in:
parent
4582e9d9fa
commit
7aac7365ac
|
|
@ -2,11 +2,11 @@ package org.skywalking.apm.collector.agentstream.worker.global;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.skywalking.apm.collector.storage.define.global.GlobalTraceDataDefine;
|
||||
import org.skywalking.apm.collector.agentstream.worker.segment.FirstSpanListener;
|
||||
import org.skywalking.apm.collector.agentstream.worker.segment.GlobalTraceIdsListener;
|
||||
import org.skywalking.apm.collector.core.util.TimeBucketUtils;
|
||||
import org.skywalking.apm.collector.core.framework.CollectorContextHelper;
|
||||
import org.skywalking.apm.collector.core.util.TimeBucketUtils;
|
||||
import org.skywalking.apm.collector.storage.define.global.GlobalTraceDataDefine;
|
||||
import org.skywalking.apm.collector.stream.StreamModuleContext;
|
||||
import org.skywalking.apm.collector.stream.StreamModuleGroupDefine;
|
||||
import org.skywalking.apm.collector.stream.worker.WorkerInvokeException;
|
||||
|
|
@ -35,7 +35,13 @@ public class GlobalTraceSpanListener implements FirstSpanListener, GlobalTraceId
|
|||
|
||||
@Override public void parseGlobalTraceId(UniqueId uniqueId) {
|
||||
StringBuilder globalTraceIdBuilder = new StringBuilder();
|
||||
uniqueId.getIdPartsList().forEach(globalTraceIdBuilder::append);
|
||||
for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) {
|
||||
if (i == 0) {
|
||||
globalTraceIdBuilder.append(uniqueId.getIdPartsList().get(i));
|
||||
} else {
|
||||
globalTraceIdBuilder.append(".").append(uniqueId.getIdPartsList().get(i));
|
||||
}
|
||||
}
|
||||
globalTraceIds.add(globalTraceIdBuilder.toString());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,15 @@ public class SegmentParse {
|
|||
|
||||
public void parse(List<UniqueId> traceIds, TraceSegmentObject segmentObject) {
|
||||
StringBuilder segmentIdBuilder = new StringBuilder();
|
||||
segmentObject.getTraceSegmentId().getIdPartsList().forEach(segmentIdBuilder::append);
|
||||
|
||||
for (int i = 0; i < segmentObject.getTraceSegmentId().getIdPartsList().size(); i++) {
|
||||
if (i == 0) {
|
||||
segmentIdBuilder.append(segmentObject.getTraceSegmentId().getIdPartsList().get(i));
|
||||
} else {
|
||||
segmentIdBuilder.append(".").append(segmentObject.getTraceSegmentId().getIdPartsList().get(i));
|
||||
}
|
||||
}
|
||||
|
||||
String segmentId = segmentIdBuilder.toString();
|
||||
|
||||
for (UniqueId uniqueId : traceIds) {
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
<logger name="org.eclipse.jetty" level="INFO"/>
|
||||
<logger name="org.apache.zookeeper" level="INFO"/>
|
||||
|
||||
<root level="debug">
|
||||
<root level="info">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
</configuration>
|
||||
|
|
@ -19,4 +19,8 @@ public class CollectionUtils {
|
|||
public static boolean isNotEmpty(List list) {
|
||||
return !isEmpty(list);
|
||||
}
|
||||
|
||||
public static <T> boolean isNotEmpty(T[] array) {
|
||||
return array != null && array.length > 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
package org.skywalking.apm.collector.ui.dao;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author pengys5
|
||||
*/
|
||||
public interface ISegmentCostDAO {
|
||||
JsonObject loadTop(long startTime, long endTime, long minCost, long maxCost, String operationName,
|
||||
String globalTraceId, int limit, int from, Sort sort);
|
||||
List<String> segmentIds, int limit, int from, Sort sort);
|
||||
|
||||
public enum Sort {
|
||||
Cost, Time
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ import org.elasticsearch.search.aggregations.bucket.terms.Terms;
|
|||
import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount;
|
||||
import org.elasticsearch.search.sort.SortBuilders;
|
||||
import org.elasticsearch.search.sort.SortMode;
|
||||
import org.skywalking.apm.collector.core.util.TimeBucketUtils;
|
||||
import org.skywalking.apm.collector.storage.define.register.InstanceDataDefine;
|
||||
import org.skywalking.apm.collector.storage.define.register.InstanceTable;
|
||||
import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO;
|
||||
|
|
@ -34,12 +35,15 @@ public class InstanceEsDAO extends EsDAO implements IInstanceDAO {
|
|||
|
||||
@Override public Long lastHeartBeatTime() {
|
||||
long fiveMinuteBefore = System.currentTimeMillis() - 5 * 60 * 1000;
|
||||
fiveMinuteBefore = TimeBucketUtils.INSTANCE.getSecondTimeBucket(fiveMinuteBefore);
|
||||
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(InstanceTable.COLUMN_HEARTBEAT_TIME).gt(fiveMinuteBefore);
|
||||
return heartBeatTime(rangeQueryBuilder);
|
||||
}
|
||||
|
||||
@Override public Long instanceLastHeartBeatTime(long applicationInstanceId) {
|
||||
long fiveMinuteBefore = System.currentTimeMillis() - 5 * 60 * 1000;
|
||||
fiveMinuteBefore = TimeBucketUtils.INSTANCE.getSecondTimeBucket(fiveMinuteBefore);
|
||||
|
||||
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
|
||||
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery(InstanceTable.COLUMN_HEARTBEAT_TIME).gt(fiveMinuteBefore);
|
||||
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery(InstanceTable.COLUMN_INSTANCE_ID, applicationInstanceId);
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import org.skywalking.apm.collector.storage.elasticsearch.dao.EsDAO;
|
|||
public class SegmentCostEsDAO extends EsDAO implements ISegmentCostDAO {
|
||||
|
||||
@Override public JsonObject loadTop(long startTime, long endTime, long minCost, long maxCost, String operationName,
|
||||
String globalTraceId, int limit, int from, Sort sort) {
|
||||
List<String> segmentIds, int limit, int from, Sort sort) {
|
||||
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(SegmentCostTable.TABLE);
|
||||
searchRequestBuilder.setTypes(SegmentCostTable.TABLE_TYPE);
|
||||
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
|
||||
|
|
@ -44,9 +44,12 @@ public class SegmentCostEsDAO extends EsDAO implements ISegmentCostDAO {
|
|||
}
|
||||
boolQueryBuilder.must().add(rangeQueryBuilder);
|
||||
}
|
||||
if (!StringUtils.isEmpty(operationName)) {
|
||||
if (StringUtils.isNotEmpty(operationName)) {
|
||||
mustQueryList.add(QueryBuilders.matchQuery(SegmentCostTable.COLUMN_SERVICE_NAME, operationName));
|
||||
}
|
||||
if (CollectionUtils.isNotEmpty(segmentIds)) {
|
||||
boolQueryBuilder.must().add(QueryBuilders.termsQuery(SegmentCostTable.COLUMN_SEGMENT_ID, segmentIds.toArray(new String[0])));
|
||||
}
|
||||
|
||||
if (Sort.Cost.equals(sort)) {
|
||||
searchRequestBuilder.addSort(SegmentCostTable.COLUMN_COST, SortOrder.DESC);
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package org.skywalking.apm.collector.ui.dao;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import java.util.List;
|
||||
import org.skywalking.apm.collector.storage.h2.dao.H2DAO;
|
||||
|
||||
/**
|
||||
|
|
@ -8,7 +9,7 @@ import org.skywalking.apm.collector.storage.h2.dao.H2DAO;
|
|||
*/
|
||||
public class SegmentCostH2DAO extends H2DAO implements ISegmentCostDAO {
|
||||
@Override public JsonObject loadTop(long startTime, long endTime, long minCost, long maxCost, String operationName,
|
||||
String globalTraceId, int limit, int from, Sort sort) {
|
||||
List<String> segmentIds, int limit, int from, Sort sort) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
package org.skywalking.apm.collector.ui.service;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import org.skywalking.apm.collector.core.util.StringUtils;
|
||||
import org.skywalking.apm.collector.storage.dao.DAOContainer;
|
||||
import org.skywalking.apm.collector.ui.dao.IGlobalTraceDAO;
|
||||
import org.skywalking.apm.collector.ui.dao.ISegmentCostDAO;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
|
@ -16,7 +20,13 @@ public class SegmentTopService {
|
|||
public JsonObject loadTop(long startTime, long endTime, long minCost, long maxCost, String operationName,
|
||||
String globalTraceId, int limit, int from, ISegmentCostDAO.Sort sort) {
|
||||
logger.debug("startTime: {}, endTime: {}, minCost: {}, maxCost: {}, operationName: {}, globalTraceId: {}, limit: {}, from: {}", startTime, endTime, minCost, maxCost, operationName, globalTraceId, limit, from);
|
||||
|
||||
List<String> segmentIds = new LinkedList<>();
|
||||
if (StringUtils.isNotEmpty(globalTraceId)) {
|
||||
IGlobalTraceDAO globalTraceDAO = (IGlobalTraceDAO)DAOContainer.INSTANCE.get(IGlobalTraceDAO.class.getName());
|
||||
segmentIds = globalTraceDAO.getSegmentIds(globalTraceId);
|
||||
}
|
||||
ISegmentCostDAO segmentCostDAO = (ISegmentCostDAO)DAOContainer.INSTANCE.get(ISegmentCostDAO.class.getName());
|
||||
return segmentCostDAO.loadTop(startTime, endTime, minCost, maxCost, operationName, globalTraceId, limit, from, sort);
|
||||
return segmentCostDAO.loadTop(startTime, endTime, minCost, maxCost, operationName, segmentIds, limit, from, sort);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package org.skywalking.apm.collector.ui.service;
|
|||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import org.skywalking.apm.collector.core.util.Const;
|
||||
import org.skywalking.apm.collector.storage.define.noderef.NodeReferenceTable;
|
||||
|
|
@ -26,13 +27,14 @@ public class TraceDagDataBuilder {
|
|||
changeNodeComp2Map(nodeCompArray);
|
||||
changeMapping2Map(nodesMappingArray);
|
||||
|
||||
for (int i = 0; i < resSumArray.size(); i++) {
|
||||
JsonObject nodeRefJsonObj = resSumArray.get(i).getAsJsonObject();
|
||||
Map<String, JsonObject> mergedResSumMap = merge(resSumArray);
|
||||
|
||||
mergedResSumMap.values().forEach(nodeRefJsonObj -> {
|
||||
String front = nodeRefJsonObj.get("front").getAsString();
|
||||
String behind = nodeRefJsonObj.get("behind").getAsString();
|
||||
|
||||
if (hasMapping(behind)) {
|
||||
continue;
|
||||
return;
|
||||
}
|
||||
|
||||
JsonObject lineJsonObj = new JsonObject();
|
||||
|
|
@ -42,7 +44,7 @@ public class TraceDagDataBuilder {
|
|||
|
||||
lineArray.add(lineJsonObj);
|
||||
logger.debug("line: {}", lineJsonObj);
|
||||
}
|
||||
});
|
||||
|
||||
JsonObject dagJsonObj = new JsonObject();
|
||||
dagJsonObj.add("nodes", pointArray);
|
||||
|
|
@ -93,4 +95,28 @@ public class TraceDagDataBuilder {
|
|||
private boolean hasMapping(String peers) {
|
||||
return mappingMap.containsKey(peers);
|
||||
}
|
||||
|
||||
private Map<String, JsonObject> merge(JsonArray nodeReference) {
|
||||
Map<String, JsonObject> mergedRef = new LinkedHashMap<>();
|
||||
for (int i = 0; i < nodeReference.size(); i++) {
|
||||
JsonObject nodeRefJsonObj = nodeReference.get(i).getAsJsonObject();
|
||||
String front = nodeRefJsonObj.get("front").getAsString();
|
||||
String behind = nodeRefJsonObj.get("behind").getAsString();
|
||||
|
||||
String id = front + Const.ID_SPLIT + behind;
|
||||
if (mergedRef.containsKey(id)) {
|
||||
JsonObject oldValue = mergedRef.get(id);
|
||||
oldValue.addProperty(NodeReferenceTable.COLUMN_S1_LTE, oldValue.get(NodeReferenceTable.COLUMN_S1_LTE).getAsLong() + nodeRefJsonObj.get(NodeReferenceTable.COLUMN_S1_LTE).getAsLong());
|
||||
oldValue.addProperty(NodeReferenceTable.COLUMN_S3_LTE, oldValue.get(NodeReferenceTable.COLUMN_S3_LTE).getAsLong() + nodeRefJsonObj.get(NodeReferenceTable.COLUMN_S3_LTE).getAsLong());
|
||||
oldValue.addProperty(NodeReferenceTable.COLUMN_S5_LTE, oldValue.get(NodeReferenceTable.COLUMN_S5_LTE).getAsLong() + nodeRefJsonObj.get(NodeReferenceTable.COLUMN_S5_LTE).getAsLong());
|
||||
oldValue.addProperty(NodeReferenceTable.COLUMN_S5_GT, oldValue.get(NodeReferenceTable.COLUMN_S5_GT).getAsLong() + nodeRefJsonObj.get(NodeReferenceTable.COLUMN_S5_GT).getAsLong());
|
||||
oldValue.addProperty(NodeReferenceTable.COLUMN_ERROR, oldValue.get(NodeReferenceTable.COLUMN_ERROR).getAsLong() + nodeRefJsonObj.get(NodeReferenceTable.COLUMN_ERROR).getAsLong());
|
||||
oldValue.addProperty(NodeReferenceTable.COLUMN_SUMMARY, oldValue.get(NodeReferenceTable.COLUMN_SUMMARY).getAsLong() + nodeRefJsonObj.get(NodeReferenceTable.COLUMN_SUMMARY).getAsLong());
|
||||
} else {
|
||||
mergedRef.put(id, nodeReference.get(i).getAsJsonObject());
|
||||
}
|
||||
}
|
||||
|
||||
return mergedRef;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,7 +119,13 @@ public class TraceStackService {
|
|||
UniqueId uniqueId = reference.getParentTraceSegmentId();
|
||||
|
||||
StringBuilder segmentIdBuilder = new StringBuilder();
|
||||
uniqueId.getIdPartsList().forEach(part -> segmentIdBuilder.append(String.valueOf(part)));
|
||||
for (int i = 0; i < uniqueId.getIdPartsList().size(); i++) {
|
||||
if (i == 0) {
|
||||
segmentIdBuilder.append(String.valueOf(uniqueId.getIdPartsList().get(i)));
|
||||
} else {
|
||||
segmentIdBuilder.append(".").append(String.valueOf(uniqueId.getIdPartsList().get(i)));
|
||||
}
|
||||
}
|
||||
|
||||
String parentSegmentId = segmentIdBuilder.toString();
|
||||
segmentParentSpanId = parentSegmentId + Const.SEGMENT_SPAN_SPLIT + String.valueOf(parentSpanId);
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ public enum OperationNameDictionary {
|
|||
OperationNameKey key = new OperationNameKey(applicationId, operationName);
|
||||
Integer operationId = operationNameDictionary.get(key);
|
||||
if (operationId != null) {
|
||||
return new Found(applicationId);
|
||||
return new Found(operationId);
|
||||
} else {
|
||||
if (registerWhenNotFound &&
|
||||
operationNameDictionary.size() + unRegisterOperationNames.size() < OPERATION_NAME_BUFFER_SIZE) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue