From 4fa9ef9ddb1cddcc4e78dd31a2ae0fafb19a41c7 Mon Sep 17 00:00:00 2001 From: HyunGil Jeong Date: Mon, 15 Jun 2015 18:19:40 +0900 Subject: [PATCH] #611 fix issues with applications having same name but different types --- .../util/ApplicationMapStatisticsUtils.java | 6 ++++ .../dao/hbase/HbaseApplicationIndexDao.java | 10 ++++-- .../web/mapper/ApplicationNameMapper.java | 35 ++++++++++++++++--- .../web/mapper/MapStatisticsCalleeMapper.java | 15 +++++--- 4 files changed, 55 insertions(+), 11 deletions(-) diff --git a/commons/src/main/java/com/navercorp/pinpoint/common/util/ApplicationMapStatisticsUtils.java b/commons/src/main/java/com/navercorp/pinpoint/common/util/ApplicationMapStatisticsUtils.java index a0ff208e0..948e912ba 100644 --- a/commons/src/main/java/com/navercorp/pinpoint/common/util/ApplicationMapStatisticsUtils.java +++ b/commons/src/main/java/com/navercorp/pinpoint/common/util/ApplicationMapStatisticsUtils.java @@ -103,6 +103,12 @@ public class ApplicationMapStatisticsUtils { return BytesUtils.toStringAndRightTrim(bytes, 6, length); } + public static String getDestApplicationNameFromColumnNameForUser(byte[] bytes, ServiceType destServiceType) { + String destApplicationName = getDestApplicationNameFromColumnName(bytes); + String destServiceTypeName = destServiceType.name(); + return destApplicationName + "_" + destServiceTypeName; + } + public static String getHost(byte[] bytes) { int offset = 6 + BytesUtils.bytesToShort(bytes, 4); diff --git a/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationIndexDao.java b/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationIndexDao.java index f4ef00550..9b5d1cc42 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationIndexDao.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationIndexDao.java @@ -16,6 +16,7 @@ package com.navercorp.pinpoint.web.dao.hbase; +import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; @@ -45,7 +46,7 @@ public class HbaseApplicationIndexDao implements ApplicationIndexDao { @Autowired @Qualifier("applicationNameMapper") - private RowMapper applicationNameMapper; + private RowMapper> applicationNameMapper; @Autowired @Qualifier("agentIdMapper") @@ -55,7 +56,12 @@ public class HbaseApplicationIndexDao implements ApplicationIndexDao { public List selectAllApplicationNames() { Scan scan = new Scan(); scan.setCaching(30); - return hbaseOperations2.find(HBaseTables.APPLICATION_INDEX, scan, applicationNameMapper); + List> results = hbaseOperations2.find(HBaseTables.APPLICATION_INDEX, scan, applicationNameMapper); + List applications = new ArrayList(); + for (List result : results) { + applications.addAll(result); + } + return applications; } @Override diff --git a/web/src/main/java/com/navercorp/pinpoint/web/mapper/ApplicationNameMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/mapper/ApplicationNameMapper.java index 186e061e0..62220fc0f 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/mapper/ApplicationNameMapper.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/mapper/ApplicationNameMapper.java @@ -16,25 +16,50 @@ package com.navercorp.pinpoint.web.mapper; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.apache.hadoop.hbase.Cell; +import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes; import org.springframework.data.hadoop.hbase.RowMapper; import org.springframework.stereotype.Component; +import com.navercorp.pinpoint.common.ServiceType; import com.navercorp.pinpoint.web.vo.Application; /** * */ @Component -public class ApplicationNameMapper implements RowMapper { +public class ApplicationNameMapper implements RowMapper> { + @Override - public Application mapRow(Result result, int rowNum) throws Exception { + public List mapRow(Result result, int rowNum) throws Exception { if (result.isEmpty()) { - return null; + return Collections.emptyList(); } + Set uniqueTypeCodes = new HashSet(); String applicationName = Bytes.toString(result.getRow()); - short serviceType = Bytes.toShort(result.value()); - return new Application(applicationName, serviceType); + + List list = result.listCells(); + if (list == null) { + return Collections.emptyList(); + } + + for (Cell cell : list) { + short serviceTypeCode = Bytes.toShort(CellUtil.cloneValue(cell)); + uniqueTypeCodes.add(serviceTypeCode); + } + List applications = new ArrayList(); + for (short serviceTypeCode : uniqueTypeCodes) { + applications.add(new Application(applicationName, ServiceType.findServiceType(serviceTypeCode))); + } + + return applications; } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/mapper/MapStatisticsCalleeMapper.java b/web/src/main/java/com/navercorp/pinpoint/web/mapper/MapStatisticsCalleeMapper.java index 2040310f4..6afdf3812 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/mapper/MapStatisticsCalleeMapper.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/mapper/MapStatisticsCalleeMapper.java @@ -16,6 +16,7 @@ package com.navercorp.pinpoint.web.mapper; +import com.navercorp.pinpoint.common.ServiceType; import com.navercorp.pinpoint.common.buffer.Buffer; import com.navercorp.pinpoint.common.buffer.FixedBuffer; import com.navercorp.pinpoint.common.util.ApplicationMapStatisticsUtils; @@ -71,7 +72,7 @@ public class MapStatisticsCalleeMapper implements RowMapper { for (Cell cell : result.rawCells()) { final byte[] qualifier = CellUtil.cloneQualifier(cell); - final Application callerApplication = readCallerApplication(qualifier); + final Application callerApplication = readCallerApplication(qualifier, calleeApplication.getServiceType()); if (filter.filter(callerApplication)) { continue; } @@ -98,9 +99,15 @@ public class MapStatisticsCalleeMapper implements RowMapper { return linkDataMap; } - private Application readCallerApplication(byte[] qualifier) { - String callerApplicationName = ApplicationMapStatisticsUtils.getDestApplicationNameFromColumnName(qualifier); - short callerServiceType = ApplicationMapStatisticsUtils.getDestServiceTypeFromColumnName(qualifier); + private Application readCallerApplication(byte[] qualifier, ServiceType calleeServiceType) { + short callerServiceType = ApplicationMapStatisticsUtils.getDestServiceTypeFromColumnName(qualifier);// Caller may be a user node, and user nodes may call nodes with the same application name but different service type. + // To distinguish between these user nodes, append callee's service type to the application name. + String callerApplicationName; + if (ServiceType.findServiceType(callerServiceType).isUser()) { + callerApplicationName = ApplicationMapStatisticsUtils.getDestApplicationNameFromColumnNameForUser(qualifier, calleeServiceType); + } else { + callerApplicationName = ApplicationMapStatisticsUtils.getDestApplicationNameFromColumnName(qualifier); + } return new Application(callerApplicationName, callerServiceType); }