diff --git a/skywalking-analysis/pom.xml b/skywalking-analysis/pom.xml
new file mode 100644
index 000000000..c74aeb101
--- /dev/null
+++ b/skywalking-analysis/pom.xml
@@ -0,0 +1,66 @@
+
+ 4.0.0
+
+ com.ai.cloud
+ skywalking-analysis
+ 1.0-SNAPSHOT
+ jar
+
+ skywalking-analysis
+ http://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+ org.apache.hbase
+ hbase-client
+ 1.1.2
+
+
+ org.apache.hbase
+ hbase-server
+ 1.1.2
+
+
+ org.apache.logging.log4j
+ log4j-core
+ 2.4.1
+
+
+ com.ai.cloud
+ skywalking-protocol
+ 1.0-SNAPSHOT
+
+
+
+
+
+
+ maven-compiler-plugin
+
+ 1.6
+ 1.6
+ ${project.build.sourceEncoding}
+
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 2.4.3
+
+ ${project.build.sourceEncoding}
+
+
+
+
+
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/AnalysisServerDriver.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/AnalysisServerDriver.java
new file mode 100644
index 000000000..651b60d04
--- /dev/null
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/AnalysisServerDriver.java
@@ -0,0 +1,58 @@
+package com.ai.cloud.skywalking.analysis;
+
+import com.ai.cloud.skywalking.analysis.config.Config;
+import com.ai.cloud.skywalking.analysis.mapper.CallChainMapper;
+import com.ai.cloud.skywalking.analysis.model.ChainInfo;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.hbase.client.Scan;
+import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
+import org.apache.hadoop.mapreduce.Job;
+import org.apache.hadoop.util.GenericOptionsParser;
+import org.apache.hadoop.util.Tool;
+import org.apache.hadoop.util.ToolRunner;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class AnalysisServerDriver extends Configured implements Tool {
+
+ private static Logger logger = LoggerFactory.getLogger(AnalysisServerDriver.class.getName());
+
+ public static void main(String[] args) throws Exception {
+ logger.info("Begin to analysis call chain.");
+ int res = ToolRunner.run(new AnalysisServerDriver(), args);
+ System.exit(res);
+ }
+
+ @Override
+ public int run(String[] args) throws Exception {
+ Configuration conf = new Configuration();
+ String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
+ if (otherArgs.length != 2) {
+ System.err.println("Usage: AnalysisServer yyyy-MM-dd/HH:mm:ss yyyy-MM-dd/HH:mm:ss");
+ System.exit(2);
+ }
+ Job job = Job.getInstance(conf);
+ job.setJarByClass(AnalysisServerDriver.class);
+ Scan scan = buildHBaseScan(args);
+
+ TableMapReduceUtil.initTableMapperJob(Config.HBase.TABLE_NAME, scan, CallChainMapper.class,
+ String.class, ChainInfo.class, job);
+ //TableMapReduceUtil.initTableReducerJob("sw-call-chain-model", CallChainReducer.class, job);
+ return job.waitForCompletion(true) ? 0 : 1;
+ }
+
+ private Scan buildHBaseScan(String[] args) throws ParseException, IOException {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd/HH:mm:ss");
+ Date startDate = simpleDateFormat.parse(args[0]);
+ Date endDate = simpleDateFormat.parse(args[1]);
+ Scan scan = new Scan();
+ scan.setTimeRange(startDate.getTime(), endDate.getTime());
+ return scan;
+ }
+}
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java
new file mode 100644
index 000000000..9dbff39a4
--- /dev/null
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/Config.java
@@ -0,0 +1,7 @@
+package com.ai.cloud.skywalking.analysis.config;
+
+public class Config {
+ public static class HBase {
+ public static String TABLE_NAME;
+ }
+}
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ConfigInitializer.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ConfigInitializer.java
new file mode 100644
index 000000000..bd3305b17
--- /dev/null
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ConfigInitializer.java
@@ -0,0 +1,85 @@
+package com.ai.cloud.skywalking.analysis.config;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public class ConfigInitializer {
+ private static Logger logger = Logger.getLogger(ConfigInitializer.class.getName());
+
+ public static void initialize() {
+ InputStream inputStream = ConfigInitializer.class.getResourceAsStream("/config.properties");
+ if (inputStream == null) {
+ logger.log(Level.ALL, "No provider sky-walking certification documents, sky-walking api auto shutdown.");
+ } else {
+ try {
+ Properties properties = new Properties();
+ properties.load(inputStream);
+ initNextLevel(properties, Config.class, new ConfigDesc());
+ } catch (IllegalAccessException e) {
+ logger.log(Level.ALL, "Parsing certification file failed, sky-walking api auto shutdown.");
+ } catch (IOException e) {
+ logger.log(Level.ALL, "Failed to read the certification file, sky-walking api auto shutdown.");
+ }
+ }
+ }
+
+ private static void initNextLevel(Properties properties, Class> recentConfigType, ConfigDesc parentDesc) throws NumberFormatException, IllegalArgumentException, IllegalAccessException {
+ for (Field field : recentConfigType.getFields()) {
+ if (Modifier.isPublic(field.getModifiers()) && Modifier.isStatic(field.getModifiers())) {
+ String configKey = (parentDesc + "." +
+ field.getName()).toLowerCase();
+ String value = properties.getProperty(configKey);
+ if (value != null) {
+ if (field.getType().equals(int.class))
+ field.set(null, Integer.valueOf(value));
+ if (field.getType().equals(String.class))
+ field.set(null, value);
+ if (field.getType().equals(long.class))
+ field.set(null, Long.valueOf(value));
+ if (field.getType().equals(boolean.class))
+ field.set(null, Boolean.valueOf(value));
+ }
+ }
+ }
+ for (Class> innerConfiguration : recentConfigType.getClasses()) {
+ parentDesc.append(innerConfiguration.getSimpleName());
+ initNextLevel(properties, innerConfiguration, parentDesc);
+ parentDesc.removeLastDesc();
+ }
+ }
+}
+
+class ConfigDesc {
+ private LinkedList descs = new LinkedList();
+
+ void append(String currentDesc) {
+ descs.addLast(currentDesc);
+ }
+
+ void removeLastDesc() {
+ descs.removeLast();
+ }
+
+ @Override
+ public String toString() {
+ if (descs.size() == 0) {
+ return "";
+ }
+ StringBuilder ret = new StringBuilder(descs.getFirst());
+ boolean first = true;
+ for (String desc : descs) {
+ if (first) {
+ first = false;
+ continue;
+ }
+ ret.append(".").append(desc);
+ }
+ return ret.toString();
+ }
+}
diff --git a/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java
new file mode 100644
index 000000000..b9bdb9bef
--- /dev/null
+++ b/skywalking-analysis/src/main/java/com/ai/cloud/skywalking/analysis/config/ViewPointFilterFactory.java
@@ -0,0 +1,79 @@
+package com.ai.cloud.skywalking.analysis.config;
+
+import com.ai.cloud.skywalking.analysis.viewpoint.ViewPointFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+public class ViewPointFilterFactory {
+
+ private static Logger logger = LoggerFactory.getLogger(ViewPointFilterFactory.class.getName());
+
+ private static Map filterType;
+
+ private ViewPointFilterFactory() {
+ //Non
+ }
+
+ private static void initFilterChain() {
+ Properties properties = new Properties();
+ try {
+ properties.load(ViewPointFilterFactory.class.getResourceAsStream("/viewpointfilter.conf"));
+ } catch (IOException e) {
+ logger.error("Failed to found the conf file[viewpointfilter.conf]", e);
+ System.exit(-1);
+ }
+
+ Set> entries = properties.entrySet();
+
+ for (Map.Entry