From 4582e9d9fa6458c8c1bb74e4c05f58059cd2cc8d Mon Sep 17 00:00:00 2001 From: pengys5 <8082209@qq.com> Date: Fri, 8 Sep 2017 17:15:54 +0800 Subject: [PATCH] Support entry service id or entry service name argument to query service tree. --- .../entry/ServiceEntrySpanListener.java | 6 +- .../service/ServiceEntryDataDefine.java | 2 +- .../collector/ui/cache/ServiceNameCache.java | 2 +- .../ui/dao/IServiceReferenceDAO.java | 2 + .../collector/ui/dao/ServiceNameEsDAO.java | 4 +- .../ui/dao/ServiceReferenceEsDAO.java | 43 ++++++++++++- .../ui/dao/ServiceReferenceH2DAO.java | 4 ++ .../ui/jetty/UIJettyModuleDefine.java | 6 +- ...er.java => ServiceTreeGetByIdHandler.java} | 6 +- .../ServiceTreeGetByNameHandler.java | 62 +++++++++++++++++++ .../ui/service/ServiceTreeService.java | 5 ++ .../apm/collector/ui/service/SpanService.java | 9 ++- .../ui/service/TraceStackService.java | 8 ++- 13 files changed, 142 insertions(+), 17 deletions(-) rename apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/{ServiceTreeGetHandler.java => ServiceTreeGetByIdHandler.java} (94%) create mode 100644 apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByNameHandler.java diff --git a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java index 0773b00be1..d0c144f77a 100644 --- a/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java +++ b/apm-collector/apm-collector-agentstream/src/main/java/org/skywalking/apm/collector/agentstream/worker/service/entry/ServiceEntrySpanListener.java @@ -58,11 +58,7 @@ public class ServiceEntrySpanListener implements RefsListener, FirstSpanListener StreamModuleContext context = (StreamModuleContext)CollectorContextHelper.INSTANCE.getContext(StreamModuleGroupDefine.GROUP_NAME); if (!hasReference && hasEntry) { ServiceEntryDataDefine.ServiceEntry serviceEntry = new ServiceEntryDataDefine.ServiceEntry(); - if (entryServiceId == 0) { - serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceName); - } else { - serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceId); - } + serviceEntry.setId(applicationId + Const.ID_SPLIT + entryServiceName); serviceEntry.setApplicationId(applicationId); serviceEntry.setEntryServiceId(entryServiceId); serviceEntry.setEntryServiceName(entryServiceName); diff --git a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java index 0ae79d695a..20b4214e5f 100644 --- a/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java +++ b/apm-collector/apm-collector-storage/src/main/java/org/skywalking/apm/collector/storage/define/service/ServiceEntryDataDefine.java @@ -21,7 +21,7 @@ public class ServiceEntryDataDefine extends DataDefine { @Override protected void attributeDefine() { addAttribute(0, new Attribute(ServiceEntryTable.COLUMN_ID, AttributeType.STRING, new NonOperation())); addAttribute(1, new Attribute(ServiceEntryTable.COLUMN_APPLICATION_ID, AttributeType.INTEGER, new NonOperation())); - addAttribute(2, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, AttributeType.INTEGER, new NonOperation())); + addAttribute(2, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_ID, AttributeType.INTEGER, new CoverOperation())); addAttribute(3, new Attribute(ServiceEntryTable.COLUMN_ENTRY_SERVICE_NAME, AttributeType.STRING, new NonOperation())); addAttribute(4, new Attribute(ServiceEntryTable.COLUMN_REGISTER_TIME, AttributeType.LONG, new NonOperation())); addAttribute(5, new Attribute(ServiceEntryTable.COLUMN_NEWEST_TIME, AttributeType.LONG, new CoverOperation())); diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java index 8235b01a6f..342bb5d0ef 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/cache/ServiceNameCache.java @@ -12,7 +12,7 @@ import org.skywalking.apm.collector.ui.dao.IServiceNameDAO; public class ServiceNameCache { //TODO size configuration - private static Cache CACHE = CacheBuilder.newBuilder().maximumSize(1000).build(); + private static Cache CACHE = CacheBuilder.newBuilder().maximumSize(10000).build(); public static String get(int serviceId) { try { diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceReferenceDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceReferenceDAO.java index d92e53960e..ca1c5950c8 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceReferenceDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/IServiceReferenceDAO.java @@ -7,4 +7,6 @@ import com.google.gson.JsonArray; */ public interface IServiceReferenceDAO { JsonArray load(int entryServiceId, long startTime, long endTime); + + JsonArray load(String entryServiceName, int entryApplicationId, long startTime, long endTime); } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java index f8a177e9d5..4c590fa94f 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceNameEsDAO.java @@ -22,7 +22,9 @@ public class ServiceNameEsDAO extends EsDAO implements IServiceNameDAO { GetResponse getResponse = getRequestBuilder.get(); if (getResponse.isExists()) { - return (String)getResponse.getSource().get(ServiceNameTable.COLUMN_SERVICE_NAME); + String serviceName = (String)getResponse.getSource().get(ServiceNameTable.COLUMN_SERVICE_NAME); + int applicationId = ((Number)getResponse.getSource().get(ServiceNameTable.COLUMN_APPLICATION_ID)).intValue(); + return applicationId + Const.ID_SPLIT + serviceName; } return Const.UNKNOWN; } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java index 83e1fc7dd2..e10b99c5f3 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceEsDAO.java @@ -27,18 +27,51 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO private final Logger logger = LoggerFactory.getLogger(ServiceReferenceEsDAO.class); + @Override public JsonArray load(String entryServiceName, int entryApplicationId, long startTime, long endTime) { + SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceReferenceTable.TABLE); + searchRequestBuilder.setTypes(ServiceReferenceTable.TABLE_TYPE); + searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); + + BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); + boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + + int entryServiceId = ServiceIdCache.get(entryApplicationId, entryServiceName); + BoolQueryBuilder entryBoolQuery = QueryBuilders.boolQuery(); + if (entryServiceId != 0) { + entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_ID, entryServiceId)); + } + entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_NAME, entryApplicationId + Const.ID_SPLIT + entryServiceName)); + boolQuery.must(entryBoolQuery); + + searchRequestBuilder.setQuery(boolQuery); + searchRequestBuilder.setSize(0); + + return load(searchRequestBuilder); + } + @Override public JsonArray load(int entryServiceId, long startTime, long endTime) { SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(ServiceReferenceTable.TABLE); searchRequestBuilder.setTypes(ServiceReferenceTable.TABLE_TYPE); searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); - boolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_ID, entryServiceId)); - boolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_NAME, ServiceNameCache.getForUI(entryServiceId))); boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + boolQuery.must().add(QueryBuilders.rangeQuery(ServiceReferenceTable.COLUMN_TIME_BUCKET).gte(startTime).lte(endTime)); + + String entryServiceName = ServiceNameCache.get(entryServiceId); + BoolQueryBuilder entryBoolQuery = QueryBuilders.boolQuery(); + entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_ID, entryServiceId)); + entryBoolQuery.should().add(QueryBuilders.matchQuery(ServiceReferenceTable.COLUMN_ENTRY_SERVICE_NAME, entryServiceName)); + boolQuery.must(entryBoolQuery); + searchRequestBuilder.setQuery(boolQuery); searchRequestBuilder.setSize(0); + return load(searchRequestBuilder); + } + + private JsonArray load(SearchRequestBuilder searchRequestBuilder) { searchRequestBuilder.addAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID).field(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID).size(100) .subAggregation(AggregationBuilders.terms(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID).field(ServiceReferenceTable.COLUMN_BEHIND_SERVICE_ID).size(100) .subAggregation(AggregationBuilders.sum(ServiceReferenceTable.COLUMN_S1_LTE).field(ServiceReferenceTable.COLUMN_S1_LTE)) @@ -112,7 +145,13 @@ public class ServiceReferenceEsDAO extends EsDAO implements IServiceReferenceDAO Sum costSum = behindServiceIdBucket.getAggregations().get(ServiceReferenceTable.COLUMN_COST_SUMMARY); String frontServiceName = ServiceNameCache.getForUI(frontServiceId); + if (StringUtils.isNotEmpty(frontServiceName)) { + frontServiceName = frontServiceName.split(Const.ID_SPLIT)[1]; + } String behindServiceName = ServiceNameCache.getForUI(behindServiceId); + if (StringUtils.isNotEmpty(frontServiceName)) { + behindServiceName = behindServiceName.split(Const.ID_SPLIT)[1]; + } JsonObject serviceReference = new JsonObject(); serviceReference.addProperty(ColumnNameUtils.INSTANCE.rename(ServiceReferenceTable.COLUMN_FRONT_SERVICE_ID), frontServiceId); diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceH2DAO.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceH2DAO.java index 716204ffb7..932d25c323 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceH2DAO.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/dao/ServiceReferenceH2DAO.java @@ -11,4 +11,8 @@ public class ServiceReferenceH2DAO extends H2DAO implements IServiceReferenceDAO @Override public JsonArray load(int entryServiceId, long startTime, long endTime) { return null; } + + @Override public JsonArray load(String entryServiceName, int entryApplicationId, long startTime, long endTime) { + return null; + } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java index 1b367ec8a3..5e23921719 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/UIJettyModuleDefine.java @@ -21,7 +21,8 @@ import org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceMetr import org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceMetricGetRangeTimeBucketHandler; import org.skywalking.apm.collector.ui.jetty.handler.instancemetric.InstanceOsInfoGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.servicetree.EntryServiceGetHandler; -import org.skywalking.apm.collector.ui.jetty.handler.servicetree.ServiceTreeGetHandler; +import org.skywalking.apm.collector.ui.jetty.handler.servicetree.ServiceTreeGetByIdHandler; +import org.skywalking.apm.collector.ui.jetty.handler.servicetree.ServiceTreeGetByNameHandler; import org.skywalking.apm.collector.ui.jetty.handler.time.AllInstanceLastTimeGetHandler; import org.skywalking.apm.collector.ui.jetty.handler.time.OneInstanceLastTimeGetHandler; @@ -71,7 +72,8 @@ public class UIJettyModuleDefine extends UIModuleDefine { handlers.add(new InstanceMetricGetOneTimeBucketHandler()); handlers.add(new InstanceMetricGetRangeTimeBucketHandler()); handlers.add(new EntryServiceGetHandler()); - handlers.add(new ServiceTreeGetHandler()); + handlers.add(new ServiceTreeGetByIdHandler()); + handlers.add(new ServiceTreeGetByNameHandler()); return handlers; } } diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByIdHandler.java similarity index 94% rename from apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java rename to apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByIdHandler.java index 1461b496c3..ea0b093546 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetHandler.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByIdHandler.java @@ -11,12 +11,12 @@ import org.slf4j.LoggerFactory; /** * @author pengys5 */ -public class ServiceTreeGetHandler extends JettyHandler { +public class ServiceTreeGetByIdHandler extends JettyHandler { - private final Logger logger = LoggerFactory.getLogger(ServiceTreeGetHandler.class); + private final Logger logger = LoggerFactory.getLogger(ServiceTreeGetByIdHandler.class); @Override public String pathSpec() { - return "/service/tree"; + return "/service/tree/entryServiceId"; } private ServiceTreeService service = new ServiceTreeService(); diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByNameHandler.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByNameHandler.java new file mode 100644 index 0000000000..e9d83d784b --- /dev/null +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/jetty/handler/servicetree/ServiceTreeGetByNameHandler.java @@ -0,0 +1,62 @@ +package org.skywalking.apm.collector.ui.jetty.handler.servicetree; + +import com.google.gson.JsonElement; +import javax.servlet.http.HttpServletRequest; +import org.skywalking.apm.collector.server.jetty.ArgumentsParseException; +import org.skywalking.apm.collector.server.jetty.JettyHandler; +import org.skywalking.apm.collector.ui.service.ServiceTreeService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author pengys5 + */ +public class ServiceTreeGetByNameHandler extends JettyHandler { + + private final Logger logger = LoggerFactory.getLogger(ServiceTreeGetByNameHandler.class); + + @Override public String pathSpec() { + return "/service/tree/entryServiceName"; + } + + private ServiceTreeService service = new ServiceTreeService(); + + @Override protected JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException { + if (!req.getParameterMap().containsKey("entryServiceName") || !req.getParameterMap().containsKey("entryApplicationId") || !req.getParameterMap().containsKey("startTime") || !req.getParameterMap().containsKey("endTime")) { + throw new ArgumentsParseException("must contains parameters: entryServiceName, entryApplicationId, startTime, endTime"); + } + + String entryServiceName = req.getParameter("entryServiceName"); + String entryApplicationIdStr = req.getParameter("entryApplicationId"); + String startTimeStr = req.getParameter("startTime"); + String endTimeStr = req.getParameter("endTime"); + logger.debug("service entry get entryServiceName: {}, startTime: {}, endTime: {}", entryServiceName, startTimeStr, endTimeStr); + + int entryApplicationId; + try { + entryApplicationId = Integer.parseInt(entryApplicationIdStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("entry application id must be integer"); + } + + long startTime; + try { + startTime = Long.parseLong(startTimeStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("start time must be long"); + } + + long endTime; + try { + endTime = Long.parseLong(endTimeStr); + } catch (NumberFormatException e) { + throw new ArgumentsParseException("end time must be long"); + } + + return service.loadServiceTree(entryServiceName, entryApplicationId, startTime, endTime); + } + + @Override protected JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException { + throw new UnsupportedOperationException(); + } +} diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java index 0d133fc0dc..654ed0cfb2 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/ServiceTreeService.java @@ -21,4 +21,9 @@ public class ServiceTreeService { IServiceReferenceDAO serviceReferenceDAO = (IServiceReferenceDAO)DAOContainer.INSTANCE.get(IServiceReferenceDAO.class.getName()); return serviceReferenceDAO.load(entryServiceId, startTime, endTime); } + + public JsonArray loadServiceTree(String entryServiceName, int entryApplicationId, long startTime, long endTime) { + IServiceReferenceDAO serviceReferenceDAO = (IServiceReferenceDAO)DAOContainer.INSTANCE.get(IServiceReferenceDAO.class.getName()); + return serviceReferenceDAO.load(entryServiceName, entryApplicationId, startTime, endTime); + } } \ No newline at end of file diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/SpanService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/SpanService.java index bbc9f02fa0..c863435878 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/SpanService.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/SpanService.java @@ -3,6 +3,8 @@ package org.skywalking.apm.collector.ui.service; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import java.util.List; +import org.skywalking.apm.collector.core.util.Const; +import org.skywalking.apm.collector.core.util.StringUtils; import org.skywalking.apm.collector.storage.dao.DAOContainer; import org.skywalking.apm.collector.ui.cache.ServiceNameCache; import org.skywalking.apm.collector.ui.dao.ISegmentDAO; @@ -26,7 +28,12 @@ public class SpanService { if (spanId == spanObject.getSpanId()) { String operationName = spanObject.getOperationName(); if (spanObject.getOperationNameId() != 0) { - operationName = ServiceNameCache.get(spanObject.getOperationNameId()); + String serviceName = ServiceNameCache.get(spanObject.getOperationNameId()); + if (StringUtils.isNotEmpty(serviceName)) { + operationName = serviceName.split(Const.ID_SPLIT)[1]; + } else { + operationName = Const.EMPTY_STRING; + } } spanJson.addProperty("operationName", operationName); spanJson.addProperty("startTime", spanObject.getStartTime()); diff --git a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceStackService.java b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceStackService.java index 170c379080..19a90826b3 100644 --- a/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceStackService.java +++ b/apm-collector/apm-collector-ui/src/main/java/org/skywalking/apm/collector/ui/service/TraceStackService.java @@ -7,6 +7,7 @@ import java.util.List; import org.skywalking.apm.collector.core.util.CollectionUtils; import org.skywalking.apm.collector.core.util.Const; import org.skywalking.apm.collector.core.util.ObjectUtils; +import org.skywalking.apm.collector.core.util.StringUtils; import org.skywalking.apm.collector.storage.dao.DAOContainer; import org.skywalking.apm.collector.ui.cache.ApplicationCache; import org.skywalking.apm.collector.ui.cache.ServiceNameCache; @@ -98,7 +99,12 @@ public class TraceStackService { String operationName = spanObject.getOperationName(); if (spanObject.getOperationNameId() != 0) { - operationName = ServiceNameCache.get(spanObject.getOperationNameId()); + String serviceName = ServiceNameCache.get(spanObject.getOperationNameId()); + if (StringUtils.isNotEmpty(serviceName)) { + operationName = serviceName.split(Const.ID_SPLIT)[1]; + } else { + operationName = Const.EMPTY_STRING; + } } String applicationCode = ApplicationCache.get(segment.getApplicationId()); -- GitLab