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 2019/07/18 06:49:20 UTC
[skywalking] 03/13: Metrcis class generated.
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 <wu...@foxmail.com>
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;
}