You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by av...@apache.org on 2017/09/21 22:41:35 UTC

[4/4] ambari git commit: AMBARI-21686 : Implement a test driver that provides a set of metric series with different kinds of metric behavior. (avijayan)

AMBARI-21686 : Implement a test driver that provides a set of metric series with different kinds of metric behavior. (avijayan)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/63e74355
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/63e74355
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/63e74355

Branch: refs/heads/branch-3.0-ams
Commit: 63e74355776b454762ab423e3516dfc3c12355e5
Parents: 8cad9eb
Author: Aravindan Vijayan <av...@hortonworks.com>
Authored: Thu Sep 21 15:40:35 2017 -0700
Committer: Aravindan Vijayan <av...@hortonworks.com>
Committed: Thu Sep 21 15:40:35 2017 -0700

----------------------------------------------------------------------
 .../ambari-metrics-alertservice/pom.xml         |  17 +-
 .../ambari/metrics/alertservice/R/AmsRTest.java | 147 -------
 .../alertservice/R/RFunctionInvoker.java        | 192 ----------
 .../metrics/alertservice/common/DataSet.java    |  38 --
 .../alertservice/common/MethodResult.java       |  27 --
 .../alertservice/common/MetricAnomaly.java      |  69 ----
 .../metrics/alertservice/common/ResultSet.java  |  43 ---
 .../common/SingleValuedTimelineMetric.java      | 103 -----
 .../alertservice/common/StatisticUtils.java     |  77 ----
 .../alertservice/common/TimelineMetric.java     | 238 ------------
 .../alertservice/common/TimelineMetrics.java    | 129 -------
 .../methods/MetricAnomalyModel.java             |  29 --
 .../metrics/alertservice/methods/ema/EmaDS.java |  70 ----
 .../alertservice/methods/ema/EmaModel.java      | 129 -------
 .../methods/ema/EmaModelLoader.java             |  46 ---
 .../alertservice/methods/ema/EmaResult.java     |  36 --
 .../alertservice/methods/ema/TestEmaModel.java  |  68 ----
 .../prototype/AmbariServerInterface.java        | 122 ++++++
 .../MetricAnomalyDetectorTestInput.java         | 126 ++++++
 .../prototype/MetricAnomalyTester.java          | 163 ++++++++
 .../prototype/MetricKafkaProducer.java          |  56 +++
 .../prototype/MetricSparkConsumer.java          | 178 +++++++++
 .../prototype/MetricsCollectorInterface.java    | 237 ++++++++++++
 .../prototype/PointInTimeADSystem.java          | 256 +++++++++++++
 .../prototype/RFunctionInvoker.java             | 222 +++++++++++
 .../prototype/TestSeriesInputRequest.java       |  88 +++++
 .../alertservice/prototype/TrendADSystem.java   | 331 ++++++++++++++++
 .../alertservice/prototype/TrendMetric.java     |  33 ++
 .../prototype/common/DataSeries.java            |  38 ++
 .../prototype/common/ResultSet.java             |  43 +++
 .../prototype/common/StatisticUtils.java        |  62 +++
 .../methods/AnomalyDetectionTechnique.java      |  32 ++
 .../prototype/methods/MetricAnomaly.java        |  86 +++++
 .../prototype/methods/ema/EmaModel.java         | 124 ++++++
 .../prototype/methods/ema/EmaModelLoader.java   |  46 +++
 .../prototype/methods/ema/EmaTechnique.java     | 142 +++++++
 .../prototype/methods/hsdev/HsdevTechnique.java |  77 ++++
 .../prototype/methods/kstest/KSTechnique.java   | 101 +++++
 .../seriesgenerator/AbstractMetricSeries.java   |  25 ++
 .../seriesgenerator/DualBandMetricSeries.java   |  88 +++++
 .../MetricSeriesGeneratorFactory.java           | 379 +++++++++++++++++++
 .../seriesgenerator/MonotonicMetricSeries.java  | 101 +++++
 .../seriesgenerator/NormalMetricSeries.java     |  81 ++++
 .../SteadyWithTurbulenceMetricSeries.java       | 115 ++++++
 .../StepFunctionMetricSeries.java               | 107 ++++++
 .../seriesgenerator/UniformMetricSeries.java    |  95 +++++
 .../alertservice/spark/AmsKafkaProducer.java    |  92 -----
 .../spark/AnomalyMetricPublisher.java           | 196 ----------
 .../spark/MetricAnomalyDetector.java            | 147 -------
 .../src/main/resources/R-scripts/hsdev.r        |  12 +-
 .../src/main/resources/R-scripts/kstest.r       |   2 +-
 .../src/main/resources/R-scripts/tukeys.r       |   9 +-
 .../src/main/resources/R-scripts/util.R         |  36 --
 .../prototype/TestEmaTechnique.java             |  86 +++++
 .../prototype/TestRFunctionInvoker.java         | 161 ++++++++
 .../alertservice/prototype/TestTukeys.java      | 100 +++++
 .../MetricSeriesGeneratorTest.java              | 108 ++++++
 .../metrics2/sink/timeline/TimelineMetric.java  |   5 +-
 .../metrics2/sink/timeline/TimelineMetrics.java |   3 +-
 .../metrics/spark/MetricAnomalyDetector.scala   |  18 +-
 .../metrics/spark/SparkPhoenixReader.scala      |  18 +-
 .../ambari-metrics-timelineservice/pom.xml      |   2 +-
 .../timeline/HBaseTimelineMetricsService.java   |  24 --
 .../timeline/MetricsPaddingMethodTest.java      |   7 -
 64 files changed, 4058 insertions(+), 1980 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/pom.xml
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/pom.xml b/ambari-metrics/ambari-metrics-alertservice/pom.xml
index 4afc80f..4db8a6a 100644
--- a/ambari-metrics/ambari-metrics-alertservice/pom.xml
+++ b/ambari-metrics/ambari-metrics-alertservice/pom.xml
@@ -31,7 +31,6 @@
     <build>
         <plugins>
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <configuration>
                     <source>1.8</source>
@@ -130,5 +129,21 @@
             <artifactId>spark-mllib_2.10</artifactId>
             <version>1.3.0</version>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+            <version>4.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.ambari</groupId>
+            <artifactId>ambari-metrics-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.2.5</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/AmsRTest.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/AmsRTest.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/AmsRTest.java
deleted file mode 100644
index 2bbc250..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/AmsRTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.R;
-
-import org.apache.ambari.metrics.alertservice.common.ResultSet;
-import org.apache.ambari.metrics.alertservice.common.DataSet;
-import org.apache.commons.lang.ArrayUtils;
-import org.rosuda.JRI.REXP;
-import org.rosuda.JRI.RVector;
-import org.rosuda.JRI.Rengine;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-public class AmsRTest {
-
-    public static void main(String[] args) {
-
-        String metricName = "TestMetric";
-        double[] ts = getTS(1000);
-
-        double[] train_ts = ArrayUtils.subarray(ts, 0,750);
-        double[] train_x = getData(750);
-        DataSet trainData = new DataSet(metricName, train_ts, train_x);
-
-        double[] test_ts = ArrayUtils.subarray(ts, 750,1000);
-        double[] test_x = getData(250);
-        test_x[50] = 5.5; //Anomaly
-        DataSet testData = new DataSet(metricName, test_ts, test_x);
-        ResultSet rs;
-
-        Map<String, String> configs = new HashMap();
-
-        System.out.println("TUKEYS");
-        configs.put("tukeys.n", "3");
-        rs = RFunctionInvoker.tukeys(trainData, testData, configs);
-        rs.print();
-        System.out.println("--------------");
-
-        System.out.println("EMA Global");
-        configs.put("ema.n", "3");
-        configs.put("ema.w", "0.8");
-        rs = RFunctionInvoker.ema_global(trainData, testData, configs);
-        rs.print();
-        System.out.println("--------------");
-
-        System.out.println("EMA Daily");
-        rs = RFunctionInvoker.ema_daily(trainData, testData, configs);
-        rs.print();
-        System.out.println("--------------");
-
-        configs.put("ks.p_value", "0.05");
-        System.out.println("KS Test");
-        rs = RFunctionInvoker.ksTest(trainData, testData, configs);
-        rs.print();
-        System.out.println("--------------");
-
-        ts = getTS(5000);
-        train_ts = ArrayUtils.subarray(ts, 30,4800);
-        train_x = getData(4800);
-        trainData = new DataSet(metricName, train_ts, train_x);
-        test_ts = ArrayUtils.subarray(ts, 4800,5000);
-        test_x = getData(200);
-        for (int i =0; i<200;i++) {
-            test_x[i] = test_x[i]*5;
-        }
-        testData = new DataSet(metricName, test_ts, test_x);
-        configs.put("hsdev.n", "3");
-        configs.put("hsdev.nhp", "3");
-        configs.put("hsdev.interval", "86400000");
-        configs.put("hsdev.period", "604800000");
-        System.out.println("HSdev");
-        rs = RFunctionInvoker.hsdev(trainData, testData, configs);
-        rs.print();
-        System.out.println("--------------");
-
-    }
-
-    static double[] getTS(int n) {
-        long currentTime = System.currentTimeMillis();
-        double[] ts = new double[n];
-        currentTime = currentTime - (currentTime % (5*60*1000));
-
-        for (int i = 0,j=n-1; i<n; i++,j--) {
-            ts[j] = currentTime;
-            currentTime = currentTime - (5*60*1000);
-        }
-        return ts;
-    }
-
-    static void testBasic() {
-        Rengine r = new Rengine(new String[]{"--no-save"}, false, null);
-        try {
-            r.eval("library(ambarimetricsAD)");
-            r.eval("source('~/dev/AMS/AD/ambarimetricsAD/org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.alerting.R/test.org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.alerting.R', echo=TRUE)");
-            r.eval("source('~/dev/AMS/AD/ambarimetricsAD/org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.alerting.R/util.org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.alerting.R', echo=TRUE)");
-            r.eval("source('~/dev/AMS/AD/ambarimetricsAD/org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.alerting.R/tukeys.org.apache.hadoop.yarn.server.applicationhistoryservice.metrics.alerting.R', echo=TRUE)");
-            double[] ts = getTS(5000);
-            double[] x = getData(5000);
-            r.assign("ts", ts);
-            r.assign("x", x);
-            r.eval("x[1000] <- 4.5");
-            r.eval("x[2000] <- 4.75");
-            r.eval("x[3000] <- 3.5");
-            r.eval("x[4000] <- 5.5");
-            r.eval("x[5000] <- 5.0");
-            r.eval("data <- data.frame(ts,x)");
-            r.eval("names(data) <- c(\"TS\", \"Metric\")");
-            System.out.println(r.eval("data"));
-            REXP exp = r.eval("t_an <- test_methods(data)");
-            exp = r.eval("t_an");
-            String strExp = exp.asString();
-            System.out.println("result:" + exp);
-            RVector cont = (RVector) exp.getContent();
-            double[] an_ts = cont.at(0).asDoubleArray();
-            double[] an_x = cont.at(1).asDoubleArray();
-            System.out.println("result:" + strExp);
-        }
-        finally {
-            r.end();
-        }
-    }
-    static double[] getData(int n) {
-        double[] metrics = new double[n];
-        Random random = new Random();
-        for (int i = 0; i<n; i++) {
-            metrics[i] = random.nextDouble();
-        }
-        return metrics;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/RFunctionInvoker.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/RFunctionInvoker.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/RFunctionInvoker.java
deleted file mode 100644
index 2713b71..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/R/RFunctionInvoker.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.R;
-
-
-import org.apache.ambari.metrics.alertservice.common.ResultSet;
-import org.apache.ambari.metrics.alertservice.common.DataSet;
-import org.rosuda.JRI.REXP;
-import org.rosuda.JRI.RVector;
-import org.rosuda.JRI.Rengine;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class RFunctionInvoker {
-
-    public static Rengine r = new Rengine(new String[]{"--no-save"}, false, null);
-
-
-    private static void loadDataSets(Rengine r, DataSet trainData, DataSet testData) {
-        r.assign("train_ts", trainData.ts);
-        r.assign("train_x", trainData.values);
-        r.eval("train_data <- data.frame(train_ts,train_x)");
-        r.eval("names(train_data) <- c(\"TS\", " + trainData.metricName + ")");
-
-        r.assign("test_ts", testData.ts);
-        r.assign("test_x", testData.values);
-        r.eval("test_data <- data.frame(test_ts,test_x)");
-        r.eval("names(test_data) <- c(\"TS\", " + testData.metricName + ")");
-    }
-
-
-    public static ResultSet tukeys(DataSet trainData, DataSet testData, Map<String, String> configs) {
-        try {
-            r.eval("source('tukeys.r', echo=TRUE)");
-
-            int n = Integer.parseInt(configs.get("tukeys.n"));
-            r.eval("n <- " + n);
-
-            loadDataSets(r, trainData, testData);
-
-            r.eval("an <- ams_tukeys(train_data, test_data, n)");
-            REXP exp = r.eval("an");
-            RVector cont = (RVector) exp.getContent();
-            List<double[]> result = new ArrayList();
-            for (int i = 0; i< cont.size(); i++) {
-                result.add(cont.at(i).asDoubleArray());
-            }
-            return new ResultSet(result);
-        } catch(Exception e) {
-            e.printStackTrace();
-        } finally {
-            r.end();
-        }
-        return null;
-    }
-
-    public static ResultSet ema_global(DataSet trainData, DataSet testData, Map<String, String> configs) {
-        try {
-            r.eval("source('ema.R', echo=TRUE)");
-
-            int n = Integer.parseInt(configs.get("ema.n"));
-            r.eval("n <- " + n);
-
-            double w = Double.parseDouble(configs.get("ema.w"));
-            r.eval("w <- " + w);
-
-            loadDataSets(r, trainData, testData);
-
-            r.eval("an <- ema_global(train_data, test_data, w, n)");
-            REXP exp = r.eval("an");
-            RVector cont = (RVector) exp.getContent();
-            List<double[]> result = new ArrayList();
-            for (int i = 0; i< cont.size(); i++) {
-                result.add(cont.at(i).asDoubleArray());
-            }
-            return new ResultSet(result);
-
-        } catch(Exception e) {
-            e.printStackTrace();
-        } finally {
-            r.end();
-        }
-        return null;
-    }
-
-    public static ResultSet ema_daily(DataSet trainData, DataSet testData, Map<String, String> configs) {
-        try {
-            r.eval("source('ema.R', echo=TRUE)");
-
-            int n = Integer.parseInt(configs.get("ema.n"));
-            r.eval("n <- " + n);
-
-            double w = Double.parseDouble(configs.get("ema.w"));
-            r.eval("w <- " + w);
-
-            loadDataSets(r, trainData, testData);
-
-            r.eval("an <- ema_daily(train_data, test_data, w, n)");
-            REXP exp = r.eval("an");
-            RVector cont = (RVector) exp.getContent();
-            List<double[]> result = new ArrayList();
-            for (int i = 0; i< cont.size(); i++) {
-                result.add(cont.at(i).asDoubleArray());
-            }
-            return new ResultSet(result);
-
-        } catch(Exception e) {
-            e.printStackTrace();
-        } finally {
-            r.end();
-        }
-        return null;
-    }
-
-    public static ResultSet ksTest(DataSet trainData, DataSet testData, Map<String, String> configs) {
-        try {
-            r.eval("source('kstest.r', echo=TRUE)");
-
-            double p_value = Double.parseDouble(configs.get("ks.p_value"));
-            r.eval("p_value <- " + p_value);
-
-            loadDataSets(r, trainData, testData);
-
-            r.eval("an <- ams_ks(train_data, test_data, p_value)");
-            REXP exp = r.eval("an");
-            RVector cont = (RVector) exp.getContent();
-            List<double[]> result = new ArrayList();
-            for (int i = 0; i< cont.size(); i++) {
-                result.add(cont.at(i).asDoubleArray());
-            }
-            return new ResultSet(result);
-
-        } catch(Exception e) {
-            e.printStackTrace();
-        } finally {
-            r.end();
-        }
-        return null;
-    }
-
-    public static ResultSet hsdev(DataSet trainData, DataSet testData, Map<String, String> configs) {
-        try {
-            r.eval("source('hsdev.r', echo=TRUE)");
-
-            int n = Integer.parseInt(configs.get("hsdev.n"));
-            r.eval("n <- " + n);
-
-            int nhp = Integer.parseInt(configs.get("hsdev.nhp"));
-            r.eval("nhp <- " + nhp);
-
-            long interval = Long.parseLong(configs.get("hsdev.interval"));
-            r.eval("interval <- " + interval);
-
-            long period = Long.parseLong(configs.get("hsdev.period"));
-            r.eval("period <- " + period);
-
-            loadDataSets(r, trainData, testData);
-
-            r.eval("an2 <- hsdev_daily(train_data, test_data, n, nhp, interval, period)");
-            REXP exp = r.eval("an2");
-            RVector cont = (RVector) exp.getContent();
-
-            List<double[]> result = new ArrayList();
-            for (int i = 0; i< cont.size(); i++) {
-                result.add(cont.at(i).asDoubleArray());
-            }
-            return new ResultSet(result);
-        } catch(Exception e) {
-            e.printStackTrace();
-        } finally {
-            r.end();
-        }
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/DataSet.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/DataSet.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/DataSet.java
deleted file mode 100644
index a709c73..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/DataSet.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-import java.util.Arrays;
-
-public class DataSet {
-
-    public String metricName;
-    public double[] ts;
-    public double[] values;
-
-    public DataSet(String metricName, double[] ts, double[] values) {
-        this.metricName = metricName;
-        this.ts = ts;
-        this.values = values;
-    }
-
-    @Override
-    public String toString() {
-        return metricName + Arrays.toString(ts) + Arrays.toString(values);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MethodResult.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MethodResult.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MethodResult.java
deleted file mode 100644
index 6bf58df..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MethodResult.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-public abstract class MethodResult {
-    protected String methodType;
-    public abstract String prettyPrint();
-
-    public String getMethodType() {
-        return methodType;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MetricAnomaly.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MetricAnomaly.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MetricAnomaly.java
deleted file mode 100644
index 4dbb425..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/MetricAnomaly.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-public class MetricAnomaly {
-
-    private String metricKey;
-    private long timestamp;
-    private double metricValue;
-    private MethodResult methodResult;
-
-    public MetricAnomaly(String metricKey, long timestamp, double metricValue, MethodResult methodResult) {
-        this.metricKey = metricKey;
-        this.timestamp = timestamp;
-        this.metricValue = metricValue;
-        this.methodResult = methodResult;
-    }
-
-    public String getMetricKey() {
-        return metricKey;
-    }
-
-    public void setMetricName(String metricName) {
-        this.metricKey = metricName;
-    }
-
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    public void setTimestamp(long timestamp) {
-        this.timestamp = timestamp;
-    }
-
-    public double getMetricValue() {
-        return metricValue;
-    }
-
-    public void setMetricValue(double metricValue) {
-        this.metricValue = metricValue;
-    }
-
-    public MethodResult getMethodResult() {
-        return methodResult;
-    }
-
-    public void setMethodResult(MethodResult methodResult) {
-        this.methodResult = methodResult;
-    }
-
-    public String getAnomalyAsString() {
-        return metricKey + ":" + timestamp + ":" + metricValue + ":" + methodResult.prettyPrint();
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/ResultSet.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/ResultSet.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/ResultSet.java
deleted file mode 100644
index 9415c1b..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/ResultSet.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ResultSet {
-
-    List<double[]> resultset = new ArrayList<>();
-
-    public ResultSet(List<double[]> resultset) {
-        this.resultset = resultset;
-    }
-
-    public void print() {
-        System.out.println("Result : ");
-        if (!resultset.isEmpty()) {
-            for (int i = 0; i<resultset.get(0).length;i++) {
-                for (double[] entity : resultset) {
-                    System.out.print(entity[i] + " ");
-                }
-                System.out.println();
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/SingleValuedTimelineMetric.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/SingleValuedTimelineMetric.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/SingleValuedTimelineMetric.java
deleted file mode 100644
index acd4452..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/SingleValuedTimelineMetric.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-
-public class SingleValuedTimelineMetric {
-    private Long timestamp;
-    private Double value;
-    private String metricName;
-    private String appId;
-    private String instanceId;
-    private String hostName;
-    private Long startTime;
-    private String type;
-
-    public void setSingleTimeseriesValue(Long timestamp, Double value) {
-        this.timestamp = timestamp;
-        this.value = value;
-    }
-
-    public SingleValuedTimelineMetric(String metricName, String appId,
-                                      String instanceId, String hostName,
-                                      long timestamp, long startTime, String type) {
-        this.metricName = metricName;
-        this.appId = appId;
-        this.instanceId = instanceId;
-        this.hostName = hostName;
-        this.timestamp = timestamp;
-        this.startTime = startTime;
-        this.type = type;
-    }
-
-    public Long getTimestamp() {
-        return timestamp;
-    }
-
-    public long getStartTime() {
-        return startTime;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public Double getValue() {
-        return value;
-    }
-
-    public String getMetricName() {
-        return metricName;
-    }
-
-    public String getAppId() {
-        return appId;
-    }
-
-    public String getInstanceId() {
-        return instanceId;
-    }
-
-    public String getHostName() {
-        return hostName;
-    }
-
-    public boolean equalsExceptTime(TimelineMetric metric) {
-        if (!metricName.equals(metric.getMetricName())) return false;
-        if (hostName != null ? !hostName.equals(metric.getHostName()) : metric.getHostName() != null)
-            return false;
-        if (appId != null ? !appId.equals(metric.getAppId()) : metric.getAppId() != null)
-            return false;
-        if (instanceId != null ? !instanceId.equals(metric.getInstanceId()) : metric.getInstanceId() != null) return false;
-
-        return true;
-    }
-
-    public TimelineMetric getTimelineMetric() {
-        TimelineMetric metric = new TimelineMetric();
-        metric.setMetricName(this.metricName);
-        metric.setAppId(this.appId);
-        metric.setHostName(this.hostName);
-        metric.setType(this.type);
-        metric.setInstanceId(this.instanceId);
-        metric.setStartTime(this.startTime);
-        metric.setTimestamp(this.timestamp);
-        metric.getMetricValues().put(timestamp, value);
-        return metric;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/StatisticUtils.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/StatisticUtils.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/StatisticUtils.java
deleted file mode 100644
index 81bd77b..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/StatisticUtils.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-
-public class StatisticUtils {
-
-  public static double mean(Collection<Double> values) {
-    double sum = 0;
-    for (double d : values) {
-      sum += d;
-    }
-    return sum / values.size();
-  }
-
-  public static double variance(Collection<Double> values) {
-    double avg =  mean(values);
-    double variance = 0;
-    for (double d : values) {
-      variance += Math.pow(d - avg, 2.0);
-    }
-    return variance;
-  }
-
-  public static double sdev(Collection<Double> values, boolean useBesselsCorrection) {
-    double variance = variance(values);
-    int n = (useBesselsCorrection) ? values.size() - 1 : values.size();
-    return Math.sqrt(variance / n);
-  }
-
-  public static double median(Collection<Double> values) {
-    ArrayList<Double> clonedValues = new ArrayList<Double>(values);
-    Collections.sort(clonedValues);
-    int n = values.size();
-
-    if (n % 2 != 0) {
-      return clonedValues.get((n-1)/2);
-    } else {
-      return ( clonedValues.get((n-1)/2) + clonedValues.get(n/2) ) / 2;
-    }
-  }
-
-
-
-//  public static void main(String[] args) {
-//
-//    Collection<Double> values = new ArrayList<>();
-//    values.add(1.0);
-//    values.add(2.0);
-//    values.add(3.0);
-//    values.add(4.0);
-//    values.add(5.0);
-//
-//    System.out.println(mean(values));
-//    System.out.println(sdev(values, false));
-//    System.out.println(median(values));
-//  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetric.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetric.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetric.java
deleted file mode 100644
index 88ad834..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetric.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.classification.InterfaceStability;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-@XmlRootElement(name = "metric")
-@XmlAccessorType(XmlAccessType.NONE)
-@InterfaceAudience.Public
-@InterfaceStability.Unstable
-public class TimelineMetric implements Comparable<TimelineMetric>, Serializable {
-
-    private String metricName;
-    private String appId;
-    private String instanceId;
-    private String hostName;
-    private long timestamp;
-    private long startTime;
-    private String type;
-    private String units;
-    private TreeMap<Long, Double> metricValues = new TreeMap<Long, Double>();
-    private Map<String, String> metadata = new HashMap<>();
-
-    // default
-    public TimelineMetric() {
-
-    }
-
-    public TimelineMetric(String metricName, String appId, String hostName, TreeMap<Long,Double> metricValues) {
-        this.metricName = metricName;
-        this.appId = appId;
-        this.hostName = hostName;
-        this.metricValues.putAll(metricValues);
-    }
-
-    // copy constructor
-    public TimelineMetric(TimelineMetric metric) {
-        setMetricName(metric.getMetricName());
-        setType(metric.getType());
-        setUnits(metric.getUnits());
-        setTimestamp(metric.getTimestamp());
-        setAppId(metric.getAppId());
-        setInstanceId(metric.getInstanceId());
-        setHostName(metric.getHostName());
-        setStartTime(metric.getStartTime());
-        setMetricValues(new TreeMap<Long, Double>(metric.getMetricValues()));
-    }
-
-    @XmlElement(name = "metricname")
-    public String getMetricName() {
-        return metricName;
-    }
-
-    public void setMetricName(String metricName) {
-        this.metricName = metricName;
-    }
-
-    @XmlElement(name = "appid")
-    public String getAppId() {
-        return appId;
-    }
-
-    public void setAppId(String appId) {
-        this.appId = appId;
-    }
-
-    @XmlElement(name = "instanceid")
-    public String getInstanceId() {
-        return instanceId;
-    }
-
-    public void setInstanceId(String instanceId) {
-        this.instanceId = instanceId;
-    }
-
-    @XmlElement(name = "hostname")
-    public String getHostName() {
-        return hostName;
-    }
-
-    public void setHostName(String hostName) {
-        this.hostName = hostName;
-    }
-
-    @XmlElement(name = "timestamp")
-    public long getTimestamp() {
-        return timestamp;
-    }
-
-    public void setTimestamp(long timestamp) {
-        this.timestamp = timestamp;
-    }
-
-    @XmlElement(name = "starttime")
-    public long getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(long startTime) {
-        this.startTime = startTime;
-    }
-
-    @XmlElement(name = "type", defaultValue = "UNDEFINED")
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    @XmlElement(name = "units")
-    public String getUnits() {
-        return units;
-    }
-
-    public void setUnits(String units) {
-        this.units = units;
-    }
-
-    @XmlElement(name = "metrics")
-    public TreeMap<Long, Double> getMetricValues() {
-        return metricValues;
-    }
-
-    public void setMetricValues(TreeMap<Long, Double> metricValues) {
-        this.metricValues = metricValues;
-    }
-
-    public void addMetricValues(Map<Long, Double> metricValues) {
-        this.metricValues.putAll(metricValues);
-    }
-
-    @XmlElement(name = "metadata")
-    public Map<String,String> getMetadata () {
-        return metadata;
-    }
-
-    public void setMetadata (Map<String,String> metadata) {
-        this.metadata = metadata;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        TimelineMetric metric = (TimelineMetric) o;
-
-        if (!metricName.equals(metric.metricName)) return false;
-        if (hostName != null ? !hostName.equals(metric.hostName) : metric.hostName != null)
-            return false;
-        if (appId != null ? !appId.equals(metric.appId) : metric.appId != null)
-            return false;
-        if (instanceId != null ? !instanceId.equals(metric.instanceId) : metric.instanceId != null)
-            return false;
-        if (timestamp != metric.timestamp) return false;
-        if (startTime != metric.startTime) return false;
-
-        return true;
-    }
-
-    public boolean equalsExceptTime(TimelineMetric metric) {
-        if (!metricName.equals(metric.metricName)) return false;
-        if (hostName != null ? !hostName.equals(metric.hostName) : metric.hostName != null)
-            return false;
-        if (appId != null ? !appId.equals(metric.appId) : metric.appId != null)
-            return false;
-        if (instanceId != null ? !instanceId.equals(metric.instanceId) : metric.instanceId != null)
-            return false;
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = metricName.hashCode();
-        result = 31 * result + (appId != null ? appId.hashCode() : 0);
-        result = 31 * result + (instanceId != null ? instanceId.hashCode() : 0);
-        result = 31 * result + (hostName != null ? hostName.hashCode() : 0);
-        result = 31 * result + (int) (timestamp ^ (timestamp >>> 32));
-        return result;
-    }
-
-    @Override
-    public int compareTo(TimelineMetric other) {
-        if (timestamp > other.timestamp) {
-            return -1;
-        } else if (timestamp < other.timestamp) {
-            return 1;
-        } else {
-            return metricName.compareTo(other.metricName);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetrics.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetrics.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetrics.java
deleted file mode 100644
index 7df6a9c..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/common/TimelineMetrics.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.common;
-
-import org.apache.hadoop.classification.InterfaceAudience;
-import org.apache.hadoop.classification.InterfaceStability;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * The class that hosts a list of timeline entities.
- */
-@XmlRootElement(name = "metrics")
-@XmlAccessorType(XmlAccessType.NONE)
-@InterfaceAudience.Public
-@InterfaceStability.Unstable
-public class TimelineMetrics implements Serializable {
-
-    private List<TimelineMetric> allMetrics = new ArrayList<TimelineMetric>();
-
-    public TimelineMetrics() {}
-
-    @XmlElement(name = "metrics")
-    public List<TimelineMetric> getMetrics() {
-        return allMetrics;
-    }
-
-    public void setMetrics(List<TimelineMetric> allMetrics) {
-        this.allMetrics = allMetrics;
-    }
-
-    private boolean isEqualTimelineMetrics(TimelineMetric metric1,
-                                           TimelineMetric metric2) {
-
-        boolean isEqual = true;
-
-        if (!metric1.getMetricName().equals(metric2.getMetricName())) {
-            return false;
-        }
-
-        if (metric1.getHostName() != null) {
-            isEqual = metric1.getHostName().equals(metric2.getHostName());
-        }
-
-        if (metric1.getAppId() != null) {
-            isEqual = metric1.getAppId().equals(metric2.getAppId());
-        }
-
-        return isEqual;
-    }
-
-    /**
-     * Merge with existing TimelineMetric if everything except startTime is
-     * the same.
-     * @param metric {@link TimelineMetric}
-     */
-    public void addOrMergeTimelineMetric(TimelineMetric metric) {
-        TimelineMetric metricToMerge = null;
-
-        if (!allMetrics.isEmpty()) {
-            for (TimelineMetric timelineMetric : allMetrics) {
-                if (timelineMetric.equalsExceptTime(metric)) {
-                    metricToMerge = timelineMetric;
-                    break;
-                }
-            }
-        }
-
-        if (metricToMerge != null) {
-            metricToMerge.addMetricValues(metric.getMetricValues());
-            if (metricToMerge.getTimestamp() > metric.getTimestamp()) {
-                metricToMerge.setTimestamp(metric.getTimestamp());
-            }
-            if (metricToMerge.getStartTime() > metric.getStartTime()) {
-                metricToMerge.setStartTime(metric.getStartTime());
-            }
-        } else {
-            allMetrics.add(metric);
-        }
-    }
-
-    // Optimization that addresses too many TreeMaps from getting created.
-    public void addOrMergeTimelineMetric(SingleValuedTimelineMetric metric) {
-        TimelineMetric metricToMerge = null;
-
-        if (!allMetrics.isEmpty()) {
-            for (TimelineMetric timelineMetric : allMetrics) {
-                if (metric.equalsExceptTime(timelineMetric)) {
-                    metricToMerge = timelineMetric;
-                    break;
-                }
-            }
-        }
-
-        if (metricToMerge != null) {
-            metricToMerge.getMetricValues().put(metric.getTimestamp(), metric.getValue());
-            if (metricToMerge.getTimestamp() > metric.getTimestamp()) {
-                metricToMerge.setTimestamp(metric.getTimestamp());
-            }
-            if (metricToMerge.getStartTime() > metric.getStartTime()) {
-                metricToMerge.setStartTime(metric.getStartTime());
-            }
-        } else {
-            allMetrics.add(metric.getTimelineMetric());
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/MetricAnomalyModel.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/MetricAnomalyModel.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/MetricAnomalyModel.java
deleted file mode 100644
index af33d26..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/MetricAnomalyModel.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.methods;
-
-import org.apache.ambari.metrics.alertservice.common.MetricAnomaly;
-import org.apache.ambari.metrics.alertservice.common.TimelineMetric;
-
-import java.util.List;
-
-public interface MetricAnomalyModel {
-
-    public List<MetricAnomaly> onNewMetric(TimelineMetric metric);
-    public List<MetricAnomaly> test(TimelineMetric metric);
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaDS.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaDS.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaDS.java
deleted file mode 100644
index 32cd96b..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaDS.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.methods.ema;
-
-import com.sun.org.apache.commons.logging.Log;
-import com.sun.org.apache.commons.logging.LogFactory;
-
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.Serializable;
-
-@XmlRootElement
-public class EmaDS implements Serializable {
-
-    String metricName;
-    String appId;
-    String hostname;
-    double ema;
-    double ems;
-    double weight;
-    int timessdev;
-    private static final Log LOG = LogFactory.getLog(EmaDS.class);
-
-    public EmaDS(String metricName, String appId, String hostname, double weight, int timessdev) {
-        this.metricName = metricName;
-        this.appId = appId;
-        this.hostname = hostname;
-        this.weight = weight;
-        this.timessdev = timessdev;
-        this.ema = 0.0;
-        this.ems = 0.0;
-    }
-
-
-    public EmaResult testAndUpdate(double metricValue) {
-
-        double diff  = Math.abs(ema - metricValue) - (timessdev * ems);
-
-        ema = weight * ema + (1 - weight) * metricValue;
-        ems = Math.sqrt(weight * Math.pow(ems, 2.0) + (1 - weight) * Math.pow(metricValue - ema, 2.0));
-        LOG.info(ema + ", " + ems);
-        return diff > 0 ? new EmaResult(diff) : null;
-    }
-
-    public void update(double metricValue) {
-        ema = weight * ema + (1 - weight) * metricValue;
-        ems = Math.sqrt(weight * Math.pow(ems, 2.0) + (1 - weight) * Math.pow(metricValue - ema, 2.0));
-        LOG.info(ema + ", " + ems);
-    }
-
-    public EmaResult test(double metricValue) {
-        double diff  = Math.abs(ema - metricValue) - (timessdev * ems);
-        return diff > 0 ? new EmaResult(diff) : null;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModel.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModel.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModel.java
deleted file mode 100644
index 13a0f55..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModel.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.methods.ema;
-
-import com.google.gson.Gson;
-import com.sun.org.apache.commons.logging.Log;
-import com.sun.org.apache.commons.logging.LogFactory;
-import org.apache.ambari.metrics.alertservice.common.MethodResult;
-import org.apache.ambari.metrics.alertservice.common.MetricAnomaly;
-import org.apache.ambari.metrics.alertservice.common.TimelineMetric;
-import org.apache.ambari.metrics.alertservice.methods.MetricAnomalyModel;
-import org.apache.spark.SparkContext;
-import org.apache.spark.mllib.util.Saveable;
-
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlRootElement;
-import java.io.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@XmlRootElement
-public class EmaModel implements MetricAnomalyModel, Saveable, Serializable {
-
-    @XmlElement(name = "trackedEmas")
-    private Map<String, EmaDS> trackedEmas = new HashMap<>();
-    private static final Log LOG = LogFactory.getLog(EmaModel.class);
-
-    public List<MetricAnomaly> onNewMetric(TimelineMetric metric) {
-
-        String metricName = metric.getMetricName();
-        String appId = metric.getAppId();
-        String hostname = metric.getHostName();
-        String key = metricName + "_" + appId + "_" + hostname;
-        List<MetricAnomaly> anomalies = new ArrayList<>();
-
-        if (!trackedEmas.containsKey(metricName)) {
-            trackedEmas.put(key, new EmaDS(metricName, appId, hostname, 0.8, 3));
-        }
-
-        EmaDS emaDS = trackedEmas.get(key);
-        for (Long timestamp : metric.getMetricValues().keySet()) {
-            double metricValue = metric.getMetricValues().get(timestamp);
-            MethodResult result = emaDS.testAndUpdate(metricValue);
-            if (result != null) {
-                MetricAnomaly metricAnomaly = new MetricAnomaly(key,timestamp, metricValue, result);
-                anomalies.add(metricAnomaly);
-            }
-        }
-        return anomalies;
-    }
-
-    public EmaDS train(TimelineMetric metric, double weight, int timessdev) {
-
-        String metricName = metric.getMetricName();
-        String appId = metric.getAppId();
-        String hostname = metric.getHostName();
-        String key = metricName + "_" + appId + "_" + hostname;
-
-        EmaDS emaDS = new EmaDS(metric.getMetricName(), metric.getAppId(), metric.getHostName(), weight, timessdev);
-        LOG.info("In EMA Train step");
-        for (Long timestamp : metric.getMetricValues().keySet()) {
-            emaDS.update(metric.getMetricValues().get(timestamp));
-        }
-        trackedEmas.put(key, emaDS);
-        return emaDS;
-    }
-
-    public List<MetricAnomaly> test(TimelineMetric metric) {
-        String metricName = metric.getMetricName();
-        String appId = metric.getAppId();
-        String hostname = metric.getHostName();
-        String key = metricName + "_" + appId + "_" + hostname;
-
-        EmaDS emaDS = trackedEmas.get(key);
-
-        if (emaDS == null) {
-            return new ArrayList<>();
-        }
-
-        List<MetricAnomaly> anomalies = new ArrayList<>();
-
-        for (Long timestamp : metric.getMetricValues().keySet()) {
-            double metricValue = metric.getMetricValues().get(timestamp);
-            MethodResult result = emaDS.testAndUpdate(metricValue);
-            if (result != null) {
-                MetricAnomaly metricAnomaly = new MetricAnomaly(key,timestamp, metricValue, result);
-                anomalies.add(metricAnomaly);
-            }
-        }
-        return anomalies;
-    }
-
-    @Override
-    public void save(SparkContext sc, String path) {
-        Gson gson = new Gson();
-        try {
-            String json = gson.toJson(this);
-            try (Writer writer = new BufferedWriter(new OutputStreamWriter(
-                    new FileOutputStream(path), "utf-8"))) {
-                writer.write(json);
-            }        } catch (IOException e) {
-            LOG.error(e);
-        }
-    }
-
-    @Override
-    public String formatVersion() {
-        return "1.0";
-    }
-
-}
-

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModelLoader.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModelLoader.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModelLoader.java
deleted file mode 100644
index 0205844..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaModelLoader.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.methods.ema;
-
-import com.google.gson.Gson;
-import com.sun.org.apache.commons.logging.Log;
-import com.sun.org.apache.commons.logging.LogFactory;
-import org.apache.spark.SparkContext;
-import org.apache.spark.mllib.util.Loader;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-public class EmaModelLoader implements Loader<EmaModel> {
-    private static final Log LOG = LogFactory.getLog(EmaModelLoader.class);
-
-    @Override
-    public EmaModel load(SparkContext sc, String path) {
-        Gson gson = new Gson();
-        try {
-            String fileString = new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
-            return gson.fromJson(fileString, EmaModel.class);
-        } catch (IOException e) {
-            LOG.error(e);
-        }
-        return null;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaResult.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaResult.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaResult.java
deleted file mode 100644
index 2d24a9c..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/EmaResult.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.methods.ema;
-
-import org.apache.ambari.metrics.alertservice.common.MethodResult;
-
-public class EmaResult extends MethodResult{
-
-    double diff;
-
-    public EmaResult(double diff) {
-        this.methodType = "EMA";
-        this.diff = diff;
-    }
-
-
-    @Override
-    public String prettyPrint() {
-        return methodType + "(` = " + diff + ")";
-    }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/TestEmaModel.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/TestEmaModel.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/TestEmaModel.java
deleted file mode 100644
index b851dab..0000000
--- a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/methods/ema/TestEmaModel.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.ambari.metrics.alertservice.methods.ema;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.gson.Gson;
-import org.apache.ambari.metrics.alertservice.common.TimelineMetric;
-
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class TestEmaModel {
-
-    public static void main(String[] args) throws IOException {
-
-        long now = System.currentTimeMillis();
-        TimelineMetric metric1 = new TimelineMetric();
-        metric1.setMetricName("dummy_metric");
-        metric1.setHostName("dummy_host");
-        metric1.setTimestamp(now);
-        metric1.setStartTime(now - 1000);
-        metric1.setAppId("HOST");
-        metric1.setType("Integer");
-
-        TreeMap<Long, Double> metricValues = new TreeMap<Long, Double>();
-
-        for (int i = 0; i<20;i++) {
-            double metric = 9 + Math.random();
-            metricValues.put(now - i*100, metric);
-        }
-        metric1.setMetricValues(metricValues);
-
-        EmaModel emaModel = new EmaModel();
-
-        emaModel.train(metric1, 0.8, 3);
-    }
-
-    /*
-     {{
-            put(now - 100, 1.20);
-            put(now - 200, 1.25);
-            put(now - 300, 1.30);
-            put(now - 400, 4.50);
-            put(now - 500, 1.35);
-            put(now - 400, 5.50);
-        }}
-     */
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/AmbariServerInterface.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/AmbariServerInterface.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/AmbariServerInterface.java
new file mode 100644
index 0000000..0c1c6fc
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/AmbariServerInterface.java
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.metrics.alertservice.prototype;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Serializable;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+public class AmbariServerInterface implements Serializable{
+
+  private static final Log LOG = LogFactory.getLog(AmbariServerInterface.class);
+
+  private String ambariServerHost;
+  private String clusterName;
+
+  public AmbariServerInterface(String ambariServerHost, String clusterName) {
+    this.ambariServerHost = ambariServerHost;
+    this.clusterName = clusterName;
+  }
+
+  public int getPointInTimeSensitivity() {
+
+    String url = constructUri("http", ambariServerHost, "8080", "/api/v1/clusters/" + clusterName + "/alert_definitions?fields=*");
+
+    URL obj = null;
+    BufferedReader in = null;
+
+    try {
+      obj = new URL(url);
+      HttpURLConnection con = (HttpURLConnection) obj.openConnection();
+      con.setRequestMethod("GET");
+
+      String encoded = Base64.getEncoder().encodeToString(("admin:admin").getBytes(StandardCharsets.UTF_8));
+      con.setRequestProperty("Authorization", "Basic "+encoded);
+
+      int responseCode = con.getResponseCode();
+      LOG.info("Sending 'GET' request to URL : " + url);
+      LOG.info("Response Code : " + responseCode);
+
+      in = new BufferedReader(
+        new InputStreamReader(con.getInputStream()));
+
+      StringBuilder responseJsonSb = new StringBuilder();
+      String line;
+      while ((line = in.readLine()) != null) {
+        responseJsonSb.append(line);
+      }
+
+      JSONObject jsonObject = new JSONObject(responseJsonSb.toString());
+      JSONArray array = jsonObject.getJSONArray("items");
+      for(int i = 0 ; i < array.length() ; i++){
+        JSONObject alertDefn = array.getJSONObject(i).getJSONObject("AlertDefinition");
+        LOG.info("alertDefn : " + alertDefn.get("name"));
+        if (alertDefn.get("name") != null && alertDefn.get("name").equals("point_in_time_metrics_anomalies")) {
+          JSONObject sourceNode = alertDefn.getJSONObject("source");
+          JSONArray params = sourceNode.getJSONArray("parameters");
+          for(int j = 0 ; j < params.length() ; j++){
+            JSONObject param = params.getJSONObject(j);
+            if (param.get("name").equals("sensitivity")) {
+              return param.getInt("value");
+            }
+          }
+          break;
+        }
+      }
+
+    } catch (Exception e) {
+      LOG.error(e);
+    } finally {
+      if (in != null) {
+        try {
+          in.close();
+        } catch (IOException e) {
+          LOG.warn(e);
+        }
+      }
+    }
+
+    return -1;
+  }
+
+  private String constructUri(String protocol, String host, String port, String path) {
+    StringBuilder sb = new StringBuilder(protocol);
+    sb.append("://");
+    sb.append(host);
+    sb.append(":");
+    sb.append(port);
+    sb.append(path);
+    return sb.toString();
+  }
+
+//  public static void main(String[] args) {
+//    AmbariServerInterface ambariServerInterface = new AmbariServerInterface();
+//    ambariServerInterface.getPointInTimeSensitivity("avijayan-ams-1.openstacklocal","c1");
+//  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyDetectorTestInput.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyDetectorTestInput.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyDetectorTestInput.java
new file mode 100644
index 0000000..490328a
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyDetectorTestInput.java
@@ -0,0 +1,126 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.metrics.alertservice.prototype;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.util.List;
+import java.util.Map;
+
+@XmlRootElement
+public class MetricAnomalyDetectorTestInput {
+
+  public MetricAnomalyDetectorTestInput() {
+  }
+
+  //Train data
+  private String trainDataName;
+  private String trainDataType;
+  private Map<String, String> trainDataConfigs;
+  private int trainDataSize;
+
+  //Test data
+  private String testDataName;
+  private String testDataType;
+  private Map<String, String> testDataConfigs;
+  private int testDataSize;
+
+  //Algorithm data
+  private List<String> methods;
+  private Map<String, String> methodConfigs;
+
+  public String getTrainDataName() {
+    return trainDataName;
+  }
+
+  public void setTrainDataName(String trainDataName) {
+    this.trainDataName = trainDataName;
+  }
+
+  public String getTrainDataType() {
+    return trainDataType;
+  }
+
+  public void setTrainDataType(String trainDataType) {
+    this.trainDataType = trainDataType;
+  }
+
+  public Map<String, String> getTrainDataConfigs() {
+    return trainDataConfigs;
+  }
+
+  public void setTrainDataConfigs(Map<String, String> trainDataConfigs) {
+    this.trainDataConfigs = trainDataConfigs;
+  }
+
+  public String getTestDataName() {
+    return testDataName;
+  }
+
+  public void setTestDataName(String testDataName) {
+    this.testDataName = testDataName;
+  }
+
+  public String getTestDataType() {
+    return testDataType;
+  }
+
+  public void setTestDataType(String testDataType) {
+    this.testDataType = testDataType;
+  }
+
+  public Map<String, String> getTestDataConfigs() {
+    return testDataConfigs;
+  }
+
+  public void setTestDataConfigs(Map<String, String> testDataConfigs) {
+    this.testDataConfigs = testDataConfigs;
+  }
+
+  public Map<String, String> getMethodConfigs() {
+    return methodConfigs;
+  }
+
+  public void setMethodConfigs(Map<String, String> methodConfigs) {
+    this.methodConfigs = methodConfigs;
+  }
+
+  public int getTrainDataSize() {
+    return trainDataSize;
+  }
+
+  public void setTrainDataSize(int trainDataSize) {
+    this.trainDataSize = trainDataSize;
+  }
+
+  public int getTestDataSize() {
+    return testDataSize;
+  }
+
+  public void setTestDataSize(int testDataSize) {
+    this.testDataSize = testDataSize;
+  }
+
+  public List<String> getMethods() {
+    return methods;
+  }
+
+  public void setMethods(List<String> methods) {
+    this.methods = methods;
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyTester.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyTester.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyTester.java
new file mode 100644
index 0000000..bff8120
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricAnomalyTester.java
@@ -0,0 +1,163 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.metrics.alertservice.prototype;
+
+import org.apache.ambari.metrics.alertservice.prototype.common.DataSeries;
+import org.apache.ambari.metrics.alertservice.prototype.common.ResultSet;
+import org.apache.ambari.metrics.alertservice.seriesgenerator.MetricSeriesGeneratorFactory;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
+import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class MetricAnomalyTester {
+
+  public static String appId = MetricsCollectorInterface.serviceName;
+  static final Log LOG = LogFactory.getLog(MetricAnomalyTester.class);
+  static Map<String, TimelineMetric> timelineMetricMap = new HashMap<>();
+
+  public static TimelineMetrics runTestAnomalyRequest(MetricAnomalyDetectorTestInput input) throws UnknownHostException {
+
+    long currentTime = System.currentTimeMillis();
+    TimelineMetrics timelineMetrics = new TimelineMetrics();
+    String hostname = InetAddress.getLocalHost().getHostName();
+
+    //Train data
+    TimelineMetric metric1 = new TimelineMetric();
+    if (StringUtils.isNotEmpty(input.getTrainDataName())) {
+      metric1 = timelineMetricMap.get(input.getTrainDataName());
+      if (metric1 == null) {
+        metric1 = new TimelineMetric();
+        double[] trainSeries = MetricSeriesGeneratorFactory.generateSeries(input.getTrainDataType(), input.getTrainDataSize(), input.getTrainDataConfigs());
+        metric1.setMetricName(input.getTrainDataName());
+        metric1.setAppId(appId);
+        metric1.setHostName(hostname);
+        metric1.setStartTime(currentTime);
+        metric1.setInstanceId(null);
+        metric1.setMetricValues(getAsTimeSeries(currentTime, trainSeries));
+        timelineMetricMap.put(input.getTrainDataName(), metric1);
+      }
+      timelineMetrics.getMetrics().add(metric1);
+    } else {
+      LOG.error("No train data name specified");
+    }
+
+    //Test data
+    TimelineMetric metric2 = new TimelineMetric();
+    if (StringUtils.isNotEmpty(input.getTestDataName())) {
+      metric2 = timelineMetricMap.get(input.getTestDataName());
+      if (metric2 == null) {
+        metric2 = new TimelineMetric();
+        double[] testSeries = MetricSeriesGeneratorFactory.generateSeries(input.getTestDataType(), input.getTestDataSize(), input.getTestDataConfigs());
+        metric2.setMetricName(input.getTestDataName());
+        metric2.setAppId(appId);
+        metric2.setHostName(hostname);
+        metric2.setStartTime(currentTime);
+        metric2.setInstanceId(null);
+        metric2.setMetricValues(getAsTimeSeries(currentTime, testSeries));
+        timelineMetricMap.put(input.getTestDataName(), metric2);
+      }
+      timelineMetrics.getMetrics().add(metric2);
+    } else {
+      LOG.warn("No test data name specified");
+    }
+
+    //Invoke method
+    if (CollectionUtils.isNotEmpty(input.getMethods())) {
+      RFunctionInvoker.setScriptsDir("/etc/ambari-metrics-collector/conf/R-scripts");
+      for (String methodType : input.getMethods()) {
+        ResultSet result = RFunctionInvoker.executeMethod(methodType, getAsDataSeries(metric1), getAsDataSeries(metric2), input.getMethodConfigs());
+        TimelineMetric timelineMetric = getAsTimelineMetric(result, methodType, input, currentTime, hostname);
+        if (timelineMetric != null) {
+          timelineMetrics.getMetrics().add(timelineMetric);
+        }
+      }
+    } else {
+      LOG.warn("No anomaly method requested");
+    }
+
+    return timelineMetrics;
+  }
+
+
+  private static TimelineMetric getAsTimelineMetric(ResultSet result, String methodType, MetricAnomalyDetectorTestInput input, long currentTime, String hostname) {
+
+    if (result == null) {
+      return null;
+    }
+
+    TimelineMetric timelineMetric = new TimelineMetric();
+    if (methodType.equals("tukeys") || methodType.equals("ema")) {
+      timelineMetric.setMetricName(input.getTrainDataName() + "_" + input.getTestDataName() + "_" + methodType + "_" + currentTime);
+      timelineMetric.setHostName(hostname);
+      timelineMetric.setAppId(appId);
+      timelineMetric.setInstanceId(null);
+      timelineMetric.setStartTime(currentTime);
+
+      TreeMap<Long, Double> metricValues = new TreeMap<>();
+      if (result.resultset.size() > 0) {
+        double[] ts = result.resultset.get(0);
+        double[] metrics = result.resultset.get(1);
+        for (int i = 0; i < ts.length; i++) {
+          if (i == 0) {
+            timelineMetric.setStartTime((long) ts[i]);
+          }
+          metricValues.put((long) ts[i], metrics[i]);
+        }
+      }
+      timelineMetric.setMetricValues(metricValues);
+      return timelineMetric;
+    }
+    return null;
+  }
+
+
+  private static TreeMap<Long, Double> getAsTimeSeries(long currentTime, double[] values) {
+
+    long startTime = currentTime - (values.length - 1) * 60 * 1000;
+    TreeMap<Long, Double> metricValues = new TreeMap<>();
+
+    for (int i = 0; i < values.length; i++) {
+      metricValues.put(startTime, values[i]);
+      startTime += (60 * 1000);
+    }
+    return metricValues;
+  }
+
+  private static DataSeries getAsDataSeries(TimelineMetric timelineMetric) {
+
+    TreeMap<Long, Double> metricValues = timelineMetric.getMetricValues();
+    double[] timestamps = new double[metricValues.size()];
+    double[] values = new double[metricValues.size()];
+    int i = 0;
+
+    for (Long timestamp : metricValues.keySet()) {
+      timestamps[i] = timestamp;
+      values[i++] = metricValues.get(timestamp);
+    }
+    return new DataSeries(timelineMetric.getMetricName() + "_" + timelineMetric.getAppId() + "_" + timelineMetric.getHostName(), timestamps, values);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/63e74355/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricKafkaProducer.java
----------------------------------------------------------------------
diff --git a/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricKafkaProducer.java b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricKafkaProducer.java
new file mode 100644
index 0000000..8023d15
--- /dev/null
+++ b/ambari-metrics/ambari-metrics-alertservice/src/main/java/org/apache/ambari/metrics/alertservice/prototype/MetricKafkaProducer.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.metrics.alertservice.prototype;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
+import org.apache.kafka.clients.producer.KafkaProducer;
+import org.apache.kafka.clients.producer.Producer;
+import org.apache.kafka.clients.producer.ProducerConfig;
+import org.apache.kafka.clients.producer.ProducerRecord;
+import org.apache.kafka.clients.producer.RecordMetadata;
+
+import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+
+public class MetricKafkaProducer {
+
+    Producer producer;
+    private static String topicName = "ambari-metrics-topic";
+
+    public MetricKafkaProducer(String kafkaServers) {
+        Properties configProperties = new Properties();
+        configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaServers); //"avijayan-ams-2.openstacklocal:6667"
+        configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.ByteArraySerializer");
+        configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.connect.json.JsonSerializer");
+        producer = new KafkaProducer(configProperties);
+    }
+
+    public void sendMetrics(TimelineMetrics timelineMetrics) throws InterruptedException, ExecutionException {
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        JsonNode jsonNode = objectMapper.valueToTree(timelineMetrics);
+        ProducerRecord<String, JsonNode> rec = new ProducerRecord<String, JsonNode>(topicName,jsonNode);
+        Future<RecordMetadata> kafkaFuture =  producer.send(rec);
+
+        System.out.println(kafkaFuture.isDone());
+        System.out.println(kafkaFuture.get().topic());
+    }
+}