From ceaf15405517ccb6958bf05b7410d594a1aa8cf5 Mon Sep 17 00:00:00 2001 From: zhangxin10 Date: Fri, 15 Jan 2016 10:25:16 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=AF=91=E4=B8=8D?= =?UTF-8?q?=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/ViewPointFilterFactory.java | 11 +++++-- .../skywalking/analysis/filter/NodeChain.java | 12 ++++++++ .../analysis/filter/impl/CostNodeFilter.java | 12 +++++++- .../analysis/mapper/CallChainMapper.java | 29 ++++--------------- .../src/main/resources/viewpointfilter.conf | 2 +- .../skywalking/api/IBuriedPointType.java | 2 +- .../type/DubboBuriedPointType.java | 2 +- .../buriedpoint/type/JDBCBuriedPointType.java | 2 +- .../type/SpringBuriedPointType.java | 2 +- .../buriedpoint/type/WEBBuriedPointType.java | 2 +- .../cloud/skywalking/protocol}/CallType.java | 2 +- .../ai/cloud/skywalking/protocol/Span.java | 4 ++- .../cloud/skywalking/protocol/SpanData.java | 4 +++ 13 files changed, 51 insertions(+), 35 deletions(-) rename {skywalking-api/src/main/java/com/ai/cloud/skywalking/model => skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol}/CallType.java (93%) diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java index b9bdb9bef..ea8b74c76 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java @@ -16,6 +16,8 @@ public class ViewPointFilterFactory { private static Map filterType; + private static Object lock = new Object(); + private ViewPointFilterFactory() { //Non } @@ -55,7 +57,7 @@ public class ViewPointFilterFactory { } } - filterType = new HashMap(); + String[] type = types.split(","); for (int i = 0; i < type.length; i++) { filterType.put(type[i], filter); @@ -65,7 +67,12 @@ public class ViewPointFilterFactory { public static ViewPointFilter getFilter(String type) { if (filterType == null) { - initFilterChain(); + synchronized (lock) { + if (filterType == null) { + filterType = new HashMap(); + initFilterChain(); + } + } } ViewPointFilter filter = filterType.get(type); diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/NodeChain.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/NodeChain.java index 4403b94a1..b30eee1db 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/NodeChain.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/NodeChain.java @@ -34,4 +34,16 @@ public class NodeChain { filters.add(new CopyAttrNodeFilter()); filters.add(new ViewPointNodeFilter()); } + + public static void main(String[] args) { + Span span = new Span("1.0a2.1452649597690.035d27f.1608.56.1@~ @~0@~" + + "http://localhost:8080/skywalking-web/order/save@~1452649597692@~5202@~" + + "astraea-PC/192.168.1.102@~0@~ @~W@~true@~ @~1608@~web-application@~6@~A "); + NodeChain nodeChain = new NodeChain(); + CostMap costMap = new CostMap(); + ChainNode chainNode = new ChainNode(); + nodeChain.doChain(span, chainNode, costMap); + + System.out.print("xx"); + } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CostNodeFilter.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CostNodeFilter.java index be48b5468..7337cce0e 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CostNodeFilter.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/filter/impl/CostNodeFilter.java @@ -11,7 +11,11 @@ public class CostNodeFilter implements ChainNodeFilter { @Override public void doFilter(Span span, ChainNode node, CostMap costMap, NodeChain chain) { if (span.isReceiver()) { - costMap.put(span.getParentLevel() + "." + span.getLevelId() + "-S", node.getCost()); + costMap.put(span.getParentLevel() + "." + span.getLevelId() + "-S", span.getCost()); + + if (isFirstNode(span)) { + chain.doChain(span, node, costMap); + } } else { if (costMap.exists(span.getParentLevel())) { costMap.put(span.getParentLevel(), costMap.get(span.getParentLevel()) + span.getCost()); @@ -20,5 +24,11 @@ public class CostNodeFilter implements ChainNodeFilter { } chain.doChain(span, node, costMap); } + + + } + + private boolean isFirstNode(Span span) { + return span.getParentLevel().length() == 0 && span.getLevelId() == 0; } } diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapper.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapper.java index e366a32e0..b83fee4b7 100644 --- a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapper.java +++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/mapper/CallChainMapper.java @@ -1,7 +1,9 @@ package com.ai.cloud.skywalking.analysis.mapper; +import com.ai.cloud.skywalking.analysis.filter.NodeChain; import com.ai.cloud.skywalking.analysis.model.ChainInfo; import com.ai.cloud.skywalking.analysis.model.ChainNode; +import com.ai.cloud.skywalking.analysis.model.CostMap; import com.ai.cloud.skywalking.protocol.CallType; import com.ai.cloud.skywalking.protocol.Span; import org.apache.hadoop.hbase.Cell; @@ -14,8 +16,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; -import java.util.HashMap; -import java.util.Map; public class CallChainMapper extends TableMapper { private Logger logger = LoggerFactory.getLogger(CallChainMapper.class.getName()); @@ -23,31 +23,13 @@ public class CallChainMapper extends TableMapper { @Override protected void map(ImmutableBytesWritable key, Result value, Context context) throws IOException, InterruptedException { - Map costMap = new HashMap(); - + CostMap costMap = new CostMap(); ChainInfo chainInfo = new ChainInfo(); - String traceId = key.toString(); - logger.info("Begin to deal Trace[" + traceId + "]..."); + for (Cell cell : value.rawCells()) { ChainNode node = new ChainNode(); Span span = new Span(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength())); - - node.setLevelId(span.getLevelId()); - node.setParentLevelId(span.getParentLevel()); - node.setViewPoint(convertViewPoint(span)); - node.setCost(span.getCost()); - node.setCallType(span.getCallType()); - if (span.isReceiver()) { - costMap.put(span.getParentLevel() + "." + span.getLevelId() + "-S", span.getCost()); - continue; - } - - if (costMap.containsKey(span.getParentLevel())) { - costMap.put(span.getParentLevel(), costMap.get(span.getParentLevel()).longValue() + span.getCost()); - } else { - costMap.put(span.getParentLevel(), 0L); - } - + new NodeChain().doChain(span, node, costMap); chainInfo.getNodes().add(node); } @@ -66,7 +48,6 @@ public class CallChainMapper extends TableMapper { } } - //入Mysql库 //入HBase库 //找到首个Node的MD5 //拼接MR任务的Key diff --git a/skywalking-analysis/src/main/resources/viewpointfilter.conf b/skywalking-analysis/src/main/resources/viewpointfilter.conf index 7009d68dd..813af5b76 100644 --- a/skywalking-analysis/src/main/resources/viewpointfilter.conf +++ b/skywalking-analysis/src/main/resources/viewpointfilter.conf @@ -1,3 +1,3 @@ # -D,M=com.ai.cloud.skywalking.analysis.viewpoint.impl.ReplaceIPPortFilter +D,M,W=com.ai.cloud.skywalking.analysis.viewpoint.impl.ReplaceIPPortFilter J=com.ai.cloud.skywalking.analysis.viewpoint.impl.AppendBusinessKeyFilter \ No newline at end of file diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/api/IBuriedPointType.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/api/IBuriedPointType.java index 06dc02af6..8b2f23528 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/api/IBuriedPointType.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/api/IBuriedPointType.java @@ -1,6 +1,6 @@ package com.ai.cloud.skywalking.api; -import com.ai.cloud.skywalking.model.CallType; +import com.ai.cloud.skywalking.protocol.CallType; public interface IBuriedPointType { diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/DubboBuriedPointType.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/DubboBuriedPointType.java index 204e8e907..929ddcacf 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/DubboBuriedPointType.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/DubboBuriedPointType.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.buriedpoint.type; import com.ai.cloud.skywalking.api.IBuriedPointType; -import com.ai.cloud.skywalking.model.CallType; +import com.ai.cloud.skywalking.protocol.CallType; public class DubboBuriedPointType implements IBuriedPointType { diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/JDBCBuriedPointType.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/JDBCBuriedPointType.java index bb64dfc9a..36c9b8f61 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/JDBCBuriedPointType.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/JDBCBuriedPointType.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.buriedpoint.type; import com.ai.cloud.skywalking.api.IBuriedPointType; -import com.ai.cloud.skywalking.model.CallType; +import com.ai.cloud.skywalking.protocol.CallType; public class JDBCBuriedPointType implements IBuriedPointType { diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/SpringBuriedPointType.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/SpringBuriedPointType.java index 1b5c27458..50ecd32bc 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/SpringBuriedPointType.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/SpringBuriedPointType.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.buriedpoint.type; import com.ai.cloud.skywalking.api.IBuriedPointType; -import com.ai.cloud.skywalking.model.CallType; +import com.ai.cloud.skywalking.protocol.CallType; public class SpringBuriedPointType implements IBuriedPointType { diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/WEBBuriedPointType.java b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/WEBBuriedPointType.java index cb6722044..ec686c9b8 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/WEBBuriedPointType.java +++ b/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/type/WEBBuriedPointType.java @@ -1,7 +1,7 @@ package com.ai.cloud.skywalking.buriedpoint.type; import com.ai.cloud.skywalking.api.IBuriedPointType; -import com.ai.cloud.skywalking.model.CallType; +import com.ai.cloud.skywalking.protocol.CallType; public class WEBBuriedPointType implements IBuriedPointType { diff --git a/skywalking-api/src/main/java/com/ai/cloud/skywalking/model/CallType.java b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/CallType.java similarity index 93% rename from skywalking-api/src/main/java/com/ai/cloud/skywalking/model/CallType.java rename to skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/CallType.java index f1a0bf20f..9dc1dcb99 100644 --- a/skywalking-api/src/main/java/com/ai/cloud/skywalking/model/CallType.java +++ b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/CallType.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.model; +package com.ai.cloud.skywalking.protocol; public enum CallType { diff --git a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/Span.java b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/Span.java index d4ea024df..ea9a0de8d 100644 --- a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/Span.java +++ b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/Span.java @@ -48,7 +48,9 @@ public class Span extends SpanData { processNo = fieldValues[12].trim(); applicationId = fieldValues[13].trim(); userId = fieldValues[14].trim(); - callType = fieldValues[15].trim(); + if (fieldValues.length > 14) { + callType = fieldValues[15].trim(); + } this.originData = originData; } diff --git a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/SpanData.java b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/SpanData.java index 3291a779d..02413e68f 100644 --- a/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/SpanData.java +++ b/skywalking-protocol/src/main/java/com/ai/cloud/skywalking/protocol/SpanData.java @@ -137,4 +137,8 @@ public abstract class SpanData { public void setCallType(String callType) { this.callType = callType; } + + public String getCallType() { + return callType; + } }