This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch top-sql in repository https://gitbox.apache.org/repos/asf/incubator-skywalking.git
The following commit(s) were added to refs/heads/top-sql by this push: new 4dd07b2 Support different slow thresholds for different db types. 4dd07b2 is described below commit 4dd07b2ed735d9378db5449deb6366acaace4325 Author: Wu Sheng <wu.sh...@foxmail.com> AuthorDate: Sun Feb 10 23:58:03 2019 +0800 Support different slow thresholds for different db types. --- docker/config/application.yml | 1 + ...eModuleConfig.java => DBLatencyThresholds.java} | 44 +++++++++++++--------- .../trace/provider/TraceModuleProvider.java | 17 +++------ .../trace/provider/TraceServiceModuleConfig.java | 9 ++--- .../receiver/trace/provider/parser/SpanTags.java | 2 + .../listener/endpoint/MultiScopesSpanListener.java | 20 +++++++--- .../src/main/assembly/application.yml | 1 + .../src/main/resources/application.yml | 1 + 8 files changed, 55 insertions(+), 40 deletions(-) diff --git a/docker/config/application.yml b/docker/config/application.yml index 1a13b4c..f9b645f 100644 --- a/docker/config/application.yml +++ b/docker/config/application.yml @@ -75,6 +75,7 @@ receiver-trace: bufferDataMaxFileSize: ${SW_RECEIVER_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB bufferFileCleanWhenRestart: ${SW_RECEIVER_BUFFER_FILE_CLEAN_WHEN_RESTART:false} sampleRate: ${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default. + slowDBAccessThreshold: ${SW_SLOW_DB_THRESHOLD:default:200,redis:50} # The slow database access thresholds. Unit ms. receiver-jvm: default: service-mesh: diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/DBLatencyThresholds.java similarity index 50% copy from oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java copy to oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/DBLatencyThresholds.java index fec00e2..55aab89 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/DBLatencyThresholds.java @@ -18,26 +18,34 @@ package org.apache.skywalking.oap.server.receiver.trace.provider; -import lombok.*; -import org.apache.skywalking.oap.server.library.module.ModuleConfig; +import java.util.*; /** - * @author peng-yongsheng + * @author wusheng */ -public class TraceServiceModuleConfig extends ModuleConfig { - @Setter @Getter private String bufferPath; - @Setter @Getter private int bufferOffsetMaxFileSize; - @Setter @Getter private int bufferDataMaxFileSize; - @Setter @Getter private boolean bufferFileCleanWhenRestart; - /** - * The sample rate precision is 1/10000. - * 10000 means 100% sample in default. - */ - @Setter @Getter private int sampleRate = 10000; +public class DBLatencyThresholds { + private Map<String, Integer> thresholds; - /** - * The threshold used to check the slow database access. - * Unit, millisecond. - */ - @Setter @Getter private int slowDBAccessThreshold = 200; + DBLatencyThresholds(String config) { + thresholds = new HashMap<>(); + String[] settings = config.split(","); + for (String setting : settings) { + String[] typeValue = setting.split(":"); + if (typeValue.length == 2) { + thresholds.put(typeValue[0].toLowerCase(), Integer.parseInt(typeValue[1])); + } + } + if (thresholds.containsKey("default")) { + thresholds.put("default", 10000); + } + } + + public int getThreshold(String type) { + type = type.toLowerCase(); + if (thresholds.containsKey(type)) { + return thresholds.get(type); + } else { + return thresholds.get("default"); + } + } } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java index 65c9179..367702d 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceModuleProvider.java @@ -20,22 +20,13 @@ package org.apache.skywalking.oap.server.receiver.trace.provider; import java.io.IOException; import org.apache.skywalking.oap.server.core.CoreModule; -import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister; -import org.apache.skywalking.oap.server.core.server.JettyHandlerRegister; -import org.apache.skywalking.oap.server.library.module.ModuleConfig; -import org.apache.skywalking.oap.server.library.module.ModuleDefine; -import org.apache.skywalking.oap.server.library.module.ModuleProvider; -import org.apache.skywalking.oap.server.library.module.ModuleStartException; -import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException; +import org.apache.skywalking.oap.server.core.server.*; +import org.apache.skywalking.oap.server.library.module.*; import org.apache.skywalking.oap.server.receiver.trace.module.TraceModule; import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.grpc.TraceSegmentServiceHandler; import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v5.rest.TraceSegmentServletHandler; import org.apache.skywalking.oap.server.receiver.trace.provider.handler.v6.grpc.TraceSegmentReportServiceHandler; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.ISegmentParserService; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParse; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParseV2; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParserListenerManager; -import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SegmentParserServiceImpl; +import org.apache.skywalking.oap.server.receiver.trace.provider.parser.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.endpoint.MultiScopesSpanListener; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.segment.SegmentSpanListener; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.service.ServiceMappingSpanListener; @@ -68,6 +59,8 @@ public class TraceModuleProvider extends ModuleProvider { } @Override public void prepare() throws ServiceNotProvidedException { + moduleConfig.setDbLatencyThresholds(new DBLatencyThresholds(moduleConfig.getSlowDBAccessThreshold())); + SegmentParserListenerManager listenerManager = new SegmentParserListenerManager(); listenerManager.add(new MultiScopesSpanListener.Factory()); listenerManager.add(new ServiceMappingSpanListener.Factory()); diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java index fec00e2..8ebeec6 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/TraceServiceModuleConfig.java @@ -30,14 +30,13 @@ public class TraceServiceModuleConfig extends ModuleConfig { @Setter @Getter private int bufferDataMaxFileSize; @Setter @Getter private boolean bufferFileCleanWhenRestart; /** - * The sample rate precision is 1/10000. - * 10000 means 100% sample in default. + * The sample rate precision is 1/10000. 10000 means 100% sample in default. */ @Setter @Getter private int sampleRate = 10000; /** - * The threshold used to check the slow database access. - * Unit, millisecond. + * The threshold used to check the slow database access. Unit, millisecond. */ - @Setter @Getter private int slowDBAccessThreshold = 200; + @Setter @Getter private String slowDBAccessThreshold = "default:200"; + @Setter @Getter private DBLatencyThresholds dbLatencyThresholds; } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java index e9f0c68..0f9fef0 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/SpanTags.java @@ -20,4 +20,6 @@ package org.apache.skywalking.oap.server.receiver.trace.provider.parser; public class SpanTags { public static final String DB_STATEMENT = "db.statement"; + + public static final String DB_TYPE = "db.type"; } diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java index 4b970fe..0330e77 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/endpoint/MultiScopesSpanListener.java @@ -26,7 +26,7 @@ import org.apache.skywalking.oap.server.core.cache.*; import org.apache.skywalking.oap.server.core.source.*; import org.apache.skywalking.oap.server.library.module.ModuleManager; import org.apache.skywalking.oap.server.library.util.TimeBucketUtils; -import org.apache.skywalking.oap.server.receiver.trace.provider.TraceServiceModuleConfig; +import org.apache.skywalking.oap.server.receiver.trace.provider.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.SpanTags; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.decorator.*; import org.apache.skywalking.oap.server.receiver.trace.provider.parser.listener.*; @@ -148,8 +148,9 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe setPublicAttrs(sourceBuilder, spanDecorator); exitSourceBuilders.add(sourceBuilder); - if (sourceBuilder.getType().equals(RequestType.DATABASE) - && sourceBuilder.getLatency() > config.getSlowDBAccessThreshold()) { + if (sourceBuilder.getType().equals(RequestType.DATABASE)) { + boolean isSlowDBAccess = false; + DatabaseSlowStatement statement = new DatabaseSlowStatement(); statement.setId(segmentCoreInfo.getSegmentId() + "-" + spanDecorator.getSpanId()); statement.setDatabaseServiceId(sourceBuilder.getDestServiceId()); @@ -159,11 +160,20 @@ public class MultiScopesSpanListener implements EntrySpanListener, ExitSpanListe for (KeyStringValuePair tag : spanDecorator.getAllTags()) { if (SpanTags.DB_STATEMENT.equals(tag.getKey())) { statement.setStatement(tag.getValue()); - slowDatabaseAccesses.add(statement); - break; + + } else if (SpanTags.DB_TYPE.equals(tag.getKey())) { + String dbType = tag.getValue(); + DBLatencyThresholds thresholds = config.getDbLatencyThresholds(); + int threshold = thresholds.getThreshold(dbType); + if (sourceBuilder.getLatency() > threshold) { + isSlowDBAccess = true; + } } } + if (isSlowDBAccess) { + slowDatabaseAccesses.add(statement); + } } } diff --git a/oap-server/server-starter/src/main/assembly/application.yml b/oap-server/server-starter/src/main/assembly/application.yml index 746de62..840777d 100644 --- a/oap-server/server-starter/src/main/assembly/application.yml +++ b/oap-server/server-starter/src/main/assembly/application.yml @@ -75,6 +75,7 @@ receiver-trace: bufferDataMaxFileSize: ${SW_RECEIVER_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB bufferFileCleanWhenRestart: ${SW_RECEIVER_BUFFER_FILE_CLEAN_WHEN_RESTART:false} sampleRate: ${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default. + slowDBAccessThreshold: ${SW_SLOW_DB_THRESHOLD:default:200,redis:50} # The slow database access thresholds. Unit ms. receiver-jvm: default: #service-mesh: diff --git a/oap-server/server-starter/src/main/resources/application.yml b/oap-server/server-starter/src/main/resources/application.yml index 5b53d73..28c7b97 100644 --- a/oap-server/server-starter/src/main/resources/application.yml +++ b/oap-server/server-starter/src/main/resources/application.yml @@ -75,6 +75,7 @@ receiver-trace: bufferDataMaxFileSize: ${SW_RECEIVER_BUFFER_DATA_MAX_FILE_SIZE:500} # Unit is MB bufferFileCleanWhenRestart: ${SW_RECEIVER_BUFFER_FILE_CLEAN_WHEN_RESTART:false} sampleRate: ${SW_TRACE_SAMPLE_RATE:10000} # The sample rate precision is 1/10000. 10000 means 100% sample in default. + slowDBAccessThreshold: ${SW_SLOW_DB_THRESHOLD:default:200,redis:50} # The slow database access thresholds. Unit ms. receiver-jvm: default: service-mesh: