diff --git a/README.md b/README.md
index 1f3089fa499064a3f191a190e0f41e7f5d0e4b97..e447e2ff2ff091a52028aebd36492540abd25d13 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,36 @@
-CAT
+CAT [![Build Status](https://travis-ci.org/dianping/cat.png?branch=biz)](https://travis-ci.org/dianping/cat)
===
-
-Central Application Tracking [![Build Status](https://travis-ci.org/dianping/cat.png?branch=biz)](https://travis-ci.org/dianping/cat)
+CAT的全称是Central Application Tracking,是基于Java开发的实时应用监控平台,包括实时系统监控、应用监控以及业务监控。
+CAT主要通过以下几种埋点类型收集信息:
+* Event 用来记录次数,表名单位时间内消息发生次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。
+* Transaction 适合记录跨越系统边界的程序访问行为,,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控。
+* Heartbeat Heartbeta表示程序内定期产生的统计信息, 如CHPU%, MEM%, 连接池状态, 系统负载等。
+* Metric 用于业务监控埋点的API。
+
+
+Requirements
+---------------------
+* Java 6
+* Maven
+* MySQL
Quick Started
---------------------
-#####1、安装Java 6+,Maven以及MySQL
-#####2、cd到CAT目录下,用maven构建项目
- mvn eclipse:clean eclipse:eclipse
-#####3、安装CAT的maven plugin,使用它配置CAT的环境
- cd cat-maven-plugin;mvn cat:install
-
-确保系统的临时目录程序拥有读写权限,Linux为/tmp/目录
-#####5、如果你安装了hadoop集群,请到/data/appdatas/cat/server.xml中配置对应hadoop信息,并将localmode设置为false。默认情况下,CAT在localmode=true的开发模式下工作。
+#####1、cd到CAT目录下,用maven构建项目
+ mvn install
+#####2、安装CAT的maven plugin,使用它配置CAT的环境
+ mkdir -p /data/appdata/cat; chmod 777 /data/appdata/cat
+ mkdir -p /data/applogs/cat; chmod 777 /data/applogs/cat
+ mvn cat:install
+#####3、如果安装了hadoop集群,需到/data/appdatas/cat/server.xml中配置对应hadoop信息。将localmode设置为false,默认情况下,CAT在开发模式(localmode=true)下工作。
#####4、运行CAT
-开发模式下有两种方式启动:
-方式一:
- cd cat-home;mvn jetty:run
-然后浏览http://localhost:2281
-方式二:
-将项目导入到eclipse中,运行cat-home项目里得‘com.dianping.cat.TestServer’来启动CAT。
+ cd cat-home;mvn jetty:run
+然后打开浏览器,输入http://localhost:2281。
+
+或者在cat目录下输入
+
+ mvn eclipse:clean eclipse:eclipse
+然后将项目导入到eclipse中,运行cat-home项目里得‘com.dianping.cat.TestServer’来启动CAT。
Copyright and license
---------------------
diff --git a/cat-client/src/main/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategy.java b/cat-client/src/main/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategy.java
index 39a7e33925024ef0173efbf0e57814c9aeab15fe..fa67c71ffe08df8a956da27bb3f2cf8b6291094b 100644
--- a/cat-client/src/main/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategy.java
+++ b/cat-client/src/main/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategy.java
@@ -42,4 +42,13 @@ public class TrafficDistributionGroupStrategy implements ABTestGroupStrategy {
m_percentA = 50;
}
}
+
+ public void init(int... percents) {
+ if (percents.length == 2) {
+ if (percents[0] + percents[1] == 100) {
+ m_percentControl = percents[0];
+ m_percentA = percents[1];
+ }
+ }
+ }
}
diff --git a/cat-client/src/main/resources/com/dianping/cat/configuration/client/config.xsd b/cat-client/src/main/resources/com/dianping/cat/configuration/client/config.xsd
index d7debcbf66eab6040b70d24f70004acb1754528d..76e00f84bf8e9046c696c25984c722591782159c 100644
--- a/cat-client/src/main/resources/com/dianping/cat/configuration/client/config.xsd
+++ b/cat-client/src/main/resources/com/dianping/cat/configuration/client/config.xsd
@@ -1,5 +1,4 @@
-
-
+
diff --git a/cat-client/src/main/resources/com/dianping/cat/status/model/status.xsd b/cat-client/src/main/resources/com/dianping/cat/status/model/status.xsd
index da6bb88239256c3c52bf7fe1822f121a852135b7..f649c9c7c44ceddd70aeafa8206206c3b5a0db82 100644
--- a/cat-client/src/main/resources/com/dianping/cat/status/model/status.xsd
+++ b/cat-client/src/main/resources/com/dianping/cat/status/model/status.xsd
@@ -1,5 +1,4 @@
-
-
+
diff --git a/cat-client/src/test/java/com/dianping/cat/AllTests.java b/cat-client/src/test/java/com/dianping/cat/AllTests.java
index 8bb4abee0b9e9264b9d8ab76b5f182e3c3c71c5e..a45de06982a81c5075306fccfd011b1ed73071a4 100644
--- a/cat-client/src/test/java/com/dianping/cat/AllTests.java
+++ b/cat-client/src/test/java/com/dianping/cat/AllTests.java
@@ -4,6 +4,9 @@ import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
+import com.dianping.cat.abtest.spi.internal.ABTestCodecTest;
+import com.dianping.cat.abtest.spi.internal.ABTestEntityManagerTest;
+import com.dianping.cat.abtest.spi.internal.groupstrategy.TrafficDistributionGroupStrategyTest;
import com.dianping.cat.configuration.ConfigTest;
import com.dianping.cat.log4j.CatAppenderTest;
import com.dianping.cat.message.EventTest;
@@ -26,6 +29,12 @@ CatAppenderTest.class,
/* .message */
MessageTest.class,
+TrafficDistributionGroupStrategyTest.class,
+
+ABTestCodecTest.class,
+
+ABTestEntityManagerTest.class,
+
EventTest.class,
HeartbeatTest.class,
diff --git a/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestContextManagerTest.java b/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestCodecTest.java
similarity index 96%
rename from cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestContextManagerTest.java
rename to cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestCodecTest.java
index 4859a669446897f1e1fa671184e3e39cd2ef9297..b2e9c9855651a19e5e4c501c70c98efd29764264 100644
--- a/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestContextManagerTest.java
+++ b/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestCodecTest.java
@@ -9,7 +9,7 @@ import junit.framework.Assert;
import org.junit.Test;
import org.unidal.lookup.ComponentTestCase;
-public class ABTestContextManagerTest extends ComponentTestCase {
+public class ABTestCodecTest extends ComponentTestCase {
@Test
public void testCodec() throws Exception {
check("1=ab:A|cd:B&2=ab:A|cd:B", "1=ab:A|cd:B&2=ab:A|cd:B");
diff --git a/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestContextTest.java b/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestContextTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7769964f3d90a3f01bd4a63a4d4e1e02320a736
--- /dev/null
+++ b/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/ABTestContextTest.java
@@ -0,0 +1,5 @@
+package com.dianping.cat.abtest.spi.internal;
+
+public class ABTestContextTest {
+
+}
diff --git a/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategyTest.java b/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategyTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..2e170a55064a1e1877d8d64a1ee11d12de5d4390
--- /dev/null
+++ b/cat-client/src/test/java/com/dianping/cat/abtest/spi/internal/groupstrategy/TrafficDistributionGroupStrategyTest.java
@@ -0,0 +1,46 @@
+package com.dianping.cat.abtest.spi.internal.groupstrategy;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.unidal.lookup.ComponentTestCase;
+
+import com.dianping.cat.abtest.spi.ABTestContext;
+import com.dianping.cat.abtest.spi.ABTestEntity;
+import com.dianping.cat.abtest.spi.ABTestGroupStrategy;
+import com.dianping.cat.abtest.spi.internal.DefaultABTestContext;
+
+public class TrafficDistributionGroupStrategyTest extends ComponentTestCase {
+
+ @Test
+ public void test() throws Exception {
+ testApply(50, 50);
+
+ testApply(40, 60);
+
+ testApply(55, 45);
+ }
+
+ public void testApply(int expectDefault, int expectA) throws Exception {
+ TrafficDistributionGroupStrategy strategy = (TrafficDistributionGroupStrategy) lookup(ABTestGroupStrategy.class,
+ TrafficDistributionGroupStrategy.ID);
+ ABTestContext ctx = new DefaultABTestContext(new ABTestEntity());
+
+ strategy.init(expectDefault, expectA);
+
+ int countDefault = 0;
+ int countA = 0;
+
+ for (int i = 0; i < 100; i++) {
+ strategy.apply(ctx);
+ if (ctx.getGroupName().equals(ABTestContext.DEFAULT_GROUP)) {
+ countDefault++;
+ } else {
+ countA++;
+ }
+ }
+
+ Assert.assertEquals(expectDefault, countDefault);
+ Assert.assertEquals(expectA, countA);
+ }
+}
diff --git a/cat-maven-plugin/src/main/java/com/dianping/cat/plugin/InstallMojo.java b/cat-maven-plugin/src/main/java/com/dianping/cat/plugin/InstallMojo.java
index 26f179959e945a26adac731c518b685efaa286b3..6f758e4f3372aad40e3debf2e2414eab61c12878 100644
--- a/cat-maven-plugin/src/main/java/com/dianping/cat/plugin/InstallMojo.java
+++ b/cat-maven-plugin/src/main/java/com/dianping/cat/plugin/InstallMojo.java
@@ -25,6 +25,8 @@ public class InstallMojo extends AbstractMojo {
private String m_path = "/data/appdatas/cat";
+ private String m_logPath = "/data/applogs/cat";
+
private String m_clientPath = m_path + File.separator + "client.xml";
private String m_serverPath = m_path + File.separator + "server.xml";
@@ -91,6 +93,7 @@ public class InstallMojo extends AbstractMojo {
getLog().info("Preparing Cat environment ... DONE");
getLog().info("Use following command line to start local Cat server:");
getLog().info(" cd cat-home; mvn jetty:run");
+ getLog().info("Please open http://localhost:2281/cat in your browser");
}
}
@@ -101,16 +104,18 @@ public class InstallMojo extends AbstractMojo {
return conn;
}
- private boolean setupConfigurationFiles() {
+ private boolean setupConfigurationFiles() throws MojoFailureException {
File path = new File(m_path);
+ File logPath = new File(m_logPath);
if (!path.exists()) {
path.mkdirs();
+ logPath.mkdirs();
}
- if (!path.canRead() || !path.canWrite()) {
+ if (!path.canRead() || !path.canWrite() || !logPath.canRead() || !logPath.canWrite()) {
getLog().error("Don't have privilege to read/write " + m_path);
- return false;
+ throw new MojoFailureException("Don't have privilege to read/write " + m_path);
}
getLog().info("Generating the configuration files to " + m_path + " ...");
@@ -153,7 +158,7 @@ public class InstallMojo extends AbstractMojo {
}
}
- private boolean setupDatabase() {
+ private boolean setupDatabase() throws MojoFailureException {
Connection conn = null;
Statement stmt = null;
boolean isSuccess = false;
@@ -175,6 +180,7 @@ public class InstallMojo extends AbstractMojo {
isSuccess = true;
} catch (Throwable e) {
getLog().error(e);
+ throw new MojoFailureException(e.getMessage());
} finally {
try {
if (stmt != null) {