From 4a73a25623f7b71c1ff791f4af9c9d17f8d409e6 Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Thu, 21 Dec 2017 22:47:06 +0800 Subject: [PATCH] Use listener factory to create new instance when create SegmentParser instance. Because of the listener is stateful. --- .../handler/reader/ReferenceJsonReader.java | 19 ++++++------- .../test/resources/json/dubbox-provider.json | 16 +++++------ .../AnalysisMetricModuleProvider.java | 12 ++++---- .../ApplicationComponentSpanListener.java | 28 +++++++++++-------- .../ApplicationMappingSpanListener.java | 9 ++++++ .../ApplicationMetricAggregationWorker.java | 1 + ...ationReferenceMetricAggregationWorker.java | 3 ++ .../global/GlobalTraceSpanListener.java | 9 ++++++ .../InstanceMetricAggregationWorker.java | 1 + ...tanceReferenceMetricAggregationWorker.java | 1 + .../segment/SegmentCostSpanListener.java | 8 ++++++ .../service/ServiceEntrySpanListener.java | 8 ++++++ .../ServiceReferenceMetricSpanListener.java | 13 +++++++-- .../define/decorator/SegmentDecorator.java | 15 ++++++---- .../define/decorator/SpanDecorator.java | 16 +++++++---- .../define/listener/SpanListenerFactory.java | 28 +++++++++++++++++++ .../ISegmentParserListenerRegister.java | 4 +-- .../parser/provider/parser/SegmentParse.java | 21 ++++++++++---- .../parser/SegmentParserListenerManager.java | 14 +++++----- .../SegmentParserListenerRegister.java | 6 ++-- 20 files changed, 166 insertions(+), 66 deletions(-) create mode 100644 apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-define/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/define/listener/SpanListenerFactory.java diff --git a/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/agent/jetty/provider/handler/reader/ReferenceJsonReader.java b/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/agent/jetty/provider/handler/reader/ReferenceJsonReader.java index 8ddbfba0f..b7dc32921 100644 --- a/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/agent/jetty/provider/handler/reader/ReferenceJsonReader.java +++ b/apm-collector/apm-collector-agent/agent-jetty/agent-jetty-provider/src/main/java/org/apache/skywalking/apm/collector/agent/jetty/provider/handler/reader/ReferenceJsonReader.java @@ -16,7 +16,6 @@ * */ - package org.apache.skywalking.apm.collector.agent.jetty.provider.handler.reader; import com.google.gson.stream.JsonReader; @@ -30,16 +29,16 @@ public class ReferenceJsonReader implements StreamJsonReader spanListeners; private final SegmentParserListenerManager listenerManager; private String segmentId; private long timeBucket = 0; @@ -62,9 +64,12 @@ public class SegmentParse { public SegmentParse(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) { this.moduleManager = moduleManager; this.listenerManager = listenerManager; + this.spanListeners = new LinkedList<>(); } public boolean parse(UpstreamSegment segment, ISegmentParseService.Source source) { + createSpanListeners(); + try { List traceIds = segment.getGlobalTraceIdsList(); TraceSegmentObject segmentObject = TraceSegmentObject.parseFrom(segment.getSegment()); @@ -173,12 +178,12 @@ public class SegmentParse { } private void notifyListenerToBuild() { - listenerManager.getSpanListeners().forEach(SpanListener::build); + spanListeners.forEach(SpanListener::build); } private void notifyExitListener(SpanDecorator spanDecorator, int applicationId, int applicationInstanceId, String segmentId) { - for (SpanListener listener : listenerManager.getSpanListeners()) { + for (SpanListener listener : spanListeners) { if (listener instanceof ExitSpanListener) { ((ExitSpanListener)listener).parseExit(spanDecorator, applicationId, applicationInstanceId, segmentId); } @@ -187,7 +192,7 @@ public class SegmentParse { private void notifyEntryListener(SpanDecorator spanDecorator, int applicationId, int applicationInstanceId, String segmentId) { - for (SpanListener listener : listenerManager.getSpanListeners()) { + for (SpanListener listener : spanListeners) { if (listener instanceof EntrySpanListener) { ((EntrySpanListener)listener).parseEntry(spanDecorator, applicationId, applicationInstanceId, segmentId); } @@ -196,7 +201,7 @@ public class SegmentParse { private void notifyLocalListener(SpanDecorator spanDecorator, int applicationId, int applicationInstanceId, String segmentId) { - for (SpanListener listener : listenerManager.getSpanListeners()) { + for (SpanListener listener : spanListeners) { if (listener instanceof LocalSpanListener) { ((LocalSpanListener)listener).parseLocal(spanDecorator, applicationId, applicationInstanceId, segmentId); } @@ -205,7 +210,7 @@ public class SegmentParse { private void notifyFirstListener(SpanDecorator spanDecorator, int applicationId, int applicationInstanceId, String segmentId) { - for (SpanListener listener : listenerManager.getSpanListeners()) { + for (SpanListener listener : spanListeners) { if (listener instanceof FirstSpanListener) { ((FirstSpanListener)listener).parseFirst(spanDecorator, applicationId, applicationInstanceId, segmentId); } @@ -213,10 +218,14 @@ public class SegmentParse { } private void notifyGlobalsListener(UniqueId uniqueId) { - for (SpanListener listener : listenerManager.getSpanListeners()) { + for (SpanListener listener : spanListeners) { if (listener instanceof GlobalTraceIdsListener) { ((GlobalTraceIdsListener)listener).parseGlobalTraceId(uniqueId); } } } + + private void createSpanListeners() { + listenerManager.getSpanListenerFactories().forEach(spanListenerFactory -> spanListeners.add(spanListenerFactory.create(moduleManager))); + } } diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParserListenerManager.java b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParserListenerManager.java index 86c1ba1f3..65b2bc342 100644 --- a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParserListenerManager.java +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/parser/SegmentParserListenerManager.java @@ -20,24 +20,24 @@ package org.apache.skywalking.apm.collector.analysis.segment.parser.provider.par import java.util.ArrayList; import java.util.List; -import org.apache.skywalking.apm.collector.analysis.segment.parser.define.listener.SpanListener; +import org.apache.skywalking.apm.collector.analysis.segment.parser.define.listener.SpanListenerFactory; /** * @author peng-yongsheng */ public class SegmentParserListenerManager { - private List spanListeners; + private List spanListenerFactories; public SegmentParserListenerManager() { - this.spanListeners = new ArrayList<>(); + this.spanListenerFactories = new ArrayList<>(); } - public void add(SpanListener spanListener) { - spanListeners.add(spanListener); + public void add(SpanListenerFactory spanListenerFactory) { + spanListenerFactories.add(spanListenerFactory); } - public List getSpanListeners() { - return spanListeners; + public List getSpanListenerFactories() { + return spanListenerFactories; } } diff --git a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentParserListenerRegister.java b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentParserListenerRegister.java index 2a903d067..cd65c35b9 100644 --- a/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentParserListenerRegister.java +++ b/apm-collector/apm-collector-analysis/analysis-segment-parser/segment-parser-provider/src/main/java/org/apache/skywalking/apm/collector/analysis/segment/parser/provider/service/SegmentParserListenerRegister.java @@ -18,7 +18,7 @@ package org.apache.skywalking.apm.collector.analysis.segment.parser.provider.service; -import org.apache.skywalking.apm.collector.analysis.segment.parser.define.listener.SpanListener; +import org.apache.skywalking.apm.collector.analysis.segment.parser.define.listener.SpanListenerFactory; import org.apache.skywalking.apm.collector.analysis.segment.parser.define.service.ISegmentParserListenerRegister; import org.apache.skywalking.apm.collector.analysis.segment.parser.provider.parser.SegmentParserListenerManager; @@ -33,7 +33,7 @@ public class SegmentParserListenerRegister implements ISegmentParserListenerRegi this.listenerManager = listenerManager; } - @Override public void register(SpanListener spanListener) { - this.listenerManager.add(spanListener); + @Override public void register(SpanListenerFactory spanListenerFactory) { + this.listenerManager.add(spanListenerFactory); } }