You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/08/05 06:29:46 UTC

[skywalking] 01/01: Make the column length of slow DB statement having the good default value.

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch stat-length
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit 423726137d17d3989c0b8188c8583a553e085dba
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Wed Aug 5 14:29:16 2020 +0800

    Make the column length of slow DB statement having the good default value.
---
 .../analyzer/provider/AnalyzerModuleConfig.java     |  4 +++-
 .../manual/database/TopNDatabaseStatement.java      |  7 ++++++-
 .../oap/server/core/analysis/topn/TopN.java         |  6 +-----
 .../oap/server/core/storage/annotation/Column.java  |  8 ++++++++
 .../server/core/storage/model/StorageModels.java    | 21 ++++++++++++++++++---
 5 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleConfig.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleConfig.java
index 0b005f3..84d3b6d 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleConfig.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/AnalyzerModuleConfig.java
@@ -68,7 +68,9 @@ public class AnalyzerModuleConfig extends ModuleConfig {
     @Getter
     private boolean traceAnalysis = true;
     /**
-     * Slow Sql string length can't beyond this limit
+     * Slow Sql string length can't beyond this limit. This value should be as same as the length annotation at the
+     * {@code org.apache.skywalking.oap.server.core.analysis.manual.database.TopNDatabaseStatement#statement}. And share
+     * the system env name, SW_SLOW_DB_THRESHOLD
      */
     @Setter
     @Getter
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java
index df203c3..77672de 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/database/TopNDatabaseStatement.java
@@ -21,23 +21,28 @@ package org.apache.skywalking.oap.server.core.analysis.manual.database;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
+import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
 import org.apache.skywalking.oap.server.core.analysis.topn.TopN;
 import org.apache.skywalking.oap.server.core.analysis.worker.TopNStreamProcessor;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageBuilder;
+import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 
 /**
  * Database TopN statement, including Database SQL statement, mongoDB and Redis commands.
  */
 @Stream(name = TopNDatabaseStatement.INDEX_NAME, scopeId = DefaultScopeDefine.DATABASE_SLOW_STATEMENT, builder = TopNDatabaseStatement.Builder.class, processor = TopNStreamProcessor.class)
 public class TopNDatabaseStatement extends TopN {
-
     public static final String INDEX_NAME = "top_n_database_statement";
 
     @Setter
     private String id;
+    @Getter
+    @Setter
+    @Column(columnName = STATEMENT, length = 2000, lengthEnvVariable = "SW_SLOW_DB_THRESHOLD", storageOnly = true)
+    private String statement;
 
     @Override
     public String id() {
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/topn/TopN.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/topn/TopN.java
index 4ec3763..8a4d7b9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/topn/TopN.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/topn/TopN.java
@@ -32,11 +32,7 @@ public abstract class TopN extends Record implements ComparableStorageData {
     public static final String LATENCY = "latency";
     public static final String TRACE_ID = "trace_id";
     public static final String SERVICE_ID = "service_id";
-
-    @Getter
-    @Setter
-    @Column(columnName = STATEMENT, storageOnly = true)
-    private String statement;
+    
     @Getter
     @Setter
     @Column(columnName = LATENCY, dataType = Column.ValueDataType.SAMPLED_RECORD)
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java
index 370e132..bda1d3b 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/annotation/Column.java
@@ -70,6 +70,14 @@ public @interface Column {
     int length() default 200;
 
     /**
+     * The return name of system environment could provide an override value of the length limitation.
+     * @return the variable name of system environment.
+     *
+     * @since 8.2.0
+     */
+    String lengthEnvVariable() default "";
+
+    /**
      * Column with data type != {@link ValueDataType#NOT_VALUE} represents this is a value column. Indicate it would be
      * queried by UI/CLI.
      *
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
index 3a8773c..6000a93 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/storage/model/StorageModels.java
@@ -23,9 +23,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
-
 import lombok.extern.slf4j.Slf4j;
-
+import org.apache.skywalking.apm.util.StringUtil;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
 import org.apache.skywalking.oap.server.core.storage.StorageException;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
@@ -105,10 +104,26 @@ public class StorageModels implements IModelManager, ModelCreator, ModelManipula
         for (Field field : fields) {
             if (field.isAnnotationPresent(Column.class)) {
                 Column column = field.getAnnotation(Column.class);
+                // Use the column#length as the default column length, as read the system env as the override mechanism.
+                // Log the error but don't block the startup sequence.
+                int columnLength = column.length();
+                final String lengthEnvVariable = column.lengthEnvVariable();
+                if (StringUtil.isNotEmpty(lengthEnvVariable)) {
+                    final String envValue = System.getenv(lengthEnvVariable);
+                    if (StringUtil.isNotEmpty(envValue)) {
+                        try {
+                            columnLength = Integer.parseInt(envValue);
+                        } catch (NumberFormatException e) {
+                            log.error("Model [{}] Column [{}], illegal value {} of column length from system env [{}]",
+                                      modelName, column.columnName(), envValue, lengthEnvVariable
+                            );
+                        }
+                    }
+                }
                 modelColumns.add(
                     new ModelColumn(
                         new ColumnName(modelName, column.columnName()), field.getType(), column.matchQuery(),
-                        column.storageOnly(), column.dataType().isValue(), column.length()
+                        column.storageOnly(), column.dataType().isValue(), columnLength
                     ));
                 if (log.isDebugEnabled()) {
                     log.debug("The field named {} with the {} type", column.columnName(), field.getType());