diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentBase64Printer.java b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentBase64Printer.java new file mode 100644 index 0000000000000000000000000000000000000000..c729bf14277dc2d1c3085da438a5656fcacacdd5 --- /dev/null +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentBase64Printer.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.collector.analysis.segment.parser.provider.service; + +import com.google.protobuf.InvalidProtocolBufferException; +import java.util.Base64; +import java.util.List; +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.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author peng-yongsheng + */ +public class SegmentBase64Printer { + + private static final Logger LOGGER = LoggerFactory.getLogger(SegmentBase64Printer.class); + + public static void main(String[] args) throws InvalidProtocolBufferException { + String segmentBase64 = "CgwKCgIBsv/x1L2vgBsSggEQ////////////ARirnsP1niwg9Z7D9Z4sOhhIMi9KREJJL0Nvbm5lY3Rpb24vY2xvc2VKDGxvY2FsaG9zdDotMVABWAFgBHoOCgdkYi50eXBlEgNzcWx6GQoLZGIuaW5zdGFuY2USCmRhdGFTb3VyY2V6DgoMZGIuc3RhdGVtZW50GP///////////wEgAg=="; + byte[] binarySegment = Base64.getDecoder().decode(segmentBase64); + TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(binarySegment); + + UniqueId segmentId = segmentObject.getTraceSegmentId(); + StringBuilder segmentIdBuilder = new StringBuilder(); + for (int i = 0; i < segmentId.getIdPartsList().size(); i++) { + if (i == 0) { + segmentIdBuilder.append(segmentId.getIdPartsList().get(i)); + } else { + segmentIdBuilder.append(".").append(segmentId.getIdPartsList().get(i)); + } + } + LOGGER.info("SegmentId: {}", segmentIdBuilder.toString()); + LOGGER.info("ApplicationId: {}", segmentObject.getApplicationId()); + LOGGER.info("ApplicationInstanceId: {}", segmentObject.getApplicationInstanceId()); + List spansList = segmentObject.getSpansList(); + LOGGER.info("Spans:"); + spansList.forEach(span -> { + LOGGER.info(" Span:"); + LOGGER.info(" SpanId: {}", span.getSpanId()); + LOGGER.info(" ParentSpanId: {}", span.getParentSpanId()); + LOGGER.info(" SpanLayer: {}", span.getSpanLayer()); + LOGGER.info(" SpanType: {}", span.getSpanType()); + LOGGER.info(" StartTime: {}", span.getStartTime()); + LOGGER.info(" EndTime: {}", span.getEndTime()); + LOGGER.info(" ComponentId: {}", span.getComponentId()); + LOGGER.info(" Component: {}", span.getComponent()); + LOGGER.info(" OperationNameId: {}", span.getOperationNameId()); + LOGGER.info(" OperationName: {}", span.getOperationName()); + LOGGER.info(" PeerId: {}", span.getPeerId()); + LOGGER.info(" Peer: {}", span.getPeer()); + LOGGER.info(" IsError: {}", span.getIsError()); + + LOGGER.info(" reference:"); + span.getRefsList().forEach(reference -> { + LOGGER.info(" EntryApplicationInstanceId: {}", reference.getEntryApplicationInstanceId()); + }); + }); + } +} diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/resources/log4j2.xml b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/resources/log4j2.xml new file mode 100644 index 0000000000000000000000000000000000000000..6697ebf27225d592684af50e65d407704b3024ac --- /dev/null +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/test/resources/log4j2.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java index cbd013e2d2444d2d6ef74c8a618d169a89444b5f..80caa04e334d49844c0ae1cdcbd9b984076c5462 100644 --- a/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java +++ b/apm-collector/apm-collector-ui/collector-ui-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/ui/service/TopologyBuilder.java @@ -20,9 +20,11 @@ package org.apache.skywalking.apm.collector.ui.service; import java.text.ParseException; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.skywalking.apm.collector.cache.CacheModule; import org.apache.skywalking.apm.collector.cache.service.ApplicationCacheService; import org.apache.skywalking.apm.collector.core.module.ModuleManager; @@ -133,6 +135,17 @@ class TopologyBuilder { nodes.add(conjecturalNode); } + Set nodeIds = buildNodeIds(nodes); + if (!nodeIds.contains(source.getApplicationId())) { + ApplicationNode applicationNode = new ApplicationNode(); + applicationNode.setId(source.getApplicationId()); + applicationNode.setName(source.getApplicationCode()); + applicationNode.setType(components.getOrDefault(source.getApplicationId(), Const.UNKNOWN)); + applicationNode.setApdex(100); + applicationNode.setSla(100); + nodes.add(applicationNode); + } + Call call = new Call(); call.setSource(source.getApplicationId()); call.setSourceName(source.getApplicationCode()); @@ -198,6 +211,12 @@ class TopologyBuilder { return topology; } + private Set buildNodeIds(List nodes) { + Set nodeIds = new HashSet<>(); + nodes.forEach(node -> nodeIds.add(node.getId())); + return nodeIds; + } + private List calleeReferenceMetricFilter( List calleeReferenceMetric) { List filteredMetrics = new LinkedList<>();