提交 fb749e20 编写于 作者: Y yong.you

Merge branch 'biz' of code.dianpingoa.com:arch/cat into biz

......@@ -96,23 +96,7 @@ public class CrossAnalyzer extends AbstractMessageAnalyzer<CrossReport> implemen
public boolean isIp(String ip) {
boolean result = false;
// try {
// if (ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")) {
// String s[] = ip.split("\\.");
//
// if (Integer.parseInt(s[0]) <= 255) {
// if (Integer.parseInt(s[1]) <= 255) {
// if (Integer.parseInt(s[2]) <= 255) {
// if (Integer.parseInt(s[3]) <= 255) {
// result = true;
// }
// }
// }
// }
// }
// } catch (Exception e) {
// //ignore
// }
try {
char first = ip.charAt(0);
char next = ip.charAt(1);
......
......@@ -69,7 +69,7 @@ public class SqlParseManager {
}
}
private String parseSql(String sqlStatement) {
protected String parseSql(String sqlStatement) {
List<String> tables = null;
try {
tables = SqlParsers.forTable().parse(sqlStatement);
......
package com.dianping.cat.consumer.cross;
import java.util.ArrayList;
import java.util.List;
import org.unidal.lookup.annotation.Inject;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.Constants;
import com.dianping.cat.consumer.MockReportManager;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.service.ReportDelegate;
import com.dianping.cat.service.ReportManager;
public class Configurator extends AbstractResourceConfigurator {
public static void main(String[] args) {
generatePlexusComponentsXmlFile(new Configurator());
}
protected Class<?> getTestClass() {
return CrossAnalyzerTest.class;
}
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
final String ID = CrossAnalyzer.ID;
all.add(C(ReportManager.class, ID, MockCrossReportManager.class)//
.req(ReportDelegate.class, ID));
all.add(C(ReportDelegate.class, ID, ExtendedCrossDelegate.class));
return all;
}
public static class ExtendedCrossDelegate extends CrossDelegate {
}
public static class MockCrossReportManager extends MockReportManager<CrossReport> {
private CrossReport m_report;
@Inject
private ReportDelegate<CrossReport> m_delegate;
@Override
public CrossReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) {
if (m_report == null) {
m_report = (CrossReport) m_delegate.makeReport(domain, startTime, Constants.HOUR);
}
return m_report;
}
}
}
package com.dianping.cat.consumer.cross;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.unidal.helper.Files;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.Constants;
import com.dianping.cat.analysis.MessageAnalyzer;
import com.dianping.cat.consumer.cross.model.entity.CrossReport;
import com.dianping.cat.message.Message;
import com.dianping.cat.message.internal.DefaultEvent;
import com.dianping.cat.message.internal.DefaultTransaction;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.message.spi.internal.DefaultMessageTree;
public class CrossAnalyzerTest extends ComponentTestCase {
private long m_timestamp;
private CrossAnalyzer m_analyzer;
private String m_domain = "group";
@Before
public void setUp() throws Exception {
super.setUp();
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
long currentTimeMillis = System.currentTimeMillis();
m_timestamp = currentTimeMillis - currentTimeMillis % (3600 * 1000);
m_analyzer = (CrossAnalyzer) lookup(MessageAnalyzer.class, CrossAnalyzer.ID);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm");
Date date = sdf.parse("20120101 00:00");
m_analyzer.initialize(date.getTime(), Constants.HOUR, Constants.MINUTE * 5);
}
@Test
public void testProcess() throws Exception {
for (int i = 1; i <= 100; i++) {
MessageTree tree = generateMessageTree(i);
m_analyzer.process(tree);
}
CrossReport report = m_analyzer.getReport(m_domain);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("cross_analyzer.xml"), "utf-8");
Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", ""));
}
protected MessageTree generateMessageTree(int i) {
MessageTree tree = new DefaultMessageTree();
tree.setMessageId("" + i);
tree.setDomain(m_domain);
tree.setHostName("group001");
tree.setIpAddress("192.168.1.1");
DefaultTransaction t;
if(i%2 == 0){
t = new DefaultTransaction("PigeonCall", "Cat-Test-Call", null);
DefaultEvent event = new DefaultEvent("PigeonCall.server", "192.168.1.0:3000:class:method1");
event.setTimestamp(m_timestamp + 5 * 60 * 1000);
event.setStatus(Message.SUCCESS);
t.addChild(event);
}else{
t = new DefaultTransaction("PigeonService", "Cat-Test-Service", null);
DefaultEvent event = new DefaultEvent("PigeonService.client", "192.168.1.2:3000:class:method2");
event.setTimestamp(m_timestamp + 5 * 60 * 1000);
event.setStatus(Message.SUCCESS);
t.addChild(event);
}
t.complete();
t.setDurationInMillis(i * 2);
t.setTimestamp(m_timestamp + 1000);
tree.setMessage(t);
return tree;
}
}
package com.dianping.cat.consumer.sql;
import java.util.ArrayList;
import java.util.List;
import org.unidal.lookup.annotation.Inject;
import org.unidal.lookup.configuration.AbstractResourceConfigurator;
import org.unidal.lookup.configuration.Component;
import com.dianping.cat.Constants;
import com.dianping.cat.consumer.MockReportManager;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.service.ReportDelegate;
import com.dianping.cat.service.ReportManager;
public class Configurator extends AbstractResourceConfigurator {
public static void main(String[] args) {
generatePlexusComponentsXmlFile(new Configurator());
}
protected Class<?> getTestClass() {
return SqlAnalyzerTest.class;
}
@Override
public List<Component> defineComponents() {
List<Component> all = new ArrayList<Component>();
final String ID = SqlAnalyzer.ID;
all.add(C(SqlParseManager.class, ExtendedSqlParseManager.class));
all.add(C(ReportManager.class, ID, MockSqlReportManager.class).req(ReportDelegate.class, ID));
all.add(C(ReportDelegate.class, ID, ExtendedSqlDelegate.class));
return all;
}
public static class ExtendedSqlDelegate extends SqlDelegate {
}
public static class MockSqlReportManager extends MockReportManager<SqlReport> {
private SqlReport m_report;
@Inject
private ReportDelegate<SqlReport> m_delegate;
@Override
public SqlReport getHourlyReport(long startTime, String domain, boolean createIfNotExist) {
if (m_report == null) {
m_report = (SqlReport) m_delegate.makeReport(domain, startTime, Constants.HOUR);
}
return m_report;
}
}
public static class ExtendedSqlParseManager extends SqlParseManager {
@Override
public String getTableNames(String sqlName, String sqlStatement, String domain) {
return parseSql(sqlStatement);
}
}
}
package com.dianping.cat.consumer.sql;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.unidal.helper.Files;
import org.unidal.lookup.ComponentTestCase;
import com.dianping.cat.Constants;
import com.dianping.cat.analysis.MessageAnalyzer;
import com.dianping.cat.consumer.sql.model.entity.SqlReport;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.internal.DefaultEvent;
import com.dianping.cat.message.internal.DefaultTransaction;
import com.dianping.cat.message.spi.MessageTree;
import com.dianping.cat.message.spi.internal.DefaultMessageTree;
public class SqlAnalyzerTest extends ComponentTestCase {
private long m_timestamp;
private SqlAnalyzer m_analyzer;
private String m_domain = "group";
@Before
public void setUp() throws Exception {
super.setUp();
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
long currentTimeMillis = System.currentTimeMillis();
m_timestamp = currentTimeMillis - currentTimeMillis % (3600 * 1000);
m_analyzer = (SqlAnalyzer) lookup(MessageAnalyzer.class, SqlAnalyzer.ID);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm");
Date date = sdf.parse("20120101 00:00");
m_analyzer.initialize(date.getTime(), Constants.HOUR, Constants.MINUTE * 5);
}
@Test
public void testProcess() throws Exception {
for (int i = 1; i <= 100; i++) {
MessageTree tree = generateMessageTree(i);
m_analyzer.process(tree);
}
SqlReport report = m_analyzer.getReport(m_domain);
String expected = Files.forIO().readFrom(getClass().getResourceAsStream("sql_analyzer.xml"), "utf-8");
Assert.assertEquals(expected.replaceAll("\r", ""), report.toString().replaceAll("\r", ""));
}
protected MessageTree generateMessageTree(int i) {
MessageTree tree = new DefaultMessageTree();
tree.setMessageId("" + i);
tree.setDomain(m_domain);
tree.setHostName("group001");
tree.setIpAddress("192.168.1.1");
DefaultTransaction t = new DefaultTransaction("SQL", "", null);
Event eventBase = new DefaultEvent("SQL.Database", "mysql://10.1.1.220:3306/cat");
t.addChild(eventBase);
if(i%4 == 1 ){
Event event = new DefaultEvent("SQL.Method", "SELECT");
t.addChild(event);
t.addData("select * from cat");
}else if(i%4 == 2 ){
Event event = new DefaultEvent("SQL.Method", "DELETE");
t.addChild(event);
t.addData("delete from cat where id = 1");
}else if(i%4 == 3 ){
Event event = new DefaultEvent("SQL.Method", "INSERT");
t.addChild(event);
t.addData("insert into cat2 (a,b) values (1,1)");
}else if(i%4 == 0 ){
Event event = new DefaultEvent("SQL.Method", "UPDATE");
t.addChild(event);
t.addData("update cat2 set a = 1 where id = 1");
}
t.complete();
t.setDurationInMillis(i * 2);
t.setTimestamp(m_timestamp + 1000);
tree.setMessage(t);
return tree;
}
}
<plexus>
<components>
<component>
<role>com.dianping.cat.service.ReportManager</role>
<role-hint>cross</role-hint>
<implementation>com.dianping.cat.consumer.cross.Configurator$MockCrossReportManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.service.ReportDelegate</role>
<role-hint>cross</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.service.ReportDelegate</role>
<role-hint>cross</role-hint>
<implementation>com.dianping.cat.consumer.cross.Configurator$ExtendedCrossDelegate</implementation>
</component>
</components>
</plexus>
<?xml version="1.0" encoding="utf-8"?>
<cross-report domain="group" startTime="2012-01-01 00:00:00" endTime="2012-01-01 00:59:59">
<domain>group</domain>
<ip>192.168.1.1</ip>
<local id="192.168.1.1">
<remote id="192.168.1.2" role="Pigeon.Client">
<type id="PigeonService" totalCount="50" failCount="50" failPercent="0.00" avg="0.00" sum="5000.00" tps="0.00">
<name id="Cat-Test-Service" totalCount="50" failCount="50" failPercent="0.00" avg="0.00" sum="5000.00" tps="0.00"/>
</type>
</remote>
<remote id="192.168.1.0:3000:class:method1" role="Pigeon.Server">
<type id="PigeonCall" totalCount="50" failCount="50" failPercent="0.00" avg="0.00" sum="5100.00" tps="0.00">
<name id="Cat-Test-Call" totalCount="50" failCount="50" failPercent="0.00" avg="0.00" sum="5100.00" tps="0.00"/>
</type>
</remote>
</local>
</cross-report>
......@@ -8,7 +8,7 @@
<remote id="10.1.77.194" role="Pigeon.Client">
<type id="PigeonCall" totalCount="111507" failCount="0" failPercent="0.00"
avg="0.0" sum="1937.0" sum2="34333.7" std="0.0" tps="0.00">
<name id="GroupService:GroupClass:GroupMethod" totalCount="1"
<name id="GroupService:GroupClass:GroupMethod" totalCount="1">
</name>
<name id="GroupService:GroupClass:GroupMethod1" totalCount="1"
failCount="0" failPercent="0.00" avg="0.0" sum="0.9" sum2="0.8"
......
<plexus>
<components>
<component>
<role>com.dianping.cat.consumer.sql.SqlParseManager</role>
<implementation>com.dianping.cat.consumer.sql.Configurator$ExtendedSqlParseManager</implementation>
</component>
<component>
<role>com.dianping.cat.service.ReportManager</role>
<role-hint>sql</role-hint>
<implementation>com.dianping.cat.consumer.sql.Configurator$MockSqlReportManager</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.service.ReportDelegate</role>
<role-hint>sql</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.service.ReportDelegate</role>
<role-hint>sql</role-hint>
<implementation>com.dianping.cat.consumer.sql.Configurator$ExtendedSqlDelegate</implementation>
</component>
</components>
</plexus>
<?xml version="1.0" encoding="utf-8"?>
<sql-report domain="group" startTime="2012-01-01 00:00:00" endTime="2012-01-01 00:59:59">
<domainName>group</domainName>
<databaseName>cat</databaseName>
<database id="cat" connect-url="mysql://10.1.1.220:3306/cat">
<table id="All" totalCount="100" failCount="100" failPercent="1.00" avg="101.00" sum="10100.00" tps="0.00" totalPercent="0.00">
<method id="SELECT" totalCount="25" failCount="25" failPercent="1.00" avg="98.00" sum="2450.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
<method id="DELETE" totalCount="25" failCount="25" failPercent="1.00" avg="100.00" sum="2500.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
<method id="INSERT" totalCount="25" failCount="25" failPercent="1.00" avg="102.00" sum="2550.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
<method id="UPDATE" totalCount="25" failCount="25" failPercent="1.00" avg="104.00" sum="2600.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
</table>
<table id="cat" totalCount="50" failCount="50" failPercent="1.00" avg="99.00" sum="4950.00" tps="0.00" totalPercent="0.00">
<method id="SELECT" totalCount="25" failCount="25" failPercent="1.00" avg="98.00" sum="2450.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
<method id="DELETE" totalCount="25" failCount="25" failPercent="1.00" avg="100.00" sum="2500.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
</table>
<table id="cat2" totalCount="50" failCount="50" failPercent="1.00" avg="103.00" sum="5150.00" tps="0.00" totalPercent="0.00">
<method id="INSERT" totalCount="25" failCount="25" failPercent="1.00" avg="102.00" sum="2550.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
<method id="UPDATE" totalCount="25" failCount="25" failPercent="1.00" avg="104.00" sum="2600.00" tps="0.00" totalPercent="0.00">
<sql></sql>
</method>
</table>
</database>
</sql-report>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册