From 67945bd622c6d7badaa82994be4510f29f667138 Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 10 Apr 2020 12:26:55 -0700 Subject: [PATCH 1/9] odfe 1.6 AD support --- build.gradle | 180 ++++++++---------- gradle/wrapper/gradle-wrapper.properties | 2 +- .../ad/util/ParseUtils.java | 9 +- ...ndistro-job-scheduler-1.4.0.0-SNAPSHOT.zip | Bin 221553 -> 0 bytes .../opendistro-job-scheduler-1.6.0.0.zip | Bin 0 -> 197659 bytes 5 files changed, 81 insertions(+), 110 deletions(-) delete mode 100644 src/test/resources/job-scheduler/opendistro-job-scheduler-1.4.0.0-SNAPSHOT.zip create mode 100644 src/test/resources/job-scheduler/opendistro-job-scheduler-1.6.0.0.zip diff --git a/build.gradle b/build.gradle index 15f6b18b..92673f76 100644 --- a/build.gradle +++ b/build.gradle @@ -16,9 +16,9 @@ buildscript { ext { es_group = "org.elasticsearch" - es_version = '7.4.2' - es_distribution = 'oss-zip' + es_version = '7.6.1' } + repositories { mavenCentral() maven { url "https://plugins.gradle.org/m2/" } @@ -31,8 +31,9 @@ buildscript { } plugins { - id 'nebula.ospackage' version "5.3.0" + id 'nebula.ospackage' version "8.2.0" apply false id "com.diffplug.gradle.spotless" version "3.26.1" + id 'java-library' } repositories { @@ -42,9 +43,8 @@ repositories { } ext { - opendistroVersion = '1.4.0' + opendistroVersion = '1.6.0' isSnapshot = "true" == System.getProperty("build.snapshot", "true") - job_scheduler_plugin_zip = "file://${fileTree("src/test/resources/job-scheduler").getSingleFile().absolutePath}" } version = "${opendistroVersion}.0" @@ -135,61 +135,6 @@ def getSeedHosts = { int num -> _seed_hosts } -tasks.create(name : "runMultiNode", type: org.elasticsearch.gradle.test.RunTask) { - daemonize = true - numNodes = _numNodes - // this has to be false otherwise ClusterFormationTasks.groovy will set discovery.seed_providers to file - autoSetHostsProvider = false - setting 'http.port', '9200-9300' - setting 'transport.port', '9300-9400' - setting 'discovery.seed_hosts', getSeedHosts(numNodes) - clusterName = 'multi-node-run' - plugin project.path - distribution = es_distribution - // Temporary until job-scheduler is published to Maven - setupCommand('installPlugin', 'bin/elasticsearch-plugin', 'install', job_scheduler_plugin_zip) -} - -tasks.create(name: "startMultiNode") { - if (_numNodes == 1) { - dependsOn "runMultiNode#start" - } else { - (0..<_numNodes).each { n -> dependsOn "runMultiNode#node${n}.start" } - } -} - -tasks.create(name : "runSingleNode", type: org.elasticsearch.gradle.test.RunTask) { - daemonize = true - numNodes = 3 - // this has to be false otherwise ClusterFormationTasks.groovy will set discovery.seed_providers to file - autoSetHostsProvider = false - // this has to be false otherwise ClusterFormationTasks.groovy will set cluster.initial_master_nodes to all 3 nodes - autoSetInitialMasterNodes = false - setting 'http.port', '9200-9300' - setting 'transport.port', '9300-9400' - setting 'discovery.seed_hosts', getSeedHosts(numNodes) - setting 'node.master', true - setting 'node.data', true - setting 'node.ingest', true - // since we want to start one node at a time, we have to provide the node we are going to start first - setting 'cluster.initial_master_nodes', "[\"node-0\"]" - clusterName = 'multi-node-run' - plugin project.path - distribution = es_distribution -} - -(0..2).each { i -> - tasks.create(name: "startSingleNode$i") { - dependsOn "runSingleNode#node${i}.start" - } -} - -task stopMultiNode(type: Exec) { - commandLine "bash", "-c", "kill -9 \$(ps aux | grep lastic | grep -v grep | grep -v stopMultiNode | awk '{print \$2}')" - sleep(1000) - dependsOn "clean" -} - def es_tmp_dir = rootProject.file('build/private/es_tmp').absoluteFile es_tmp_dir.mkdirs() @@ -198,31 +143,59 @@ test { systemProperty 'tests.security.manager', 'false' } -integTestRunner { - systemProperty 'tests.security.manager', 'false' - systemProperty 'java.io.tmpdir', es_tmp_dir.absolutePath - systemProperty 'tests.locale', 'en' - // Tell the test JVM if the cluster JVM is running under a debugger so that tests can use longer timeouts for - // requests. The 'doFirst' delays reading the debug setting on the cluster till execution time. - doFirst { systemProperty 'cluster.debug', integTestCluster.debug } - - // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable - if (System.getProperty("test.debug") != null) { - jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005' +integTest { + runner { + systemProperty 'tests.security.manager', 'false' + systemProperty 'java.io.tmpdir', es_tmp_dir.absolutePath + // The 'doFirst' delays till execution time. + doFirst { + // Tell the test JVM if the cluster JVM is running under a debugger so that tests can + // use longer timeouts for requests. + def isDebuggingCluster = getDebug() || System.getProperty("test.debug") != null + systemProperty 'cluster.debug', isDebuggingCluster + // Set number of nodes system property to be used in tests + systemProperty 'cluster.number_of_nodes', "${_numNodes}" + // There seems to be an issue when running multi node run or integ tasks with unicast_hosts + // not being written, the waitForAllConditions ensures it's written +// getClusters().forEach { cluster -> +// cluster.waitForAllConditions() +// } + } + + // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable + if (System.getProperty("test.debug") != null) { + jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005' + } } } -integTestCluster { - distribution = es_distribution - // Temporary until job-scheduler is published to Maven - setupCommand('installPlugin', 'bin/elasticsearch-plugin', 'install', job_scheduler_plugin_zip) +testClusters.integTest { + testDistribution = "OSS" + // Cluster shrink exception thrown if we try to set numberOfNodes to 1, so only apply if > 1 + if (_numNodes > 1) numberOfNodes = _numNodes + // When running integration tests it doesn't forward the --debug-jvm to the cluster anymore + // i.e. we have to use a custom property to flag when we want to debug elasticsearch JVM + // since we also support multi node integration tests we increase debugPort per node + if (System.getProperty("es.debug") != null) { + def debugPort = 5005 + nodes.forEach { node -> + node.jvmArgs("-agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=*:${debugPort}") + debugPort += 1 + } + } + plugin(fileTree("src/test/resources/job-scheduler").getSingleFile()) } -run { - distribution = es_distribution - // Temporary until job-scheduler is published to Maven - setupCommand('installPlugin', 'bin/elasticsearch-plugin', 'install', job_scheduler_plugin_zip) -} +//run { +// doFirst { +// // There seems to be an issue when running multi node run or integ tasks with unicast_hosts +// // not being written, the waitForAllConditions ensures it's written +// getClusters().forEach { cluster -> +// cluster.waitForAllConditions() +// } +// } +// plugin(fileTree("src/test/resources/job-scheduler").getSingleFile()) +//} evaluationDependsOnChildren() @@ -296,8 +269,9 @@ check.dependsOn jacocoTestCoverageVerification jacocoTestCoverageVerification.dependsOn jacocoTestReport dependencies { + compile "org.elasticsearch:elasticsearch:${es_version}" compileOnly "org.elasticsearch.plugin:elasticsearch-scripting-painless-spi:${versions.elasticsearch}" - compileOnly "com.amazon.opendistroforelasticsearch:opendistro-job-scheduler-spi:1.4.0.0" + compileOnly "com.amazon.opendistroforelasticsearch:opendistro-job-scheduler-spi:1.6.0.0" compile group: 'com.google.guava', name: 'guava', version:'15.0' compile group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1' compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5' @@ -327,28 +301,28 @@ apply plugin: 'nebula.ospackage' // This is afterEvaluate because the bundlePlugin ZIP task is updated afterEvaluate and changes the ZIP name to match the plugin name afterEvaluate { - project.tasks.getByName("run#installOpendistroAnomalyDetectorPlugin").dependsOn("run#installPlugin") - project.tasks.getByName("run#installPlugin").dependsOn.remove(project.tasks.getByName("run#installOpendistroAnomalyDetectorPlugin")) - project.tasks.getByName("run#installPlugin").dependsOn("run#copyPlugins") - project.tasks.getByName("run#start").dependsOn.remove(project.tasks.getByName("run#installPlugin")) - project.tasks.getByName("run#start").dependsOn("run#installOpendistroAnomalyDetectorPlugin") - - if (_numNodes == 1) { - project.tasks.getByName("runMultiNode#installOpendistroAnomalyDetectorPlugin").dependsOn("runMultiNode#installPlugin") - project.tasks.getByName("runMultiNode#installPlugin").dependsOn.remove(project.tasks.getByName("runMultiNode#installOpendistroAnomalyDetectorPlugin")) - project.tasks.getByName("runMultiNode#installPlugin").dependsOn("runMultiNode#copyPlugins") - project.tasks.getByName("runMultiNode#start").dependsOn.remove(project.tasks.getByName("runMultiNode#installPlugin")) - project.tasks.getByName("runMultiNode#start").dependsOn("runMultiNode#installOpendistroAnomalyDetectorPlugin") - } else { - (0..<_numNodes).each { - n -> - project.tasks.getByName("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin").dependsOn("runMultiNode#node${n}.installPlugin") - project.tasks.getByName("runMultiNode#node${n}.installPlugin").dependsOn.remove(project.tasks.getByName("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin")) - project.tasks.getByName("runMultiNode#node${n}.installPlugin").dependsOn("runMultiNode#node${n}.copyPlugins") - project.tasks.getByName("runMultiNode#node${n}.start").dependsOn.remove(project.tasks.getByName("runMultiNode#node${n}.installPlugin")) - project.tasks.getByName("runMultiNode#node${n}.start").dependsOn("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin") - } - } +// project.tasks.getByName("run#installOpendistroAnomalyDetectorPlugin").dependsOn("run#installPlugin") +// project.tasks.getByName("run#installPlugin").dependsOn.remove(project.tasks.getByName("run#installOpendistroAnomalyDetectorPlugin")) +// project.tasks.getByName("run#installPlugin").dependsOn("run#copyPlugins") +// project.tasks.getByName("run#start").dependsOn.remove(project.tasks.getByName("run#installPlugin")) +// project.tasks.getByName("run#start").dependsOn("run#installOpendistroAnomalyDetectorPlugin") +// +// if (_numNodes == 1) { +// project.tasks.getByName("runMultiNode#installOpendistroAnomalyDetectorPlugin").dependsOn("runMultiNode#installPlugin") +// project.tasks.getByName("runMultiNode#installPlugin").dependsOn.remove(project.tasks.getByName("runMultiNode#installOpendistroAnomalyDetectorPlugin")) +// project.tasks.getByName("runMultiNode#installPlugin").dependsOn("runMultiNode#copyPlugins") +// project.tasks.getByName("runMultiNode#start").dependsOn.remove(project.tasks.getByName("runMultiNode#installPlugin")) +// project.tasks.getByName("runMultiNode#start").dependsOn("runMultiNode#installOpendistroAnomalyDetectorPlugin") +// } else { +// (0..<_numNodes).each { +// n -> +// project.tasks.getByName("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin").dependsOn("runMultiNode#node${n}.installPlugin") +// project.tasks.getByName("runMultiNode#node${n}.installPlugin").dependsOn.remove(project.tasks.getByName("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin")) +// project.tasks.getByName("runMultiNode#node${n}.installPlugin").dependsOn("runMultiNode#node${n}.copyPlugins") +// project.tasks.getByName("runMultiNode#node${n}.start").dependsOn.remove(project.tasks.getByName("runMultiNode#node${n}.installPlugin")) +// project.tasks.getByName("runMultiNode#node${n}.start").dependsOn("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin") +// } +// } ospackage { packageName = "${name}" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 063322f7..36df5b4a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.1-bin.zip diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java index 5e2edc11..7a6a6cbd 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java @@ -219,12 +219,9 @@ public static AggregatorFactories.Builder parseAggregators(XContentParser parser ); } - aggBuilder = parser - .namedObject( - BaseAggregationBuilder.class, - fieldName, - new AggregatorFactories.AggParseContext(aggregationName) - ); + aggBuilder = parser.namedObject(BaseAggregationBuilder.class, fieldName, aggregationName + // new AggregatorFactories.AggParseContext(aggregationName) + ); } } else { throw new ParsingException( diff --git a/src/test/resources/job-scheduler/opendistro-job-scheduler-1.4.0.0-SNAPSHOT.zip b/src/test/resources/job-scheduler/opendistro-job-scheduler-1.4.0.0-SNAPSHOT.zip deleted file mode 100644 index 99a5b603ac8554a1a354c5af88015a58e97356a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221553 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 z 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%0A4Y=Z_WD*u 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 ZG0lmJw1va*A5|2I{v4t<%i^p8 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 diff --git a/src/test/resources/job-scheduler/opendistro-job-scheduler-1.6.0.0.zip b/src/test/resources/job-scheduler/opendistro-job-scheduler-1.6.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..d37f2137f677af387572b96813ee0ed4b103c596 GIT binary patch literal 197659 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

@98=(pQ#M8z(}nUW6oZ0rU7V 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 aJSG+wWTKkN$_CQR41}M6v@kO>kOTlASk~bH literal 0 HcmV?d00001 From f6dd325607729c8b51b445e4e8c0b10f655f0798 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 13 Apr 2020 11:25:30 -0700 Subject: [PATCH 2/9] odfe 1.6 AD support --- build.gradle | 72 +++++----------------------------------------------- 1 file changed, 6 insertions(+), 66 deletions(-) diff --git a/build.gradle b/build.gradle index 92673f76..48d674c1 100644 --- a/build.gradle +++ b/build.gradle @@ -55,6 +55,9 @@ apply plugin: 'elasticsearch.esplugin' apply plugin: 'base' apply plugin: 'jacoco' +def usingRemoteCluster = System.properties.containsKey('tests.rest.cluster') || System.properties.containsKey('tests.cluster') +def usingMultiNode = project.properties.containsKey('numNodes') + allprojects { group = 'com.amazon.opendistroforelasticsearch' @@ -116,25 +119,6 @@ thirdPartyAudit.enabled = false // See package README.md for details on using these tasks. def _numNodes = findProperty('numNodes') as Integer ?: 1 -def getSeedHosts = { int num -> - def _localhost = "127.0.0.1:" - def _startPort = 9300 - - def _seed_hosts = new StringBuilder() - _seed_hosts.append("[") - - (0..< num).each { i -> - if (i>0) { - _seed_hosts.append(", ") - } - def _host = "\"" + _localhost + (_startPort + i) + "\"" - _seed_hosts.append(_host) - } - - _seed_hosts.append("]") - _seed_hosts -} - def es_tmp_dir = rootProject.file('build/private/es_tmp').absoluteFile es_tmp_dir.mkdirs() @@ -157,9 +141,9 @@ integTest { systemProperty 'cluster.number_of_nodes', "${_numNodes}" // There seems to be an issue when running multi node run or integ tasks with unicast_hosts // not being written, the waitForAllConditions ensures it's written -// getClusters().forEach { cluster -> -// cluster.waitForAllConditions() -// } + getClusters().forEach { cluster -> + cluster.waitForAllConditions() + } } // The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable @@ -186,17 +170,6 @@ testClusters.integTest { plugin(fileTree("src/test/resources/job-scheduler").getSingleFile()) } -//run { -// doFirst { -// // There seems to be an issue when running multi node run or integ tasks with unicast_hosts -// // not being written, the waitForAllConditions ensures it's written -// getClusters().forEach { cluster -> -// cluster.waitForAllConditions() -// } -// } -// plugin(fileTree("src/test/resources/job-scheduler").getSingleFile()) -//} - evaluationDependsOnChildren() task release(type: Copy, group: 'build') { @@ -301,29 +274,6 @@ apply plugin: 'nebula.ospackage' // This is afterEvaluate because the bundlePlugin ZIP task is updated afterEvaluate and changes the ZIP name to match the plugin name afterEvaluate { -// project.tasks.getByName("run#installOpendistroAnomalyDetectorPlugin").dependsOn("run#installPlugin") -// project.tasks.getByName("run#installPlugin").dependsOn.remove(project.tasks.getByName("run#installOpendistroAnomalyDetectorPlugin")) -// project.tasks.getByName("run#installPlugin").dependsOn("run#copyPlugins") -// project.tasks.getByName("run#start").dependsOn.remove(project.tasks.getByName("run#installPlugin")) -// project.tasks.getByName("run#start").dependsOn("run#installOpendistroAnomalyDetectorPlugin") -// -// if (_numNodes == 1) { -// project.tasks.getByName("runMultiNode#installOpendistroAnomalyDetectorPlugin").dependsOn("runMultiNode#installPlugin") -// project.tasks.getByName("runMultiNode#installPlugin").dependsOn.remove(project.tasks.getByName("runMultiNode#installOpendistroAnomalyDetectorPlugin")) -// project.tasks.getByName("runMultiNode#installPlugin").dependsOn("runMultiNode#copyPlugins") -// project.tasks.getByName("runMultiNode#start").dependsOn.remove(project.tasks.getByName("runMultiNode#installPlugin")) -// project.tasks.getByName("runMultiNode#start").dependsOn("runMultiNode#installOpendistroAnomalyDetectorPlugin") -// } else { -// (0..<_numNodes).each { -// n -> -// project.tasks.getByName("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin").dependsOn("runMultiNode#node${n}.installPlugin") -// project.tasks.getByName("runMultiNode#node${n}.installPlugin").dependsOn.remove(project.tasks.getByName("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin")) -// project.tasks.getByName("runMultiNode#node${n}.installPlugin").dependsOn("runMultiNode#node${n}.copyPlugins") -// project.tasks.getByName("runMultiNode#node${n}.start").dependsOn.remove(project.tasks.getByName("runMultiNode#node${n}.installPlugin")) -// project.tasks.getByName("runMultiNode#node${n}.start").dependsOn("runMultiNode#node${n}.installOpendistroAnomalyDetectorPlugin") -// } -// } - ospackage { packageName = "${name}" release = isSnapshot ? "0.1" : '1' @@ -371,16 +321,6 @@ afterEvaluate { } } -tasks.whenTaskAdded { task -> - if (task.name == "integTestCluster#wait") { - project.tasks.getByName("integTestCluster#installOpendistroAnomalyDetectorPlugin").dependsOn("integTestCluster#installPlugin") - project.tasks.getByName("integTestCluster#installPlugin").dependsOn.remove(project.tasks.getByName("integTestCluster#installOpendistroAnomalyDetectorPlugin")) - project.tasks.getByName("integTestCluster#installPlugin").dependsOn("integTestCluster#copyPlugins") - project.tasks.getByName("integTestCluster#start").dependsOn.remove(project.tasks.getByName("integTestCluster#installPlugin")) - project.tasks.getByName("integTestCluster#start").dependsOn("integTestCluster#installOpendistroAnomalyDetectorPlugin") - } -} - spotless { java { eclipse().configFile rootProject.file('.eclipseformat.xml') From 468e40ffe0dcfe1a7146a551ee98d1d56c8d87fc Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 14 Apr 2020 00:18:16 -0700 Subject: [PATCH 3/9] odfe 1.6 AD support --- build.gradle | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build.gradle b/build.gradle index 48d674c1..a6e89166 100644 --- a/build.gradle +++ b/build.gradle @@ -170,6 +170,16 @@ testClusters.integTest { plugin(fileTree("src/test/resources/job-scheduler").getSingleFile()) } +run { + doFirst { + // There seems to be an issue when running multi node run or integ tasks with unicast_hosts + // not being written, the waitForAllConditions ensures it's written + getClusters().forEach { cluster -> + cluster.waitForAllConditions() + } + } +} + evaluationDependsOnChildren() task release(type: Copy, group: 'build') { From 48f5cd6690c49f6236c2082094154b8eb1ba59c9 Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 14 Apr 2020 00:36:55 -0700 Subject: [PATCH 4/9] odfe 1.6 AD support --- .../amazon/opendistroforelasticsearch/ad/util/ParseUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java index 7a6a6cbd..2aa43e67 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java @@ -220,7 +220,6 @@ public static AggregatorFactories.Builder parseAggregators(XContentParser parser } aggBuilder = parser.namedObject(BaseAggregationBuilder.class, fieldName, aggregationName - // new AggregatorFactories.AggParseContext(aggregationName) ); } } else { From 0fdcfb1871512da0ffabb8fab54e4af0aebc74e1 Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 14 Apr 2020 12:18:37 -0700 Subject: [PATCH 5/9] fix action to pick up java 13 --- .github/workflows/test-workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-workflow.yml b/.github/workflows/test-workflow.yml index 9c9bf7d8..9227fd92 100644 --- a/.github/workflows/test-workflow.yml +++ b/.github/workflows/test-workflow.yml @@ -8,7 +8,7 @@ jobs: build: strategy: matrix: - java: [12] + java: [13] # Job name name: Build Anomaly detection with JDK ${{ matrix.java }} # This job runs on Linux From e9d4a460a3371ffd4a66330fc55e2d9492db546b Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 14 Apr 2020 12:28:22 -0700 Subject: [PATCH 6/9] fix spotless issues --- .../amazon/opendistroforelasticsearch/ad/util/ParseUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java index 2aa43e67..e5709697 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/ParseUtils.java @@ -219,8 +219,7 @@ public static AggregatorFactories.Builder parseAggregators(XContentParser parser ); } - aggBuilder = parser.namedObject(BaseAggregationBuilder.class, fieldName, aggregationName - ); + aggBuilder = parser.namedObject(BaseAggregationBuilder.class, fieldName, aggregationName); } } else { throw new ParsingException( From 40cc15b0f88323a8c63611e8f5f41f847f526d3e Mon Sep 17 00:00:00 2001 From: Vamshi Vijay Nakkirtha <46505183+vamshin@users.noreply.github.com> Date: Tue, 14 Apr 2020 21:24:28 -0700 Subject: [PATCH 7/9] Updated README.md Updated README.md to reflect changes to run multi node cluster --- README.md | 35 ++++------------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 145f5102..3c814326 100644 --- a/README.md +++ b/README.md @@ -76,39 +76,12 @@ The **test runner JVM** will start suspended and wait for a debugger to attach t ### Advanced: Launching multi node clusters locally -Sometimes you need to launch a cluster with more than one ES server process. The `startMultiNode` tasks help with this. +Sometimes you need to launch a cluster with more than one Elasticsearch server process. -#### All nodes are started and stopped together +You can do this by running `./gradlew run -PnumNodes=` -If you need a multi node cluster where all nodes are started together use: - -``` -./gradlew -PnumNodes=2 startMultiNode # to launch 2 nodes - -``` - -If you need a single node cluster use: - -``` -./gradlew startMultiNode - -``` - -#### Nodes join and leave the cluster independently - -If you need a multi node cluster (up to 3 nodes) where you'd like to be able to add and kill each node independently use: - -``` -./gradlew startSingleNode0 -./gradlew startSingleNode1 -./gradlew startSingleNode2 -``` - -#### Kill the nodes when you're done! - -``` -./gradlew stopMultiNode -``` +You can also debug a multi-node cluster, by using a combination of above multi-node and debug steps. +But, you must set up debugger configurations to listen on each port starting from `5005` and increasing by 1 for each node. ## Known Issues * We have a cold start period whenever we initialize a model, which could happen when we create a new detector or when the cluster restarts and models get restored from snapshots. Currently the detector always return errors during the cold start period. Please ignore these initial errors for now. We are actively working on the fix and will push in the next release. From 7fcb93d366649baaeb8f752110498bc8102c7f4c Mon Sep 17 00:00:00 2001 From: Vamshi Vijay Nakkirtha <46505183+vamshin@users.noreply.github.com> Date: Tue, 14 Apr 2020 21:29:59 -0700 Subject: [PATCH 8/9] removed unused variables --- build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/build.gradle b/build.gradle index a6e89166..ff10747d 100644 --- a/build.gradle +++ b/build.gradle @@ -55,9 +55,6 @@ apply plugin: 'elasticsearch.esplugin' apply plugin: 'base' apply plugin: 'jacoco' -def usingRemoteCluster = System.properties.containsKey('tests.rest.cluster') || System.properties.containsKey('tests.cluster') -def usingMultiNode = project.properties.containsKey('numNodes') - allprojects { group = 'com.amazon.opendistroforelasticsearch' From b541442f788a0842f50966f9fa9c2f3f081575dd Mon Sep 17 00:00:00 2001 From: Vijay Date: Thu, 16 Apr 2020 12:08:32 -0700 Subject: [PATCH 9/9] commit e5b6ce5f47590e9c451c02a2b81d1c40a5f2b6d6 Author: Kaituo Li Date: Wed Apr 15 15:45:13 2020 -0700 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add state and error to profile API (#84) * Add state and error to profile API We want to make it easy for customers and oncalls to identify a detector’s state and error if any. This PR adds such information to our new profile API. We expect three kinds of states: -Disabled: if get ad job api says the job is disabled; -Init: if anomaly score after the last update time of the detector is larger than 0 -Running: if neither of the above applies and no exceptions. Error is populated if error of the latest anomaly result is not empty. Testing done: -manual testing during a detector’s life cycle: not created, created but not started, started, during initialization, after initialization, stopped, restarted -added unit tests to cover above scenario commit 0c3305000ffe6e61c7c2104314a555e69d060023 Author: Kaituo Li Date: Tue Apr 14 11:52:20 2020 -0700 Use callbacks and bug fix (#83) * Use callbacks and bug fix This PR includes the following changes: 1. remove classes that are not needed in jacocoExclusions since we have enough coverage for those classes. 2. Use ClientUtil instead of Elasticsearch’s client in AD job runner 3. Use one function to get the number of partitioned forests. Previously, we have redundant code in both ModelManager and ADStateManager. 4. Change ADStateManager.getAnomalyDetector to use callback. 5. Change AnomalyResultTransportAction to use callback to get features. 6. Add in AnomalyResultTransportAction to handle the case where all features have been disabled, and users' index does not exist. 7. Change get RCF and threshold result methods to use callback and add exception handling of IndexNotFoundException due to the change. Previously, getting RCF and threshold result methods won’t throw IndexNotFoundException. 8. Remove unused fields in StopDetectorTransportAction and AnomalyResultTransportAction 9. Unwrap EsRejectedExecutionException as it can be nested inside RemoteTransportException. Previously, we would not recognize EsRejectedExecutionException and thus miss anomaly results write retrying. 10. Add error in anomaly result schema.11. Fix broken tests due to my changes. Testing done: 1. unit/integration tests pass 2. do end-to-end testing and make sure my fix achieves the purpose  * timeout issue is gone  * when all features have been disabled or index does not exist, we will retry a few more times and disable AD jobs. --- build.gradle | 18 +- .../ad/AnomalyDetectorJobRunner.java | 34 +- .../ad/AnomalyDetectorPlugin.java | 23 +- .../ad/AnomalyDetectorProfileRunner.java | 287 ++++++++++++++++ .../ad/AnomalyDetectorRunner.java | 1 + .../ad/ml/ModelManager.java | 62 +++- .../ad/model/AnomalyDetectorJob.java | 3 +- .../ad/model/AnomalyResult.java | 12 +- .../ad/model/DetectorProfile.java | 107 ++++++ .../ad/model/DetectorState.java | 22 ++ .../ad/model/Mergeable.java | 20 ++ .../ad/model/ProfileName.java | 73 ++++ .../ad/rest/AbstractSearchAction.java | 17 +- .../ad/rest/RestGetAnomalyDetectorAction.java | 100 ++++-- .../ad/transport/ADStateManager.java | 78 ++--- .../AnomalyResultTransportAction.java | 137 ++++---- .../transport/RCFResultTransportAction.java | 21 +- .../StopDetectorTransportAction.java | 6 +- .../ThresholdResultTransportAction.java | 19 +- .../handler/AnomalyResultHandler.java | 52 ++- .../MultiResponsesDelegateActionListener.java | 112 +++++++ .../ad/util/RestHandlerUtils.java | 2 + .../resources/mappings/anomaly-results.json | 3 + .../ad/AnomalyDetectorJobRunnerTests.java | 25 +- .../ad/AnomalyDetectorProfileRunnerTests.java | 317 ++++++++++++++++++ .../ad/TestHelpers.java | 104 +++++- .../cluster/ADClusterEventListenerTests.java | 1 + .../ad/ml/ModelManagerTests.java | 9 +- .../ad/transport/ADStateManagerTests.java | 67 ++-- .../ad/transport/AnomalyResultTests.java | 186 +++++----- .../transport/CronTransportActionTests.java | 1 + .../DeleteModelTransportActionTests.java | 1 + .../ad/transport/RCFResultTests.java | 25 +- .../ad/transport/ThresholdResultTests.java | 18 +- 34 files changed, 1583 insertions(+), 380 deletions(-) create mode 100644 src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunner.java create mode 100644 src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorProfile.java create mode 100644 src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorState.java create mode 100644 src/main/java/com/amazon/opendistroforelasticsearch/ad/model/Mergeable.java create mode 100644 src/main/java/com/amazon/opendistroforelasticsearch/ad/model/ProfileName.java create mode 100644 src/main/java/com/amazon/opendistroforelasticsearch/ad/util/MultiResponsesDelegateActionListener.java create mode 100644 src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunnerTests.java diff --git a/build.gradle b/build.gradle index a6e89166..a3bde1cb 100644 --- a/build.gradle +++ b/build.gradle @@ -207,23 +207,17 @@ List jacocoExclusions = [ 'com.amazon.opendistroforelasticsearch.ad.common.exception.AnomalyDetectionException', 'com.amazon.opendistroforelasticsearch.ad.util.ClientUtil', - 'com.amazon.opendistroforelasticsearch.ad.ml.*', - 'com.amazon.opendistroforelasticsearch.ad.feature.*', - 'com.amazon.opendistroforelasticsearch.ad.dataprocessor.*', - 'com.amazon.opendistroforelasticsearch.ad.AnomalyDetectorRunner', - 'com.amazon.opendistroforelasticsearch.ad.resthandler.RestGetAnomalyResultAction', - 'com.amazon.opendistroforelasticsearch.ad.metrics.MetricFactory', - 'com.amazon.opendistroforelasticsearch.ad.indices.AnomalyDetectionIndices', - 'com.amazon.opendistroforelasticsearch.ad.transport.ForwardAction', - 'com.amazon.opendistroforelasticsearch.ad.transport.ForwardTransportAction', 'com.amazon.opendistroforelasticsearch.ad.transport.StopDetectorAction', 'com.amazon.opendistroforelasticsearch.ad.transport.StopDetectorRequest', 'com.amazon.opendistroforelasticsearch.ad.transport.StopDetectorResponse', 'com.amazon.opendistroforelasticsearch.ad.transport.StopDetectorTransportAction', - 'com.amazon.opendistroforelasticsearch.ad.transport.ADStatsAction', - 'com.amazon.opendistroforelasticsearch.ad.transport.CronRequest', 'com.amazon.opendistroforelasticsearch.ad.transport.DeleteDetectorAction', - 'com.amazon.opendistroforelasticsearch.ad.util.ParseUtils' + 'com.amazon.opendistroforelasticsearch.ad.transport.CronTransportAction', + 'com.amazon.opendistroforelasticsearch.ad.transport.CronRequest', + 'com.amazon.opendistroforelasticsearch.ad.transport.ADStatsAction', + 'com.amazon.opendistroforelasticsearch.ad.AnomalyDetectorRunner', + 'com.amazon.opendistroforelasticsearch.ad.indices.AnomalyDetectionIndices', + 'com.amazon.opendistroforelasticsearch.ad.util.ParseUtils', ] jacocoTestCoverageVerification { diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunner.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunner.java index e59bf605..82f6d502 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunner.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunner.java @@ -28,6 +28,7 @@ import com.amazon.opendistroforelasticsearch.ad.transport.AnomalyResultResponse; import com.amazon.opendistroforelasticsearch.ad.transport.AnomalyResultTransportAction; import com.amazon.opendistroforelasticsearch.ad.transport.handler.AnomalyResultHandler; +import com.amazon.opendistroforelasticsearch.ad.util.ClientUtil; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.JobExecutionContext; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.LockModel; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.ScheduledJobParameter; @@ -39,7 +40,9 @@ import org.apache.logging.log4j.Logger; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; +import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.client.Client; import org.elasticsearch.common.settings.Settings; @@ -71,6 +74,7 @@ public class AnomalyDetectorJobRunner implements ScheduledJobRunner { private Settings settings; private int maxRetryForEndRunException; private Client client; + private ClientUtil clientUtil; private ThreadPool threadPool; private AnomalyResultHandler anomalyResultHandler; private ConcurrentHashMap detectorEndRunExceptionCount; @@ -97,6 +101,10 @@ public void setClient(Client client) { this.client = client; } + public void setClientUtil(ClientUtil clientUtil) { + this.clientUtil = clientUtil; + } + public void setThreadPool(ThreadPool threadPool) { this.threadPool = threadPool; } @@ -258,7 +266,7 @@ protected void handleAdException( ) { String detectorId = jobParameter.getName(); if (exception instanceof EndRunException) { - log.error("EndRunException happened when executed anomaly result action for " + detectorId, exception); + log.error("EndRunException happened when executing anomaly result action for " + detectorId, exception); if (((EndRunException) exception).isEndNow()) { // Stop AD job if EndRunException shows we should end job now. @@ -349,9 +357,8 @@ private void stopAdJob(String detectorId) { try { GetRequest getRequest = new GetRequest(AnomalyDetectorJob.ANOMALY_DETECTOR_JOB_INDEX).id(detectorId); - client.get(getRequest, ActionListener.wrap(response -> { + clientUtil.asyncRequest(getRequest, client::get, ActionListener.wrap(response -> { if (response.isExists()) { - String s = response.getSourceAsString(); try ( XContentParser parser = XContentType.JSON .xContent() @@ -374,14 +381,19 @@ private void stopAdJob(String detectorId) { .setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) .source(newJob.toXContent(XContentBuilder.builder(XContentType.JSON.xContent()), XCONTENT_WITH_TYPE)) .id(detectorId); - client.index(indexRequest, ActionListener.wrap(indexResponse -> { - if (indexResponse != null - && (indexResponse.getResult() == CREATED || indexResponse.getResult() == UPDATED)) { - log.info("AD Job was disabled by JobRunner for " + detectorId); - } else { - log.warn("Failed to disable AD job for " + detectorId); - } - }, exception -> log.error("JobRunner failed to update AD job as disabled for " + detectorId, exception))); + clientUtil + .asyncRequest( + indexRequest, + client::index, + ActionListener.wrap(indexResponse -> { + if (indexResponse != null + && (indexResponse.getResult() == CREATED || indexResponse.getResult() == UPDATED)) { + log.info("AD Job was disabled by JobRunner for " + detectorId); + } else { + log.warn("Failed to disable AD job for " + detectorId); + } + }, exception -> log.error("JobRunner failed to update AD job as disabled for " + detectorId, exception)) + ); } } catch (IOException e) { log.error("JobRunner failed to stop detector job " + detectorId, e); diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorPlugin.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorPlugin.java index 5f93e936..285ab608 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorPlugin.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector; import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob; import com.amazon.opendistroforelasticsearch.ad.model.AnomalyResult; +import com.amazon.opendistroforelasticsearch.ad.model.ProfileName; import com.amazon.opendistroforelasticsearch.ad.rest.RestAnomalyDetectorJobAction; import com.amazon.opendistroforelasticsearch.ad.rest.RestDeleteAnomalyDetectorAction; import com.amazon.opendistroforelasticsearch.ad.rest.RestExecuteAnomalyDetectorAction; @@ -141,8 +142,9 @@ public class AnomalyDetectorPlugin extends Plugin implements ActionPlugin, Scrip private Client client; private ClusterService clusterService; private ThreadPool threadPool; - private IndexNameExpressionResolver indexNameExpressionResolver; private ADStats adStats; + private NamedXContentRegistry xContentRegistry; + private ClientUtil clientUtil; static { SpecialPermission.check(); @@ -163,7 +165,6 @@ public List getRestHandlers( IndexNameExpressionResolver indexNameExpressionResolver, Supplier nodesInCluster ) { - this.indexNameExpressionResolver = indexNameExpressionResolver; AnomalyResultHandler anomalyResultHandler = new AnomalyResultHandler( client, settings, @@ -174,11 +175,17 @@ public List getRestHandlers( ); AnomalyDetectorJobRunner jobRunner = AnomalyDetectorJobRunner.getJobRunnerInstance(); jobRunner.setClient(client); + jobRunner.setClientUtil(clientUtil); jobRunner.setThreadPool(threadPool); jobRunner.setAnomalyResultHandler(anomalyResultHandler); jobRunner.setSettings(settings); - RestGetAnomalyDetectorAction restGetAnomalyDetectorAction = new RestGetAnomalyDetectorAction(restController); + AnomalyDetectorProfileRunner profileRunner = new AnomalyDetectorProfileRunner(client, this.xContentRegistry); + RestGetAnomalyDetectorAction restGetAnomalyDetectorAction = new RestGetAnomalyDetectorAction( + restController, + profileRunner, + ProfileName.getNames() + ); RestIndexAnomalyDetectorAction restIndexAnomalyDetectorAction = new RestIndexAnomalyDetectorAction( settings, restController, @@ -237,10 +244,11 @@ public Collection createComponents( Settings settings = environment.settings(); Clock clock = Clock.systemUTC(); Throttler throttler = new Throttler(clock); - ClientUtil clientUtil = new ClientUtil(settings, client, throttler, threadPool); + this.clientUtil = new ClientUtil(settings, client, throttler, threadPool); IndexUtils indexUtils = new IndexUtils(client, clientUtil, clusterService); anomalyDetectionIndices = new AnomalyDetectionIndices(client, clusterService, threadPool, settings, clientUtil); this.clusterService = clusterService; + this.xContentRegistry = xContentRegistry; SingleFeatureLinearUniformInterpolator singleFeatureLinearUniformInterpolator = new IntegerSensitiveSingleFeatureLinearUniformInterpolator(); @@ -272,7 +280,8 @@ public Collection createComponents( HybridThresholdingModel.class, AnomalyDetectorSettings.MIN_PREVIEW_SIZE, AnomalyDetectorSettings.HOURLY_MAINTENANCE, - AnomalyDetectorSettings.HOURLY_MAINTENANCE + AnomalyDetectorSettings.HOURLY_MAINTENANCE, + AnomalyDetectorSettings.SHINGLE_SIZE ); HashRing hashRing = new HashRing(clusterService, clock, settings); @@ -389,7 +398,7 @@ public List> getSettings() { @Override public List getNamedXContent() { - return ImmutableList.of(AnomalyDetector.XCONTENT_REGISTRY, ADMetaData.XCONTENT_REGISTRY); + return ImmutableList.of(AnomalyDetector.XCONTENT_REGISTRY, ADMetaData.XCONTENT_REGISTRY, AnomalyResult.XCONTENT_REGISTRY); } @Override diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunner.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunner.java new file mode 100644 index 00000000..1cf75cda --- /dev/null +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunner.java @@ -0,0 +1,287 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad; + +import static com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector.ANOMALY_DETECTORS_INDEX; +import static com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob.ANOMALY_DETECTOR_JOB_INDEX; +import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; + +import java.io.IOException; +import java.util.Set; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; +import org.elasticsearch.common.xcontent.NamedXContentRegistry; +import org.elasticsearch.common.xcontent.XContentParseException; +import org.elasticsearch.common.xcontent.XContentParser; +import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.IndexNotFoundException; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; + +import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob; +import com.amazon.opendistroforelasticsearch.ad.model.AnomalyResult; +import com.amazon.opendistroforelasticsearch.ad.model.DetectorProfile; +import com.amazon.opendistroforelasticsearch.ad.model.DetectorState; +import com.amazon.opendistroforelasticsearch.ad.model.ProfileName; +import com.amazon.opendistroforelasticsearch.ad.util.MultiResponsesDelegateActionListener; + +public class AnomalyDetectorProfileRunner { + private final Logger logger = LogManager.getLogger(AnomalyDetectorProfileRunner.class); + private Client client; + private NamedXContentRegistry xContentRegistry; + static String FAIL_TO_FIND_DETECTOR_MSG = "Fail to find detector with id: "; + static String FAIL_TO_GET_PROFILE_MSG = "Fail to get profile for detector "; + + public AnomalyDetectorProfileRunner(Client client, NamedXContentRegistry xContentRegistry) { + this.client = client; + this.xContentRegistry = xContentRegistry; + } + + public void profile(String detectorId, ActionListener listener, Set profiles) { + + if (profiles.isEmpty()) { + listener.onFailure(new RuntimeException("Unsupported profile types.")); + return; + } + + MultiResponsesDelegateActionListener delegateListener = new MultiResponsesDelegateActionListener( + listener, + profiles.size(), + "Fail to fetch profile for " + detectorId + ); + + prepareProfile(detectorId, delegateListener, profiles); + } + + private void prepareProfile( + String detectorId, + MultiResponsesDelegateActionListener listener, + Set profiles + ) { + GetRequest getRequest = new GetRequest(ANOMALY_DETECTOR_JOB_INDEX, detectorId); + client.get(getRequest, ActionListener.wrap(getResponse -> { + if (getResponse != null && getResponse.isExists()) { + try ( + XContentParser parser = XContentType.JSON + .xContent() + .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, getResponse.getSourceAsString()) + ) { + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); + AnomalyDetectorJob job = AnomalyDetectorJob.parse(parser); + long enabledTimeMs = job.getEnabledTime().toEpochMilli(); + + if (profiles.contains(ProfileName.STATE)) { + profileState(detectorId, enabledTimeMs, listener, job.isEnabled()); + } + if (profiles.contains(ProfileName.ERROR)) { + profileError(detectorId, enabledTimeMs, listener); + } + } catch (IOException | XContentParseException | NullPointerException e) { + logger.error(e); + listener.failImmediately(FAIL_TO_GET_PROFILE_MSG, e); + } + } else { + GetRequest getDetectorRequest = new GetRequest(ANOMALY_DETECTORS_INDEX, detectorId); + client.get(getDetectorRequest, onGetDetectorResponse(listener, detectorId, profiles)); + } + }, exception -> { + if (exception instanceof IndexNotFoundException) { + logger.info(exception.getMessage()); + GetRequest getDetectorRequest = new GetRequest(ANOMALY_DETECTORS_INDEX, detectorId); + client.get(getDetectorRequest, onGetDetectorResponse(listener, detectorId, profiles)); + } else { + logger.error(FAIL_TO_GET_PROFILE_MSG + detectorId); + listener.onFailure(exception); + } + })); + } + + private ActionListener onGetDetectorResponse( + MultiResponsesDelegateActionListener listener, + String detectorId, + Set profiles + ) { + return ActionListener.wrap(getResponse -> { + if (getResponse != null && getResponse.isExists()) { + DetectorProfile profile = new DetectorProfile(); + if (profiles.contains(ProfileName.STATE)) { + profile.setState(DetectorState.DISABLED); + } + listener.respondImmediately(profile); + } else { + listener.failImmediately(FAIL_TO_FIND_DETECTOR_MSG + detectorId); + } + }, exception -> { listener.failImmediately(FAIL_TO_FIND_DETECTOR_MSG + detectorId, exception); }); + } + + /** + * We expect three kinds of states: + * -Disabled: if get ad job api says the job is disabled; + * -Init: if anomaly score after the last update time of the detector is larger than 0 + * -Running: if neither of the above applies and no exceptions. + * @param detectorId detector id + * @param enabledTime the time when AD job is enabled in milliseconds + * @param listener listener to process the returned state or exception + * @param enabled whether the detector job is enabled or not + */ + private void profileState( + String detectorId, + long enabledTime, + MultiResponsesDelegateActionListener listener, + boolean enabled + ) { + if (enabled) { + SearchRequest searchLatestResult = createInittedEverRequest(detectorId, enabledTime); + client.search(searchLatestResult, onInittedEver(listener, detectorId, enabledTime)); + } else { + DetectorProfile profile = new DetectorProfile(); + profile.setState(DetectorState.DISABLED); + listener.onResponse(profile); + } + } + + private ActionListener onInittedEver( + MultiResponsesDelegateActionListener listener, + String detectorId, + long lastUpdateTimeMs + ) { + return ActionListener.wrap(searchResponse -> { + SearchHits hits = searchResponse.getHits(); + DetectorProfile profile = new DetectorProfile(); + if (hits.getTotalHits().value == 0L) { + profile.setState(DetectorState.INIT); + } else { + profile.setState(DetectorState.RUNNING); + } + + listener.onResponse(profile); + + }, exception -> { + if (exception instanceof IndexNotFoundException) { + DetectorProfile profile = new DetectorProfile(); + // anomaly result index is not created yet + profile.setState(DetectorState.INIT); + listener.onResponse(profile); + } else { + logger + .error( + "Fail to find any anomaly result with anomaly score larger than 0 after AD job enabled time for detector {}", + detectorId + ); + listener.onFailure(new RuntimeException("Fail to find detector state: " + detectorId, exception)); + } + }); + } + + /** + * Error is populated if error of the latest anomaly result is not empty. + * @param detectorId detector id + * @param enabledTime the time when AD job is enabled in milliseconds + * @param listener listener to process the returned error or exception + */ + private void profileError(String detectorId, long enabledTime, MultiResponsesDelegateActionListener listener) { + SearchRequest searchLatestResult = createLatestAnomalyResultRequest(detectorId, enabledTime); + client.search(searchLatestResult, onGetLatestAnomalyResult(listener, detectorId)); + } + + private ActionListener onGetLatestAnomalyResult(ActionListener listener, String detectorId) { + return ActionListener.wrap(searchResponse -> { + SearchHits hits = searchResponse.getHits(); + if (hits.getTotalHits().value == 0L) { + listener.onResponse(new DetectorProfile()); + } else { + SearchHit hit = hits.getAt(0); + + try ( + XContentParser parser = XContentType.JSON + .xContent() + .createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, hit.getSourceAsString()) + ) { + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); + AnomalyResult result = parser.namedObject(AnomalyResult.class, AnomalyResult.PARSE_FIELD_NAME, null); + + DetectorProfile profile = new DetectorProfile(); + if (result.getError() != null) { + profile.setError(result.getError()); + } + listener.onResponse(profile); + } catch (IOException | XContentParseException | NullPointerException e) { + logger.error("Fail to parse anomaly result with " + hit.toString()); + listener.onFailure(new RuntimeException("Fail to find detector error: " + detectorId, e)); + } + } + }, exception -> { + if (exception instanceof IndexNotFoundException) { + listener.onResponse(new DetectorProfile()); + } else { + logger.error("Fail to find any anomaly result after AD job enabled time for detector {}", detectorId); + listener.onFailure(new RuntimeException("Fail to find detector error: " + detectorId, exception)); + } + }); + } + + /** + * Create search request to check if we have at least 1 anomaly score larger than 0 after AD job enabled time + * @param detectorId detector id + * @param enabledTime the time when AD job is enabled in milliseconds + * @return the search request + */ + private SearchRequest createInittedEverRequest(String detectorId, long enabledTime) { + BoolQueryBuilder filterQuery = new BoolQueryBuilder(); + filterQuery.filter(QueryBuilders.termQuery(AnomalyResult.DETECTOR_ID_FIELD, detectorId)); + filterQuery.filter(QueryBuilders.rangeQuery(AnomalyResult.EXECUTION_END_TIME_FIELD).gte(enabledTime)); + filterQuery.filter(QueryBuilders.rangeQuery(AnomalyResult.ANOMALY_SCORE_FIELD).gt(0)); + + SearchSourceBuilder source = new SearchSourceBuilder().query(filterQuery).size(1); + + SearchRequest request = new SearchRequest(AnomalyResult.ANOMALY_RESULT_INDEX); + request.source(source); + return request; + } + + /** + * Create search request to get the latest anomaly result after AD job enabled time + * @param detectorId detector id + * @param enabledTime the time when AD job is enabled in milliseconds + * @return the search request + */ + private SearchRequest createLatestAnomalyResultRequest(String detectorId, long enabledTime) { + BoolQueryBuilder filterQuery = new BoolQueryBuilder(); + filterQuery.filter(QueryBuilders.termQuery(AnomalyResult.DETECTOR_ID_FIELD, detectorId)); + filterQuery.filter(QueryBuilders.rangeQuery(AnomalyResult.EXECUTION_END_TIME_FIELD).gte(enabledTime)); + + FieldSortBuilder sortQuery = new FieldSortBuilder(AnomalyResult.EXECUTION_END_TIME_FIELD).order(SortOrder.DESC); + + SearchSourceBuilder source = new SearchSourceBuilder().query(filterQuery).size(1).sort(sortQuery); + + SearchRequest request = new SearchRequest(AnomalyResult.ANOMALY_RESULT_INDEX); + request.source(source); + return request; + } +} diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorRunner.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorRunner.java index 5998b08f..5a613b50 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorRunner.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorRunner.java @@ -58,6 +58,7 @@ public AnomalyDetectorRunner(ModelManager modelManager, FeatureManager featureMa * @param startTime detection period start time * @param endTime detection period end time * @param listener handle anomaly result + * @throws IOException - if a user gives wrong query input when defining a detector */ public void executeDetector(AnomalyDetector detector, Instant startTime, Instant endTime, ActionListener> listener) throws IOException { diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManager.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManager.java index dbf74b16..e334645e 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManager.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Arrays; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; @@ -108,6 +109,7 @@ public String getName() { private final CheckpointDao checkpointDao; private final Gson gson; private final Clock clock; + private final int shingleSize; // A tree of N samples has 2N nodes, with one bounding box for each node. private static final long BOUNDING_BOXES = 2L; @@ -160,7 +162,8 @@ public ModelManager( Class thresholdingModelClass, int minPreviewSize, Duration modelTtl, - Duration checkpointInterval + Duration checkpointInterval, + int shingleSize ) { this.clusterService = clusterService; @@ -188,6 +191,7 @@ public ModelManager( this.forests = new ConcurrentHashMap<>(); this.thresholds = new ConcurrentHashMap<>(); + this.shingleSize = shingleSize; } /** @@ -272,6 +276,36 @@ public Entry getPartitionedForestSizes(RandomCutForest forest, return new SimpleImmutableEntry<>(numPartitions, forestSize); } + /** + * Construct a RCF model and then partition it by forest size. + * + * A RCF model is constructed based on the number of input features. + * + * Then a RCF model is first partitioned into desired size based on heap. + * If there are more partitions than the number of nodes in the cluster, + * the model is partitioned by the number of nodes and verified to + * ensure the size of a partition does not exceed the max size limit based on heap. + * + * @param detector detector object + * @return a pair of number of partitions and size of a parition (number of trees) + * @throws LimitExceededException when there is no sufficient resouce available + */ + public Entry getPartitionedForestSizes(AnomalyDetector detector) { + String detectorId = detector.getDetectorId(); + int rcfNumFeatures = detector.getEnabledFeatureIds().size() * shingleSize; + return getPartitionedForestSizes( + RandomCutForest + .builder() + .dimensions(rcfNumFeatures) + .sampleSize(rcfNumSamplesInTree) + .numberOfTrees(rcfNumTrees) + .outputAfter(rcfNumSamplesInTree) + .parallelExecutionEnabled(false) + .build(), + detectorId + ); + } + /** * Gets the estimated size of a RCF model. * @@ -542,20 +576,22 @@ public void trainModel(AnomalyDetector anomalyDetector, double[][] dataPoints) { if (dataPoints.length == 0 || dataPoints[0].length == 0) { throw new IllegalArgumentException("Data points must not be empty."); } + if (dataPoints[0].length != anomalyDetector.getEnabledFeatureIds().size() * shingleSize) { + throw new IllegalArgumentException( + String + .format( + Locale.ROOT, + "Feature dimension is not correct, we expect %s but get %d", + anomalyDetector.getEnabledFeatureIds().size() * shingleSize, + dataPoints[0].length + ) + ); + } int rcfNumFeatures = dataPoints[0].length; // Create partitioned RCF models - Entry partitionResults = getPartitionedForestSizes( - RandomCutForest - .builder() - .dimensions(rcfNumFeatures) - .sampleSize(rcfNumSamplesInTree) - .numberOfTrees(rcfNumTrees) - .outputAfter(rcfNumSamplesInTree) - .parallelExecutionEnabled(false) - .build(), - anomalyDetector.getDetectorId() - ); + Entry partitionResults = getPartitionedForestSizes(anomalyDetector); + int numForests = partitionResults.getKey(); int forestSize = partitionResults.getValue(); double[] scores = new double[dataPoints.length]; diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyDetectorJob.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyDetectorJob.java index 62a42cf7..bf552941 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyDetectorJob.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyDetectorJob.java @@ -96,7 +96,8 @@ public static AnomalyDetectorJob parse(XContentParser parser) throws IOException String name = null; Schedule schedule = null; TimeConfiguration windowDelay = null; - Boolean isEnabled = null; + // we cannot set it to null as isEnabled() would do the unboxing and results in null pointer exception + Boolean isEnabled = Boolean.FALSE; Instant enabledTime = null; Instant disabledTime = null; Instant lastUpdateTime = null; diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyResult.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyResult.java index 077ba33d..d0881e3b 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyResult.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/AnomalyResult.java @@ -18,6 +18,9 @@ import com.amazon.opendistroforelasticsearch.ad.annotation.Generated; import com.amazon.opendistroforelasticsearch.ad.util.ParseUtils; import com.google.common.base.Objects; + +import org.elasticsearch.common.ParseField; +import org.elasticsearch.common.xcontent.NamedXContentRegistry; import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; @@ -35,10 +38,17 @@ */ public class AnomalyResult implements ToXContentObject { + public static final String PARSE_FIELD_NAME = "AnomalyResult"; + public static final NamedXContentRegistry.Entry XCONTENT_REGISTRY = new NamedXContentRegistry.Entry( + AnomalyResult.class, + new ParseField(PARSE_FIELD_NAME), + it -> parse(it) + ); + public static final String ANOMALY_RESULT_INDEX = ".opendistro-anomaly-results"; public static final String DETECTOR_ID_FIELD = "detector_id"; - private static final String ANOMALY_SCORE_FIELD = "anomaly_score"; + public static final String ANOMALY_SCORE_FIELD = "anomaly_score"; private static final String ANOMALY_GRADE_FIELD = "anomaly_grade"; private static final String CONFIDENCE_FIELD = "confidence"; private static final String FEATURE_DATA_FIELD = "feature_data"; diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorProfile.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorProfile.java new file mode 100644 index 00000000..30650cbe --- /dev/null +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorProfile.java @@ -0,0 +1,107 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad.model; + +import java.io.IOException; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.ToXContentObject; +import org.elasticsearch.common.xcontent.XContentBuilder; + +public class DetectorProfile implements ToXContentObject, Mergeable { + private DetectorState state; + private String error; + + private static final String STATE_FIELD = "state"; + private static final String ERROR_FIELD = "error"; + + public XContentBuilder toXContent(XContentBuilder builder) throws IOException { + return toXContent(builder, ToXContent.EMPTY_PARAMS); + } + + @Override + public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { + XContentBuilder xContentBuilder = builder.startObject(); + + if (state != null) { + xContentBuilder.field(STATE_FIELD, state); + } + if (error != null) { + xContentBuilder.field(ERROR_FIELD, error); + } + return xContentBuilder.endObject(); + } + + public DetectorState getState() { + return state; + } + + public void setState(DetectorState state) { + this.state = state; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + @Override + public void merge(Mergeable other) { + if (this == other || other == null || getClass() != other.getClass()) { + return; + } + DetectorProfile otherProfile = (DetectorProfile) other; + if (otherProfile.getState() != null) { + this.state = otherProfile.getState(); + } + if (otherProfile.getError() != null) { + this.error = otherProfile.getError(); + } + + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + if (obj instanceof DetectorProfile) { + DetectorProfile other = (DetectorProfile) obj; + + return new EqualsBuilder().append(state, other.state).append(error, other.error).isEquals(); + } + return false; + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(state).append(error).toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this).append("state", state).append("error", error).toString(); + } +} diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorState.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorState.java new file mode 100644 index 00000000..08307942 --- /dev/null +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/DetectorState.java @@ -0,0 +1,22 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad.model; + +public enum DetectorState { + DISABLED, + INIT, + RUNNING +} diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/Mergeable.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/Mergeable.java new file mode 100644 index 00000000..7093af99 --- /dev/null +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/Mergeable.java @@ -0,0 +1,20 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad.model; + +public interface Mergeable { + void merge(Mergeable other); +} diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/ProfileName.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/ProfileName.java new file mode 100644 index 00000000..ea0be275 --- /dev/null +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/model/ProfileName.java @@ -0,0 +1,73 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad.model; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public enum ProfileName { + STATE("state"), + ERROR("error"); + + private String name; + + ProfileName(String name) { + this.name = name; + } + + /** + * Get profile name + * + * @return name + */ + public String getName() { + return name; + } + + /** + * Get set of profile names + * + * @return set of profile names + */ + public static Set getNames() { + Set names = new HashSet<>(); + + for (ProfileName statName : ProfileName.values()) { + names.add(statName.getName()); + } + return names; + } + + public static ProfileName getName(String name) { + switch (name) { + case "state": + return STATE; + case "error": + return ERROR; + default: + throw new IllegalArgumentException("Unsupported profile types"); + } + } + + public static Set getNames(Collection names) { + Set res = new HashSet<>(); + for (String name : names) { + res.add(getName(name)); + } + return res; + } +} diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/AbstractSearchAction.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/AbstractSearchAction.java index ef4a4137..3f98befd 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/AbstractSearchAction.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/AbstractSearchAction.java @@ -80,13 +80,18 @@ public RestResponse buildResponse(SearchResponse response) throws Exception { return new BytesRestResponse(RestStatus.REQUEST_TIMEOUT, response.toString()); } - for (SearchHit hit : response.getHits()) { - XContentParser parser = XContentType.JSON - .xContent() - .createParser(channel.request().getXContentRegistry(), LoggingDeprecationHandler.INSTANCE, hit.getSourceAsString()); - ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); + if (clazz == AnomalyDetector.class) { + for (SearchHit hit : response.getHits()) { + XContentParser parser = XContentType.JSON + .xContent() + .createParser( + channel.request().getXContentRegistry(), + LoggingDeprecationHandler.INSTANCE, + hit.getSourceAsString() + ); + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); - if (clazz == AnomalyDetector.class) { + // write back id and version to anomaly detector object ToXContentObject xContentObject = AnomalyDetector.parse(parser, hit.getId(), hit.getVersion()); XContentBuilder builder = xContentObject.toXContent(jsonBuilder(), EMPTY_PARAMS); hit.sourceRef(BytesReference.bytes(builder)); diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/RestGetAnomalyDetectorAction.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/RestGetAnomalyDetectorAction.java index 82582ad7..21e142e6 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/RestGetAnomalyDetectorAction.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/rest/RestGetAnomalyDetectorAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -17,8 +17,13 @@ import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector; import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob; +import com.amazon.opendistroforelasticsearch.ad.model.DetectorProfile; +import com.amazon.opendistroforelasticsearch.ad.model.ProfileName; import com.amazon.opendistroforelasticsearch.ad.util.RestHandlerUtils; +import com.google.common.collect.Sets; import com.amazon.opendistroforelasticsearch.ad.AnomalyDetectorPlugin; +import com.amazon.opendistroforelasticsearch.ad.AnomalyDetectorProfileRunner; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -27,6 +32,7 @@ import org.elasticsearch.action.get.MultiGetRequest; import org.elasticsearch.action.get.MultiGetResponse; import org.elasticsearch.client.node.NodeClient; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.rest.BaseRestHandler; @@ -40,11 +46,16 @@ import org.elasticsearch.rest.action.RestResponseListener; import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; import java.util.Locale; +import java.util.Set; import static com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector.ANOMALY_DETECTORS_INDEX; import static com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob.ANOMALY_DETECTOR_JOB_INDEX; import static com.amazon.opendistroforelasticsearch.ad.util.RestHandlerUtils.DETECTOR_ID; +import static com.amazon.opendistroforelasticsearch.ad.util.RestHandlerUtils.PROFILE; +import static com.amazon.opendistroforelasticsearch.ad.util.RestHandlerUtils.TYPE; import static com.amazon.opendistroforelasticsearch.ad.util.RestHandlerUtils.createXContentParser; import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; @@ -55,11 +66,36 @@ public class RestGetAnomalyDetectorAction extends BaseRestHandler { private static final String GET_ANOMALY_DETECTOR_ACTION = "get_anomaly_detector"; private static final Logger logger = LogManager.getLogger(RestGetAnomalyDetectorAction.class); + private final AnomalyDetectorProfileRunner profileRunner; + private final Set allProfileTypeStrs; + private final Set allProfileTypes; + + public RestGetAnomalyDetectorAction( + RestController controller, + AnomalyDetectorProfileRunner profileRunner, + Set allProfileTypeStrs + ) { + this.profileRunner = profileRunner; + this.allProfileTypes = new HashSet(Arrays.asList(ProfileName.values())); + this.allProfileTypeStrs = ProfileName.getNames(); - public RestGetAnomalyDetectorAction(RestController controller) { String path = String.format(Locale.ROOT, "%s/{%s}", AnomalyDetectorPlugin.AD_BASE_DETECTORS_URI, DETECTOR_ID); controller.registerHandler(RestRequest.Method.GET, path, this); controller.registerHandler(RestRequest.Method.HEAD, path, this); + controller + .registerHandler( + RestRequest.Method.GET, + String.format(Locale.ROOT, "%s/{%s}/%s", AnomalyDetectorPlugin.AD_BASE_DETECTORS_URI, DETECTOR_ID, PROFILE), + this + ); + // types is a profile names. See a complete list of supported profiles names in + // com.amazon.opendistroforelasticsearch.ad.model.ProfileName. + controller + .registerHandler( + RestRequest.Method.GET, + String.format(Locale.ROOT, "%s/{%s}/%s/{%s}", AnomalyDetectorPlugin.AD_BASE_DETECTORS_URI, DETECTOR_ID, PROFILE, TYPE), + this + ); } @Override @@ -71,16 +107,23 @@ public String getName() { protected RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException { String detectorId = request.param(DETECTOR_ID); boolean returnJob = request.paramAsBoolean("job", false); - MultiGetRequest.Item adItem = new MultiGetRequest.Item(ANOMALY_DETECTORS_INDEX, detectorId) - .version(RestActions.parseVersion(request)); - MultiGetRequest multiGetRequest = new MultiGetRequest().add(adItem); - if (returnJob) { - MultiGetRequest.Item adJobItem = new MultiGetRequest.Item(ANOMALY_DETECTOR_JOB_INDEX, detectorId) + String typesStr = request.param(TYPE); + String rawPath = request.rawPath(); + if (!Strings.isEmpty(typesStr) || rawPath.endsWith(PROFILE) || rawPath.endsWith(PROFILE + "/")) { + return channel -> profileRunner + .profile(detectorId, getProfileActionListener(channel, detectorId), getProfilesToCollect(typesStr)); + } else { + MultiGetRequest.Item adItem = new MultiGetRequest.Item(ANOMALY_DETECTORS_INDEX, detectorId) .version(RestActions.parseVersion(request)); - multiGetRequest.add(adJobItem); - } + MultiGetRequest multiGetRequest = new MultiGetRequest().add(adItem); + if (returnJob) { + MultiGetRequest.Item adJobItem = new MultiGetRequest.Item(ANOMALY_DETECTOR_JOB_INDEX, detectorId) + .version(RestActions.parseVersion(request)); + multiGetRequest.add(adJobItem); + } - return channel -> client.multiGet(multiGetRequest, onMultiGetResponse(channel, returnJob, detectorId)); + return channel -> client.multiGet(multiGetRequest, onMultiGetResponse(channel, returnJob, detectorId)); + } } private ActionListener onMultiGetResponse(RestChannel channel, boolean returnJob, String detectorId) { @@ -110,12 +153,8 @@ public RestResponse buildResponse(MultiGetResponse multiGetResponse) throws Exce ) { ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); detector = parser.namedObject(AnomalyDetector.class, AnomalyDetector.PARSE_FIELD_NAME, null); - } catch (Throwable t) { - logger.error("Fail to parse detector", t); - return new BytesRestResponse( - RestStatus.INTERNAL_SERVER_ERROR, - "Failed to parse detector with id: " + detectorId - ); + } catch (Exception e) { + return buildInternalServerErrorResponse(e, "Failed to parse detector with id: " + detectorId); } } } @@ -127,12 +166,8 @@ public RestResponse buildResponse(MultiGetResponse multiGetResponse) throws Exce try (XContentParser parser = createXContentParser(channel, response.getResponse().getSourceAsBytesRef())) { ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); adJob = AnomalyDetectorJob.parse(parser); - } catch (Throwable t) { - logger.error("Fail to parse detector job ", t); - return new BytesRestResponse( - RestStatus.INTERNAL_SERVER_ERROR, - "Failed to parse detector job with id: " + detectorId - ); + } catch (Exception e) { + return buildInternalServerErrorResponse(e, "Failed to parse detector job with id: " + detectorId); } } } @@ -148,4 +183,25 @@ public RestResponse buildResponse(MultiGetResponse multiGetResponse) throws Exce }; } + private ActionListener getProfileActionListener(RestChannel channel, String detectorId) { + return ActionListener + .wrap( + profile -> { channel.sendResponse(new BytesRestResponse(RestStatus.OK, profile.toXContent(channel.newBuilder()))); }, + exception -> { channel.sendResponse(buildInternalServerErrorResponse(exception, exception.getMessage())); } + ); + } + + private RestResponse buildInternalServerErrorResponse(Exception e, String errorMsg) { + logger.error(errorMsg, e); + return new BytesRestResponse(RestStatus.INTERNAL_SERVER_ERROR, errorMsg); + } + + private Set getProfilesToCollect(String typesStr) { + if (Strings.isEmpty(typesStr)) { + return this.allProfileTypes; + } else { + Set typesInRequest = new HashSet<>(Arrays.asList(typesStr.split(","))); + return ProfileName.getNames(Sets.intersection(this.allProfileTypeStrs, typesInRequest)); + } + } } diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManager.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManager.java index eb57123c..4e993c50 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManager.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -22,19 +22,18 @@ import java.time.Instant; import java.util.Map; import java.util.Optional; -import java.util.Random; import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; -import com.amazon.opendistroforelasticsearch.ad.common.exception.AnomalyDetectionException; import com.amazon.opendistroforelasticsearch.ad.common.exception.LimitExceededException; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector; -import com.amazon.opendistroforelasticsearch.ad.settings.AnomalyDetectorSettings; import com.amazon.opendistroforelasticsearch.ad.util.ClientUtil; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.Client; @@ -44,8 +43,6 @@ import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; -import com.amazon.randomcutforest.RandomCutForest; - /** * ADStateManager is used by transport layer to manage AnomalyDetector object * and the number of partitions for a detector id. @@ -56,7 +53,6 @@ public class ADStateManager { private ConcurrentHashMap> currentDetectors; private ConcurrentHashMap> partitionNumber; private Client client; - private Random random; private ModelManager modelManager; private NamedXContentRegistry xContentRegistry; private ClientUtil clientUtil; @@ -77,7 +73,6 @@ public ADStateManager( ) { this.currentDetectors = new ConcurrentHashMap<>(); this.client = client; - this.random = new Random(); this.modelManager = modelManager; this.xContentRegistry = xContentRegistry; this.partitionNumber = new ConcurrentHashMap<>(); @@ -91,67 +86,58 @@ public ADStateManager( /** * Get the number of RCF model's partition number for detector adID * @param adID detector id + * @param detector object * @return the number of RCF model's partition number for adID - * @throws InterruptedException when we cannot get anomaly detector object for adID before timeout * @throws LimitExceededException when there is no sufficient resource available */ - public int getPartitionNumber(String adID) throws InterruptedException { + public int getPartitionNumber(String adID, AnomalyDetector detector) { Entry partitonAndTime = partitionNumber.get(adID); if (partitonAndTime != null) { partitonAndTime.setValue(clock.instant()); return partitonAndTime.getKey(); } - Optional detector = getAnomalyDetector(adID); - if (!detector.isPresent()) { - throw new AnomalyDetectionException(adID, "AnomalyDetector is not found"); - } - - RandomCutForest forest = RandomCutForest - .builder() - .dimensions(detector.get().getFeatureAttributes().size() * AnomalyDetectorSettings.SHINGLE_SIZE) - .sampleSize(AnomalyDetectorSettings.NUM_SAMPLES_PER_TREE) - .numberOfTrees(AnomalyDetectorSettings.NUM_TREES) - .parallelExecutionEnabled(false) - .build(); - int partitionNum = modelManager.getPartitionedForestSizes(forest, adID).getKey(); + int partitionNum = modelManager.getPartitionedForestSizes(detector).getKey(); partitionNumber.putIfAbsent(adID, new SimpleEntry<>(partitionNum, clock.instant())); return partitionNum; } - public Optional getAnomalyDetector(String adID) { + public void getAnomalyDetector(String adID, ActionListener> listener) { Entry detectorAndTime = currentDetectors.get(adID); if (detectorAndTime != null) { detectorAndTime.setValue(clock.instant()); - return Optional.of(detectorAndTime.getKey()); + listener.onResponse(Optional.of(detectorAndTime.getKey())); + return; } GetRequest request = new GetRequest(AnomalyDetector.ANOMALY_DETECTORS_INDEX, adID); - Optional getResponse = clientUtil.timedRequest(request, LOG, client::get); - - return onGetResponse(getResponse, adID); + clientUtil.asyncRequest(request, client::get, onGetResponse(adID, listener)); } - private Optional onGetResponse(Optional asResponse, String adID) { - if (!asResponse.isPresent() || !asResponse.get().isExists()) { - return Optional.empty(); - } + private ActionListener onGetResponse(String adID, ActionListener> listener) { + return ActionListener.wrap(response -> { + if (response == null || !response.isExists()) { + listener.onResponse(Optional.empty()); + return; + } - GetResponse response = asResponse.get(); - String xc = response.getSourceAsString(); - LOG.debug("Fetched anomaly detector: {}", xc); - - try (XContentParser parser = XContentType.JSON.xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, xc)) { - ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); - AnomalyDetector detector = AnomalyDetector.parse(parser, response.getId()); - currentDetectors.put(adID, new SimpleEntry<>(detector, clock.instant())); - return Optional.of(detector); - } catch (Exception t) { - LOG.error("Fail to parse detector {}", adID); - LOG.error("Stack trace:", t); - return Optional.empty(); - } + String xc = response.getSourceAsString(); + LOG.info("Fetched anomaly detector: {}", xc); + + try ( + XContentParser parser = XContentType.JSON.xContent().createParser(xContentRegistry, LoggingDeprecationHandler.INSTANCE, xc) + ) { + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser::getTokenLocation); + AnomalyDetector detector = AnomalyDetector.parse(parser, response.getId()); + currentDetectors.put(adID, new SimpleEntry<>(detector, clock.instant())); + listener.onResponse(Optional.of(detector)); + } catch (Exception t) { + LOG.error("Fail to parse detector {}", adID); + LOG.error("Stack trace:", t); + listener.onResponse(Optional.empty()); + } + }, listener::onFailure); } /** diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTransportAction.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTransportAction.java index 4d3f62a9..f130ab9c 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTransportAction.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTransportAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -32,9 +32,9 @@ import com.amazon.opendistroforelasticsearch.ad.common.exception.LimitExceededException; import com.amazon.opendistroforelasticsearch.ad.common.exception.ResourceNotFoundException; import com.amazon.opendistroforelasticsearch.ad.constant.CommonErrorMessages; +import com.amazon.opendistroforelasticsearch.ad.constant.CommonName; import com.amazon.opendistroforelasticsearch.ad.feature.FeatureManager; import com.amazon.opendistroforelasticsearch.ad.feature.SinglePointFeatures; -import com.amazon.opendistroforelasticsearch.ad.indices.AnomalyDetectionIndices; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; import com.amazon.opendistroforelasticsearch.ad.ml.RcfResult; import com.amazon.opendistroforelasticsearch.ad.ml.rcf.CombinedRcfResult; @@ -45,6 +45,7 @@ import com.amazon.opendistroforelasticsearch.ad.stats.ADStats; import com.amazon.opendistroforelasticsearch.ad.stats.StatNames; import com.amazon.opendistroforelasticsearch.ad.util.ColdStartRunner; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.message.ParameterizedMessage; @@ -54,11 +55,9 @@ import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionListenerResponseHandler; import org.elasticsearch.action.ActionRequest; -import org.elasticsearch.action.bulk.BackoffPolicy; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.HandledTransportAction; import org.elasticsearch.action.support.IndicesOptions; -import org.elasticsearch.client.Client; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.block.ClusterBlockLevel; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; @@ -69,12 +68,12 @@ import org.elasticsearch.common.io.stream.NotSerializableExceptionWrapper; import org.elasticsearch.node.NodeClosedException; import org.elasticsearch.tasks.Task; -import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.ConnectTransportException; import org.elasticsearch.transport.ReceiveTimeoutTransportException; import org.elasticsearch.transport.TransportRequestOptions; import org.elasticsearch.transport.TransportService; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.IndexNotFoundException; public class AnomalyResultTransportAction extends HandledTransportAction { @@ -83,6 +82,7 @@ public class AnomalyResultTransportAction extends HandledTransportAction getFeatureData(double[] currentFeature, AnomalyDetecto * + unknown prediction error * * Known cause of EndRunException with endNow returning true: - * + anomaly detector is not available - * + a models' memory size reached limit + * + a model's memory size reached limit * + models' total memory size reached limit + * + Having trouble querying feature data due to + * * index does not exist + * * all features have been disabled + * + anomaly detector is not available + * * Known cause of InternalFailure: * + threshold model node is not available * + cluster read/write is blocked - * + interrupted while waiting for rcf/threshold model nodes' responses * + cold start hasn't been finished * + fail to get all of rcf model nodes' responses * + fail to get threshold model node's response * + RCF/Threshold model node failing to get checkpoint to restore model before timeout + * + Detection is throttle because previous detection query is running * */ @Override @@ -225,7 +214,18 @@ protected void doExecute(Task task, ActionRequest actionRequest, ActionListener< } try { - Optional detector = stateManager.getAnomalyDetector(adID); + stateManager.getAnomalyDetector(adID, onGetDetector(listener, adID, request)); + } catch (Exception ex) { + handleExecuteException(ex, listener, adID); + } + } + + private ActionListener> onGetDetector( + ActionListener listener, + String adID, + AnomalyResultRequest request + ) { + return ActionListener.wrap(detector -> { if (!detector.isPresent()) { listener.onFailure(new EndRunException(adID, "AnomalyDetector is not available.", true)); return; @@ -233,13 +233,15 @@ protected void doExecute(Task task, ActionRequest actionRequest, ActionListener< AnomalyDetector anomalyDetector = detector.get(); String thresholdModelID = modelManager.getThresholdModelId(adID); - Optional thresholdNode = hashRing.getOwningNode(thresholdModelID); - if (!thresholdNode.isPresent()) { + Optional asThresholdNode = hashRing.getOwningNode(thresholdModelID); + if (!asThresholdNode.isPresent()) { listener.onFailure(new InternalFailure(adID, "Threshold model node is not available.")); return; } - if (!shouldStart(listener, adID, detector.get(), thresholdNode.get().getId(), thresholdModelID)) { + DiscoveryNode thresholdNode = asThresholdNode.get(); + + if (!shouldStart(listener, adID, anomalyDetector, thresholdNode.getId(), thresholdModelID)) { return; } @@ -250,12 +252,31 @@ protected void doExecute(Task task, ActionRequest actionRequest, ActionListener< long dataStartTime = request.getStart() - delayMillis; long dataEndTime = request.getEnd() - delayMillis; - SinglePointFeatures featureOptional = featureManager.getCurrentFeatures(anomalyDetector, dataStartTime, dataEndTime); + featureManager + .getCurrentFeatures( + anomalyDetector, + dataStartTime, + dataEndTime, + onFeatureResponse(adID, anomalyDetector, listener, thresholdModelID, thresholdNode, dataStartTime, dataEndTime) + ); + }, exception -> handleExecuteException(exception, listener, adID)); + + } + private ActionListener onFeatureResponse( + String adID, + AnomalyDetector detector, + ActionListener listener, + String thresholdModelID, + DiscoveryNode thresholdNode, + long dataStartTime, + long dataEndTime + ) { + return ActionListener.wrap(featureOptional -> { List featureInResponse = null; if (featureOptional.getUnprocessedFeatures().isPresent()) { - featureInResponse = getFeatureData(featureOptional.getUnprocessedFeatures().get(), detector.get()); + featureInResponse = getFeatureData(featureOptional.getUnprocessedFeatures().get(), detector); } if (!featureOptional.getProcessedFeatures().isPresent()) { @@ -293,7 +314,7 @@ protected void doExecute(Task task, ActionRequest actionRequest, ActionListener< // Can throw LimitExceededException when a single partition is more than X% of heap memory. // Compute this number once and the value won't change unless the coordinating AD node for an // detector changes or the cluster size changes. - int rcfPartitionNum = stateManager.getPartitionNumber(adID); + int rcfPartitionNum = stateManager.getPartitionNumber(adID, detector); List rcfResults = new ArrayList<>(); @@ -326,8 +347,6 @@ protected void doExecute(Task task, ActionRequest actionRequest, ActionListener< thresholdModelID, thresholdNode, featureInResponse, - dataStartTime, - dataEndTime, rcfPartitionNum, responseCount, adID @@ -342,9 +361,15 @@ protected void doExecute(Task task, ActionRequest actionRequest, ActionListener< new ActionListenerResponseHandler<>(rcfListener, RCFResultResponse::new) ); } - } catch (Exception ex) { - handleExecuteException(ex, listener, adID); - } + }, exception -> { + if (exception instanceof IndexNotFoundException) { + listener.onFailure(new EndRunException(adID, "Having trouble querying data: " + exception.getMessage(), true)); + } else if (exception instanceof IllegalArgumentException && detector.getEnabledFeatureIds().isEmpty()) { + listener.onFailure(new EndRunException(adID, ALL_FEATURES_DISABLED_ERR_MSG, true)); + } else { + handleExecuteException(exception, listener, adID); + } + }); } /** @@ -390,7 +415,9 @@ private void findException(Throwable cause, String adID, AtomicReference previousException = globalRunner.fetchException(adID); @@ -468,13 +495,11 @@ class RCFActionListener implements ActionListener { private String modelID; private AtomicReference failure; private String rcfNodeID; - private Optional detector; + private AnomalyDetector detector; private ActionListener listener; private String thresholdModelID; - private Optional thresholdNode; + private DiscoveryNode thresholdNode; private List featureInResponse; - private long startTime; - private long endTime; private int nodeCount; private final AtomicInteger responseCount; private final String adID; @@ -484,13 +509,11 @@ class RCFActionListener implements ActionListener { String modelID, AtomicReference failure, String rcfNodeID, - Optional detector, + AnomalyDetector detector, ActionListener listener, String thresholdModelID, - Optional thresholdNode, + DiscoveryNode thresholdNode, List features, - long startTime, - long endTime, int nodeCount, AtomicInteger responseCount, String adID @@ -504,8 +527,6 @@ class RCFActionListener implements ActionListener { this.thresholdModelID = thresholdModelID; this.featureInResponse = features; this.failure = failure; - this.startTime = startTime; - this.endTime = endTime; this.nodeCount = nodeCount; this.responseCount = responseCount; this.adID = adID; @@ -544,7 +565,7 @@ public void onFailure(Exception e) { private void handleRCFResults() { try { - if (coldStartIfNoModel(failure, detector.get()) || rcfResults.isEmpty()) { + if (coldStartIfNoModel(failure, detector) || rcfResults.isEmpty()) { listener.onFailure(new InternalFailure(adID, NO_MODEL_ERR_MSG)); return; } @@ -554,7 +575,7 @@ private void handleRCFResults() { final AtomicReference anomalyResultResponse = new AtomicReference<>(); - String thresholdNodeId = thresholdNode.get().getId(); + String thresholdNodeId = thresholdNode.getId(); LOG.info("Sending threshold request to {} for model {}", thresholdNodeId, thresholdModelID); ThresholdActionListener thresholdListener = new ThresholdActionListener( anomalyResultResponse, @@ -563,15 +584,12 @@ private void handleRCFResults() { thresholdNodeId, detector, combinedResult, - featureInResponse, listener, - startTime, - endTime, adID ); transportService .sendRequest( - thresholdNode.get(), + thresholdNode, ThresholdResultAction.NAME, new ThresholdResultRequest(adID, thresholdModelID, combinedScore), option, @@ -590,11 +608,8 @@ class ThresholdActionListener implements ActionListener private AtomicReference failure; private String thresholdNodeID; private ActionListener listener; - private Optional detector; + private AnomalyDetector detector; private CombinedRcfResult combinedResult; - private List featureInResponse; - private long startTime; - private long endTime; private String adID; ThresholdActionListener( @@ -602,12 +617,9 @@ class ThresholdActionListener implements ActionListener List features, String modelID, String thresholdNodeID, - Optional detector, + AnomalyDetector detector, CombinedRcfResult combinedResult, - List featureInResponse, ActionListener listener, - long startTime, - long endTime, String adID ) { this.anomalyResultResponse = anomalyResultResponse; @@ -616,9 +628,6 @@ class ThresholdActionListener implements ActionListener this.thresholdNodeID = thresholdNodeID; this.detector = detector; this.combinedResult = combinedResult; - this.featureInResponse = featureInResponse; - this.startTime = startTime; - this.endTime = endTime; this.failure = new AtomicReference(); this.listener = listener; this.adID = adID; @@ -650,7 +659,7 @@ public void onFailure(Exception e) { private void handleThresholdResult() { try { - if (coldStartIfNoModel(failure, detector.get())) { + if (coldStartIfNoModel(failure, detector)) { listener.onFailure(new InternalFailure(adID, NO_MODEL_ERR_MSG)); return; } diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTransportAction.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTransportAction.java index 41e11052..382c632c 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTransportAction.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTransportAction.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ import com.amazon.opendistroforelasticsearch.ad.common.exception.LimitExceededException; import com.amazon.opendistroforelasticsearch.ad.constant.CommonErrorMessages; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; -import com.amazon.opendistroforelasticsearch.ad.ml.RcfResult; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.action.ActionListener; @@ -57,8 +57,21 @@ protected void doExecute(Task task, RCFResultRequest request, ActionListener listener + .onResponse(new RCFResultResponse(result.getScore(), result.getConfidence(), result.getForestSize())), + exception -> { + LOG.warn(exception); + listener.onFailure(exception); + } + ) + ); } catch (Exception e) { LOG.error(e); listener.onFailure(e); diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/StopDetectorTransportAction.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/StopDetectorTransportAction.java index fb140a8a..d434837e 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/StopDetectorTransportAction.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/StopDetectorTransportAction.java @@ -15,7 +15,6 @@ package com.amazon.opendistroforelasticsearch.ad.transport; -import com.amazon.opendistroforelasticsearch.ad.cluster.DeleteDetector; import com.amazon.opendistroforelasticsearch.ad.common.exception.InternalFailure; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -39,20 +38,17 @@ public class StopDetectorTransportAction extends HandledTransportAction { private static final Logger LOG = LogManager.getLogger(ThresholdResultTransportAction.class); @@ -42,8 +42,17 @@ protected void doExecute(Task task, ThresholdResultRequest request, ActionListen try { LOG.info("Serve threshold request for {}", request.getModelID()); - ThresholdingResult result = manager.getThresholdingResult(request.getAdID(), request.getModelID(), request.getRCFScore()); - listener.onResponse(new ThresholdResultResponse(result.getGrade(), result.getConfidence())); + manager + .getThresholdingResult( + request.getAdID(), + request.getModelID(), + request.getRCFScore(), + ActionListener + .wrap( + result -> listener.onResponse(new ThresholdResultResponse(result.getGrade(), result.getConfidence())), + exception -> listener.onFailure(exception) + ) + ); } catch (Exception e) { LOG.error(e); listener.onFailure(e); diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/handler/AnomalyResultHandler.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/handler/AnomalyResultHandler.java index 742a0689..e9a970cc 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/handler/AnomalyResultHandler.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/transport/handler/AnomalyResultHandler.java @@ -172,35 +172,27 @@ private void saveDetectorResult(AnomalyResult anomalyResult) { } void saveDetectorResult(IndexRequest indexRequest, String context, Iterator backoff) { - client - .index( - indexRequest, - ActionListener - .wrap( - response -> LOG.debug(SUCCESS_SAVING_MSG + context), - exception -> { - // Elasticsearch has a thread pool and a queue for write per node. A thread - // pool will have N number of workers ready to handle the requests. When a - // request comes and if a worker is free , this is handled by the worker. Now by - // default the number of workers is equal to the number of cores on that CPU. - // When the workers are full and there are more write requests, the request - // will go to queue. The size of queue is also limited. If by default size is, - // say, 200 and if there happens more parallel requests than this, then those - // requests would be rejected as you can see EsRejectedExecutionException. - // So EsRejectedExecutionException is the way that Elasticsearch tells us that - // it cannot keep up with the current indexing rate. - // When it happens, we should pause indexing a bit before trying again, ideally - // with randomized exponential backoff. - if (!(exception instanceof EsRejectedExecutionException) || !backoff.hasNext()) { - LOG.error(FAIL_TO_SAVE_ERR_MSG + context, exception); - } else { - TimeValue nextDelay = backoff.next(); - LOG.warn(RETRY_SAVING_ERR_MSG + context, exception); - threadPool - .schedule(() -> saveDetectorResult(indexRequest, context, backoff), nextDelay, ThreadPool.Names.SAME); - } - } - ) - ); + client.index(indexRequest, ActionListener.wrap(response -> LOG.debug(SUCCESS_SAVING_MSG + context), exception -> { + // Elasticsearch has a thread pool and a queue for write per node. A thread + // pool will have N number of workers ready to handle the requests. When a + // request comes and if a worker is free , this is handled by the worker. Now by + // default the number of workers is equal to the number of cores on that CPU. + // When the workers are full and there are more write requests, the request + // will go to queue. The size of queue is also limited. If by default size is, + // say, 200 and if there happens more parallel requests than this, then those + // requests would be rejected as you can see EsRejectedExecutionException. + // So EsRejectedExecutionException is the way that Elasticsearch tells us that + // it cannot keep up with the current indexing rate. + // When it happens, we should pause indexing a bit before trying again, ideally + // with randomized exponential backoff. + Throwable cause = ExceptionsHelper.unwrapCause(exception); + if (!(cause instanceof EsRejectedExecutionException) || !backoff.hasNext()) { + LOG.error(FAIL_TO_SAVE_ERR_MSG + context, cause); + } else { + TimeValue nextDelay = backoff.next(); + LOG.warn(RETRY_SAVING_ERR_MSG + context, cause); + threadPool.schedule(() -> saveDetectorResult(indexRequest, context, backoff), nextDelay, ThreadPool.Names.SAME); + } + })); } } diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/MultiResponsesDelegateActionListener.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/MultiResponsesDelegateActionListener.java new file mode 100644 index 00000000..3f42a18c --- /dev/null +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/MultiResponsesDelegateActionListener.java @@ -0,0 +1,112 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.ActionListener; + +import com.amazon.opendistroforelasticsearch.ad.model.Mergeable; + +/** + * A listener wrapper to help send multiple requests asynchronously and return one final responses together + */ +public class MultiResponsesDelegateActionListener implements ActionListener { + private static final Logger LOG = LogManager.getLogger(MultiResponsesDelegateActionListener.class); + private final ActionListener delegate; + private final AtomicInteger collectedResponseCount; + private final int maxResponseCount; + // save responses from multiple requests + private final List savedResponses; + private List exceptions; + private String finalErrorMsg; + + public MultiResponsesDelegateActionListener(ActionListener delegate, int maxResponseCount, String finalErrorMsg) { + this.delegate = delegate; + this.collectedResponseCount = new AtomicInteger(0); + this.maxResponseCount = maxResponseCount; + this.savedResponses = Collections.synchronizedList(new ArrayList()); + this.exceptions = Collections.synchronizedList(new ArrayList()); + this.finalErrorMsg = finalErrorMsg; + } + + @Override + public void onResponse(T response) { + try { + if (response != null) { + this.savedResponses.add(response); + } + } finally { + // If expectedResponseCount == 0 , collectedResponseCount.incrementAndGet() will be greater than expectedResponseCount + if (collectedResponseCount.incrementAndGet() >= maxResponseCount) { + finish(); + } + } + + } + + @Override + public void onFailure(Exception e) { + LOG.error(e); + try { + this.exceptions.add(e.getMessage()); + } finally { + // no matter the asynchronous request is a failure or success, we need to increment the count. + // We need finally here to increment the count when there is a failure. + if (collectedResponseCount.incrementAndGet() >= maxResponseCount) { + finish(); + } + } + } + + private void finish() { + if (this.exceptions.size() == 0) { + if (savedResponses.size() == 0) { + this.delegate.onFailure(new RuntimeException("No response collected")); + } else { + T response0 = savedResponses.get(0); + for (int i = 1; i < savedResponses.size(); i++) { + response0.merge(savedResponses.get(i)); + } + this.delegate.onResponse(response0); + } + } else { + this.delegate.onFailure(new RuntimeException(String.format(Locale.ROOT, finalErrorMsg + " Exceptions: %s", exceptions))); + } + } + + public void failImmediately(Exception e) { + this.delegate.onFailure(new RuntimeException(finalErrorMsg, e)); + } + + public void failImmediately(String errMsg) { + this.delegate.onFailure(new RuntimeException(errMsg)); + } + + public void failImmediately(String errMsg, Exception e) { + this.delegate.onFailure(new RuntimeException(errMsg, e)); + } + + public void respondImmediately(T o) { + this.delegate.onResponse(o); + } +} diff --git a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/RestHandlerUtils.java b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/RestHandlerUtils.java index 2d09ea2d..057eeec7 100644 --- a/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/RestHandlerUtils.java +++ b/src/main/java/com/amazon/opendistroforelasticsearch/ad/util/RestHandlerUtils.java @@ -53,6 +53,8 @@ public final class RestHandlerUtils { public static final String PREVIEW = "_preview"; public static final String START_JOB = "_start"; public static final String STOP_JOB = "_stop"; + public static final String PROFILE = "_profile"; + public static final String TYPE = "type"; public static final ToXContent.MapParams XCONTENT_WITH_TYPE = new ToXContent.MapParams(ImmutableMap.of("with_type", "true")); private static final String KIBANA_USER_AGENT = "Kibana"; diff --git a/src/main/resources/mappings/anomaly-results.json b/src/main/resources/mappings/anomaly-results.json index 2ad310d1..80ee69e4 100644 --- a/src/main/resources/mappings/anomaly-results.json +++ b/src/main/resources/mappings/anomaly-results.json @@ -45,6 +45,9 @@ "execution_end_time": { "type": "date", "format": "strict_date_time||epoch_millis" + }, + "error": { + "type": "text" } } } diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunnerTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunnerTests.java index 0f93ed59..45b23ea0 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunnerTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorJobRunnerTests.java @@ -19,6 +19,7 @@ import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob; import com.amazon.opendistroforelasticsearch.ad.model.IntervalTimeConfiguration; import com.amazon.opendistroforelasticsearch.ad.transport.handler.AnomalyResultHandler; +import com.amazon.opendistroforelasticsearch.ad.util.ClientUtil; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.JobExecutionContext; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.LockModel; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.ScheduledJobParameter; @@ -26,6 +27,7 @@ import com.amazon.opendistroforelasticsearch.jobscheduler.spi.schedule.Schedule; import com.amazon.opendistroforelasticsearch.jobscheduler.spi.utils.LockService; import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; @@ -74,6 +76,10 @@ public class AnomalyDetectorJobRunnerTests extends AbstractADTest { @Mock private Client client; + + @Mock + private ClientUtil clientUtil; + @Mock private ClusterService clusterService; @@ -119,6 +125,7 @@ public void setup() throws Exception { doReturn(executorService).when(mockedThreadPool).executor(anyString()); runner.setThreadPool(mockedThreadPool); runner.setClient(client); + runner.setClientUtil(clientUtil); runner.setAnomalyResultHandler(anomalyResultHandler); setUpJobParameter(); @@ -214,7 +221,7 @@ public void testRunAdJobWithEndRunExceptionNow() { public void testRunAdJobWithEndRunExceptionNowAndExistingAdJob() { testRunAdJobWithEndRunExceptionNowAndStopAdJob(true, true, true); verify(anomalyResultHandler).indexAnomalyResult(any()); - verify(client).index(any(), any()); + verify(clientUtil).asyncRequest(any(IndexRequest.class), any(), any()); assertTrue(testAppender.containsMessage("AD Job was disabled by JobRunner for")); } @@ -222,7 +229,7 @@ public void testRunAdJobWithEndRunExceptionNowAndExistingAdJob() { public void testRunAdJobWithEndRunExceptionNowAndExistingAdJobAndIndexException() { testRunAdJobWithEndRunExceptionNowAndStopAdJob(true, true, false); verify(anomalyResultHandler).indexAnomalyResult(any()); - verify(client).index(any(), any()); + verify(clientUtil).asyncRequest(any(IndexRequest.class), any(), any()); assertTrue(testAppender.containsMessage("Failed to disable AD job for")); } @@ -256,7 +263,7 @@ private void testRunAdJobWithEndRunExceptionNowAndStopAdJob(boolean jobExists, b Exception exception = new EndRunException(jobParameter.getName(), randomAlphaOfLength(5), true); doAnswer(invocation -> { - ActionListener listener = invocation.getArgument(1); + ActionListener listener = invocation.getArgument(2); GetResponse response = new GetResponse( new GetResult( AnomalyDetectorJob.ANOMALY_DETECTOR_JOB_INDEX, @@ -286,11 +293,11 @@ private void testRunAdJobWithEndRunExceptionNowAndStopAdJob(boolean jobExists, b listener.onResponse(response); return null; - }).when(client).get(any(), any()); + }).when(clientUtil).asyncRequest(any(GetRequest.class), any(), any()); doAnswer(invocation -> { IndexRequest request = invocation.getArgument(0); - ActionListener listener = invocation.getArgument(1); + ActionListener listener = invocation.getArgument(2); ShardId shardId = new ShardId(new Index(AnomalyDetectorJob.ANOMALY_DETECTOR_JOB_INDEX, randomAlphaOfLength(10)), 0); if (disableSuccessfully) { listener.onResponse(new IndexResponse(shardId, randomAlphaOfLength(10), request.id(), 1, 1, 1, true)); @@ -298,7 +305,7 @@ private void testRunAdJobWithEndRunExceptionNowAndStopAdJob(boolean jobExists, b listener.onResponse(null); } return null; - }).when(client).index(any(), any()); + }).when(clientUtil).asyncRequest(any(IndexRequest.class), any(), any()); runner.handleAdException(jobParameter, lockService, lock, Instant.now().minusMillis(1000 * 60), Instant.now(), exception); } @@ -309,10 +316,10 @@ public void testRunAdJobWithEndRunExceptionNowAndGetJobException() { Exception exception = new EndRunException(jobParameter.getName(), randomAlphaOfLength(5), true); doAnswer(invocation -> { - ActionListener listener = invocation.getArgument(1); + ActionListener listener = invocation.getArgument(2); listener.onFailure(new RuntimeException("test")); return null; - }).when(client).get(any(), any()); + }).when(clientUtil).asyncRequest(any(GetRequest.class), any(), any()); runner.handleAdException(jobParameter, lockService, lock, Instant.now().minusMillis(1000 * 60), Instant.now(), exception); verify(anomalyResultHandler).indexAnomalyResult(any()); @@ -324,7 +331,7 @@ public void testRunAdJobWithEndRunExceptionNowAndFailToGetJob() { LockModel lock = new LockModel("indexName", "jobId", Instant.now(), 10, false); Exception exception = new EndRunException(jobParameter.getName(), randomAlphaOfLength(5), true); - doThrow(new RuntimeException("fail to get AD job")).when(client).get(any(), any()); + doThrow(new RuntimeException("fail to get AD job")).when(clientUtil).asyncRequest(any(GetRequest.class), any(), any()); runner.handleAdException(jobParameter, lockService, lock, Instant.now().minusMillis(1000 * 60), Instant.now(), exception); verify(anomalyResultHandler).indexAnomalyResult(any()); diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunnerTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunnerTests.java new file mode 100644 index 00000000..8f23f7ea --- /dev/null +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/AnomalyDetectorProfileRunnerTests.java @@ -0,0 +1,317 @@ +/* + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazon.opendistroforelasticsearch.ad; + +import static com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector.ANOMALY_DETECTORS_INDEX; +import static com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob.ANOMALY_DETECTOR_JOB_INDEX; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; + +import java.io.IOException; +import java.time.Instant; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.get.GetRequest; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.Client; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.NamedXContentRegistry; +import org.elasticsearch.index.IndexNotFoundException; +import org.elasticsearch.search.SearchModule; +import org.elasticsearch.test.ESTestCase; +import org.junit.Before; +import org.junit.BeforeClass; + +import com.amazon.opendistroforelasticsearch.ad.cluster.ADMetaData; +import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector; +import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetectorJob; +import com.amazon.opendistroforelasticsearch.ad.model.AnomalyResult; +import com.amazon.opendistroforelasticsearch.ad.model.DetectorProfile; +import com.amazon.opendistroforelasticsearch.ad.model.DetectorState; +import com.amazon.opendistroforelasticsearch.ad.model.ProfileName; + +public class AnomalyDetectorProfileRunnerTests extends ESTestCase { + private static final Logger LOG = LogManager.getLogger(AnomalyDetectorProfileRunnerTests.class); + private AnomalyDetectorProfileRunner runner; + private Client client; + private AnomalyDetector detector; + private static Set stateOnly; + private static Set stateNError; + private static String error = "No full shingle in current detection window"; + + @Override + protected NamedXContentRegistry xContentRegistry() { + SearchModule searchModule = new SearchModule(Settings.EMPTY, false, Collections.emptyList()); + List entries = searchModule.getNamedXContents(); + entries.addAll(Arrays.asList(AnomalyDetector.XCONTENT_REGISTRY, ADMetaData.XCONTENT_REGISTRY, AnomalyResult.XCONTENT_REGISTRY)); + return new NamedXContentRegistry(entries); + } + + @BeforeClass + public static void setUpOnce() { + stateOnly = new HashSet(); + stateOnly.add(ProfileName.STATE); + stateNError = new HashSet(); + stateNError.add(ProfileName.ERROR); + stateNError.add(ProfileName.STATE); + } + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + client = mock(Client.class); + runner = new AnomalyDetectorProfileRunner(client, xContentRegistry()); + } + + enum JobStatus { + INDEX_NOT_EXIT, + DISABLED, + ENABLED + } + + enum InittedEverResultStatus { + INDEX_NOT_EXIT, + GREATER_THAN_ZERO, + EMPTY, + EXCEPTION + } + + enum ErrorResultStatus { + INDEX_NOT_EXIT, + NO_ERROR, + ERROR + } + + @SuppressWarnings("unchecked") + private void setUpClientGet(boolean detectorExists, JobStatus jobStatus) throws IOException { + detector = TestHelpers.randomAnomalyDetector(TestHelpers.randomUiMetadata(), Instant.now()); + doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + GetRequest request = (GetRequest) args[0]; + ActionListener listener = (ActionListener) args[1]; + + if (request.index().equals(ANOMALY_DETECTORS_INDEX)) { + if (detectorExists) { + listener.onResponse(TestHelpers.createGetResponse(detector, detector.getDetectorId())); + } else { + listener.onFailure(new IndexNotFoundException(ANOMALY_DETECTORS_INDEX)); + } + } else { + AnomalyDetectorJob job = null; + switch (jobStatus) { + case INDEX_NOT_EXIT: + listener.onFailure(new IndexNotFoundException(ANOMALY_DETECTOR_JOB_INDEX)); + break; + case DISABLED: + job = TestHelpers.randomAnomalyDetectorJob(false); + listener.onResponse(TestHelpers.createGetResponse(job, detector.getDetectorId())); + break; + case ENABLED: + job = TestHelpers.randomAnomalyDetectorJob(true); + listener.onResponse(TestHelpers.createGetResponse(job, detector.getDetectorId())); + break; + default: + assertTrue("should not reach here", false); + break; + } + } + + return null; + }).when(client).get(any(), any()); + } + + @SuppressWarnings("unchecked") + private void setUpClientSearch(InittedEverResultStatus inittedEverResultStatus, ErrorResultStatus errorResultStatus) { + doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + SearchRequest request = (SearchRequest) args[0]; + ActionListener listener = (ActionListener) args[1]; + if (errorResultStatus == ErrorResultStatus.INDEX_NOT_EXIT + || inittedEverResultStatus == InittedEverResultStatus.INDEX_NOT_EXIT) { + listener.onFailure(new IndexNotFoundException(AnomalyResult.ANOMALY_RESULT_INDEX)); + return null; + } + AnomalyResult result = null; + if (request.source().query().toString().contains(AnomalyResult.ANOMALY_SCORE_FIELD)) { + switch (inittedEverResultStatus) { + case GREATER_THAN_ZERO: + result = TestHelpers.randomAnomalyDetectResult(0.87); + listener.onResponse(TestHelpers.createSearchResponse(result)); + break; + case EMPTY: + listener.onResponse(TestHelpers.createEmptySearchResponse()); + break; + case EXCEPTION: + listener.onFailure(new RuntimeException()); + break; + default: + assertTrue("should not reach here", false); + break; + } + } else { + switch (errorResultStatus) { + case NO_ERROR: + result = TestHelpers.randomAnomalyDetectResult(null); + listener.onResponse(TestHelpers.createSearchResponse(result)); + break; + case ERROR: + result = TestHelpers.randomAnomalyDetectResult(error); + listener.onResponse(TestHelpers.createSearchResponse(result)); + break; + default: + assertTrue("should not reach here", false); + break; + } + } + + return null; + }).when(client).search(any(), any()); + + } + + public void testDetectorNotExist() throws IOException, InterruptedException { + setUpClientGet(false, JobStatus.INDEX_NOT_EXIT); + final CountDownLatch inProgressLatch = new CountDownLatch(1); + + runner.profile("x123", ActionListener.wrap(response -> { + assertTrue("Should not reach here", false); + inProgressLatch.countDown(); + }, exception -> { + assertTrue(exception.getMessage().contains(AnomalyDetectorProfileRunner.FAIL_TO_FIND_DETECTOR_MSG)); + inProgressLatch.countDown(); + }), stateNError); + assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS)); + } + + public void testDisabledJobIndexTemplate(JobStatus status) throws IOException, InterruptedException { + setUpClientGet(true, status); + DetectorProfile expectedProfile = new DetectorProfile(); + expectedProfile.setState(DetectorState.DISABLED); + final CountDownLatch inProgressLatch = new CountDownLatch(1); + + runner.profile(detector.getDetectorId(), ActionListener.wrap(response -> { + assertEquals(expectedProfile, response); + inProgressLatch.countDown(); + }, exception -> { + assertTrue("Should not reach here ", false); + inProgressLatch.countDown(); + }), stateOnly); + assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS)); + } + + public void testNoJobIndex() throws IOException, InterruptedException { + testDisabledJobIndexTemplate(JobStatus.INDEX_NOT_EXIT); + } + + public void testJobDisabled() throws IOException, InterruptedException { + testDisabledJobIndexTemplate(JobStatus.DISABLED); + } + + public void testInitOrRunningStateTemplate(InittedEverResultStatus status, DetectorState expectedState) throws IOException, + InterruptedException { + setUpClientGet(true, JobStatus.ENABLED); + setUpClientSearch(status, ErrorResultStatus.NO_ERROR); + DetectorProfile expectedProfile = new DetectorProfile(); + expectedProfile.setState(expectedState); + final CountDownLatch inProgressLatch = new CountDownLatch(1); + + runner.profile(detector.getDetectorId(), ActionListener.wrap(response -> { + assertEquals(expectedProfile, response); + inProgressLatch.countDown(); + }, exception -> { + assertTrue("Should not reach here ", false); + inProgressLatch.countDown(); + }), stateOnly); + assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS)); + } + + public void testResultNotExist() throws IOException, InterruptedException { + testInitOrRunningStateTemplate(InittedEverResultStatus.INDEX_NOT_EXIT, DetectorState.INIT); + } + + public void testResultEmpty() throws IOException, InterruptedException { + testInitOrRunningStateTemplate(InittedEverResultStatus.EMPTY, DetectorState.INIT); + } + + public void testResultGreaterThanZero() throws IOException, InterruptedException { + testInitOrRunningStateTemplate(InittedEverResultStatus.GREATER_THAN_ZERO, DetectorState.RUNNING); + } + + public void testErrorStateTemplate(InittedEverResultStatus initStatus, ErrorResultStatus status, DetectorState state, String error) + throws IOException, + InterruptedException { + setUpClientGet(true, JobStatus.ENABLED); + setUpClientSearch(initStatus, status); + DetectorProfile expectedProfile = new DetectorProfile(); + expectedProfile.setState(state); + expectedProfile.setError(error); + final CountDownLatch inProgressLatch = new CountDownLatch(1); + + runner.profile(detector.getDetectorId(), ActionListener.wrap(response -> { + assertEquals(expectedProfile, response); + inProgressLatch.countDown(); + }, exception -> { + assertTrue("Should not reach here ", false); + inProgressLatch.countDown(); + }), stateNError); + assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS)); + } + + public void testInitNoError() throws IOException, InterruptedException { + testErrorStateTemplate(InittedEverResultStatus.INDEX_NOT_EXIT, ErrorResultStatus.INDEX_NOT_EXIT, DetectorState.INIT, null); + } + + public void testRunningNoError() throws IOException, InterruptedException { + testErrorStateTemplate(InittedEverResultStatus.GREATER_THAN_ZERO, ErrorResultStatus.NO_ERROR, DetectorState.RUNNING, null); + } + + public void testRunningWithError() throws IOException, InterruptedException { + testErrorStateTemplate(InittedEverResultStatus.GREATER_THAN_ZERO, ErrorResultStatus.ERROR, DetectorState.RUNNING, error); + } + + public void testInitWithError() throws IOException, InterruptedException { + testErrorStateTemplate(InittedEverResultStatus.EMPTY, ErrorResultStatus.ERROR, DetectorState.INIT, error); + } + + public void testExceptionOnStateFetching() throws IOException, InterruptedException { + setUpClientGet(true, JobStatus.ENABLED); + setUpClientSearch(InittedEverResultStatus.EXCEPTION, ErrorResultStatus.NO_ERROR); + + final CountDownLatch inProgressLatch = new CountDownLatch(1); + + runner.profile(detector.getDetectorId(), ActionListener.wrap(response -> { + assertTrue("Should not reach here ", false); + inProgressLatch.countDown(); + }, exception -> { + assertTrue("Unexcpeted exception " + exception.getMessage(), exception instanceof RuntimeException); + inProgressLatch.countDown(); + }), stateOnly); + assertTrue(inProgressLatch.await(100, TimeUnit.SECONDS)); + } +} diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/TestHelpers.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/TestHelpers.java index b85103c5..3af20295 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/TestHelpers.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/TestHelpers.java @@ -33,9 +33,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.util.Strings; +import org.apache.lucene.search.TotalHits; import org.elasticsearch.Version; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; +import org.elasticsearch.action.get.GetResponse; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.search.ShardSearchFailure; import org.elasticsearch.client.Client; import org.elasticsearch.client.Request; import org.elasticsearch.client.RequestOptions; @@ -58,14 +62,25 @@ import org.elasticsearch.common.util.concurrent.ThreadContext; import org.elasticsearch.common.xcontent.LoggingDeprecationHandler; import org.elasticsearch.common.xcontent.NamedXContentRegistry; +import org.elasticsearch.common.xcontent.ToXContent; +import org.elasticsearch.common.xcontent.ToXContentObject; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; +import org.elasticsearch.index.get.GetResult; +import org.elasticsearch.index.mapper.MapperService; import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.SearchModule; import org.elasticsearch.search.aggregations.AggregationBuilder; import org.elasticsearch.search.aggregations.AggregatorFactories; +import org.elasticsearch.search.aggregations.InternalAggregations; import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.internal.InternalSearchResponse; +import org.elasticsearch.search.profile.SearchProfileShardResults; +import org.elasticsearch.search.suggest.Suggest; import org.elasticsearch.test.ClusterServiceUtils; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.test.rest.ESRestTestCase; @@ -82,6 +97,7 @@ import static org.elasticsearch.cluster.node.DiscoveryNodeRole.BUILT_IN_ROLES; import static org.elasticsearch.index.query.AbstractQueryBuilder.parseInnerQueryBuilder; +import static org.elasticsearch.index.seqno.SequenceNumbers.UNASSIGNED_SEQ_NO; import static org.elasticsearch.test.ESTestCase.randomAlphaOfLength; import static org.elasticsearch.test.ESTestCase.randomDouble; import static org.elasticsearch.test.ESTestCase.randomInt; @@ -297,9 +313,21 @@ public static FeatureData randomFeatureData() { } public static AnomalyResult randomAnomalyDetectResult() { + return randomAnomalyDetectResult(randomDouble(), randomAlphaOfLength(5)); + } + + public static AnomalyResult randomAnomalyDetectResult(double score) { + return randomAnomalyDetectResult(randomDouble(), null); + } + + public static AnomalyResult randomAnomalyDetectResult(String error) { + return randomAnomalyDetectResult(Double.NaN, error); + } + + public static AnomalyResult randomAnomalyDetectResult(double score, String error) { return new AnomalyResult( randomAlphaOfLength(5), - randomDouble(), + score, randomDouble(), randomDouble(), ImmutableList.of(randomFeatureData(), randomFeatureData()), @@ -307,16 +335,20 @@ public static AnomalyResult randomAnomalyDetectResult() { Instant.now().truncatedTo(ChronoUnit.SECONDS), Instant.now().truncatedTo(ChronoUnit.SECONDS), Instant.now().truncatedTo(ChronoUnit.SECONDS), - randomAlphaOfLength(5) + error ); } public static AnomalyDetectorJob randomAnomalyDetectorJob() { + return randomAnomalyDetectorJob(true); + } + + public static AnomalyDetectorJob randomAnomalyDetectorJob(boolean enabled) { return new AnomalyDetectorJob( randomAlphaOfLength(10), randomIntervalSchedule(), randomIntervalTimeConfiguration(), - true, + enabled, Instant.now().truncatedTo(ChronoUnit.SECONDS), Instant.now().truncatedTo(ChronoUnit.SECONDS), Instant.now().truncatedTo(ChronoUnit.SECONDS), @@ -406,4 +438,70 @@ public static void createIndex(RestClient client, String indexName, HttpEntity d null ); } + + public static GetResponse createGetResponse(ToXContentObject o, String id) throws IOException { + XContentBuilder content = o.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS); + + return new GetResponse( + new GetResult( + AnomalyDetector.ANOMALY_DETECTORS_INDEX, + MapperService.SINGLE_MAPPING_NAME, + id, + UNASSIGNED_SEQ_NO, + 0, + -1, + true, + BytesReference.bytes(content), + Collections.emptyMap(), + Collections.emptyMap() + ) + ); + } + + public static SearchResponse createSearchResponse(ToXContentObject o) throws IOException { + XContentBuilder content = o.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS); + + SearchHit[] hits = new SearchHit[1]; + hits[0] = new SearchHit(0).sourceRef(BytesReference.bytes(content)); + + return new SearchResponse( + new InternalSearchResponse( + new SearchHits(hits, new TotalHits(1, TotalHits.Relation.EQUAL_TO), 1.0f), + new InternalAggregations(Collections.emptyList()), + new Suggest(Collections.emptyList()), + new SearchProfileShardResults(Collections.emptyMap()), + false, + false, + 1 + ), + "", + 5, + 5, + 0, + 100, + ShardSearchFailure.EMPTY_ARRAY, + SearchResponse.Clusters.EMPTY + ); + } + + public static SearchResponse createEmptySearchResponse() throws IOException { + return new SearchResponse( + new InternalSearchResponse( + new SearchHits(new SearchHit[0], new TotalHits(0, TotalHits.Relation.EQUAL_TO), 1.0f), + new InternalAggregations(Collections.emptyList()), + new Suggest(Collections.emptyList()), + new SearchProfileShardResults(Collections.emptyMap()), + false, + false, + 1 + ), + "", + 5, + 5, + 0, + 100, + ShardSearchFailure.EMPTY_ARRAY, + SearchResponse.Clusters.EMPTY + ); + } } diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/cluster/ADClusterEventListenerTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/cluster/ADClusterEventListenerTests.java index 8b222e87..ff8c54b9 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/cluster/ADClusterEventListenerTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/cluster/ADClusterEventListenerTests.java @@ -33,6 +33,7 @@ import com.amazon.opendistroforelasticsearch.ad.AbstractADTest; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; + import org.elasticsearch.cluster.ClusterChangedEvent; import org.elasticsearch.cluster.ClusterName; import org.elasticsearch.cluster.ClusterState; diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManagerTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManagerTests.java index 679ae0cb..81242a49 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManagerTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/ml/ModelManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -135,6 +135,7 @@ public class ModelManagerTests { private String rcfModelId; private String thresholdModelId; private String checkpoint; + private int shingleSize; @Before public void setup() { @@ -156,6 +157,7 @@ public void setup() { minPreviewSize = 500; modelTtl = Duration.ofHours(1); checkpointInterval = Duration.ofHours(1); + shingleSize = 1; rcf = RandomCutForest.builder().dimensions(numFeatures).sampleSize(numSamples).numberOfTrees(numTrees).build(); @@ -185,7 +187,8 @@ public void setup() { thresholdingModelClass, minPreviewSize, modelTtl, - checkpointInterval + checkpointInterval, + shingleSize ) ); @@ -591,7 +594,7 @@ public void clear_deleteThresholdCheckpoint() { public void trainModel_putTrainedModels() { double[][] trainData = new Random().doubles().limit(100).mapToObj(d -> new double[] { d }).toArray(double[][]::new); doReturn(new SimpleEntry<>(1, 10)).when(modelManager).getPartitionedForestSizes(anyObject(), anyObject()); - + doReturn(asList("feature1")).when(anomalyDetector).getEnabledFeatureIds(); modelManager.trainModel(anomalyDetector, trainData); verify(checkpointDao).putModelCheckpoint(eq(modelManager.getRcfModelId(anomalyDetector.getDetectorId(), 0)), anyObject()); diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManagerTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManagerTests.java index 5804216d..1cce2aae 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManagerTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ADStateManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -34,7 +34,6 @@ import java.util.concurrent.ConcurrentHashMap; import com.amazon.opendistroforelasticsearch.ad.TestHelpers; -import com.amazon.opendistroforelasticsearch.ad.common.exception.AnomalyDetectionException; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; import com.amazon.opendistroforelasticsearch.ad.model.AnomalyDetector; import com.amazon.opendistroforelasticsearch.ad.util.ClientUtil; @@ -60,16 +59,17 @@ import org.junit.After; import org.junit.Before; -import com.amazon.randomcutforest.RandomCutForest; - public class ADStateManagerTests extends ESTestCase { private ADStateManager stateManager; private ModelManager modelManager; private Client client; + private ClientUtil clientUtil; private Clock clock; private Duration duration; private Throttler throttler; private ThreadPool context; + private AnomalyDetector detectorToCheck; + private Settings settings; @Override protected NamedXContentRegistry xContentRegistry() { @@ -82,10 +82,10 @@ protected NamedXContentRegistry xContentRegistry() { public void setUp() throws Exception { super.setUp(); modelManager = mock(ModelManager.class); - when(modelManager.getPartitionedForestSizes(any(RandomCutForest.class), any(String.class))) - .thenReturn(new SimpleImmutableEntry<>(2, 20)); + when(modelManager.getPartitionedForestSizes(any(AnomalyDetector.class))).thenReturn(new SimpleImmutableEntry<>(2, 20)); client = mock(Client.class); - Settings settings = Settings + clientUtil = mock(ClientUtil.class); + settings = Settings .builder() .put("opendistro.anomaly_detection.max_retry_for_unresponsive_node", 3) .put("opendistro.anomaly_detection.ad_mute_minutes", TimeValue.timeValueMinutes(10)) @@ -95,15 +95,7 @@ public void setUp() throws Exception { context = TestHelpers.createThreadPool(); throttler = new Throttler(clock); - stateManager = new ADStateManager( - client, - xContentRegistry(), - modelManager, - settings, - new ClientUtil(settings, client, throttler, context), - clock, - duration - ); + stateManager = new ADStateManager(client, xContentRegistry(), modelManager, settings, clientUtil, clock, duration); } @@ -114,12 +106,14 @@ public void tearDown() throws Exception { stateManager = null; modelManager = null; client = null; + clientUtil = null; + detectorToCheck = null; } @SuppressWarnings("unchecked") private String setupDetector(boolean responseExists) throws IOException { - AnomalyDetector detector = TestHelpers.randomAnomalyDetector(TestHelpers.randomUiMetadata(), null); - XContentBuilder content = detector.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS); + detectorToCheck = TestHelpers.randomAnomalyDetector(TestHelpers.randomUiMetadata(), null); + XContentBuilder content = detectorToCheck.toXContent(XContentFactory.jsonBuilder(), ToXContent.EMPTY_PARAMS); doAnswer(invocation -> { Object[] args = invocation.getArguments(); @@ -130,8 +124,8 @@ private String setupDetector(boolean responseExists) throws IOException { if (args[0] instanceof GetRequest) { request = (GetRequest) args[0]; } - if (args[1] instanceof ActionListener) { - listener = (ActionListener) args[1]; + if (args[2] instanceof ActionListener) { + listener = (ActionListener) args[2]; } assertTrue(request != null && listener != null); @@ -141,7 +135,7 @@ private String setupDetector(boolean responseExists) throws IOException { new GetResult( AnomalyDetector.ANOMALY_DETECTORS_INDEX, MapperService.SINGLE_MAPPING_NAME, - detector.getDetectorId(), + detectorToCheck.getDetectorId(), UNASSIGNED_SEQ_NO, 0, -1, @@ -154,21 +148,17 @@ private String setupDetector(boolean responseExists) throws IOException { ); return null; - }).when(client).get(any(), any()); - return detector.getDetectorId(); + }).when(clientUtil).asyncRequest(any(GetRequest.class), any(), any(ActionListener.class)); + return detectorToCheck.getDetectorId(); } public void testGetPartitionNumber() throws IOException, InterruptedException { String detectorId = setupDetector(true); - int partitionNumber = stateManager.getPartitionNumber(detectorId); + int partitionNumber = stateManager + .getPartitionNumber(detectorId, TestHelpers.randomAnomalyDetector(TestHelpers.randomUiMetadata(), null)); assertEquals(2, partitionNumber); } - public void testGetResponseNotFound() throws IOException, InterruptedException { - String detectorId = setupDetector(false); - expectThrows(AnomalyDetectionException.class, () -> stateManager.getPartitionNumber(detectorId)); - } - public void testShouldMute() { String nodeId = "123"; assertTrue(!stateManager.isMuted(nodeId)); @@ -214,10 +204,29 @@ public void testMaintenancRemove() throws IOException { } public void testHasRunningQuery() throws IOException { + stateManager = new ADStateManager( + client, + xContentRegistry(), + modelManager, + settings, + new ClientUtil(settings, client, throttler, context), + clock, + duration + ); + AnomalyDetector detector = TestHelpers.randomAnomalyDetector(ImmutableMap.of(), null); SearchRequest dummySearchRequest = new SearchRequest(); assertFalse(stateManager.hasRunningQuery(detector)); throttler.insertFilteredQuery(detector.getDetectorId(), dummySearchRequest); assertTrue(stateManager.hasRunningQuery(detector)); } + + public void testGetAnomalyDetector() throws IOException { + String detectorId = setupDetector(true); + stateManager + .getAnomalyDetector( + detectorId, + ActionListener.wrap(asDetector -> { assertEquals(detectorToCheck, asDetector.get()); }, exception -> assertTrue(false)) + ); + } } diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTests.java index 9832863f..f0a929c8 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/AnomalyResultTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; -import static org.mockito.Mockito.any; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.anyDouble; @@ -53,12 +53,12 @@ import java.util.function.Function; import com.amazon.opendistroforelasticsearch.ad.breaker.ADCircuitBreakerService; -import com.amazon.opendistroforelasticsearch.ad.indices.AnomalyDetectionIndices; import com.amazon.opendistroforelasticsearch.ad.AbstractADTest; import com.amazon.opendistroforelasticsearch.ad.cluster.HashRing; import com.amazon.opendistroforelasticsearch.ad.common.exception.AnomalyDetectionException; import com.amazon.opendistroforelasticsearch.ad.common.exception.ClientException; +import com.amazon.opendistroforelasticsearch.ad.common.exception.EndRunException; import com.amazon.opendistroforelasticsearch.ad.common.exception.InternalFailure; import com.amazon.opendistroforelasticsearch.ad.common.exception.JsonPathNotFoundException; import com.amazon.opendistroforelasticsearch.ad.common.exception.LimitExceededException; @@ -85,7 +85,6 @@ import org.elasticsearch.ElasticsearchTimeoutException; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequestValidationException; -import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.support.ActionFilters; @@ -135,7 +134,6 @@ public class AnomalyResultTests extends AbstractADTest { private FeatureManager featureQuery; private ModelManager normalModelManager; private Client client; - private AnomalyDetectionIndices anomalyDetectionIndices; private AnomalyDetector detector; private HashRing hashRing; private IndexNameExpressionResolver indexNameResolver; @@ -171,7 +169,7 @@ public void setUp() throws Exception { clusterService = testNodes[0].clusterService; stateManager = mock(ADStateManager.class); // return 2 RCF partitions - when(stateManager.getPartitionNumber(any(String.class))).thenReturn(2); + when(stateManager.getPartitionNumber(any(String.class), any(AnomalyDetector.class))).thenReturn(2); when(stateManager.isMuted(any(String.class))).thenReturn(false); detector = mock(AnomalyDetector.class); @@ -184,19 +182,35 @@ public void setUp() throws Exception { userIndex.add("test*"); when(detector.getIndices()).thenReturn(userIndex); when(detector.getDetectorId()).thenReturn("testDetectorId"); - when(stateManager.getAnomalyDetector(any(String.class))).thenReturn(Optional.of(detector)); + doAnswer(invocation -> { + ActionListener> listener = invocation.getArgument(1); + listener.onResponse(Optional.of(detector)); + return null; + }).when(stateManager).getAnomalyDetector(any(String.class), any(ActionListener.class)); hashRing = mock(HashRing.class); when(hashRing.getOwningNode(any(String.class))).thenReturn(Optional.of(clusterService.state().nodes().getLocalNode())); when(hashRing.build()).thenReturn(true); featureQuery = mock(FeatureManager.class); - when(featureQuery.getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong())) - .thenReturn(new SinglePointFeatures(Optional.of(new double[] { 0.0d }), Optional.of(new double[] { 0 }))); + + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new SinglePointFeatures(Optional.of(new double[] { 0.0d }), Optional.of(new double[] { 0 }))); + return null; + }).when(featureQuery).getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong(), any(ActionListener.class)); + normalModelManager = mock(ModelManager.class); - when(normalModelManager.getThresholdingResult(any(String.class), any(String.class), anyDouble())) - .thenReturn(new ThresholdingResult(0, 1.0d)); - when(normalModelManager.getRcfResult(any(String.class), any(String.class), any(double[].class))) - .thenReturn(new RcfResult(0.2, 0, 100)); + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new ThresholdingResult(0, 1.0d)); + return null; + }).when(normalModelManager).getThresholdingResult(any(String.class), any(String.class), anyDouble(), any(ActionListener.class)); + + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new RcfResult(0.2, 0, 100)); + return null; + }).when(normalModelManager).getRcfResult(any(String.class), any(String.class), any(double[].class), any(ActionListener.class)); when(normalModelManager.combineRcfResults(any())).thenReturn(new CombinedRcfResult(0, 1.0d)); adID = "123"; rcfModelID = "123-rcf-1"; @@ -253,37 +267,6 @@ public void setupTestNodes(Settings settings) { runner = new ColdStartRunner(); } - @SuppressWarnings("unchecked") - public void setUpSavingAnomalyResultIndex(boolean anomalyResultIndexExists) throws IOException { - anomalyDetectionIndices = mock(AnomalyDetectionIndices.class); - doAnswer(invocation -> { - Object[] args = invocation.getArguments(); - assertTrue(String.format("The size of args is %d. Its content is %s", args.length, Arrays.toString(args)), args.length >= 1); - - ActionListener listener = null; - - if (args[0] instanceof ActionListener) { - listener = (ActionListener) args[0]; - } - - assertTrue(listener != null); - - listener.onResponse(new CreateIndexResponse(true, true, AnomalyResult.ANOMALY_RESULT_INDEX) { - }); - - return null; - }).when(anomalyDetectionIndices).initAnomalyResultIndexDirectly(any()); - - when(anomalyDetectionIndices.doesAnomalyResultIndexExist()).thenReturn(anomalyResultIndexExists); - } - - public void setupInitResultIndexException(Class exceptionType) throws IOException { - anomalyDetectionIndices = mock(AnomalyDetectionIndices.class); - doThrow(exceptionType).when(anomalyDetectionIndices).initAnomalyResultIndexDirectly(any()); - - when(anomalyDetectionIndices.doesAnomalyResultIndexExist()).thenReturn(false); - } - @Override @After public final void tearDown() throws Exception { @@ -293,7 +276,6 @@ public final void tearDown() throws Exception { runner.shutDown(); runner = null; client = null; - anomalyDetectionIndices = null; super.tearDownLog4jForJUnit(); super.tearDown(); } @@ -309,7 +291,6 @@ private void assertException(PlainActionFuture listener, public void testNormal() throws IOException { - setUpSavingAnomalyResultIndex(false); // These constructors register handler in transport service new RCFResultTransportAction( new ActionFilters(Collections.emptySet()), @@ -322,17 +303,14 @@ public void testNormal() throws IOException { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -377,17 +355,14 @@ public Throwable noModelExceptionTemplate( AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, globalRunner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -441,10 +416,13 @@ public void testADExceptionWhenColdStart() { noModelExceptionTemplate(new AnomalyDetectionException(adID, ""), mockRunner, adID, error); } + @SuppressWarnings("unchecked") public void testInsufficientCapacityExceptionDuringColdStart() { ModelManager rcfManager = mock(ModelManager.class); - doThrow(ResourceNotFoundException.class).when(rcfManager).getRcfResult(any(String.class), any(String.class), any(double[].class)); + doThrow(ResourceNotFoundException.class) + .when(rcfManager) + .getRcfResult(any(String.class), any(String.class), any(double[].class), any(ActionListener.class)); when(rcfManager.getRcfModelId(any(String.class), anyInt())).thenReturn(rcfModelID); ColdStartRunner mockRunner = mock(ColdStartRunner.class); @@ -458,17 +436,14 @@ public void testInsufficientCapacityExceptionDuringColdStart() { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, mockRunner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -480,12 +455,13 @@ public void testInsufficientCapacityExceptionDuringColdStart() { assertException(listener, LimitExceededException.class); } + @SuppressWarnings("unchecked") public void testInsufficientCapacityExceptionDuringRestoringModel() { ModelManager rcfManager = mock(ModelManager.class); doThrow(new NotSerializableExceptionWrapper(new LimitExceededException(adID, CommonErrorMessages.MEMORY_LIMIT_EXCEEDED_ERR_MSG))) .when(rcfManager) - .getRcfResult(any(String.class), any(String.class), any(double[].class)); + .getRcfResult(any(String.class), any(String.class), any(double[].class), any(ActionListener.class)); // These constructors register handler in transport service new RCFResultTransportAction(new ActionFilters(Collections.emptySet()), transportService, rcfManager, adCircuitBreakerService); @@ -494,17 +470,14 @@ public void testInsufficientCapacityExceptionDuringRestoringModel() { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -535,17 +508,14 @@ public void testThresholdException() { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -569,17 +539,14 @@ public void testCircuitBreaker() { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, breakerService, adStats ); @@ -636,17 +603,14 @@ private void nodeNotConnectedExceptionTemplate(boolean isRCF, boolean temporary, AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), exceptionTransportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, hackedClusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -692,24 +656,26 @@ public void testTemporaryThresholdNodeNotConnectedException() { nodeNotConnectedExceptionTemplate(false, true, 1); } + @SuppressWarnings("unchecked") public void testMute() { ADStateManager muteStateManager = mock(ADStateManager.class); when(muteStateManager.isMuted(any(String.class))).thenReturn(true); - when(muteStateManager.getAnomalyDetector(any(String.class))).thenReturn(Optional.of(detector)); + doAnswer(invocation -> { + ActionListener> listener = invocation.getArgument(1); + listener.onResponse(Optional.of(detector)); + return null; + }).when(muteStateManager).getAnomalyDetector(any(String.class), any(ActionListener.class)); AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, muteStateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -722,7 +688,6 @@ public void testMute() { } public void alertingRequestTemplate(boolean anomalyResultIndexExists) throws IOException { - setUpSavingAnomalyResultIndex(anomalyResultIndexExists); // These constructors register handler in transport service new RCFResultTransportAction( new ActionFilters(Collections.emptySet()), @@ -735,17 +700,14 @@ public void alertingRequestTemplate(boolean anomalyResultIndexExists) throws IOE new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -890,22 +852,19 @@ public void testOnFailureNull() throws IOException { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, new ColdStartRunner(), - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); AnomalyResultTransportAction.RCFActionListener listener = action.new RCFActionListener( - null, null, null, null, null, null, null, null, null, 0, 0, 0, new AtomicInteger(), null + null, null, null, null, null, null, null, null, null, 0, new AtomicInteger(), null ); listener.onFailure(null); } @@ -915,17 +874,14 @@ public void testColdStartNoTrainingData() throws Exception { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -943,17 +899,14 @@ public void testColdStartTimeoutPutCheckpoint() throws Exception { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -968,32 +921,35 @@ enum FeatureTestMode { AD_EXCEPTION } + @SuppressWarnings("unchecked") public void featureTestTemplate(FeatureTestMode mode) { if (mode == FeatureTestMode.FEATURE_NOT_AVAILABLE) { - when(featureQuery.getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong())) - .thenReturn(new SinglePointFeatures(Optional.empty(), Optional.empty())); + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new SinglePointFeatures(Optional.empty(), Optional.empty())); + return null; + }).when(featureQuery).getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong(), any(ActionListener.class)); } else if (mode == FeatureTestMode.ILLEGAL_STATE) { - doThrow(IllegalArgumentException.class).when(featureQuery).getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong()); + doThrow(IllegalArgumentException.class) + .when(featureQuery) + .getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong(), any(ActionListener.class)); } else if (mode == FeatureTestMode.AD_EXCEPTION) { doThrow(AnomalyDetectionException.class) .when(featureQuery) - .getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong()); + .getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong(), any(ActionListener.class)); } AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -1069,17 +1025,14 @@ private void globalBlockTemplate(BlockType type, String errLogMsg, Settings inde AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, hackedClusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); @@ -1116,24 +1069,55 @@ public void testNullRCFResult() { AnomalyResultTransportAction action = new AnomalyResultTransportAction( new ActionFilters(Collections.emptySet()), transportService, - client, settings, stateManager, runner, - anomalyDetectionIndices, featureQuery, normalModelManager, hashRing, clusterService, indexNameResolver, - threadPool, adCircuitBreakerService, adStats ); AnomalyResultTransportAction.RCFActionListener listener = action.new RCFActionListener( - null, "123-rcf-0", null, "123", null, null, null, null, null, 0, 0, 0, new AtomicInteger(), null + null, "123-rcf-0", null, "123", null, null, null, null, null, 0, new AtomicInteger(), null ); listener.onResponse(null); assertTrue(testAppender.containsMessage(AnomalyResultTransportAction.NULL_RESPONSE)); } + + @SuppressWarnings("unchecked") + public void testAllFeaturesDisabled() { + // doThrow(IllegalArgumentException.class).when(featureQuery) + // .getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong(), any(ActionListener.class)); + doAnswer(invocation -> { + Object[] args = invocation.getArguments(); + ActionListener listener = (ActionListener) args[3]; + listener.onFailure(new IllegalArgumentException()); + return null; + }).when(featureQuery).getCurrentFeatures(any(AnomalyDetector.class), anyLong(), anyLong(), any(ActionListener.class)); + when(detector.getEnabledFeatureIds()).thenReturn(Collections.emptyList()); + + AnomalyResultTransportAction action = new AnomalyResultTransportAction( + new ActionFilters(Collections.emptySet()), + transportService, + settings, + stateManager, + runner, + featureQuery, + normalModelManager, + hashRing, + clusterService, + indexNameResolver, + adCircuitBreakerService, + adStats + ); + + AnomalyResultRequest request = new AnomalyResultRequest(adID, 100, 200); + PlainActionFuture listener = new PlainActionFuture<>(); + action.doExecute(null, request, listener); + + assertException(listener, EndRunException.class, AnomalyResultTransportAction.ALL_FEATURES_DISABLED_ERR_MSG); + } } diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/CronTransportActionTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/CronTransportActionTests.java index bc6c6141..a1e556dc 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/CronTransportActionTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/CronTransportActionTests.java @@ -27,6 +27,7 @@ import com.amazon.opendistroforelasticsearch.ad.common.exception.JsonPathNotFoundException; import com.amazon.opendistroforelasticsearch.ad.feature.FeatureManager; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; + import org.elasticsearch.Version; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.cluster.ClusterName; diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/DeleteModelTransportActionTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/DeleteModelTransportActionTests.java index 09f2ddee..7d60ffce 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/DeleteModelTransportActionTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/DeleteModelTransportActionTests.java @@ -30,6 +30,7 @@ import com.amazon.opendistroforelasticsearch.ad.constant.CommonErrorMessages; import com.amazon.opendistroforelasticsearch.ad.feature.FeatureManager; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; + import org.elasticsearch.Version; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.support.ActionFilters; diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTests.java index 95766caa..9084ee6a 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/RCFResultTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -33,6 +34,8 @@ import com.amazon.opendistroforelasticsearch.ad.constant.CommonMessageAttributes; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; import com.amazon.opendistroforelasticsearch.ad.ml.RcfResult; + +import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.PlainActionFuture; @@ -56,6 +59,7 @@ public class RCFResultTests extends ESTestCase { Gson gson = new GsonBuilder().create(); + @SuppressWarnings("unchecked") public void testNormal() { TransportService transportService = new TransportService( Settings.EMPTY, @@ -75,7 +79,12 @@ public void testNormal() { manager, adCircuitBreakerService ); - when(manager.getRcfResult(any(String.class), any(String.class), any(double[].class))).thenReturn(new RcfResult(0, 0, 25)); + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new RcfResult(0, 0, 25)); + return null; + }).when(manager).getRcfResult(any(String.class), any(String.class), any(double[].class), any(ActionListener.class)); + when(adCircuitBreakerService.isOpen()).thenReturn(false); final PlainActionFuture future = new PlainActionFuture<>(); @@ -87,6 +96,7 @@ public void testNormal() { assertEquals(25, response.getForestSize(), 0.001); } + @SuppressWarnings("unchecked") public void testExecutionException() { TransportService transportService = new TransportService( Settings.EMPTY, @@ -106,7 +116,9 @@ public void testExecutionException() { manager, adCircuitBreakerService ); - doThrow(NullPointerException.class).when(manager).getRcfResult(any(String.class), any(String.class), any(double[].class)); + doThrow(NullPointerException.class) + .when(manager) + .getRcfResult(any(String.class), any(String.class), any(double[].class), any(ActionListener.class)); when(adCircuitBreakerService.isOpen()).thenReturn(false); final PlainActionFuture future = new PlainActionFuture<>(); @@ -172,6 +184,7 @@ public void testJsonRequest() throws IOException, JsonPathNotFoundException { ); } + @SuppressWarnings("unchecked") public void testCircuitBreaker() { TransportService transportService = new TransportService( Settings.EMPTY, @@ -191,7 +204,11 @@ public void testCircuitBreaker() { manager, breakerService ); - when(manager.getRcfResult(any(String.class), any(String.class), any(double[].class))).thenReturn(new RcfResult(0, 0, 25)); + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new RcfResult(0, 0, 25)); + return null; + }).when(manager).getRcfResult(any(String.class), any(String.class), any(double[].class), any(ActionListener.class)); when(breakerService.isOpen()).thenReturn(true); final PlainActionFuture future = new PlainActionFuture<>(); diff --git a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ThresholdResultTests.java b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ThresholdResultTests.java index 4c2ca200..4a992126 100644 --- a/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ThresholdResultTests.java +++ b/src/test/java/com/amazon/opendistroforelasticsearch/ad/transport/ThresholdResultTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. @@ -19,9 +19,9 @@ import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyDouble; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; import java.io.IOException; import java.util.Collections; @@ -31,6 +31,8 @@ import com.amazon.opendistroforelasticsearch.ad.constant.CommonMessageAttributes; import com.amazon.opendistroforelasticsearch.ad.ml.ModelManager; import com.amazon.opendistroforelasticsearch.ad.ml.ThresholdingResult; + +import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.support.ActionFilters; import org.elasticsearch.action.support.PlainActionFuture; @@ -50,6 +52,7 @@ public class ThresholdResultTests extends ESTestCase { + @SuppressWarnings("unchecked") public void testNormal() { TransportService transportService = new TransportService( Settings.EMPTY, @@ -63,7 +66,11 @@ public void testNormal() { ModelManager manager = mock(ModelManager.class); ThresholdResultTransportAction action = new ThresholdResultTransportAction(mock(ActionFilters.class), transportService, manager); - when(manager.getThresholdingResult(any(String.class), any(String.class), anyDouble())).thenReturn(new ThresholdingResult(0, 1.0d)); + doAnswer(invocation -> { + ActionListener listener = invocation.getArgument(3); + listener.onResponse(new ThresholdingResult(0, 1.0d)); + return null; + }).when(manager).getThresholdingResult(any(String.class), any(String.class), anyDouble(), any(ActionListener.class)); final PlainActionFuture future = new PlainActionFuture<>(); ThresholdResultRequest request = new ThresholdResultRequest("123", "123-threshold", 2); @@ -74,6 +81,7 @@ public void testNormal() { assertEquals(1, response.getConfidence(), 0.001); } + @SuppressWarnings("unchecked") public void testExecutionException() { TransportService transportService = new TransportService( Settings.EMPTY, @@ -87,7 +95,9 @@ public void testExecutionException() { ModelManager manager = mock(ModelManager.class); ThresholdResultTransportAction action = new ThresholdResultTransportAction(mock(ActionFilters.class), transportService, manager); - doThrow(NullPointerException.class).when(manager).getThresholdingResult(any(String.class), any(String.class), anyDouble()); + doThrow(NullPointerException.class) + .when(manager) + .getThresholdingResult(any(String.class), any(String.class), anyDouble(), any(ActionListener.class)); final PlainActionFuture future = new PlainActionFuture<>(); ThresholdResultRequest request = new ThresholdResultRequest("123", "123-threshold", 2);