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) {