diff --git a/.github/workflows/ci_e2e.yml b/.github/workflows/ci_e2e.yml index 82c81ef4e1..68230e56fb 100644 --- a/.github/workflows/ci_e2e.yml +++ b/.github/workflows/ci_e2e.yml @@ -69,6 +69,6 @@ jobs: uses: actions/upload-artifact@v1 with: name: dslogs - path: /var/lib/docker/volumes/docker-swarm_dolphinscheduler-logs/_data + path: /var/lib/docker/volumes/dolphinscheduler-logs/_data diff --git a/.github/workflows/ci_ut.yml b/.github/workflows/ci_ut.yml index 55f1259d2b..b301cf77bd 100644 --- a/.github/workflows/ci_ut.yml +++ b/.github/workflows/ci_ut.yml @@ -78,7 +78,7 @@ jobs: -Dsonar.core.codeCoveragePlugin=jacoco -Dsonar.projectKey=apache-dolphinscheduler -Dsonar.login=e4058004bc6be89decf558ac819aa1ecbee57682 - -Dsonar.exclusions=dolphinscheduler-ui/src/**/i18n/locale/*.js + -Dsonar.exclusions=dolphinscheduler-ui/src/**/i18n/locale/*.js,dolphinscheduler-microbench/src/**/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/dolphinscheduler-microbench/pom.xml b/dolphinscheduler-microbench/pom.xml new file mode 100644 index 0000000000..6080343ed0 --- /dev/null +++ b/dolphinscheduler-microbench/pom.xml @@ -0,0 +1,101 @@ + + + + + dolphinscheduler + org.apache.dolphinscheduler + 1.2.1-SNAPSHOT + + 4.0.0 + + dolphinscheduler-microbench + jar + ${project.artifactId} + + + UTF-8 + 1.21 + 1.8 + benchmarks + + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + junit + junit + compile + + + + org.slf4j + slf4j-api + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${javac.target} + ${javac.target} + ${javac.target} + false + + + + + org.apache.maven.plugins + maven-assembly-plugin + ${maven-assembly-plugin.version} + + + + org.openjdk.jmh.Main + + + + jar-with-dependencies + + + + + + + + + \ No newline at end of file diff --git a/dolphinscheduler-microbench/src/main/java/org/apache/dolphinscheduler/microbench/base/AbstractBaseBenchmark.java b/dolphinscheduler-microbench/src/main/java/org/apache/dolphinscheduler/microbench/base/AbstractBaseBenchmark.java new file mode 100644 index 0000000000..25f0ae9114 --- /dev/null +++ b/dolphinscheduler-microbench/src/main/java/org/apache/dolphinscheduler/microbench/base/AbstractBaseBenchmark.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dolphinscheduler.microbench.base; + +import org.junit.Test; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.results.format.ResultFormatType; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.ChainedOptionsBuilder; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; + +/** + * BaseBenchMark + * If you need to test jmh, please extend him first + */ +@Warmup(iterations = AbstractBaseBenchmark.DEFAULT_WARMUP_ITERATIONS) +@Measurement(iterations = AbstractBaseBenchmark.DEFAULT_MEASURE_ITERATIONS) +@State(Scope.Thread) +@Fork(AbstractBaseBenchmark.DEFAULT_FORKS) +public abstract class AbstractBaseBenchmark { + + static final int DEFAULT_WARMUP_ITERATIONS = 10; + + static final int DEFAULT_MEASURE_ITERATIONS = 10; + + static final int DEFAULT_FORKS = 2; + + private static Logger logger = LoggerFactory.getLogger(AbstractBaseBenchmark.class); + + + private ChainedOptionsBuilder newOptionsBuilder() { + + String className = getClass().getSimpleName(); + + ChainedOptionsBuilder optBuilder = new OptionsBuilder() + // set benchmark ClassName + .include(className); + + if (getMeasureIterations() > 0) { + optBuilder.warmupIterations(getMeasureIterations()); + } + + if (getMeasureIterations() > 0) { + optBuilder.measurementIterations(getMeasureIterations()); + } + + if (getForks() > 0) { + optBuilder.forks(getForks()); + } + + String output = getReportDir(); + if (output != null) { + boolean writeFileStatus; + String filePath = getReportDir() + className + ".json"; + File file = new File(filePath); + + if (file.exists()) { + writeFileStatus = file.delete(); + + + } else { + writeFileStatus = file.getParentFile().mkdirs(); + try { + writeFileStatus = file.createNewFile(); + } catch (IOException e) { + logger.warn("jmh test create file error" + e); + } + } + if (writeFileStatus) { + optBuilder.resultFormat(ResultFormatType.JSON) + .result(filePath); + } + } + return optBuilder; + } + + @Test + public void run() throws Exception { + new Runner(newOptionsBuilder().build()).run(); + } + + private int getWarmupIterations() { + + String value = System.getProperty("warmupIterations"); + return null != value ? Integer.parseInt(value) : -1; + } + + private int getMeasureIterations() { + String value = System.getProperty("measureIterations"); + return null != value ? Integer.parseInt(value) : -1; + } + + private static String getReportDir() { + return System.getProperty("perfReportDir"); + } + + private static int getForks() { + String value = System.getProperty("forkCount"); + return null != value ? Integer.parseInt(value) : -1; + } + + +} + diff --git a/dolphinscheduler-microbench/src/main/java/org/apache/dolphinscheduler/microbench/common/EnumBenchMark.java b/dolphinscheduler-microbench/src/main/java/org/apache/dolphinscheduler/microbench/common/EnumBenchMark.java new file mode 100644 index 0000000000..dcce5368e3 --- /dev/null +++ b/dolphinscheduler-microbench/src/main/java/org/apache/dolphinscheduler/microbench/common/EnumBenchMark.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dolphinscheduler.microbench.common; + + +import org.apache.dolphinscheduler.microbench.base.AbstractBaseBenchmark; +import org.openjdk.jmh.annotations.*; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + *Enum values JMH test + */ +@Warmup(iterations = 2, time = 1) +@Measurement(iterations = 4, time = 1) +@State(Scope.Benchmark) +public class EnumBenchMark extends AbstractBaseBenchmark { + + @Benchmark + public boolean simpleTest(){ + return Boolean.TRUE; + } + @Param({"101", "108", "103", "104", "105", "103"}) + private int testNum; + + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void enumValuesTest() { + TestTypeEnum.oldGetNameByType(testNum); + } + + @Benchmark + @BenchmarkMode(Mode.AverageTime) + @OutputTimeUnit(TimeUnit.MICROSECONDS) + public void enumStaticMapTest() { + TestTypeEnum.newGetNameByType(testNum); + } + + + public enum TestTypeEnum { + + TYPE_101(101, "TYPE101"), + TYPE_102(102, "TYPE102"), + TYPE_103(103, "TYPE103"), + TYPE_104(104, "TYPE104"), + TYPE_105(105, "TYPE105"), + TYPE_106(106, "TYPE106"), + TYPE_107(107, "TYPE107"), + TYPE_108(108, "TYPE108"); + + private int code; + private String name; + + public int getCode() { + return code; + } + + + public String getName() { + return name; + } + + + TestTypeEnum(int code, String name) { + this.code = code; + this.name = name; + } + + private static final Map TEST_TYPE_MAP = new HashMap<>(); + + static { + for (TestTypeEnum testTypeEnum : TestTypeEnum.values()) { + TEST_TYPE_MAP.put(testTypeEnum.code,testTypeEnum); + } + } + + public static void newGetNameByType(int code) { + if (TEST_TYPE_MAP.containsKey(code)) { + TEST_TYPE_MAP.get(code); + return; + } + throw new IllegalArgumentException("invalid code : " + code); + } + + public static void oldGetNameByType(int code) { + for (TestTypeEnum testTypeEnum : TestTypeEnum.values()) { + if (testTypeEnum.getCode() == code) { + return; + } + } + throw new IllegalArgumentException("invalid code : " + code); + } + } + +} diff --git a/pom.xml b/pom.xml index 0742728584..861fde840b 100644 --- a/pom.xml +++ b/pom.xml @@ -1011,5 +1011,6 @@ dolphinscheduler-remote dolphinscheduler-service dolphinscheduler-plugin-api + dolphinscheduler-microbench