This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch bug in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit eaadbe604db409f7ce19959f5b583443a0784aee Author: Wu Sheng <[email protected]> AuthorDate: Fri Nov 18 16:11:58 2022 +0800 Add default entity name(`_blank`) --- docs/en/changes/changes.md | 3 ++- .../listener/vservice/VirtualMQProcessor.java | 27 ++++++++++++---------- .../apache/skywalking/oap/server/core/Const.java | 1 + .../oap/server/core/analysis/IDManager.java | 20 ++++++++++++---- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md index b52cfada6a..d79f046274 100644 --- a/docs/en/changes/changes.md +++ b/docs/en/changes/changes.md @@ -115,6 +115,7 @@ * Fix `ShardingTopologyQueryDAO.loadServiceRelationsDetectedAtServerSide` invoke backend miss parameter `serviceIds`. * Changed system variable `SW_SUPERDATASET_STORAGE_DAY_STEP` to `SW_STORAGE_ES_SUPER_DATASET_DAY_STEP` to be consistent with other ES storage related variables. * Fix ESEventQueryDAO missing metric_table boolQuery criteria. +* Add default entity name(`_blank`) if absent to avoid NPE in the decoding. This caused `Can't split xxx id into 2 parts`. #### UI @@ -155,7 +156,7 @@ * Add Python runtime metrics and cpu/memory utilization panels to General-Instance and Fass-Instance dashboards. * Enhance the legend of metrics graph widget with the summary table. * Add apache eventMesh logo file. -* Fix conditions for trace profiling bugSomething isn't working. +* Fix conditions for trace profiling bug. * Fix tag keys list and duration condition. #### Documentation diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/vservice/VirtualMQProcessor.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/vservice/VirtualMQProcessor.java index 1a2edd58c7..62bcfea838 100644 --- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/vservice/VirtualMQProcessor.java +++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/vservice/VirtualMQProcessor.java @@ -75,9 +75,7 @@ public class VirtualMQProcessor implements VirtualServiceProcessor { String serviceName = namingControl.formatServiceName(peer); long timeBucket = TimeBucket.getMinuteTimeBucket(span.getStartTime()); sourceList.add(toServiceMeta(serviceName, timeBucket)); - String endpoint = buildEndpointName(mqTags.topic, mqTags.queue); - String endpointName = namingControl.formatEndpointName(serviceName, endpoint); - sourceList.add(toEndpointMeta(serviceName, endpointName, timeBucket)); + MQAccess access = new MQAccess(); access.setTypeId(span.getComponentId()); access.setTransmissionLatency(mqTags.transmissionLatency); @@ -87,15 +85,20 @@ public class VirtualMQProcessor implements VirtualServiceProcessor { access.setOperation(mqOperation); sourceList.add(access); - MQEndpointAccess endpointAccess = new MQEndpointAccess(); - endpointAccess.setTypeId(span.getComponentId()); - endpointAccess.setTransmissionLatency(mqTags.transmissionLatency); - endpointAccess.setStatus(!span.getIsError()); - endpointAccess.setTimeBucket(timeBucket); - endpointAccess.setOperation(mqOperation); - endpointAccess.setServiceName(serviceName); - endpointAccess.setEndpoint(endpointName); - sourceList.add(endpointAccess); + String endpoint = buildEndpointName(mqTags.topic, mqTags.queue); + if (!endpoint.isEmpty()) { + String endpointName = namingControl.formatEndpointName(serviceName, endpoint); + sourceList.add(toEndpointMeta(serviceName, endpointName, timeBucket)); + MQEndpointAccess endpointAccess = new MQEndpointAccess(); + endpointAccess.setTypeId(span.getComponentId()); + endpointAccess.setTransmissionLatency(mqTags.transmissionLatency); + endpointAccess.setStatus(!span.getIsError()); + endpointAccess.setTimeBucket(timeBucket); + endpointAccess.setOperation(mqOperation); + endpointAccess.setServiceName(serviceName); + endpointAccess.setEndpoint(endpointName); + sourceList.add(endpointAccess); + } } private String buildEndpointName(String topic, String queue) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java index 499bc18848..84f57eeb56 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Const.java @@ -40,4 +40,5 @@ public class Const { public static final String EMPTY_STRING = ""; public static final String POINT = "."; public static final String DOUBLE_COLONS_SPLIT = "::"; + public static final String BLANK_ENTITY_NAME = "_blank"; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/IDManager.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/IDManager.java index cf67d0eb62..0e56e42e0c 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/IDManager.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/IDManager.java @@ -18,17 +18,17 @@ package org.apache.skywalking.oap.server.core.analysis; -import java.nio.charset.StandardCharsets; -import java.util.Base64; - import com.google.common.base.Charsets; import com.google.common.hash.Hashing; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.skywalking.oap.server.core.Const; import org.apache.skywalking.oap.server.core.UnexpectedException; import org.apache.skywalking.oap.server.library.util.BooleanUtils; +import org.apache.skywalking.oap.server.library.util.StringUtil; /** * IDManager includes all ID encode/decode functions for service, service instance and endpoint. @@ -44,6 +44,9 @@ public class IDManager { * conjectured by telemetry data collected from agents on/in the `normal` service. */ public static String buildId(String name, boolean isNormal) { + if (StringUtil.isBlank(name)) { + name = Const.BLANK_ENTITY_NAME; + } return encode(name) + Const.SERVICE_ID_CONNECTOR + BooleanUtils.booleanToValue(isNormal); } @@ -108,6 +111,9 @@ public class IDManager { * @return service instance id */ public static String buildId(String serviceId, String instanceName) { + if (StringUtil.isBlank(instanceName)) { + instanceName = Const.BLANK_ENTITY_NAME; + } return serviceId + Const.ID_CONNECTOR + encode(instanceName); @@ -180,6 +186,9 @@ public class IDManager { * @return endpoint id */ public static String buildId(String serviceId, String endpointName) { + if (StringUtil.isBlank(endpointName)) { + endpointName = Const.BLANK_ENTITY_NAME; + } return serviceId + Const.ID_CONNECTOR + encode(endpointName); @@ -261,12 +270,13 @@ public class IDManager { public static class ProcessID { /** * @param instanceId built by {@link ServiceInstanceID#buildId(String, String)} - * @param name process name + * @param name process name * @return process id */ public static String buildId(String instanceId, String name) { return Hashing.sha256().newHasher().putString(String.format("%s_%s", - name, instanceId), Charsets.UTF_8).hash().toString(); + name, instanceId + ), Charsets.UTF_8).hash().toString(); } /**
