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; }
