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

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

commit 37f33dd131e8526184f2af79b1bd5d769bff69d8
Author: Wu Sheng <[email protected]>
AuthorDate: Tue Jul 16 22:06:25 2019 +0800

    Metrcis class generated.
---
 .../org/apache/skywalking/oal/rt/OALRuntime.java   | 42 +++++++++++++++-------
 .../code-templates/metrics/deserialize.ftl         |  6 ++--
 .../resources/code-templates/metrics/serialize.ftl |  4 +--
 .../resources/code-templates/metrics/toDay.ftl     | 26 ++++++++++++++
 .../resources/code-templates/metrics/toHour.ftl    | 26 ++++++++++++++
 .../resources/code-templates/metrics/toMonth.ftl   | 26 ++++++++++++++
 .../{OALEngine.java => OALCompileException.java}   | 16 +++++----
 .../oap/server/core/oal/rt/OALEngine.java          |  2 +-
 8 files changed, 122 insertions(+), 26 deletions(-)

diff --git 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java
index cacc049..61de5a2 100644
--- 
a/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java
+++ 
b/oap-server/oal-rt/src/main/java/org/apache/skywalking/oal/rt/OALRuntime.java
@@ -30,7 +30,9 @@ import java.util.Locale;
 import javassist.CannotCompileException;
 import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.CtConstructor;
 import javassist.CtField;
+import javassist.CtNewConstructor;
 import javassist.CtNewMethod;
 import javassist.NotFoundException;
 import javassist.bytecode.AnnotationsAttribute;
@@ -53,6 +55,7 @@ import org.apache.skywalking.oal.rt.parser.ScriptParser;
 import org.apache.skywalking.oal.rt.parser.SourceColumn;
 import org.apache.skywalking.oal.rt.parser.SourceColumnsFactory;
 import org.apache.skywalking.oap.server.core.analysis.Stream;
+import org.apache.skywalking.oap.server.core.oal.rt.OALCompileException;
 import org.apache.skywalking.oap.server.core.oal.rt.OALEngine;
 import org.apache.skywalking.oap.server.core.storage.annotation.Column;
 import org.apache.skywalking.oap.server.library.module.ModuleStartException;
@@ -72,9 +75,11 @@ public class OALRuntime implements OALEngine {
     private static final Charset CLASS_FILE_CHARSET = Charset.forName("UTF-8");
     private static final String METRICS_FUNCTION_PACKAGE = 
"org.apache.skywalking.oap.server.core.analysis.metrics.";
     private static final String DYNAMIC_METRICS_CLASS_PACKAGE = 
"org.apache.skywalking.oal.rt.metrics.";
+    private static final String DYNAMIC_METRICS_BUILDER_CLASS_PACKAGE = 
"org.apache.skywalking.oal.rt.metrics.builder";
     private static final String WITH_METADATA_INTERFACE = 
"org.apache.skywalking.oap.server.core.analysis.metrics.WithMetadata";
     private static final String METRICS_STREAM_PROCESSOR = 
"org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor";
-    private static final String[] METRICS_CLASS_METHODS = {"id", "hashCode", 
"remoteHashCode", "equals", "serialize", "deserialize", "getMeta"};
+    private static final String[] METRICS_CLASS_METHODS =
+        {"id", "hashCode", "remoteHashCode", "equals", "serialize", 
"deserialize", "getMeta", "toDay"};
     private final ClassPool classPool;
     private Configuration configuration;
     private AllDispatcherContext allDispatcherContext;
@@ -87,7 +92,7 @@ public class OALRuntime implements OALEngine {
         allDispatcherContext = new AllDispatcherContext();
     }
 
-    @Override public void start(ClassLoader currentClassLoader) throws 
ModuleStartException {
+    @Override public void start(ClassLoader currentClassLoader) throws 
ModuleStartException, OALCompileException {
         Reader read;
         try {
             read = ResourceUtils.read("scope-meta.yml");
@@ -122,34 +127,47 @@ public class OALRuntime implements OALEngine {
         this.generateClassAtRuntime(oalScripts);
     }
 
-    private void generateClassAtRuntime(OALScripts oalScripts) {
+    private void generateClassAtRuntime(OALScripts oalScripts) throws 
OALCompileException {
         List<AnalysisResult> metricsStmts = oalScripts.getMetricsStmts();
         metricsStmts.forEach(this::buildDispatcherContext);
 
-        metricsStmts.forEach(this::generateMetricsClass);
+        for (AnalysisResult metricsStmt : metricsStmts) {
+            generateMetricsClass(metricsStmt);
+        }
 
     }
 
-    private void generateMetricsClass(AnalysisResult metricsStmt) {
+    private void generateMetricsClass(AnalysisResult metricsStmt) throws 
OALCompileException {
         CtClass parentMetricsClass = null;
         try {
             parentMetricsClass = classPool.get(METRICS_FUNCTION_PACKAGE + 
metricsStmt.getMetricsClassName());
         } catch (NotFoundException e) {
             logger.error("Can't find parent class for " + 
metricsStmt.getMetricsName() + ".", e);
-            return;
+            throw new OALCompileException(e.getMessage(), e);
         }
         CtClass metricsClass = 
classPool.makeClass(metricsClassName(metricsStmt), parentMetricsClass);
         try {
             metricsClass.addInterface(classPool.get(WITH_METADATA_INTERFACE));
         } catch (NotFoundException e) {
             logger.error("Can't find WithMetadata interface for " + 
metricsStmt.getMetricsName() + ".", e);
-            return;
+            throw new OALCompileException(e.getMessage(), e);
         }
 
         ClassFile metricsClassClassFile = metricsClass.getClassFile();
         ConstPool constPool = metricsClassClassFile.getConstPool();
 
         /**
+         * Create empty construct
+         */
+        try {
+            CtConstructor defaultConstructor = CtNewConstructor.make("public " 
+ metricsStmt.getMetricsName() + "Metrics() {}", metricsClass);
+            metricsClass.addConstructor(defaultConstructor);
+        } catch (CannotCompileException e) {
+            logger.error("Can't add empty constructor in " + 
metricsStmt.getMetricsName() + ".", e);
+            throw new OALCompileException(e.getMessage(), e);
+        }
+
+        /**
          * Add fields with annotations.
          *
          * private ${sourceField.typeName} ${sourceField.fieldName};
@@ -183,7 +201,7 @@ public class OALRuntime implements OALEngine {
 
             } catch (CannotCompileException e) {
                 logger.error("Can't add field(including set/get) " + 
field.getFieldName() + " in " + metricsStmt.getMetricsName() + ".", e);
-                return;
+                throw new OALCompileException(e.getMessage(), e);
             }
         }
 
@@ -197,7 +215,7 @@ public class OALRuntime implements OALEngine {
                 
metricsClass.addMethod(CtNewMethod.make(methodEntity.toString(), metricsClass));
             } catch (Exception e) {
                 logger.error("Can't generate method " + method + " for " + 
metricsStmt.getMetricsName() + ".", e);
-                return;
+                throw new OALCompileException(e.getMessage(), e);
             }
         }
 
@@ -219,11 +237,9 @@ public class OALRuntime implements OALEngine {
 
         try {
             metricsClass.toClass();
-            Class.forName(metricsClass.getName());
         } catch (CannotCompileException e) {
             logger.error("Can't compile " + metricsStmt.getMetricsName() + 
".", e);
-        } catch (ClassNotFoundException e) {
-            e.printStackTrace();
+            throw new OALCompileException(e.getMessage(), e);
         }
 
         ClassFilePrinter.print(metricsClassClassFile);
@@ -234,7 +250,7 @@ public class OALRuntime implements OALEngine {
     }
 
     private String metricsBuilderClassName(AnalysisResult metricsStmt) {
-        return metricsStmt.getMetricsName() + "Metrics.Builder";
+        return DYNAMIC_METRICS_BUILDER_CLASS_PACKAGE + 
metricsStmt.getMetricsName() + "MetricsBuilder";
     }
 
     private void buildDispatcherContext(AnalysisResult metricsStmt) {
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl
index 20ee249..bbd0ad0 100644
--- 
a/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl
+++ 
b/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl
@@ -18,10 +18,10 @@ public void 
deserialize(org.apache.skywalking.oap.server.core.remote.grpc.proto.
     <#list serializeFields.intLongValuePairListFields as field>
         setDetailGroup(new 
org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValueArray(30));
 
-        
Iterator<rg.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair>
 iterator = remoteData.getDataIntLongPairListList().iterator();
+        java.util.Iterator iterator = 
remoteData.getDataIntLongPairListList().iterator();
         while (iterator.hasNext()) {
-            IntKeyLongValuePair element = iterator.next();
-            getDetailGroup().add(new IntKeyLongValue(element.getKey(), 
element.getValue()));
+            
org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair 
element = 
(org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair)(iterator.next());
+            super.getDetailGroup().add(new 
org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue(element.getKey(),
 element.getValue()));
         }
     </#list>
 }
\ No newline at end of file
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl
index c0c0ca1..53af5b3 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl
@@ -16,9 +16,9 @@ public 
org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData.Builde
         remoteBuilder.addDataIntegers(${field.getter}());
     </#list>
     <#list serializeFields.intLongValuePairListFields as field>
-        
Iterator<org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue>
 iterator = getDetailGroup().iterator();
+        java.util.Iterator iterator = super.getDetailGroup().iterator();
         while (iterator.hasNext()) {
-            remoteBuilder.addDataIntLongPairList(iterator.next().serialize());
+            
remoteBuilder.addDataIntLongPairList(((org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue)(iterator.next())).serialize());
         }
     </#list>
 
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl
new file mode 100644
index 0000000..8dcd474
--- /dev/null
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl
@@ -0,0 +1,26 @@
+public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics toDay() {
+    org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics metrics = new 
org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics();
+    <#list fieldsFromSource as field>
+        <#if field.columnName == "time_bucket">
+            metrics.setTimeBucket(toTimeBucketInDay());
+        <#elseif field.typeName == "java.lang.String" || field.typeName == 
"long" || field.typeName == "int" || field.typeName == "double" || 
field.typeName == "float">
+            metrics.${field.fieldSetter}(this.${field.fieldGetter}());
+        <#else>
+            ${field.typeName} newValue = new ${field.typeName}();
+            newValue.copyFrom(this.${field.fieldGetter}());
+            metrics.${field.fieldSetter}(newValue);
+        </#if>
+    </#list>
+    <#list persistentFields as field>
+        <#if field.columnName == "time_bucket">
+            metrics.setTimeBucket(toTimeBucketInDay());
+        <#elseif field.typeName == "java.lang.String" || field.typeName == 
"long" || field.typeName == "int" || field.typeName == "double" || 
field.typeName == "float">
+            metrics.${field.fieldSetter}(this.${field.fieldGetter}());
+        <#else>
+            ${field.typeName} newValue = new ${field.typeName}();
+            newValue.copyFrom(this.${field.fieldGetter}());
+            metrics.${field.fieldSetter}(newValue);
+        </#if>
+    </#list>
+    return metrics;
+}
\ No newline at end of file
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl
new file mode 100644
index 0000000..1328eb9
--- /dev/null
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl
@@ -0,0 +1,26 @@
+public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics toHour() 
{
+    org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics metrics = new 
org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics();
+    <#list fieldsFromSource as field>
+        <#if field.columnName == "time_bucket">
+            metrics.setTimeBucket(toTimeBucketInHour());
+        <#elseif field.typeName == "java.lang.String" || field.typeName == 
"long" || field.typeName == "int" || field.typeName == "double" || 
field.typeName == "float">
+            metrics.${field.fieldSetter}(this.${field.fieldGetter}());
+        <#else>
+            ${field.typeName} newValue = new ${field.typeName}();
+            newValue.copyFrom(this.${field.fieldGetter}());
+            metrics.${field.fieldSetter}(newValue);
+        </#if>
+    </#list>
+    <#list persistentFields as field>
+        <#if field.columnName == "time_bucket">
+            metrics.setTimeBucket(toTimeBucketInHour());
+        <#elseif field.typeName == "java.lang.String" || field.typeName == 
"long" || field.typeName == "int" || field.typeName == "double" || 
field.typeName == "float">
+            metrics.${field.fieldSetter}(this.${field.fieldGetter}());
+        <#else>
+            ${field.typeName} newValue = new ${field.typeName}();
+            newValue.copyFrom(this.${field.fieldGetter}());
+            metrics.${field.fieldSetter}(newValue);
+        </#if>
+    </#list>
+    return metrics;
+}
\ No newline at end of file
diff --git 
a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toMonth.ftl 
b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toMonth.ftl
new file mode 100644
index 0000000..b036385
--- /dev/null
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toMonth.ftl
@@ -0,0 +1,26 @@
+public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics 
toMonth() {
+    org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics metrics = new 
org.apache.skywalking.oal.rt.metrics.${metricsName}Metrics();
+    <#list fieldsFromSource as field>
+        <#if field.columnName == "time_bucket">
+            metrics.setTimeBucket(toTimeBucketInMonth());
+        <#elseif field.typeName == "java.lang.String" || field.typeName == 
"long" || field.typeName == "int" || field.typeName == "double" || 
field.typeName == "float">
+            metrics.${field.fieldSetter}(this.${field.fieldGetter}());
+        <#else>
+            ${field.typeName} newValue = new ${field.typeName}();
+            newValue.copyFrom(this.${field.fieldGetter}());
+            metrics.${field.fieldSetter}(newValue);
+        </#if>
+    </#list>
+    <#list persistentFields as field>
+        <#if field.columnName == "time_bucket">
+            metrics.setTimeBucket(toTimeBucketInMonth());
+        <#elseif field.typeName == "java.lang.String" || field.typeName == 
"long" || field.typeName == "int" || field.typeName == "double" || 
field.typeName == "float">
+            metrics.${field.fieldSetter}(this.${field.fieldGetter}());
+        <#else>
+            ${field.typeName} newValue = new ${field.typeName}();
+            newValue.copyFrom(this.${field.fieldGetter}());
+            metrics.${field.fieldSetter}(newValue);
+        </#if>
+    </#list>
+    return metrics;
+}
\ No newline at end of file
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALCompileException.java
similarity index 77%
copy from 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
copy to 
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALCompileException.java
index cf385d7..b72321e 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALCompileException.java
@@ -18,13 +18,15 @@
 
 package org.apache.skywalking.oap.server.core.oal.rt;
 
-import org.apache.skywalking.oap.server.library.module.ModuleStartException;
-
 /**
- * OALEngine defines the main entrance of the oal script engine runtime.
- *
  * @author wusheng
  */
-public interface OALEngine {
-    void start(ClassLoader currentClassLoader) throws ModuleStartException;
-}
+public class OALCompileException extends Exception {
+    public OALCompileException(String message) {
+        super(message);
+    }
+
+    public OALCompileException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
\ No newline at end of file
diff --git 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
index cf385d7..8d5703b 100644
--- 
a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
+++ 
b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/oal/rt/OALEngine.java
@@ -26,5 +26,5 @@ import 
org.apache.skywalking.oap.server.library.module.ModuleStartException;
  * @author wusheng
  */
 public interface OALEngine {
-    void start(ClassLoader currentClassLoader) throws ModuleStartException;
+    void start(ClassLoader currentClassLoader) throws ModuleStartException, 
OALCompileException;
 }

Reply via email to