You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2022/11/18 08:12:16 UTC

[skywalking] 01/01: Add default entity name(`_blank`)

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 <wu...@foxmail.com>
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();
         }
 
         /**