diff --git a/.gitignore b/.gitignore index b6e47617..bf011e1f 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,29 @@ dmypy.json # Pyre type checker .pyre/ + +.DS_Store + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* diff --git a/core/README.md b/core/README.md index d6a2bac0..23dec9d9 100644 --- a/core/README.md +++ b/core/README.md @@ -48,6 +48,8 @@ In the container, you can generate and run ctests as shown below. Run `./setup_ubuntu.sh` or `sudo ./setup_ubuntu.sh`. +For Apache Skywalking Project - Run `sudo ./setup_ubuntu_skywalking.sh` + ### 2. Target Project To generate ctests or run ctest, you need to first clone the target project. @@ -61,6 +63,8 @@ To generate ctests or run ctest, you need to first clone the target project. `
` can be `hadoop`, `hbase`, `zookeeper` or `alluxio`. +For Apache Skywalking Project - Run `./add_project_skywalking.sh -r ` + ## Usage ### 1. Generating Ctests diff --git a/core/add_project_skywalking.sh b/core/add_project_skywalking.sh new file mode 100644 index 00000000..d5a6f271 --- /dev/null +++ b/core/add_project_skywalking.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +while getopts r: flag +do + case "${flag}" in + r) version=${OPTARG};; + esac +done + +if [ -z "$version" ] +then + echo "Usage : ./add_project_skywalking.sh -r " + exit +fi + +echo $version + +rm -rf app/skywalking + +mkdir -p app/skywalking + +cd app/skywalking + +wget https://dlcdn.apache.org/skywalking/$version/apache-skywalking-apm-$version-src.tgz + +tar zxvf apache-skywalking-apm-$version-src.tgz + +cd apache-skywalking-apm-$version + +git apply ../../../patch/skywalking/skywalking.patch + +cd oap-server + +mvn clean install -DskipTests + +cd .. \ No newline at end of file diff --git a/core/default_configs/skywalking-default.tsv b/core/default_configs/skywalking-default.tsv new file mode 100644 index 00000000..9b6cf034 --- /dev/null +++ b/core/default_configs/skywalking-default.tsv @@ -0,0 +1,46 @@ +configuration.apollo.apolloEnv DEV Configure appolo environment +services[1].duration 20000 The sample rate precision is 1/10000. 10000 means 100% sample in default. Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. +configuration.nacos.port 49317 Nacos Server Port +configuration.zookeeper.hostPort localhost:49315 Zookeeper host port +configuration.nacos.username nacos Nacos auth username +configuration.nacos.port 49319 Nacos Server Port +storage.mysql.metadataQueryMaxSize 5000 Metadata query max size +configuration.apollo.period 1 Unit seconds sync period default fetch every 60 seconds +configuration.nacos.period 2 Unit seconds sync period default fetch every 60 seconds +configuration.nacos.accessKey Nacos auth accessKey +configuration.consul.period 1 Sync period in seconds. Defaults to 60 seconds. +configuration.etcd.period 1 Unit seconds sync period default fetch every 60 seconds +configuration.zookeeper.maxRetries 3 max number of times to retry +configuration.apollo.apolloCluster default Apollo cluster name +configuration.zookeeper.hostPort localhost:49310 Zookeeper host port +core.default.enableDataKeeperExecutor TRUE Set a timeout on metrics data. After the timeout has expired, the metrics data will automatically be deleted. +default.rate 10000 The sample rate precision is 1/10000. 10000 means 100% sample in default +receiver-zipkin.default.restPort 9411 Port used by OAP to collect zipkin trace from HTTP +services[1].name name1 The sample rate precision is 1/10000. 10000 means 100% sample in default. Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. +services[0].rate 2000 The sample rate precision is 1/10000. 10000 means 100% sample in default. Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. +MO-1.MO-1-P1.prop2 value2-prop Example configs +MO-1.MO-1-P1.p1 value1 Example configs +configuration.consul.hostAndPorts localhost:49296 Consul host and ports separated by comma eg 1.2.3.4:8500,2.3.4.5:8500 +configuration.zookeeper.namespace /default Zookeeper namespace +configuration.nacos.secretKey Nacos auth accessKey +configuration.apollo.appId SampleApp Apollo application id +storage.mysql.properties.jdbcUrl jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements Mysql jdbc connection string +configuration.nacos.serverAddr localhost Nacos Server Host +configuration.etcd.endpoints http://127.0.0.1:49305 Etcd Server Host +services[1].rate 1000 The sample rate precision is 1/10000. 10000 means 100% sample in default. Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. +configuration.nacos.group skywalking Nacos Configuration Group +configuration.apollo.apolloMeta http://localhost:49284 Apollo host and port +configuration.etcd.endpoints http://127.0.0.1:49302 Etcd Server Host +services[0].name name2 The sample rate precision is 1/10000. 10000 means 100% sample in default. Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. +configuration.zookeeper.baseSleepTimeMs 1000 initial amount of time to wait between retries +storage.mysql.properties.dataSource.password !AI!3B Mysql datasource password +configuration.apollo.apolloMeta http://localhost:49287 Apollo host and port +default.duration -1 The sample rate precision is 1/10000. 10000 means 100% sample in default +configuration.consul.hostAndPorts localhost:49290 localhost:49296 Consul host and ports separated by comma eg 1.2.3.4:8500,2.3.4.5:8500 +receiver-zipkin.default.restHost 0.0.0.0 Host used by OAP to collect zipkin trace from HTTP +configuration.nacos.namespace Nacos Configuration namespace +configuration.nacos.password nacos Nacos auth username +MO-1.MO-1-P1.p2 value2 Example configs +services[0].duration 30000 The sample rate precision is 1/10000. 10000 means 100% sample in default. Setting this threshold about the latency would make the slow trace segments sampled if they cost more time, even the sampling mechanism activated. The default value is `-1`, which means would not sample slow traces. Unit, millisecond. +configuration.zookeeper.period 1 Unit seconds sync period default fetch every 60 seconds +configuration.etcd.namespace /skywalking/ Etcd Configuration Group \ No newline at end of file diff --git a/core/generate_ctest/ctest_mapping/ctests-skywalking.json b/core/generate_ctest/ctest_mapping/ctests-skywalking.json new file mode 100644 index 00000000..d18e115d --- /dev/null +++ b/core/generate_ctest/ctest_mapping/ctests-skywalking.json @@ -0,0 +1,100 @@ +{ + "configuration.apollo.period": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.zookeeper.maxRetries": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.zookeeper.period": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.zookeeper.baseSleepTimeMs": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.zookeeper.namespace": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "services[1].rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate" + ], + "services[0].duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate" + ], + "default.duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate" + ], + "services[0].rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate" + ], + "default.rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate" + ], + "services[1].duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate" + ], + "configuration.nacos.port": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.nacos.group": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.nacos.period": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.etcd.period": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.etcd.namespace": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.consul.period": [ + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group" + ] +} diff --git a/core/generate_ctest/skywalking/README.md b/core/generate_ctest/skywalking/README.md new file mode 100644 index 00000000..0190faea --- /dev/null +++ b/core/generate_ctest/skywalking/README.md @@ -0,0 +1,52 @@ +# Generating Parameter Sets for Apache Skywalking + +**generate_ctest is used to automatically generate ctests** + +```shell +# Switch to the generate_ctest/skywalking directory +cd /core/generate_ctest/skywalking + +# Build the project to generate the target/ctest-runner-1.0-SNAPSHOT-jar-with-dependencies.jar +mvn clean package + +# Switch to the instrumented apache skywalking directory +cd /home/skywalking + +# Run the jar by providing the following inputs +# 1. temp directory which will contain the files needed for this run +# 2. File core/identify_param/results/skywalking/test_to_param_flat.json from the execution of the core/identify_param/skywalking step +# 3. File skywalking-generated-values.tsv from the execution of the core/generate_value step +# 4. Result directory which will contain the results of the execution +java -jar /core/generate_ctest/skywalking/target/ctest-runner-1.0-SNAPSHOT-jar-with-dependencies.jar /tmp /test-to-config-flat.txt /skywalking-generated-values.tsv /resultDir +``` + +## Results + +2 files are generated as a result of this run + +1. Generates the `core/generate_ctest/ctest_mapping/ctests-skywalking.json` file +```json +{ + "configuration.apollo.period": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.zookeeper.maxRetries": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.zookeeper.period": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ]... +} + +``` + +2. Execution results for each case in the tab separated format + +Param Test Value p/f Time_in_ns +```json +services[0].duration org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify 15000 p 9188519779 +services[0].duration org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify 60000 p 9179170267 +``` diff --git a/core/generate_ctest/skywalking/pom.xml b/core/generate_ctest/skywalking/pom.xml new file mode 100644 index 00000000..1286cf59 --- /dev/null +++ b/core/generate_ctest/skywalking/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + org.uiuc + ctest-runner + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + org.apache.maven.shared + maven-invoker + 3.2.0 + + + com.google.code.gson + gson + 2.9.1 + + + com.anubhavshukla + properties-to-yaml-converter + 1.0.1 + + + + + + + maven-assembly-plugin + + + + org.uiuc.Main + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/core/generate_ctest/skywalking/src/main/java/org/uiuc/AppConstants.java b/core/generate_ctest/skywalking/src/main/java/org/uiuc/AppConstants.java new file mode 100644 index 00000000..f7e7e72e --- /dev/null +++ b/core/generate_ctest/skywalking/src/main/java/org/uiuc/AppConstants.java @@ -0,0 +1,62 @@ +package org.uiuc; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public interface AppConstants { + + Map moduleToDirMap = new HashMap() { + { + put("oap-server/server-starter", "./oap-server/server-starter/src/main/resources/"); + put("oap-server/server-configuration/configuration-apollo", "./oap-server/server-configuration/configuration-apollo/src/test/resources/"); + put("oap-server/server-configuration/configuration-etcd", "./oap-server/server-configuration/configuration-etcd/src/test/resources/"); + put("oap-server/server-configuration/configuration-zookeeper", "./oap-server/server-configuration/configuration-zookeeper/src/test/resources/"); + put("oap-server/analyzer/agent-analyzer", "./oap-server/analyzer/agent-analyzer/src/main/resources/"); + put("oap-server/server-configuration/configuration-nacos", "./oap-server/server-configuration/configuration-nacos/src/test/resources/"); + put("oap-server/server-configuration/configuration-consul", "./oap-server/server-configuration/configuration-consul/src/test/resources/"); + } + }; + + Map moduleToFileNameMap = new HashMap() { + { + put("oap-server/server-starter", "application2.yml"); + put("oap-server/server-configuration/configuration-apollo", "application2.yml"); + put("oap-server/server-configuration/configuration-etcd", "application2.yml"); + put("oap-server/server-configuration/configuration-zookeeper", "application2.yml"); + put("oap-server/analyzer/agent-analyzer", "trace-sampling-policy-settings2.yml"); + put("oap-server/server-configuration/configuration-nacos", "application2.yml"); + put("oap-server/server-configuration/configuration-consul", "application2.yml"); + } + }; + + List testCases = Arrays.asList( + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig", + "oap-server/server-library/library-module>org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig", + "oap-server/server-configuration/configuration-apollo>org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-apollo>org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-consul>org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-consul>org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-etcd>org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-etcd>org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-zookeeper>org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-zookeeper>org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.NacosConfigWatcherRegisterTest#shouldReadConfigs" + ); + + String ERROR_MSG = "Error on exec() method"; +} diff --git a/core/generate_ctest/skywalking/src/main/java/org/uiuc/Main.java b/core/generate_ctest/skywalking/src/main/java/org/uiuc/Main.java new file mode 100644 index 00000000..5d03f0b4 --- /dev/null +++ b/core/generate_ctest/skywalking/src/main/java/org/uiuc/Main.java @@ -0,0 +1,226 @@ +package org.uiuc; + +import com.anubhavshukla.p2y.converter.PropertiesToYamlConverter; +import com.google.gson.Gson; +import org.apache.commons.io.FileUtils; + +import java.io.*; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.uiuc.AppConstants.*; + +public class Main { + public static void main(String[] args) throws IOException { + + String configDestDir = args[0]; + String testToConfigMapperInputFile = args[1]; + String generatedValueListFile = args[2]; + String resultDir = args[3]; + + List arrList = new ArrayList<>(); + try (Stream lines = Files.lines(Paths.get(generatedValueListFile), Charset.defaultCharset())) { + lines.forEachOrdered(line -> { + if (!line.isEmpty()) { + String[] split = line.split("\t"); + if (!line.contains("SKIP")) { + arrList.add(split[0] + "=" + split[1]); + arrList.add(split[0] + "=" + split[2]); + } + } + }); + } + System.out.println(arrList); + FileWriter writer = new FileWriter(configDestDir + "/output.txt"); + for (String str : arrList) { + writer.write(str + System.lineSeparator()); + } + writer.close(); + + List overrideConfigFileList = new ArrayList<>(); + int i = 0; + try (Stream lines = Files.lines(Paths.get(configDestDir + "/output.txt"), Charset.defaultCharset())) { + lines.forEachOrdered(line -> { + try { + File file = new File("config" + i + ".txt"); + FileUtils.writeStringToFile(file, line, Charset.forName("UTF-8")); + PropertiesToYamlConverter p = new PropertiesToYamlConverter(); + String yaml = p.fileToYamlString(file); + if (yaml.contains("[")) { + yaml = yaml.replaceFirst("\\[[^\\]]+\\]", "").trim().replace("\n ", "\n" + " -"); + } + System.out.println(yaml); + FileUtils.writeStringToFile(new File(configDestDir + "/" + line), yaml, Charset.forName("UTF-8")); + overrideConfigFileList.add(line); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + StringBuffer mapperInputStr = new StringBuffer(); + try (Stream lines = Files.lines(Paths.get(testToConfigMapperInputFile), Charset.defaultCharset())) { + lines.forEachOrdered(line -> + mapperInputStr.append(line) + ); + } + System.out.println(mapperInputStr); + + Gson gson = new Gson(); + Map> testToConfigList = gson.fromJson(mapperInputStr.toString(), Map.class); + System.out.println(testToConfigList); + + Map testCaseToModuleMap = testCases.stream() + .collect(Collectors.toMap(x -> x.split(">")[1], y -> y.split(">")[0])); + + List finalReport = new ArrayList<>(); + Map testParamToSuccessCountMap = new HashMap<>(); + Map testParamToSuccessBooleanCountMap = new HashMap<>(); + testToConfigList.forEach((testCase, configList) -> { + configList.forEach(config -> { + List allMatchingFiles = overrideConfigFileList.stream().filter(x -> x.split("=")[0].equals(config)).collect(Collectors.toList()); + allMatchingFiles.forEach(c -> { + System.out.println("Module : " + testCaseToModuleMap.get(testCase) + " TestCase : " + testCase + " destFileName : " + c); + try { + runTest(configDestDir, c, testCaseToModuleMap.get(testCase), testCase, finalReport, testParamToSuccessCountMap, testParamToSuccessBooleanCountMap); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + }); + }); + + Map> finalParamToTestReport = new LinkedHashMap<>(); + + testParamToSuccessCountMap.forEach((k, v) -> { + if (v >= 2) { + String[] split = k.split("_"); + String parameter = split[0]; + String testCase = split[1]; + if (!finalParamToTestReport.containsKey(parameter)) { + Set testList = new HashSet<>(); + testList.add(testCase); + finalParamToTestReport.put(parameter, testList); + } else { + finalParamToTestReport.get(parameter).add(testCase); + } + } + }); + + testParamToSuccessBooleanCountMap.forEach((k, v) -> { + String[] split = k.split("_"); + String parameter = split[0]; + String testCase = split[1]; + if (!finalParamToTestReport.containsKey(parameter)) { + Set testList = new HashSet<>(); + testList.add(testCase); + finalParamToTestReport.put(parameter, testList); + } else { + finalParamToTestReport.get(parameter).add(testCase); + } + }); + + System.out.println(finalReport); + FileWriter writer2 = new FileWriter(resultDir + "/test_result.tsv"); + for (String str : finalReport) { + writer2.write(str + System.lineSeparator()); + } + writer2.close(); + + String finalCtestJson = gson.toJson(finalParamToTestReport); + System.out.println(finalCtestJson); + FileWriter writer3 = new FileWriter(resultDir + "/ctests-skywalking.json"); + writer3.write(finalCtestJson); + writer3.close(); + + } + + private static void runTest(String sourceDir, String sourceFileName, String module, String testCase, + List finalReport, Map testParamToSuccessCountMap, Map testParamToSuccessBooleanCountMap) throws IOException, InterruptedException { + + long startTime = System.nanoTime(); + + String destFileName = moduleToFileNameMap.get(module); + + System.out.println("copying < " + sourceFileName + " > from < " + sourceDir + " > to < " + moduleToDirMap.get(module) + " >"); + + try { + Runtime.getRuntime().exec("cp " + sourceDir + "/" + sourceFileName + " " + moduleToDirMap.get(module) + "/" + destFileName); + } catch (IOException e) { + System.err.println(ERROR_MSG); + e.printStackTrace(); + } + + Process p = null; + try { + p = Runtime.getRuntime().exec("mvn test -pl " + module + " -Dtest=" + testCase + " -DfailIfNoTests=false"); + } catch (IOException e) { + System.err.println(ERROR_MSG); + e.printStackTrace(); + } + + OutputStream output = new OutputStream() { + private final StringBuilder string = new StringBuilder(); + + @Override + public void write(int b) { + this.string.append((char) b); + } + + public String toString() { + return this.string.toString(); + } + }; + + copy(p.getInputStream(), output); + BufferedReader bufReader = new BufferedReader(new StringReader(output.toString())); + String next = bufReader.readLine(); + String parameter = sourceFileName.split("=")[0]; + long endTime = System.nanoTime(); + long execTime = (endTime - startTime); + while (next != null) { + System.out.println(next); + String paramValue = sourceFileName.split("=")[1]; + if (next.contains("BUILD FAILURE")) { + finalReport.add(parameter + "\t" + testCase + "\t" + paramValue + "\t" + "f" + "\t" + execTime); + } else if (next.contains("BUILD SUCCESS")) { + finalReport.add(parameter + "\t" + testCase + "\t" + paramValue + "\t" + "p" + "\t" + execTime); + String key = String.join("_", parameter, testCase); + if (paramValue.equals("TRUE") || paramValue.equals("FALSE")) { + if (!testParamToSuccessBooleanCountMap.containsKey(key)) { + testParamToSuccessBooleanCountMap.put(key, 1); + } else { + testParamToSuccessBooleanCountMap.put(key, testParamToSuccessBooleanCountMap.get(key) + 1); + } + } else { + if (!testParamToSuccessCountMap.containsKey(key)) { + testParamToSuccessCountMap.put(key, 1); + } else { + testParamToSuccessCountMap.put(key, testParamToSuccessCountMap.get(key) + 1); + } + } + } + next = bufReader.readLine(); + } + p.waitFor(); + } + + public static void copy(InputStream in, OutputStream out) throws IOException { + while (true) { + int c = in.read(); + if (c == -1) + break; + out.write((char) c); + } + } +} \ No newline at end of file diff --git a/core/generate_value/results/skywalking/skywalking-generated-values.tsv b/core/generate_value/results/skywalking/skywalking-generated-values.tsv new file mode 100644 index 00000000..38624009 --- /dev/null +++ b/core/generate_value/results/skywalking/skywalking-generated-values.tsv @@ -0,0 +1,46 @@ +configuration.apollo.apolloEnv SKIP SKIP +services[1].duration 10000 40000 +configuration.nacos.port 3000 3001 +configuration.zookeeper.hostPort SKIP SKIP +configuration.nacos.username SKIP SKIP +configuration.nacos.port 3000 3001 +storage.mysql.metadataQueryMaxSize 2500 10000 +configuration.apollo.period 0 2 +configuration.nacos.period 1 4 +configuration.nacos.accessKey SKIP SKIP +configuration.consul.period 0 2 +configuration.etcd.period 0 2 +configuration.zookeeper.maxRetries 1 6 +configuration.apollo.apolloCluster SKIP SKIP +configuration.zookeeper.hostPort SKIP SKIP +core.default.enableDataKeeperExecutor FALSE SKIP +default.rate 5000 20000 +receiver-zipkin.default.restPort 4705 18822 +services[1].name SKIP SKIP +services[0].rate 1000 4000 +MO-1.MO-1-P1.prop2 SKIP SKIP +MO-1.MO-1-P1.p1 SKIP SKIP +configuration.consul.hostAndPorts SKIP SKIP +configuration.zookeeper.namespace /valid/file1 /valid/file2 +configuration.nacos.secretKey SKIP SKIP +configuration.apollo.appId SKIP SKIP +storage.mysql.properties.jdbcUrl SKIP SKIP +configuration.nacos.serverAddr SKIP SKIP +configuration.etcd.endpoints SKIP SKIP +services[1].rate 500 2000 +configuration.nacos.group xdgroup samgroup +configuration.apollo.apolloMeta SKIP SKIP +configuration.etcd.endpoints SKIP SKIP +services[0].name SKIP SKIP +configuration.zookeeper.baseSleepTimeMs 500 2000 +storage.mysql.properties.dataSource.password SKIP SKIP +configuration.apollo.apolloMeta SKIP SKIP +default.duration 0 -2 +configuration.consul.hostAndPorts SKIP SKIP +receiver-zipkin.default.restHost 127.0.0.1 SKIP +configuration.nacos.namespace SKIP SKIP +configuration.nacos.password SKIP SKIP +MO-1.MO-1-P1.p2 value2 SKIP SKIP +services[0].duration 15000 60000 +configuration.zookeeper.period 0 2 +configuration.etcd.namespace /valid/file1 /valid/file2 diff --git a/core/generate_value/value_generation.py b/core/generate_value/value_generation.py index 82a5bde8..74b38d8a 100644 --- a/core/generate_value/value_generation.py +++ b/core/generate_value/value_generation.py @@ -25,6 +25,9 @@ def read_tsv(module): if module == "zookeeper-server": assert len(params) == 32 return 32 + elif module == "skywalking": + assert len(params) == 46 + return 46 else: assert len(params) == 90 return 90 @@ -105,6 +108,8 @@ def print_params(module): f = open(module + output, "w") if module == "zookeeper-server": assert len(params) == 32 + elif module == "skywalking": + assert len(params) == 46 else: assert len(params) >= 90 for param in params: diff --git a/core/identify_param/results/skywalking/conf_params.txt b/core/identify_param/results/skywalking/conf_params.txt new file mode 100644 index 00000000..715bfd89 --- /dev/null +++ b/core/identify_param/results/skywalking/conf_params.txt @@ -0,0 +1,46 @@ +configuration.apollo.apolloEnv +services[1].duration +configuration.nacos.port +configuration.zookeeper.hostPort +configuration.nacos.username +configuration.nacos.port +storage.mysql.metadataQueryMaxSize +configuration.apollo.period +configuration.nacos.period +configuration.nacos.accessKey +configuration.consul.period +configuration.etcd.period +configuration.zookeeper.maxRetries +configuration.apollo.apolloCluster +configuration.zookeeper.hostPort +core.default.enableDataKeeperExecutor +default.rate +receiver-zipkin.default.restPort +services[1].name +services[0].rate +MO-1.MO-1-P1.prop2 +MO-1.MO-1-P1.p1 +configuration.consul.hostAndPorts +configuration.zookeeper.namespace +configuration.nacos.secretKey +configuration.apollo.appId +storage.mysql.properties.jdbcUrl +configuration.nacos.serverAddr +configuration.etcd.endpoints +services[1].rate +configuration.nacos.group +configuration.apollo.apolloMeta +configuration.etcd.endpoints +services[0].name +configuration.zookeeper.baseSleepTimeMs +storage.mysql.properties.dataSource.password +configuration.apollo.apolloMeta +default.duration +configuration.consul.hostAndPorts +receiver-zipkin.default.restHost +configuration.nacos.namespace +configuration.nacos.password +MO-1.MO-1-P1.p2 value2 +services[0].duration +configuration.zookeeper.period +configuration.etcd.namespace diff --git a/core/identify_param/results/skywalking/param_unset_getter_map.json b/core/identify_param/results/skywalking/param_unset_getter_map.json new file mode 100644 index 00000000..f411ff00 --- /dev/null +++ b/core/identify_param/results/skywalking/param_unset_getter_map.json @@ -0,0 +1,197 @@ +{ + "services[1].name": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.serverAddr": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "receiver-zipkin.default.restHost": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig" + ], + "configuration.nacos.secretKey": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.apollo.apolloCluster": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "services[0].rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.consul.hostAndPorts": [ + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.etcd.period": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.apollo.appId": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "configuration.nacos.username": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.apollo.period": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "storage.mysql.properties.jdbcUrl": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig" + ], + "storage.mysql.metadataQueryMaxSize": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig" + ], + "configuration.etcd.endpoints": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.nacos.period": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "MO-1.MO-1-P1.p2": [ + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig" + ], + "services[0].name": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.zookeeper.baseSleepTimeMs": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.apollo.apolloEnv": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "core.default.enableDataKeeperExecutor": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig" + ], + "default.rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "services[0].duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.consul.period": [ + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.zookeeper.maxRetries": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "storage.mysql.properties.dataSource.password": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig" + ], + "configuration.zookeeper.hostPort": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "receiver-zipkin.default.restPort": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig" + ], + "configuration.apollo.apolloMeta": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "default.duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.accessKey": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.nacos.port": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "services[1].rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.namespace": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.etcd.namespace": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "MO-1.MO-1-P1.p1": [ + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig" + ], + "services[1].duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.group": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.zookeeper.period": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "MO-1.MO-1-P1.prop2": [ + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig" + ], + "configuration.zookeeper.namespace": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.nacos.password": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ] +} \ No newline at end of file diff --git a/core/identify_param/results/skywalking/test_method_list.json b/core/identify_param/results/skywalking/test_method_list.json new file mode 100644 index 00000000..4c57b09e --- /dev/null +++ b/core/identify_param/results/skywalking/test_method_list.json @@ -0,0 +1,26 @@ +[ + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig", + "oap-server/server-library/library-module>org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig", + "oap-server/server-configuration/configuration-apollo>org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-apollo>org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-consul>org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-consul>org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-etcd>org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-etcd>org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-zookeeper>org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-zookeeper>org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.NacosConfigWatcherRegisterTest#shouldReadConfigs" +] \ No newline at end of file diff --git a/core/identify_param/results/skywalking/test_to_param.json b/core/identify_param/results/skywalking/test_to_param.json new file mode 100644 index 00000000..e7bd23a3 --- /dev/null +++ b/core/identify_param/results/skywalking/test_to_param.json @@ -0,0 +1,286 @@ +{ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig": { + "storage": { + "mysql": { + "metadataQueryMaxSize": "5000", + "properties": { + "jdbcUrl": "jdbc:mysql://localhost:3306/swtest?rewriteBatchedStatements" + } + } + } + }, + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig": { + "receiver-zipkin": { + "default": { + "restHost": "0.0.0.0" + } + } + }, + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig": { + "receiver-zipkin": { + "default": { + "restPort": "9411" + } + } + }, + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig": { + "core": { + "default": { + "enableDataKeeperExecutor": "true" + } + } + }, + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig": { + "storage": { + "mysql": { + "properties": { + "dataSource.password": "!AI!3B" + } + } + } + }, + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig": { + "MO-1": { + "MO-1-P1": { + "prop2": "value2-prop", + "p1": "value1", + "p2": "value2" + } + } + }, + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated": { + "configuration": { + "apollo": { + "apolloCluster": "default", + "apolloMeta": "http://localhost:49158", + "apolloEnv": "DEV", + "appId": "SampleApp", + "period": "1" + } + } + }, + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group": { + "configuration": { + "apollo": { + "apolloCluster": "default", + "apolloMeta": "http://localhost:49161", + "apolloEnv": "DEV", + "appId": "SampleApp", + "period": "1" + } + } + }, + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated": { + "configuration": { + "consul": { + "hostAndPorts": "localhost:49164", + "period": "1" + } + } + }, + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group": { + "configuration": { + "consul": { + "hostAndPorts": "localhost:49170", + "period": "1" + } + } + }, + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated": { + "configuration": { + "etcd": { + "endpoints": "http://127.0.0.1:49176", + "namespace": "/skywalking/", + "period": "1" + } + } + }, + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group": { + "configuration": { + "etcd": { + "endpoints": "http://127.0.0.1:49179", + "namespace": "/skywalking/", + "period": "1" + } + } + }, + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated": { + "configuration": { + "zookeeper": { + "namespace": "/default", + "hostPort": "localhost:49184", + "period": "1", + "baseSleepTimeMs": "1000", + "maxRetries": "3" + } + } + }, + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig": { + "configuration": { + "zookeeper": { + "namespace": "/default", + "hostPort": "localhost:49189", + "period": "1", + "baseSleepTimeMs": "1000", + "maxRetries": "3" + } + } + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + }, + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated": { + "configuration": { + "nacos": { + "secretKey": "", + "port": "49191", + "namespace": "", + "username": "nacos", + "period": "1", + "serverAddr": "localhost", + "group": "skywalking", + "password": "nacos", + "accessKey": "" + } + } + }, + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup": { + "configuration": { + "nacos": { + "secretKey": "", + "port": "49193", + "namespace": "", + "username": "nacos", + "period": "1", + "serverAddr": "localhost", + "group": "skywalking", + "password": "nacos", + "accessKey": "" + } + } + }, + "org.apache.skywalking.oap.server.configuration.nacos.NacosConfigWatcherRegisterTest#shouldReadConfigs": {} + } \ No newline at end of file diff --git a/core/identify_param/results/skywalking/test_to_param_flat.json b/core/identify_param/results/skywalking/test_to_param_flat.json new file mode 100644 index 00000000..1cb25b8e --- /dev/null +++ b/core/identify_param/results/skywalking/test_to_param_flat.json @@ -0,0 +1,161 @@ +{ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated": [ + "configuration.apollo.apolloMeta", + "configuration.apollo.appId", + "configuration.apollo.period", + "configuration.apollo.apolloEnv", + "configuration.apollo.apolloCluster" + ], + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated": [ + "configuration.zookeeper.maxRetries", + "configuration.zookeeper.period", + "configuration.zookeeper.hostPort", + "configuration.zookeeper.baseSleepTimeMs", + "configuration.zookeeper.namespace" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate": [ + "services[1].rate", + "services[0].duration", + "default.duration", + "services[0].name", + "services[1].name", + "services[0].rate", + "default.rate", + "services[1].duration" + ], + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup": [ + "configuration.nacos.port", + "configuration.nacos.serverAddr", + "configuration.nacos.accessKey", + "configuration.nacos.group", + "configuration.nacos.namespace", + "configuration.nacos.password", + "configuration.nacos.username", + "configuration.nacos.period", + "configuration.nacos.secretKey" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate": [ + "default.duration", + "services[0].duration", + "services[1].duration", + "services[1].name", + "default.rate", + "services[0].rate", + "services[1].rate", + "services[0].name" + ], + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group": [ + "configuration.etcd.period", + "configuration.etcd.endpoints", + "configuration.etcd.namespace" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify": [ + "services[1].duration", + "services[1].name", + "services[0].rate", + "services[0].duration", + "default.duration", + "services[1].rate", + "default.rate", + "services[0].name" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate": [ + "services[1].duration", + "default.duration", + "services[0].name", + "services[0].rate", + "services[1].name", + "default.rate", + "services[1].rate", + "services[0].duration" + ], + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group": [ + "configuration.apollo.period", + "configuration.apollo.apolloEnv", + "configuration.apollo.apolloCluster", + "configuration.apollo.appId", + "configuration.apollo.apolloMeta" + ], + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated": [ + "configuration.etcd.period", + "configuration.etcd.endpoints", + "configuration.etcd.namespace" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify": [ + "default.rate", + "services[0].rate", + "services[1].duration", + "services[1].rate", + "default.duration", + "services[0].duration", + "services[1].name", + "services[0].name" + ], + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated": [ + "configuration.nacos.password", + "configuration.nacos.port", + "configuration.nacos.accessKey", + "configuration.nacos.secretKey", + "configuration.nacos.namespace", + "configuration.nacos.group", + "configuration.nacos.period", + "configuration.nacos.serverAddr", + "configuration.nacos.username" + ], + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group": [ + "configuration.consul.hostAndPorts", + "configuration.consul.period" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify": [ + "services[0].name", + "services[0].duration", + "services[1].name", + "services[0].rate", + "default.duration", + "services[1].rate", + "services[1].duration", + "default.rate" + ], + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig": [ + "storage.mysql.metadataQueryMaxSize", + "storage.mysql.properties.jdbcUrl" + ], + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig": [ + "configuration.zookeeper.maxRetries", + "configuration.zookeeper.period", + "configuration.zookeeper.baseSleepTimeMs", + "configuration.zookeeper.namespace", + "configuration.zookeeper.hostPort" + ], + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated": [ + "configuration.consul.hostAndPorts", + "configuration.consul.period" + ], + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig": [ + "MO-1.MO-1-P1.prop2", + "MO-1.MO-1-P1.p1", + "MO-1.MO-1-P1.p2" + ], + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig": [ + "receiver-zipkin.default.restHost" + ], + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit": [ + "services[0].name", + "default.rate", + "services[1].name", + "services[0].duration", + "services[1].rate", + "default.duration", + "services[1].duration", + "services[0].rate" + ], + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig": [ + "core.default.enableDataKeeperExecutor" + ], + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig": [ + "storage.mysql.properties.dataSource.password" + ], + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig": [ + "receiver-zipkin.default.restPort" + ] + } \ No newline at end of file diff --git a/core/identify_param/skywalking/README.md b/core/identify_param/skywalking/README.md new file mode 100644 index 00000000..7b619d5c --- /dev/null +++ b/core/identify_param/skywalking/README.md @@ -0,0 +1,121 @@ +# Building & Instrumenting Apache Skywalking project + +The below steps are automated in the script `core/add_project_skywalking.sh` + +1. Login to VM and create a new directory +2. Run the command +```shell +# Latest source code release can be found in https://skywalking.apache.org/downloads/ +wget https://dlcdn.apache.org/skywalking/9.2.0/apache-skywalking-apm-9.2.0-src.tgz +``` +3. Unzip the file +```shell +tar zxvf apache-skywalking-apm-9.2.0-src.tgz +``` + +4. Apply the instrumentation patch from the openctest repo (skywalking.patch contains both logging and interception instrumentation) +```shell +git apply /core/patch/skywalking/skywalking.patch +``` +5. Switch to the backend directory +```shell +cd oap-server +``` +6. Build the project +```shell +mvn clean install -DskipTests +``` + + +# Identifying Parameters in Apache Skywalking + +**Use identify_param to identify configuration parameters exercised by tests in the target project.** + +## Details +1. Run tests in the instrumented target project. +2. Parse the test log to identify parameters exercised in each test. +3. For each configuration parameter p, identify tests that reset the value of p, and exclude p from these tests' exercised parameter set. +4. Generate a mapping where the keys are parameters, and values are lists of tests which exercise but not reset the parameters. + +```shell +# Switch to the identify_param/skywalking directory +cd /core/identify_param/skywalking + +# Build the project to generate the target/ctest-mapper-1.0-SNAPSHOT-jar-with-dependencies.jar +mvn clean package + +# Switch to the instrumented apache skywalking directory +cd /home/skywalking + +# Run the jar by providing the output directory +java -jar /core/identify_param/skywalking/target/ctest-mapper-1.0-SNAPSHOT-jar-with-dependencies.jar /home/output/ +``` + +## Results + +3 files are generated as a result of this run + +1. Test case to config map `core/identify_param/results/skywalking/test_to_param.json` +```json +{ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig": { + "configuration": { + "zookeeper": { + "namespace": "/default", + "hostPort": "localhost:49189", + "period": "1", + "baseSleepTimeMs": "1000", + "maxRetries": "3" + } + } + }, + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit": { + "default": { + "duration": "-1", + "rate": "10000" + }, + "services": [ + { + "duration": "30000", + "rate": "2000", + "name": "name2" + }, + { + "duration": "20000", + "rate": "1000", + "name": "name1" + } + ] + },... +} +``` + +2. Generate the test case to config flat map `core/identify_param/results/skywalking/test_to_param_flat.json` +```json +{ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated": [ + "configuration.apollo.apolloMeta", + "configuration.apollo.appId", + "configuration.apollo.period", + "configuration.apollo.apolloEnv", + "configuration.apollo.apolloCluster" + ], + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated": [ + "configuration.zookeeper.maxRetries", + "configuration.zookeeper.period", + "configuration.zookeeper.hostPort", + "configuration.zookeeper.baseSleepTimeMs", + "configuration.zookeeper.namespace" + ]... +} +``` + +3. Generates the flat config `core/default_configs/skywalking-default.tsv` from skywalking's hierarchy structure which can be used by the generate_value python code. This also supports array based configs. + +``` +configuration.apollo.apolloEnv DEV description +services[1].duration 20000 description +configuration.nacos.port 49317 description +configuration.zookeeper.hostPort localhost:49315 description +configuration.nacos.username nacos description +``` \ No newline at end of file diff --git a/core/identify_param/skywalking/pom.xml b/core/identify_param/skywalking/pom.xml new file mode 100644 index 00000000..548d8390 --- /dev/null +++ b/core/identify_param/skywalking/pom.xml @@ -0,0 +1,62 @@ + + + 4.0.0 + + org.uiuc + ctest-mapper + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + org.apache.maven.shared + maven-invoker + 3.2.0 + + + com.google.code.gson + gson + 2.9.1 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.13.4 + + + + + + + maven-assembly-plugin + + + + org.uiuc.Main + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/core/identify_param/skywalking/src/main/java/org/uiuc/AppConstants.java b/core/identify_param/skywalking/src/main/java/org/uiuc/AppConstants.java new file mode 100644 index 00000000..62b25b85 --- /dev/null +++ b/core/identify_param/skywalking/src/main/java/org/uiuc/AppConstants.java @@ -0,0 +1,52 @@ +package org.uiuc; + +import java.util.Arrays; +import java.util.List; + +public interface AppConstants { + + List testCases = Arrays.asList( + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig", + "oap-server/server-starter>org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig", + "oap-server/server-library/library-module>org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig", + "oap-server/server-configuration/configuration-apollo>org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-apollo>org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-consul>org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-consul>org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-etcd>org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-etcd>org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group", + "oap-server/server-configuration/configuration-zookeeper>org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-zookeeper>org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "oap-server/analyzer/agent-analyzer>org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "oap-server/server-configuration/configuration-nacos>org.apache.skywalking.oap.server.configuration.nacos.NacosConfigWatcherRegisterTest#shouldReadConfigs" + ); + + + String ERROR_MSG = "Error on exec() method"; + + String CTEST_MODULE = "[CTEST][getModuleConfiguration]"; + String CTEST_PROVIDER = "[CTEST][getProviderConfiguration]"; + + String CTEST_PROPERTY_WRAPPER = "[CTEST][PropertiesWrapper]"; + + String CTEST_PROPERTY_RESET_WRAPPER = "[CTEST][PropertiesWrapper -reset]"; + + String CTEST_SUB_PROPERTY_WRAPPER = "[CTEST][SubPropertiesWrapper]"; + + String CTEST_SUB_PROPERTY_RESET_WRAPPER = "[CTEST][SubPropertiesWrapper -reset]"; + + String CTEST_SETTINGS_MAP = "[CTest SETTINGS MAP]"; + String SEPARATOR = "###"; + String SEPARATOR_ASTERISK = "***"; +} diff --git a/core/identify_param/skywalking/src/main/java/org/uiuc/Main.java b/core/identify_param/skywalking/src/main/java/org/uiuc/Main.java new file mode 100644 index 00000000..bc9e9b2a --- /dev/null +++ b/core/identify_param/skywalking/src/main/java/org/uiuc/Main.java @@ -0,0 +1,325 @@ +package org.uiuc; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.gson.Gson; + +import java.io.BufferedReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ValueNode; + +import java.util.Iterator; + + +import static org.uiuc.AppConstants.*; +import static org.uiuc.UtilHelper.copy; + +public class Main { + + static Map map = new LinkedHashMap<>(); + + public static void main(String[] args) throws IOException, InterruptedException { + + String destDir = args[0]; + + int initialIndex = 0; + processMvnTest(initialIndex); + + Gson gson = new Gson(); + String json = gson.toJson(map); + System.out.println(json); + + FileWriter writer3 = new FileWriter(destDir + "/test-to-config.txt"); + writer3.write(json); + writer3.close(); + + Map map = new HashMap<>(); + try { + addKeys("", new ObjectMapper().readTree(json), map); + } catch (IOException e) { + e.printStackTrace(); + } + + Map> testToConfigList = new LinkedHashMap<>(); + map.forEach((k,v) -> { + String[] strArr = k.split("#"); + String str = strArr[1]; + String testCase = strArr[0] + "#" + str.substring(0, str.indexOf(".")); + String confStr = strArr[1]; + String config = confStr.substring(confStr.indexOf(".") + 1); + if(!testToConfigList.containsKey(testCase)) { + List confList = new ArrayList<>(); + confList.add(config); + testToConfigList.put(testCase, confList); + } else { + testToConfigList.get(testCase).add(config); + } + }); + + String jsonTestToConfigList = gson.toJson(testToConfigList); + System.out.println(jsonTestToConfigList); + FileWriter writer1 = new FileWriter(destDir + "/test-to-config-flat.txt"); + writer1.write(jsonTestToConfigList); + writer1.close(); + + Set set = new HashSet<>(); + map.forEach((k,v) -> { + String str = k.split("#")[1]; + set.add(str.substring(str.indexOf(".") + 1) + "\t" + v + "\t" + "description"); + }); + + FileWriter writer2 = new FileWriter(destDir + "/all-config.txt"); + for(String str: set) { + writer2.write(str + System.lineSeparator()); + } + writer2.close(); + } + + private static void processMvnTest(int index) throws IOException, InterruptedException { + + if (index == testCases.size()) { + return; + } + + Process p = null; + System.out.println(map); + String test = testCases.get(index); + String[] split = test.split(">"); + String module = split[0]; + String testCase = split[1]; + System.out.println("Module: " + module + " Test Case: " + testCase); + try { + p = Runtime.getRuntime().exec("mvn test -pl " + module + " -Dtest=" + testCase + " -DfailIfNoTests=false"); + } catch (IOException e) { + System.err.println(ERROR_MSG); + e.printStackTrace(); + } + OutputStream output = new OutputStream() { + private final StringBuilder string = new StringBuilder(); + + @Override + public void write(int b) { + this.string.append((char) b); + } + + public String toString() { + return this.string.toString(); + } + }; + + copy(p.getInputStream(), output); + System.out.println(output); + BufferedReader bufReader = new BufferedReader(new StringReader(output.toString())); + String prev = bufReader.readLine(); + String next = bufReader.readLine(); + StringBuilder storeModule = new StringBuilder(); + StringBuilder storeProvider = new StringBuilder(); + StringBuilder storeProperty = new StringBuilder(); + Map configMap = new LinkedHashMap<>(); + + while (next != null) { + if (prev.contains(CTEST_MODULE) && next.contains(CTEST_PROVIDER)) { + storeModule = new StringBuilder(prev); + storeProvider = new StringBuilder(next); + } + if (next.contains(CTEST_PROPERTY_WRAPPER)) { + storeProperty = new StringBuilder(next); + processMapping(testCase, configMap, storeModule.toString(), storeProvider.toString(), next, null, null, + null); + } + if (next.contains(CTEST_SUB_PROPERTY_WRAPPER)) { + processMapping(testCase, configMap, storeModule.toString(), storeProvider.toString(), + storeProperty.toString(), next, null, null); + } + if (next.contains(CTEST_PROPERTY_RESET_WRAPPER)) { + processMapping(testCase, configMap, storeModule.toString(), storeProvider.toString(), null, null, next, + null); + } + if (next.contains(CTEST_SUB_PROPERTY_RESET_WRAPPER)) { + processMapping(testCase, configMap, storeModule.toString(), storeProvider.toString(), + storeProperty.toString(), next, null, next); + } + if (next.contains(CTEST_SETTINGS_MAP)) { + processSettingsMap(testCase, next); + } + prev = next; + next = bufReader.readLine(); + } + if (!map.containsKey(testCase)) { + map.put(testCase, new HashMap<>()); + } + index = index + 1; + processMvnTest(index); + p.waitFor(); + } + + private static void processMapping(String test, Map configMap, String module, String provider, + String propKey, String subPropKey, String resetProp, String resetSubProp) { + + String moduleExtracted = (module == null || module.isEmpty()) ? null + : module.substring(module.indexOf(SEPARATOR) + 3, module.lastIndexOf(SEPARATOR)); + + String providerExtracted = (provider == null || provider.isEmpty()) ? null + : provider.substring(provider.indexOf(SEPARATOR) + 3, provider.lastIndexOf(SEPARATOR)); + + String propKeyExtracted = (propKey == null || propKey.isEmpty()) ? null + : propKey.substring(propKey.indexOf(SEPARATOR) + 3, propKey.lastIndexOf(SEPARATOR)); + + String subPropKeyExtracted = (subPropKey == null || subPropKey.isEmpty()) ? null + : subPropKey.substring(subPropKey.indexOf(SEPARATOR) + 3, subPropKey.lastIndexOf(SEPARATOR)); + + String resetPropKey = (resetProp == null || resetProp.isEmpty()) ? null + : resetProp.substring(resetProp.indexOf(SEPARATOR) + 3, resetProp.lastIndexOf(SEPARATOR)); + + String resetPropValue = (resetProp == null || resetProp.isEmpty()) ? null + : resetProp.substring(resetProp.indexOf(SEPARATOR_ASTERISK) + 3, + resetProp.lastIndexOf(SEPARATOR_ASTERISK)); + + if (moduleExtracted == null && providerExtracted == null) { + return; + } + + if (resetProp != null && map.containsKey(test) && module != null && ((Map) map.get(test)).containsKey(module) + && provider != null && ((Map) ((Map) map.get(test)).get(module)).containsKey(provider) && ((Map) ((Map) ((Map) map.get(test)).get(module)) + .get(provider)).containsKey(resetPropKey)) { + ((Map) ((Map) ((Map) map.get(test)).get(module)).get(provider)).put(resetPropKey, resetPropValue); + return; + } + + String resetSubPropKey = (resetSubProp == null || resetSubProp.isEmpty()) ? null + : resetSubProp.substring(resetProp.indexOf(SEPARATOR) + 3, resetSubProp.lastIndexOf(SEPARATOR)); + String resetSubPropValue = (resetSubProp == null || resetSubProp.isEmpty()) ? null + : resetSubProp.substring(resetProp.indexOf(SEPARATOR_ASTERISK) + 3, + resetSubProp.lastIndexOf(SEPARATOR_ASTERISK)); + + if (resetSubPropKey != null && map.containsKey(test) && module != null && ((Map) map.get(test)).containsKey(module) + && provider != null && ((Map) ((Map) map.get(test)).get(module)).containsKey(provider) && ((Map) ((Map) ((Map) map.get(test)).get(module)) + .get(provider)).containsKey(resetSubPropKey)) { + ((Map) ((Map) ((Map) ((Map) map.get(test)).get(module)).get(provider)).get("properties")).put(resetSubPropKey, resetSubPropValue); + return; + } + + String configStr = provider.substring(provider.indexOf("{") + 1, provider.lastIndexOf("}")); + + if (configStr.contains("properties={") && propKeyExtracted.equals("properties") + && subPropKeyExtracted != null) { + String propertiesStr = configStr.substring(configStr.indexOf("{") + 1, configStr.indexOf("}")); + configStr = configStr.replace(propertiesStr, "").replace("properties={}", ""); + String[] innerProp = propertiesStr.split(", "); + Map propMap = new LinkedHashMap<>(); + for (String s : innerProp) { + String[] eachProp = s.split("="); + if (subPropKeyExtracted.equals(eachProp[0])) { + propMap.put(eachProp[0], eachProp[1]); + } + } + if (propMap.size() > 0) { + configMap.put("properties", propMap); + } + } + + if (configStr.contains("downsampling=") && propKeyExtracted.equals("downsampling")) { + String arrayStr = configStr.substring(configStr.indexOf("["), configStr.indexOf("]") + 1); + configStr = configStr.replace(arrayStr, "").replace("downsampling=,", ""); + configMap.put("downsampling", arrayStr); + } + + String[] parts = configStr.split(", "); + + for (String part : parts) { + String[] eachConfig = part.split("="); + if (eachConfig.length == 1 && propKeyExtracted.equals(eachConfig[0])) { + configMap.put(eachConfig[0], ""); + } else { + if (propKeyExtracted.equals(eachConfig[0])) { + configMap.put(eachConfig[0], eachConfig[1]); + } + } + } + + Map> providerMap = new LinkedHashMap<>(); + providerMap.put(providerExtracted, configMap); + Map>> moduleMap = new LinkedHashMap<>(); + moduleMap.put(moduleExtracted, providerMap); + map.put(test, moduleMap); + } + + private static void processSettingsMap(String test, String config) { + Map configs = new HashMap<>(); + String extractedInitial = config.substring(config.indexOf("("), config.lastIndexOf(")")); + String defaultPolicy = extractedInitial.substring(extractedInitial.indexOf("defaultPolicy=SamplingPolicy(") + 29, extractedInitial.indexOf("),")); + String[] defaultPolicyArr = defaultPolicy.split(", "); + Map defaultPolicyMap = new HashMap<>(); + for (String s : defaultPolicyArr) { + String[] split = s.split("="); + defaultPolicyMap.put(split[0], split[1]); + } + configs.put("default", defaultPolicyMap); + String services = extractedInitial.substring(extractedInitial.indexOf("services={") + 10, extractedInitial.indexOf("}")); + + List matchList = new ArrayList<>(); + Pattern regex = Pattern.compile("\\(([^()]*)\\)"); + Matcher regexMatcher = regex.matcher(services); + while (regexMatcher.find()) { + matchList.add(regexMatcher.group(1)); + } + + List orderedServiceList = new ArrayList<>(); + String[] serviceNames = services.replaceAll("\\s*\\([^\\)]*\\)\\s*", " ").split(" , "); + for (String str : serviceNames) { + orderedServiceList.add(str.split("=")[0]); + } + + List serviceList = new ArrayList<>(); + for (int i = 0; i < matchList.size(); i++) { + Map servicesMap = new HashMap<>(); + servicesMap.put("name", ""); + String[] split = matchList.get(i).split(", "); + servicesMap.put("name", orderedServiceList.get(i)); + for (String s : split) { + String[] internalSplit = s.split("="); + servicesMap.put(internalSplit[0], internalSplit[1]); + } + serviceList.add(servicesMap); + } + + configs.put("services", serviceList); + map.put(test, configs); + } + + private static void addKeys(String currentPath, JsonNode jsonNode, Map map) { + if (jsonNode.isObject()) { + ObjectNode objectNode = (ObjectNode) jsonNode; + Iterator> iter = objectNode.fields(); + String pathPrefix = currentPath.isEmpty() ? "" : currentPath + "."; + + while (iter.hasNext()) { + Map.Entry entry = iter.next(); + addKeys(pathPrefix + entry.getKey(), entry.getValue(), map); + } + } else if (jsonNode.isArray()) { + ArrayNode arrayNode = (ArrayNode) jsonNode; + for (int i = 0; i < arrayNode.size(); i++) { + addKeys(currentPath + "[" + i + "]", arrayNode.get(i), map); + } + } else if (jsonNode.isValueNode()) { + ValueNode valueNode = (ValueNode) jsonNode; + map.put(currentPath, valueNode.asText()); + } + } + +} \ No newline at end of file diff --git a/core/identify_param/skywalking/src/main/java/org/uiuc/UtilHelper.java b/core/identify_param/skywalking/src/main/java/org/uiuc/UtilHelper.java new file mode 100644 index 00000000..c1582772 --- /dev/null +++ b/core/identify_param/skywalking/src/main/java/org/uiuc/UtilHelper.java @@ -0,0 +1,17 @@ +package org.uiuc; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class UtilHelper { + + public static void copy(InputStream in, OutputStream out) throws IOException { + while (true) { + int c = in.read(); + if (c == -1) + break; + out.write((char) c); + } + } +} diff --git a/core/patch/skywalking/interception.patch b/core/patch/skywalking/interception.patch new file mode 100644 index 00000000..3f193697 --- /dev/null +++ b/core/patch/skywalking/interception.patch @@ -0,0 +1,762 @@ +diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/TraceSamplingPolicyWatcher.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/TraceSamplingPolicyWatcher.java +index a22d7ab..04036eb 100644 +--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/TraceSamplingPolicyWatcher.java ++++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/TraceSamplingPolicyWatcher.java +@@ -43,6 +43,7 @@ public class TraceSamplingPolicyWatcher extends ConfigChangeWatcher { + public TraceSamplingPolicyWatcher(AnalyzerModuleConfig moduleConfig, ModuleProvider provider) { + super(AnalyzerModule.NAME, provider, "traceSamplingPolicy"); + this.defaultSamplingPolicySettings = parseFromFile(moduleConfig.getTraceSamplingPolicySettingsFile()); ++ log.info("[CTest SETTINGS MAP] " + defaultSamplingPolicySettings); + loadDefaultPolicySettings(); + } + +diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java +index 5009ed5..aa1e293 100644 +--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java ++++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java +@@ -28,6 +28,7 @@ public class SamplingPolicySettings { + + @Getter + private SamplingPolicy defaultPolicy; ++ @Getter + private Map services; + + /** +diff --git a/oap-server/analyzer/agent-analyzer/src/main/resources/trace-sampling-policy-settings2.yml b/oap-server/analyzer/agent-analyzer/src/main/resources/trace-sampling-policy-settings2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/analyzer/agent-analyzer/src/test/resources/log4j2.xml b/oap-server/analyzer/agent-analyzer/src/test/resources/log4j2.xml +new file mode 100644 +index 0000000..55a6aef +--- /dev/null ++++ b/oap-server/analyzer/agent-analyzer/src/test/resources/log4j2.xml +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java b/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java +index 6bb3de3..b4f2da9 100644 +--- a/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java +@@ -23,6 +23,7 @@ import java.io.FileNotFoundException; + import java.io.IOException; + import java.io.Reader; + import java.time.Duration; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import java.util.concurrent.TimeUnit; +@@ -208,7 +209,10 @@ public class ITApolloConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -216,7 +220,7 @@ public class ITApolloConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -231,6 +235,30 @@ public class ITApolloConfigurationTest { + } + } + ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } ++ + //for retry + private String httpExec(HttpUriRequest request, ResponseHandler responseHandler) { + try { +diff --git a/oap-server/server-configuration/configuration-apollo/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-apollo/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java b/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java +index f69dd64..a211038 100644 +--- a/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java +@@ -21,8 +21,10 @@ package org.apache.skywalking.oap.server.configuration.consul; + import com.google.common.net.HostAndPort; + import com.orbitz.consul.Consul; + import com.orbitz.consul.KeyValueClient; ++import lombok.extern.slf4j.Slf4j; + import java.io.FileNotFoundException; + import java.io.Reader; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import org.apache.skywalking.oap.server.library.util.PropertyPlaceholderHelper; +@@ -43,6 +45,7 @@ import static org.junit.Assert.assertNotNull; + import static org.junit.Assert.assertNull; + import static org.junit.Assert.assertTrue; + ++@Slf4j + public class ITConsulConfigurationTest { + private final Yaml yaml = new Yaml(); + +@@ -134,7 +137,10 @@ public class ITConsulConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -142,7 +148,7 @@ public class ITConsulConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -156,4 +162,28 @@ public class ITConsulConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-consul/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-consul/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-consul/src/test/resources/log4j2.xml b/oap-server/server-configuration/configuration-consul/src/test/resources/log4j2.xml +new file mode 100644 +index 0000000..f23f14f +--- /dev/null ++++ b/oap-server/server-configuration/configuration-consul/src/test/resources/log4j2.xml +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java b/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java +index 8a6c0d0..d6ece1b 100644 +--- a/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java +@@ -25,6 +25,7 @@ import java.io.FileNotFoundException; + import java.io.Reader; + import java.nio.charset.Charset; + import java.util.Collections; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import java.util.concurrent.TimeUnit; +@@ -163,7 +164,10 @@ public class ITEtcdConfigurationTest { + final Yaml yaml = new Yaml(); + + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -172,7 +176,7 @@ public class ITEtcdConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load( + PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); +@@ -187,4 +191,28 @@ public class ITEtcdConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-etcd/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-etcd/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java b/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java +index cca5dad..4802c96 100644 +--- a/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java +@@ -24,6 +24,7 @@ import com.alibaba.nacos.api.exception.NacosException; + import java.io.FileNotFoundException; + import java.io.Reader; + import java.util.Collections; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import lombok.extern.slf4j.Slf4j; +@@ -147,7 +148,10 @@ public class ITNacosConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -155,7 +159,7 @@ public class ITNacosConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -169,4 +173,28 @@ public class ITNacosConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-nacos/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-nacos/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-nacos/src/test/resources/log4j2.xml b/oap-server/server-configuration/configuration-nacos/src/test/resources/log4j2.xml +new file mode 100644 +index 0000000..a46d185 +--- /dev/null ++++ b/oap-server/server-configuration/configuration-nacos/src/test/resources/log4j2.xml +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java b/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java +index 6c76f8b..408b559 100644 +--- a/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java +@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.configuration.zookeeper.it; + + import java.io.FileNotFoundException; + import java.io.Reader; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import lombok.extern.slf4j.Slf4j; +@@ -139,7 +140,10 @@ public class ITZookeeperConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -147,7 +151,7 @@ public class ITZookeeperConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -161,4 +165,28 @@ public class ITZookeeperConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-zookeeper/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-zookeeper/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java +index f4f0586..4fc02f7 100644 +--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java ++++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java +@@ -20,10 +20,12 @@ package org.apache.skywalking.oap.server.library.module; + + import java.util.HashMap; + import java.util.Properties; ++import lombok.extern.slf4j.Slf4j; + + /** + * Modulization configurations. The {@link ModuleManager} is going to start, lookup, start modules based on this. + */ ++@Slf4j + public class ApplicationConfiguration { + private HashMap modules = new HashMap<>(); + +@@ -32,6 +34,7 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration addModule(String moduleName) { ++ log.warn("[CTEST][getModuleConfiguration] ###" + moduleName + "###" + getStackTrace()); + ModuleConfiguration newModule = new ModuleConfiguration(); + modules.put(moduleName, newModule); + return newModule; +@@ -42,19 +45,30 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration getModuleConfiguration(String name) { ++ log.warn("[CTEST][getModuleConfiguration] ###" + name + "###" + getStackTrace()); + return modules.get(name); + } + ++ private static String getStackTrace() { ++ String stacktrace = " "; ++ for (StackTraceElement element : Thread.currentThread().getStackTrace()) { ++ stacktrace = stacktrace.concat(element.getClassName() + "\t"); ++ } ++ return stacktrace; ++ } ++ + /** + * The configurations about a certain module. + */ ++ @Slf4j + public static class ModuleConfiguration { + private HashMap providers = new HashMap<>(); + + private ModuleConfiguration() { + } + +- public Properties getProviderConfiguration(String name) { ++ public PropertiesWrapper getProviderConfiguration(String name) { ++ log.warn("[CTEST][getProviderConfiguration] ###" + name + "### providers " + providers.get(name).getProperties() + getStackTrace()); + return providers.get(name).getProperties(); + } + +@@ -63,24 +77,72 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration addProviderConfiguration(String name, Properties properties) { ++ log.warn("[CTEST][getProviderConfiguration] ###" + name + "### providers " + properties + getStackTrace()); + ProviderConfiguration newProvider = new ProviderConfiguration(properties); + providers.put(name, newProvider); + return this; + } + } + ++ @Slf4j ++ public static class PropertiesWrapper extends Properties { ++ @Override ++ public synchronized Object get(Object key) { ++ log.info("[CTEST][PropertiesWrapper] ###" + key + "### test"); ++ return super.get(key); ++ } ++ ++ @Override ++ public String getProperty(String key) { ++ log.info("[CTEST][PropertiesWrapper] ###" + key + "###"); ++ return super.getProperty(key); ++ } ++ ++ @Override ++ public synchronized java.lang.Object put(java.lang.Object key, java.lang.Object value) { ++ log.info("[CTEST][PropertiesWrapper-reset] ###" + key + "### " + "***" + value + "***"); ++ return super.put(key, value); ++ } ++ } ++ ++ @Slf4j ++ public static class SubPropertiesWrapper extends Properties { ++ @Override ++ public synchronized Object get(Object key) { ++ log.info("[CTEST][SubPropertiesWrapper] ###" + key + "### test"); ++ return super.get(key); ++ } ++ ++ @Override ++ public String getProperty(String key) { ++ log.info("[CTEST][SubPropertiesWrapper] ###" + key + "###"); ++ return super.getProperty(key); ++ } ++ ++ @Override ++ public synchronized java.lang.Object put(java.lang.Object key, java.lang.Object value) { ++ log.info("[CTEST][SubPropertiesWrapper-reset] ###" + key + "### " + "***" + value + "***"); ++ return super.put(key, value); ++ } ++ } ++ + /** + * The configuration about a certain provider of a module. + */ ++ @Slf4j + public static class ProviderConfiguration { +- private Properties properties; ++ private PropertiesWrapper propertiesWrapper; + + ProviderConfiguration(Properties properties) { +- this.properties = properties; ++ PropertiesWrapper wrapper = new PropertiesWrapper(); ++ properties.forEach((k, v) -> { ++ wrapper.put(k, v); ++ }); ++ this.propertiesWrapper = wrapper; + } + +- private Properties getProperties() { +- return properties; ++ private PropertiesWrapper getProperties() { ++ return propertiesWrapper; + } + } + } +diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java +index ad04576..453ebc5 100644 +--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java ++++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java +@@ -20,14 +20,16 @@ package org.apache.skywalking.oap.server.library.module; + + import java.lang.reflect.Field; + import java.util.Enumeration; +-import java.util.Properties; ++import lombok.extern.slf4j.Slf4j; + import java.util.ServiceLoader; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.PropertiesWrapper; + + /** + * A module definition. + */ ++@Slf4j + public abstract class ModuleDefine implements ModuleProviderHolder { + + private static final Logger LOGGER = LoggerFactory.getLogger(ModuleDefine.class); +@@ -96,8 +98,8 @@ public abstract class ModuleDefine implements ModuleProviderHolder { + loadedProvider.prepare(); + } + +- private void copyProperties(ModuleConfig dest, Properties src, String moduleName, +- String providerName) throws IllegalAccessException { ++ private void copyProperties(ModuleConfig dest, PropertiesWrapper src, String moduleName, ++ String providerName) throws IllegalAccessException { + if (dest == null) { + return; + } +diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java +index 3bccd30..0e86f74 100644 +--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java ++++ b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java +@@ -21,12 +21,15 @@ package org.apache.skywalking.oap.server.starter.config; + import java.io.FileNotFoundException; + import java.io.Reader; + import java.util.ArrayList; ++import java.util.List; + import java.util.Iterator; + import java.util.Map; + import java.util.Properties; + import lombok.extern.slf4j.Slf4j; + import org.apache.skywalking.oap.server.library.util.PropertyPlaceholderHelper; + import org.apache.skywalking.oap.server.library.module.ApplicationConfiguration; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.PropertiesWrapper; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.SubPropertiesWrapper; + import org.apache.skywalking.oap.server.library.module.ProviderNotFoundException; + import org.apache.skywalking.oap.server.library.util.CollectionUtils; + import org.apache.skywalking.oap.server.library.util.ResourceUtils; +@@ -80,7 +83,11 @@ public class ApplicationConfigLoader implements ConfigLoader { ++ subPropertiesWrapper.put(k, v); ++ }); ++ properties.put(propertyName, subPropertiesWrapper); + } else { + properties.put(propertyName, propertyValue); + replacePropertyAndLog(propertyName, propertyValue, properties, providerName); +@@ -200,7 +207,7 @@ public class ApplicationConfigLoader implements ConfigLoader modules = new HashMap<>(); + +@@ -32,6 +34,7 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration addModule(String moduleName) { ++ log.warn("[CTEST][getModuleConfiguration] ###" + moduleName + "###" + getStackTrace()); + ModuleConfiguration newModule = new ModuleConfiguration(); + modules.put(moduleName, newModule); + return newModule; +@@ -42,19 +45,30 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration getModuleConfiguration(String name) { ++ log.warn("[CTEST][getModuleConfiguration] ###" + name + "###" + getStackTrace()); + return modules.get(name); + } + ++ private static String getStackTrace() { ++ String stacktrace = " "; ++ for (StackTraceElement element : Thread.currentThread().getStackTrace()) { ++ stacktrace = stacktrace.concat(element.getClassName() + "\t"); ++ } ++ return stacktrace; ++ } ++ + /** + * The configurations about a certain module. + */ ++ @Slf4j + public static class ModuleConfiguration { + private HashMap providers = new HashMap<>(); + + private ModuleConfiguration() { + } + +- public Properties getProviderConfiguration(String name) { ++ public PropertiesWrapper getProviderConfiguration(String name) { ++ log.warn("[CTEST][getProviderConfiguration] ###" + name + "### providers " + providers.get(name).getProperties() + getStackTrace()); + return providers.get(name).getProperties(); + } + +@@ -63,24 +77,72 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration addProviderConfiguration(String name, Properties properties) { ++ log.warn("[CTEST][getProviderConfiguration] ###" + name + "### providers " + properties + getStackTrace()); + ProviderConfiguration newProvider = new ProviderConfiguration(properties); + providers.put(name, newProvider); + return this; + } + } + ++ @Slf4j ++ public static class PropertiesWrapper extends Properties { ++ @Override ++ public synchronized Object get(Object key) { ++ log.info("[CTEST][PropertiesWrapper] ###" + key + "### test"); ++ return super.get(key); ++ } ++ ++ @Override ++ public String getProperty(String key) { ++ log.info("[CTEST][PropertiesWrapper] ###" + key + "###"); ++ return super.getProperty(key); ++ } ++ ++ @Override ++ public synchronized java.lang.Object put(java.lang.Object key, java.lang.Object value) { ++ log.info("[CTEST][PropertiesWrapper-reset] ###" + key + "### " + "***" + value + "***"); ++ return super.put(key, value); ++ } ++ } ++ ++ @Slf4j ++ public static class SubPropertiesWrapper extends Properties { ++ @Override ++ public synchronized Object get(Object key) { ++ log.info("[CTEST][SubPropertiesWrapper] ###" + key + "### test"); ++ return super.get(key); ++ } ++ ++ @Override ++ public String getProperty(String key) { ++ log.info("[CTEST][SubPropertiesWrapper] ###" + key + "###"); ++ return super.getProperty(key); ++ } ++ ++ @Override ++ public synchronized java.lang.Object put(java.lang.Object key, java.lang.Object value) { ++ log.info("[CTEST][SubPropertiesWrapper-reset] ###" + key + "### " + "***" + value + "***"); ++ return super.put(key, value); ++ } ++ } ++ + /** + * The configuration about a certain provider of a module. + */ ++ @Slf4j + public static class ProviderConfiguration { +- private Properties properties; ++ private PropertiesWrapper propertiesWrapper; + + ProviderConfiguration(Properties properties) { +- this.properties = properties; ++ PropertiesWrapper wrapper = new PropertiesWrapper(); ++ properties.forEach((k, v) -> { ++ wrapper.put(k, v); ++ }); ++ this.propertiesWrapper = wrapper; + } + +- private Properties getProperties() { +- return properties; ++ private PropertiesWrapper getProperties() { ++ return propertiesWrapper; + } + } + } +diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java +index ad04576..453ebc5 100644 +--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java ++++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java +@@ -20,14 +20,16 @@ package org.apache.skywalking.oap.server.library.module; + + import java.lang.reflect.Field; + import java.util.Enumeration; +-import java.util.Properties; ++import lombok.extern.slf4j.Slf4j; + import java.util.ServiceLoader; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.PropertiesWrapper; + + /** + * A module definition. + */ ++@Slf4j + public abstract class ModuleDefine implements ModuleProviderHolder { + + private static final Logger LOGGER = LoggerFactory.getLogger(ModuleDefine.class); +@@ -96,8 +98,8 @@ public abstract class ModuleDefine implements ModuleProviderHolder { + loadedProvider.prepare(); + } + +- private void copyProperties(ModuleConfig dest, Properties src, String moduleName, +- String providerName) throws IllegalAccessException { ++ private void copyProperties(ModuleConfig dest, PropertiesWrapper src, String moduleName, ++ String providerName) throws IllegalAccessException { + if (dest == null) { + return; + } +diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java +index 3bccd30..0e86f74 100644 +--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java ++++ b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java +@@ -21,12 +21,15 @@ package org.apache.skywalking.oap.server.starter.config; + import java.io.FileNotFoundException; + import java.io.Reader; + import java.util.ArrayList; ++import java.util.List; + import java.util.Iterator; + import java.util.Map; + import java.util.Properties; + import lombok.extern.slf4j.Slf4j; + import org.apache.skywalking.oap.server.library.util.PropertyPlaceholderHelper; + import org.apache.skywalking.oap.server.library.module.ApplicationConfiguration; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.PropertiesWrapper; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.SubPropertiesWrapper; + import org.apache.skywalking.oap.server.library.module.ProviderNotFoundException; + import org.apache.skywalking.oap.server.library.util.CollectionUtils; + import org.apache.skywalking.oap.server.library.util.ResourceUtils; +@@ -80,7 +83,11 @@ public class ApplicationConfigLoader implements ConfigLoader { ++ subPropertiesWrapper.put(k, v); ++ }); ++ properties.put(propertyName, subPropertiesWrapper); + } else { + properties.put(propertyName, propertyValue); + replacePropertyAndLog(propertyName, propertyValue, properties, providerName); +@@ -200,7 +207,7 @@ public class ApplicationConfigLoader implements ConfigLoader { ++ if (overrides.get(k).getDuration() != null) { ++ this.defaultSamplingPolicySettings.get(k).setDuration(overrides.get(k).getDuration()); ++ } ++ if (overrides.get(k).getRate() != null) { ++ this.defaultSamplingPolicySettings.get(k).setRate(overrides.get(k).getRate()); ++ } ++ }); ++ } ++ } ++ + @Override + public void notify(ConfigChangeEvent value) { + if (EventType.DELETE.equals(value.getEventType()) || StringUtil.isBlank(value.getNewValue())) { +@@ -106,10 +132,10 @@ public class TraceSamplingPolicyWatcher extends ConfigChangeWatcher { + */ + private boolean shouldSampleService(SamplingPolicy samplingPolicy, int sample, int duration) { + return (samplingPolicy.getDuration() != null && isOverSlowThreshold(duration, samplingPolicy.getDuration())) +- || (samplingPolicy.getRate() != null && withinRateRange(sample, samplingPolicy.getRate())) +- // global policy +- || (samplingPolicy.getDuration() == null && isOverDefaultSlowThreshold(duration)) +- || (samplingPolicy.getRate() == null && withinDefaultRateRange(sample)); ++ || (samplingPolicy.getRate() != null && withinRateRange(sample, samplingPolicy.getRate())) ++ // global policy ++ || (samplingPolicy.getDuration() == null && isOverDefaultSlowThreshold(duration)) ++ || (samplingPolicy.getRate() == null && withinDefaultRateRange(sample)); + } + + private boolean withinDefaultRateRange(int sample) { +@@ -146,7 +172,7 @@ public class TraceSamplingPolicyWatcher extends ConfigChangeWatcher { + log.info("[trace-sampling-policy] Updating trace-sample-policy with: {}", samplingPolicySettings); + } else { + log.info( +- "[trace-sampling-policy] Parse yaml fail, retain last configuration: {}", this.samplingPolicySettings); ++ "[trace-sampling-policy] Parse yaml fail, retain last configuration: {}", this.samplingPolicySettings); + } + } + +diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java +index 5009ed5..aa1e293 100644 +--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java ++++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/sampling/SamplingPolicySettings.java +@@ -28,6 +28,7 @@ public class SamplingPolicySettings { + + @Getter + private SamplingPolicy defaultPolicy; ++ @Getter + private Map services; + + /** +diff --git a/oap-server/analyzer/agent-analyzer/src/main/resources/trace-sampling-policy-settings2.yml b/oap-server/analyzer/agent-analyzer/src/main/resources/trace-sampling-policy-settings2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/analyzer/agent-analyzer/src/test/resources/log4j2.xml b/oap-server/analyzer/agent-analyzer/src/test/resources/log4j2.xml +new file mode 100644 +index 0000000..55a6aef +--- /dev/null ++++ b/oap-server/analyzer/agent-analyzer/src/test/resources/log4j2.xml +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java b/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java +index 6bb3de3..73aa586 100644 +--- a/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-apollo/src/test/java/org/apache/skywalking/oap/server/configuration/apollo/ITApolloConfigurationTest.java +@@ -23,6 +23,7 @@ import java.io.FileNotFoundException; + import java.io.IOException; + import java.io.Reader; + import java.time.Duration; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import java.util.concurrent.TimeUnit; +@@ -63,15 +64,15 @@ public class ITApolloConfigurationTest { + + @ClassRule + public final static DockerComposeContainer ENVIRONMENT = +- new DockerComposeContainer<>(new File(ITApolloConfigurationTest.class +- .getClassLoader() +- .getResource("docker/docker-compose.yaml").getPath())) +- .withExposedService("apollo-config-and-portal", 8080, +- Wait.forLogMessage(".*Config service started.*", 1)) +- .withExposedService("apollo-config-and-portal", 8070, +- Wait.forLogMessage(".*Portal started. You can visit.*", 1) ++ new DockerComposeContainer<>(new File(ITApolloConfigurationTest.class ++ .getClassLoader() ++ .getResource("docker/docker-compose.yaml").getPath())) ++ .withExposedService("apollo-config-and-portal", 8080, ++ Wait.forLogMessage(".*Config service started.*", 1)) ++ .withExposedService("apollo-config-and-portal", 8070, ++ Wait.forLogMessage(".*Portal started. You can visit.*", 1) + .withStartupTimeout(Duration.ofSeconds(100)) +- ); ++ ); + + @Before + public void setUp() throws Exception { +@@ -208,7 +209,10 @@ public class ITApolloConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -216,7 +220,7 @@ public class ITApolloConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -231,6 +235,30 @@ public class ITApolloConfigurationTest { + } + } + ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } ++ + //for retry + private String httpExec(HttpUriRequest request, ResponseHandler responseHandler) { + try { +diff --git a/oap-server/server-configuration/configuration-apollo/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-apollo/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java b/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java +index f69dd64..13f8605 100644 +--- a/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-consul/src/test/java/org/apache/skywalking/oap/server/configuration/consul/ITConsulConfigurationTest.java +@@ -21,8 +21,10 @@ package org.apache.skywalking.oap.server.configuration.consul; + import com.google.common.net.HostAndPort; + import com.orbitz.consul.Consul; + import com.orbitz.consul.KeyValueClient; ++import lombok.extern.slf4j.Slf4j; + import java.io.FileNotFoundException; + import java.io.Reader; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import org.apache.skywalking.oap.server.library.util.PropertyPlaceholderHelper; +@@ -43,6 +45,7 @@ import static org.junit.Assert.assertNotNull; + import static org.junit.Assert.assertNull; + import static org.junit.Assert.assertTrue; + ++@Slf4j + public class ITConsulConfigurationTest { + private final Yaml yaml = new Yaml(); + +@@ -50,9 +53,9 @@ public class ITConsulConfigurationTest { + + @Rule + public final GenericContainer container = +- new GenericContainer<>(DockerImageName.parse("consul:0.9")) +- .waitingFor(Wait.forLogMessage(".*Synced node info.*", 1)) +- .withCommand("agent", "-server", "-bootstrap-expect=1", "-client=0.0.0.0"); ++ new GenericContainer<>(DockerImageName.parse("consul:0.9")) ++ .waitingFor(Wait.forLogMessage(".*Synced node info.*", 1)) ++ .withCommand("agent", "-server", "-bootstrap-expect=1", "-client=0.0.0.0"); + + @Before + public void setUp() throws Exception { +@@ -74,9 +77,9 @@ public class ITConsulConfigurationTest { + + String hostAndPort = System.getProperty("consul.address", "127.0.0.1:8500"); + Consul consul = Consul.builder() +- .withHostAndPort(HostAndPort.fromString(hostAndPort)) +- .withConnectTimeoutMillis(5000) +- .build(); ++ .withHostAndPort(HostAndPort.fromString(hostAndPort)) ++ .withConnectTimeoutMillis(5000) ++ .build(); + KeyValueClient client = consul.keyValueClient(); + + assertTrue(client.putValue("test-module.default.testKey", "1000")); +@@ -100,9 +103,9 @@ public class ITConsulConfigurationTest { + + String hostAndPort = System.getProperty("consul.address", "127.0.0.1:8500"); + Consul consul = Consul.builder() +- .withHostAndPort(HostAndPort.fromString(hostAndPort)) +- .withConnectTimeoutMillis(5000) +- .build(); ++ .withHostAndPort(HostAndPort.fromString(hostAndPort)) ++ .withConnectTimeoutMillis(5000) ++ .build(); + KeyValueClient client = consul.keyValueClient(); + + assertTrue(client.putValue("test-module.default.testKeyGroup/item1", "100")); +@@ -134,7 +137,10 @@ public class ITConsulConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -142,7 +148,7 @@ public class ITConsulConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -156,4 +162,28 @@ public class ITConsulConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-consul/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-consul/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-consul/src/test/resources/log4j2.xml b/oap-server/server-configuration/configuration-consul/src/test/resources/log4j2.xml +new file mode 100644 +index 0000000..f23f14f +--- /dev/null ++++ b/oap-server/server-configuration/configuration-consul/src/test/resources/log4j2.xml +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java b/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java +index 8a6c0d0..3c5aaea 100644 +--- a/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-etcd/src/test/java/org/apache/skywalking/oap/server/configuration/etcd/ITEtcdConfigurationTest.java +@@ -25,6 +25,7 @@ import java.io.FileNotFoundException; + import java.io.Reader; + import java.nio.charset.Charset; + import java.util.Collections; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import java.util.concurrent.TimeUnit; +@@ -50,14 +51,14 @@ import static org.junit.Assert.assertNull; + public class ITEtcdConfigurationTest { + @Rule + public final GenericContainer container = +- new GenericContainer<>(DockerImageName.parse("quay.io/coreos/etcd:v3.5.0")) +- .waitingFor(Wait.forLogMessage(".*ready to serve client requests.*", 1)) +- .withEnv(Collections.singletonMap("ALLOW_NONE_AUTHENTICATION", "yes")) +- .withCommand( +- "etcd", +- "--advertise-client-urls", "http://0.0.0.0:2379", +- "--listen-client-urls", "http://0.0.0.0:2379" +- ); ++ new GenericContainer<>(DockerImageName.parse("quay.io/coreos/etcd:v3.5.0")) ++ .waitingFor(Wait.forLogMessage(".*ready to serve client requests.*", 1)) ++ .withEnv(Collections.singletonMap("ALLOW_NONE_AUTHENTICATION", "yes")) ++ .withCommand( ++ "etcd", ++ "--advertise-client-urls", "http://0.0.0.0:2379", ++ "--listen-client-urls", "http://0.0.0.0:2379" ++ ); + + private EtcdConfigurationTestProvider provider; + +@@ -81,15 +82,15 @@ public class ITEtcdConfigurationTest { + assertNull(provider.watcher.value()); + + KV client = Client.builder() +- .endpoints("http://localhost:" + container.getMappedPort(2379)) +- .namespace(ByteSequence.from("/skywalking/", Charset.defaultCharset())) +- .build() +- .getKVClient(); ++ .endpoints("http://localhost:" + container.getMappedPort(2379)) ++ .namespace(ByteSequence.from("/skywalking/", Charset.defaultCharset())) ++ .build() ++ .getKVClient(); + + String testValue = "value"; + client.put( +- ByteSequence.from("test-module.default.testKey", Charset.defaultCharset()), +- ByteSequence.from(testValue, Charset.defaultCharset()) ++ ByteSequence.from("test-module.default.testKey", Charset.defaultCharset()), ++ ByteSequence.from(testValue, Charset.defaultCharset()) + ).get(); + + for (String v = provider.watcher.value(); v == null; v = provider.watcher.value()) { +@@ -113,18 +114,18 @@ public class ITEtcdConfigurationTest { + assertEquals("{}", provider.groupWatcher.groupItems().toString()); + + KV client = Client.builder() +- .endpoints("http://localhost:" + container.getMappedPort(2379)) +- .namespace(ByteSequence.from("/skywalking/", Charset.defaultCharset())) +- .build() +- .getKVClient(); ++ .endpoints("http://localhost:" + container.getMappedPort(2379)) ++ .namespace(ByteSequence.from("/skywalking/", Charset.defaultCharset())) ++ .build() ++ .getKVClient(); + + client.put( +- ByteSequence.from("test-module.default.testKeyGroup/item1", Charset.defaultCharset()), +- ByteSequence.from("100", Charset.defaultCharset()) ++ ByteSequence.from("test-module.default.testKeyGroup/item1", Charset.defaultCharset()), ++ ByteSequence.from("100", Charset.defaultCharset()) + ).get(); + client.put( +- ByteSequence.from("test-module.default.testKeyGroup/item2", Charset.defaultCharset()), +- ByteSequence.from("200", Charset.defaultCharset()) ++ ByteSequence.from("test-module.default.testKeyGroup/item2", Charset.defaultCharset()), ++ ByteSequence.from("200", Charset.defaultCharset()) + ).get(); + + for (String v = provider.groupWatcher.groupItems().get("item1"); v == null; v = provider.groupWatcher.groupItems().get("item1")) { +@@ -148,8 +149,8 @@ public class ITEtcdConfigurationTest { + + //test modify item2 + client.put( +- ByteSequence.from("test-module.default.testKeyGroup/item2", Charset.defaultCharset()), +- ByteSequence.from("300", Charset.defaultCharset()) ++ ByteSequence.from("test-module.default.testKeyGroup/item2", Charset.defaultCharset()), ++ ByteSequence.from("300", Charset.defaultCharset()) + ).get(); + for (String v = provider.groupWatcher.groupItems().get("item2"); v.equals("200"); v = provider.groupWatcher.groupItems().get("item2")) { + log.info("value is : {}", provider.groupWatcher.groupItems().get("item2")); +@@ -163,19 +164,22 @@ public class ITEtcdConfigurationTest { + final Yaml yaml = new Yaml(); + + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { + ApplicationConfiguration.ModuleConfiguration moduleConfiguration = configuration.addModule( +- moduleName); ++ moduleName); + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load( +- PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); ++ PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { + properties.replace(key, replaceValue); + } +@@ -187,4 +191,28 @@ public class ITEtcdConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-etcd/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-etcd/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java b/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java +index cca5dad..27bbef4 100644 +--- a/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-nacos/src/test/java/org/apache/skywalking/oap/server/configuration/nacos/ITNacosConfigurationTest.java +@@ -24,6 +24,7 @@ import com.alibaba.nacos.api.exception.NacosException; + import java.io.FileNotFoundException; + import java.io.Reader; + import java.util.Collections; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import lombok.extern.slf4j.Slf4j; +@@ -53,9 +54,9 @@ public class ITNacosConfigurationTest { + + @Rule + public final GenericContainer container = +- new GenericContainer<>(DockerImageName.parse("nacos/nacos-server:1.4.2")) +- .waitingFor(Wait.forLogMessage(".*Nacos started successfully.*", 1)) +- .withEnv(Collections.singletonMap("MODE", "standalone")); ++ new GenericContainer<>(DockerImageName.parse("nacos/nacos-server:1.4.2")) ++ .waitingFor(Wait.forLogMessage(".*Nacos started successfully.*", 1)) ++ .withEnv(Collections.singletonMap("MODE", "standalone")); + + @Before + public void setUp() throws Exception { +@@ -147,7 +148,10 @@ public class ITNacosConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -155,7 +159,7 @@ public class ITNacosConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -169,4 +173,28 @@ public class ITNacosConfigurationTest { + }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-nacos/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-nacos/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-configuration/configuration-nacos/src/test/resources/log4j2.xml b/oap-server/server-configuration/configuration-nacos/src/test/resources/log4j2.xml +new file mode 100644 +index 0000000..a46d185 +--- /dev/null ++++ b/oap-server/server-configuration/configuration-nacos/src/test/resources/log4j2.xml +@@ -0,0 +1,36 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java b/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java +index 6c76f8b..deead76 100644 +--- a/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java ++++ b/oap-server/server-configuration/configuration-zookeeper/src/test/java/org/apache/skywalking/oap/server/configuration/zookeeper/it/ITZookeeperConfigurationTest.java +@@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.configuration.zookeeper.it; + + import java.io.FileNotFoundException; + import java.io.Reader; ++import java.util.List; + import java.util.Map; + import java.util.Properties; + import lombok.extern.slf4j.Slf4j; +@@ -53,8 +54,8 @@ public class ITZookeeperConfigurationTest { + + @Rule + public final GenericContainer container = +- new GenericContainer<>(DockerImageName.parse("zookeeper:3.5")) +- .waitingFor(Wait.forLogMessage(".*binding to port.*", 1)); ++ new GenericContainer<>(DockerImageName.parse("zookeeper:3.5")) ++ .waitingFor(Wait.forLogMessage(".*binding to port.*", 1)); + + private String zkAddress; + +@@ -70,7 +71,7 @@ public class ITZookeeperConfigurationTest { + moduleManager.init(applicationConfiguration); + + provider = (MockZookeeperConfigurationProvider) moduleManager.find(MockZookeeperConfigurationModule.NAME) +- .provider(); ++ .provider(); + + assertNotNull(provider); + } +@@ -139,7 +140,10 @@ public class ITZookeeperConfigurationTest { + @SuppressWarnings("unchecked") + private void loadConfig(ApplicationConfiguration configuration) throws FileNotFoundException { + Reader applicationReader = ResourceUtils.read("application.yml"); +- Map>> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { +@@ -147,7 +151,7 @@ public class ITZookeeperConfigurationTest { + providerConfig.forEach((name, propertiesConfig) -> { + Properties properties = new Properties(); + if (propertiesConfig != null) { +- propertiesConfig.forEach((key, value) -> { ++ ((Map) propertiesConfig).forEach((key, value) -> { + properties.put(key, value); + final Object replaceValue = yaml.load(PropertyPlaceholderHelper.INSTANCE.replacePlaceholders(value + "", properties)); + if (replaceValue != null) { +@@ -158,7 +162,31 @@ public class ITZookeeperConfigurationTest { + moduleConfiguration.addProviderConfiguration(name, properties); + }); + } +- }); ++ }); + } + } ++ ++ private static Map deepMerge(Map original, Map newMap) { ++ if (newMap == null) { ++ return original; ++ } ++ for (Object key : newMap.keySet()) { ++ if (newMap.get(key) instanceof Map && original.get(key) instanceof Map) { ++ Map originalChild = (Map) original.get(key); ++ Map newChild = (Map) newMap.get(key); ++ original.put(key, deepMerge(originalChild, newChild)); ++ } else if (newMap.get(key) instanceof List && original.get(key) instanceof List) { ++ List originalChild = (List) original.get(key); ++ List newChild = (List) newMap.get(key); ++ for (Object each : newChild) { ++ if (!originalChild.contains(each)) { ++ originalChild.add(each); ++ } ++ } ++ } else { ++ original.put(key, newMap.get(key)); ++ } ++ } ++ return original; ++ } + } +diff --git a/oap-server/server-configuration/configuration-zookeeper/src/test/resources/application2.yml b/oap-server/server-configuration/configuration-zookeeper/src/test/resources/application2.yml +new file mode 100644 +index 0000000..e69de29 +diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java +index f4f0586..4fc02f7 100644 +--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java ++++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ApplicationConfiguration.java +@@ -20,10 +20,12 @@ package org.apache.skywalking.oap.server.library.module; + + import java.util.HashMap; + import java.util.Properties; ++import lombok.extern.slf4j.Slf4j; + + /** + * Modulization configurations. The {@link ModuleManager} is going to start, lookup, start modules based on this. + */ ++@Slf4j + public class ApplicationConfiguration { + private HashMap modules = new HashMap<>(); + +@@ -32,6 +34,7 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration addModule(String moduleName) { ++ log.warn("[CTEST][getModuleConfiguration] ###" + moduleName + "###" + getStackTrace()); + ModuleConfiguration newModule = new ModuleConfiguration(); + modules.put(moduleName, newModule); + return newModule; +@@ -42,19 +45,30 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration getModuleConfiguration(String name) { ++ log.warn("[CTEST][getModuleConfiguration] ###" + name + "###" + getStackTrace()); + return modules.get(name); + } + ++ private static String getStackTrace() { ++ String stacktrace = " "; ++ for (StackTraceElement element : Thread.currentThread().getStackTrace()) { ++ stacktrace = stacktrace.concat(element.getClassName() + "\t"); ++ } ++ return stacktrace; ++ } ++ + /** + * The configurations about a certain module. + */ ++ @Slf4j + public static class ModuleConfiguration { + private HashMap providers = new HashMap<>(); + + private ModuleConfiguration() { + } + +- public Properties getProviderConfiguration(String name) { ++ public PropertiesWrapper getProviderConfiguration(String name) { ++ log.warn("[CTEST][getProviderConfiguration] ###" + name + "### providers " + providers.get(name).getProperties() + getStackTrace()); + return providers.get(name).getProperties(); + } + +@@ -63,24 +77,72 @@ public class ApplicationConfiguration { + } + + public ModuleConfiguration addProviderConfiguration(String name, Properties properties) { ++ log.warn("[CTEST][getProviderConfiguration] ###" + name + "### providers " + properties + getStackTrace()); + ProviderConfiguration newProvider = new ProviderConfiguration(properties); + providers.put(name, newProvider); + return this; + } + } + ++ @Slf4j ++ public static class PropertiesWrapper extends Properties { ++ @Override ++ public synchronized Object get(Object key) { ++ log.info("[CTEST][PropertiesWrapper] ###" + key + "### test"); ++ return super.get(key); ++ } ++ ++ @Override ++ public String getProperty(String key) { ++ log.info("[CTEST][PropertiesWrapper] ###" + key + "###"); ++ return super.getProperty(key); ++ } ++ ++ @Override ++ public synchronized java.lang.Object put(java.lang.Object key, java.lang.Object value) { ++ log.info("[CTEST][PropertiesWrapper-reset] ###" + key + "### " + "***" + value + "***"); ++ return super.put(key, value); ++ } ++ } ++ ++ @Slf4j ++ public static class SubPropertiesWrapper extends Properties { ++ @Override ++ public synchronized Object get(Object key) { ++ log.info("[CTEST][SubPropertiesWrapper] ###" + key + "### test"); ++ return super.get(key); ++ } ++ ++ @Override ++ public String getProperty(String key) { ++ log.info("[CTEST][SubPropertiesWrapper] ###" + key + "###"); ++ return super.getProperty(key); ++ } ++ ++ @Override ++ public synchronized java.lang.Object put(java.lang.Object key, java.lang.Object value) { ++ log.info("[CTEST][SubPropertiesWrapper-reset] ###" + key + "### " + "***" + value + "***"); ++ return super.put(key, value); ++ } ++ } ++ + /** + * The configuration about a certain provider of a module. + */ ++ @Slf4j + public static class ProviderConfiguration { +- private Properties properties; ++ private PropertiesWrapper propertiesWrapper; + + ProviderConfiguration(Properties properties) { +- this.properties = properties; ++ PropertiesWrapper wrapper = new PropertiesWrapper(); ++ properties.forEach((k, v) -> { ++ wrapper.put(k, v); ++ }); ++ this.propertiesWrapper = wrapper; + } + +- private Properties getProperties() { +- return properties; ++ private PropertiesWrapper getProperties() { ++ return propertiesWrapper; + } + } + } +diff --git a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java +index 418f5da..a20f188 100644 +--- a/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java ++++ b/oap-server/server-library/library-module/src/main/java/org/apache/skywalking/oap/server/library/module/ModuleDefine.java +@@ -21,14 +21,16 @@ package org.apache.skywalking.oap.server.library.module; + import java.lang.reflect.Field; + import java.lang.reflect.InvocationTargetException; + import java.util.Enumeration; +-import java.util.Properties; + import java.util.ServiceLoader; + import org.slf4j.Logger; + import org.slf4j.LoggerFactory; ++import lombok.extern.slf4j.Slf4j; ++import static org.apache.skywalking.oap.server.library.module.ApplicationConfiguration.PropertiesWrapper; + + /** + * A module definition. + */ ++@Slf4j + public abstract class ModuleDefine implements ModuleProviderHolder { + + private static final Logger LOGGER = LoggerFactory.getLogger(ModuleDefine.class); +@@ -109,7 +111,7 @@ public abstract class ModuleDefine implements ModuleProviderHolder { + loadedProvider.prepare(); + } + +- private void copyProperties(ModuleConfig dest, Properties src, String moduleName, ++ private void copyProperties(ModuleConfig dest, PropertiesWrapper src, String moduleName, + String providerName) throws IllegalAccessException { + if (dest == null) { + return; +diff --git a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java +index 3bccd30..fdd3115 100644 +--- a/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java ++++ b/oap-server/server-starter/src/main/java/org/apache/skywalking/oap/server/starter/config/ApplicationConfigLoader.java +@@ -21,6 +21,7 @@ package org.apache.skywalking.oap.server.starter.config; + import java.io.FileNotFoundException; + import java.io.Reader; + import java.util.ArrayList; ++import java.util.List; + import java.util.Iterator; + import java.util.Map; + import java.util.Properties; +@@ -57,18 +58,21 @@ public class ApplicationConfigLoader implements ConfigLoader> moduleConfig = yaml.loadAs(applicationReader, Map.class); ++ Map> first = yaml.loadAs(applicationReader, Map.class); ++ Reader applicationReader2 = ResourceUtils.read("application2.yml"); ++ Map> second = yaml.loadAs(applicationReader2, Map.class); ++ Map> moduleConfig = deepMerge(first, second); + if (CollectionUtils.isNotEmpty(moduleConfig)) { + selectConfig(moduleConfig); + moduleConfig.forEach((moduleName, providerConfig) -> { + if (providerConfig.size() > 0) { + log.info("Get a module define from application.yml, module name: {}", moduleName); + ApplicationConfiguration.ModuleConfiguration moduleConfiguration = configuration.addModule( +- moduleName); ++ moduleName); + providerConfig.forEach((providerName, config) -> { + log.info( +- "Get a provider define belong to {} module, provider name: {}", moduleName, +- providerName ++ "Get a provider define belong to {} module, provider name: {}", moduleName, ++ providerName + ); + final Map propertiesConfig = (Map) config; + final Properties properties = new Properties(); +@@ -80,7 +84,11 @@ public class ApplicationConfigLoader implements ConfigLoader { ++ subPropertiesWrapper.put(k, v); ++ }); ++ properties.put(propertyName, subPropertiesWrapper); + } else { + properties.put(propertyName, propertyValue); + replacePropertyAndLog(propertyName, propertyValue, properties, providerName); +@@ -91,8 +99,8 @@ public class ApplicationConfigLoader implements ConfigLoader !resolvedSelector.equals(e.getKey())); + +@@ -167,9 +199,9 @@ public class ApplicationConfigLoader implements ConfigLoadercore/run_ctest/skywalking + +# Build the project to generate the target/ctest-runner-1.0-SNAPSHOT-jar-with-dependencies.jar +mvn clean package + +# Switch to the instrumented apache skywalking directory +cd /home/skywalking + +# Run the jar by providing the following inputs +# 1. Source directory containing the overridden file (Example : core/run_ctest/skywalking/sample-skywalking) +# 2. Source file name containing the overridden param values (Example : core/run_ctest/skywalking/sample-skywalking/application.yml) +# 3. Module containing the test case +# 4. Test case + +java -jar core/run_ctest/skywalking/target/ctest-runner-1.0-SNAPSHOT-jar-with-dependencies.jar core/run_ctest/skywalking/sample-skywalking application2.yml oap-server/server-configuration/configuration-zookeeper org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated +``` + +## Results + +The test case will be executed with the overridden configs present in the input file. \ No newline at end of file diff --git a/core/run_ctest/skywalking/pom.xml b/core/run_ctest/skywalking/pom.xml new file mode 100644 index 00000000..d74d52fa --- /dev/null +++ b/core/run_ctest/skywalking/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + org.uiuc + ctest-runner + 1.0-SNAPSHOT + + + 8 + 8 + UTF-8 + + + + + org.apache.maven.shared + maven-invoker + 3.2.0 + + + com.google.code.gson + gson + 2.9.1 + + + + + + + maven-assembly-plugin + + + + org.uiuc.Main + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + + + \ No newline at end of file diff --git a/core/run_ctest/skywalking/sample-skywalking/application.yml b/core/run_ctest/skywalking/sample-skywalking/application.yml new file mode 100644 index 00000000..09447143 --- /dev/null +++ b/core/run_ctest/skywalking/sample-skywalking/application.yml @@ -0,0 +1,3 @@ +configuration: + apollo: + period: -200 diff --git a/core/run_ctest/skywalking/src/main/java/org/uiuc/AppConstants.java b/core/run_ctest/skywalking/src/main/java/org/uiuc/AppConstants.java new file mode 100644 index 00000000..c2046e77 --- /dev/null +++ b/core/run_ctest/skywalking/src/main/java/org/uiuc/AppConstants.java @@ -0,0 +1,31 @@ +package org.uiuc; + +import java.util.HashMap; +import java.util.Map; + +public interface AppConstants { + + Map moduleToDirMap = new HashMap() { + { + put("oap-server/server-starter", "./oap-server/server-starter/src/main/resources/"); + put("oap-server/server-configuration/configuration-apollo", "./oap-server/server-configuration/configuration-apollo/src/test/resources/"); + put("oap-server/server-configuration/configuration-etcd", "./oap-server/server-configuration/configuration-etcd/src/test/resources/"); + put("oap-server/server-configuration/configuration-zookeeper", "./oap-server/server-configuration/configuration-zookeeper/src/test/resources/"); + put("oap-server/analyzer/agent-analyzer", "./oap-server/analyzer/agent-analyzer/src/main/resources/"); + put("oap-server/server-configuration/configuration-nacos", "./oap-server/server-configuration/configuration-nacos/src/test/resources/"); + } + }; + + Map moduleToFileNameMap = new HashMap() { + { + put("oap-server/server-starter", "application2.yml"); + put("oap-server/server-configuration/configuration-apollo", "application2.yml"); + put("oap-server/server-configuration/configuration-etcd", "application2.yml"); + put("oap-server/server-configuration/configuration-zookeeper", "application2.yml"); + put("oap-server/analyzer/agent-analyzer", "trace-sampling-policy-settings2.yml"); + put("oap-server/server-configuration/configuration-nacos", "application2.yml"); + } + }; + + String ERROR_MSG = "Error on exec() method"; +} diff --git a/core/run_ctest/skywalking/src/main/java/org/uiuc/Main.java b/core/run_ctest/skywalking/src/main/java/org/uiuc/Main.java new file mode 100644 index 00000000..72fddc14 --- /dev/null +++ b/core/run_ctest/skywalking/src/main/java/org/uiuc/Main.java @@ -0,0 +1,64 @@ +package org.uiuc; + +import java.io.*; + +import static org.uiuc.AppConstants.*; + +public class Main { + public static void main(String[] args) throws IOException, InterruptedException { + + String sourceDir = args[0]; + String sourceFileName = args[1]; + String module = args[2]; + String destFileName = moduleToFileNameMap.get(module); + String testCase = args[3]; + + System.out.println("copying < " + sourceFileName + " > from < " + sourceDir + " > to < " + moduleToDirMap.get(module) + " >"); + + try { + Runtime.getRuntime().exec("cp " + sourceDir + "/" + sourceFileName + " " + moduleToDirMap.get(module) + "/" + destFileName); + } catch (IOException e) { + System.err.println(ERROR_MSG); + e.printStackTrace(); + } + + Process p = null; + try { + p = Runtime.getRuntime().exec("mvn test -pl " + module + " -Dtest=" + testCase + " -DfailIfNoTests=false"); + } catch (IOException e) { + System.err.println(ERROR_MSG); + e.printStackTrace(); + } + + OutputStream output = new OutputStream() { + private final StringBuilder string = new StringBuilder(); + + @Override + public void write(int b) { + this.string.append((char) b); + } + + public String toString() { + return this.string.toString(); + } + }; + + copy(p.getInputStream(), output); + BufferedReader bufReader = new BufferedReader(new StringReader(output.toString())); + String next = bufReader.readLine(); + while (next != null) { + System.out.println(next); + next = bufReader.readLine(); + } + p.waitFor(); + } + + public static void copy(InputStream in, OutputStream out) throws IOException { + while (true) { + int c = in.read(); + if (c == -1) + break; + out.write((char) c); + } + } +} \ No newline at end of file diff --git a/core/setup_ubuntu_skywalking.sh b/core/setup_ubuntu_skywalking.sh new file mode 100755 index 00000000..7671259e --- /dev/null +++ b/core/setup_ubuntu_skywalking.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# set up env for Linux ubuntu +sudo apt-get install openjdk-11-jdk +sudo apt-get install maven +sudo apt-get install build-essential autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev +sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin \ No newline at end of file diff --git a/data/ctest_mapping/opensource-skywalking.json b/data/ctest_mapping/opensource-skywalking.json new file mode 100644 index 00000000..f411ff00 --- /dev/null +++ b/data/ctest_mapping/opensource-skywalking.json @@ -0,0 +1,197 @@ +{ + "services[1].name": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.serverAddr": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "receiver-zipkin.default.restHost": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadStringTypeConfig" + ], + "configuration.nacos.secretKey": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.apollo.apolloCluster": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "services[0].rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.consul.hostAndPorts": [ + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.etcd.period": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.apollo.appId": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "configuration.nacos.username": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.apollo.period": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "storage.mysql.properties.jdbcUrl": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig" + ], + "storage.mysql.metadataQueryMaxSize": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadConfig" + ], + "configuration.etcd.endpoints": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.nacos.period": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "MO-1.MO-1-P1.p2": [ + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig" + ], + "services[0].name": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.zookeeper.baseSleepTimeMs": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.apollo.apolloEnv": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "core.default.enableDataKeeperExecutor": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadBooleanTypeConfig" + ], + "default.rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "services[0].duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.consul.period": [ + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.consul.ITConsulConfigurationTest#shouldReadUpdated4Group" + ], + "configuration.zookeeper.maxRetries": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "storage.mysql.properties.dataSource.password": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadSpecialStringTypeConfig" + ], + "configuration.zookeeper.hostPort": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "receiver-zipkin.default.restPort": [ + "org.apache.skywalking.oap.server.starter.config.ApplicationConfigLoaderTestCase#testLoadIntegerTypeConfig" + ], + "configuration.apollo.apolloMeta": [ + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated4Group", + "org.apache.skywalking.oap.server.configuration.apollo.ITApolloConfigurationTest#shouldReadUpdated" + ], + "default.duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.accessKey": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.nacos.port": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "services[1].rate": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.namespace": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.etcd.namespace": [ + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.etcd.ITEtcdConfigurationTest#shouldReadUpdated4Group" + ], + "MO-1.MO-1-P1.p1": [ + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig" + ], + "services[1].duration": [ + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testStaticConfigInit", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testTraceLatencyThresholdDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateDynamicUpdate", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testDefaultSampleRateNotify", + "org.apache.skywalking.oap.server.analyzer.provider.trace.TraceSamplingPolicyWatcherTest#testServiceSampleRateNotify" + ], + "configuration.nacos.group": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ], + "configuration.zookeeper.period": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "MO-1.MO-1-P1.prop2": [ + "org.apache.skywalking.oap.server.library.module.ApplicationConfigurationTest#testBuildConfig" + ], + "configuration.zookeeper.namespace": [ + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated", + "org.apache.skywalking.oap.server.configuration.zookeeper.it.ITZookeeperConfigurationTest#shouldReadUpdated4GroupConfig" + ], + "configuration.nacos.password": [ + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdatedGroup", + "org.apache.skywalking.oap.server.configuration.nacos.ITNacosConfigurationTest#shouldReadUpdated" + ] +} \ No newline at end of file